【解析新特性】300W单路输出工业电源>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » DIY开发板同时I2C驱动LM75A和PCF8563程序问题

共4条 1/1 1 跳转至

DIY开发板同时I2C驱动LM75A和PCF8563程序问题

菜鸟
2013-10-31 20:44:35    评分

      最近在弄I2C驱动,在网上找了一个《I2C协议说明及verilog实现读写I2C器件》文档,修改其中的代码。进过漫长的修改调试,终于可以单独驱动LM75A或者PCF8563了,但是两个一起驱动就出问题了,找了很久也没解决,望高手指导下呀

test_i2c.rar

已解锁-I2C协议说明及verilog实现读写I2C器件.pdf


程序是本来想通过下面语句完成两个器件的切换读取:

case(code_ctl) 
    PCF8563T: begin 
        if(finish_bit==1'b0)begin //finish_bit是在50ms中有一个50MHz时钟周期为1,其他时刻都是0

                                            //所以是50ms进行一次I2C操作
            sda_data_addr<=8'ha2; //PCF8563器件地址,程序中一次读完秒,分和时三个字节数据
            sda_data_word<=8'h02; //发送秒寄存器的地址
            if(iic_sts == STOP)begin
                sec<=data_read; 

                min<=data_read2; 

                hour<=data_read3; 

            end 
        else 
            code_ctl<=LM75A; //等待发送秒寄存器的地址
    end 
    LM75A: begin 
        if(finish_bit==1'b0)begin 
            sda_data_addr<=8'h90; //LM75A器件地址,程序中只读两个字节数据,显示只要前8位

                                               //程序中这个字节数据未转为BCD码,直接1602显示了……LEs不够用啊 
            sda_data_word<=8'h00; //发送温度寄存器的地址

            if(iic_sts == STOP)
                temp<=data_read4; 
        end 
        else 
            code_ctl<=PCF8563T;
    end 
endcase

但是不行,改为单独一个就能正常显示。


其中PCF8563T和LM75A的SLC和SDA输出是共用的(没有标名称的是PCF8563T的

输入的时候用器件地址区分后,再读取SDA或者LM75A:

assign LM75A_SCL = scl_r; 
assign LM75A_SDA = sda_io_flag?sda_r:1'bz; 
assign SCL = scl_r; 
assign SDA = sda_io_flag?sda_r:1'bz; 
I2C的状态机中,SDA和LM75A_SDA的读取区分是器件地址,sda_data_addr==8'ha2是则从机应答

和读数据是PCF8563T的SDA,否则是LM75A的LM75A_SDA。


采用的I2C的时序是这样的,先启动I2C然后发送器件地址(写),从机应答,写寄存器地址,从机应答

重启I2C,发送器件地址(读),接收一个字节数据,主机应答,接收一个字节数据,主机应答

接收一个字节数据,主机非应答(非应答我理解的是SDA输出高电平),停止I2C。一直保持停止状态,等到50ms再启动I2C操作。


还有就是如果对PCF8563T进行两次I2C操作,然后对LM75A进行两次操作,如此循环就能勉强都驱动起来

但是1602的显示会抖动,怀疑读到的数据变动?!看着有点头昏了,望高手指导下~~




关键词: CPLD_DIY     I2C     IIC     LM75A     PC    

院士
2013-11-01 08:59:34    评分
2楼
等高手~~

专家
2013-11-01 09:07:03    评分
3楼

I2C总线从原理上讲,其就是并总线的,也就是共用一条scl线是正确的。

I2C总线上不同的器件响应主机是通过器件本身的地址来识别的,刚刚看了楼主的程序,两个器件地址也是有区分的。


没有太明白楼主所谓的“两个一起发”。总线操作肯定是要一个一个来,先LM75A,再PCF8563.


如果我没有理解楼主的意思,请楼主再补充。


菜鸟
2013-11-01 12:29:07    评分
4楼

先谢谢了。我程序中想实现的也是先PCF8563再LM75A,再PCF8563LM75A,如此循环的,但是不行。如果一直单独循环PCF8563或者单独LM75A就没问题,试过,如果执行两次PCF8563,再执行两次LM75A,再执行两次PCF8563,再执行两次LM75A,如此循环,就都能读出数据,但是数据会跳动。1602刷新速度有点高,但应该没问题的,一直用。只怀疑自己I2C程序有问题了,难道结束STOP没有做好?!还是数据更新到显示缓存寄存器时做的不好?!我自己看了两天没发现自己的问题啊~~还望做过两个器件一起用的同学指导下


也许我该像论坛里的同学学习,试试用按键控制读取PCF8563和LM75A数据,按一个按键读取PCF8563的数据一次,再按一个按键读取LM75A的数据一次。


共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]