关于I2C控制器的几个疑问

您好,最近在使用DSP6713 的I2C控制器时发现几个问题,请教下各位,还望赐教:

1.向I2C命令寄存器中写入命令0x2420时,通过memory观察命令寄存器地址,发现只写进去了0x0420,如果强行再次写入0x2420时,该寄存器内容为0x2420,请问这是正常的么?(停止命令也一样)

2.I2C初始化时,需要增加将状态寄存器STR中的BB位写1清零的操作么?

3.在设置II2C为Master模式,处于接收状态时,RM=0情况下,采用轮询方式接收数据, 手册中的流程图中显示需要判断状态寄存器的ARDY位,当ARDY位为1时,可以设置停止位STP=1,然后读取I2CDRR最后一个字节数据。

但我在按照此流程图实际编码调试时,发现,当我要接收多个字节的情况下,接收完第一个字节时,ARDY就置1了,这个ARDY位在接收条件下,是每接收1个字节就会变为1么,那么我要接收多个字节的时候,ARDY怎么再变为0呢?

另外在发送状态时,ARDY的含义也是发送了一个字节就置1么?ARDY的含义到底是什么?

ARDY  NACK  ICRRDY (ICXRDY)这些状态位在收发过程中变化的先后是什么样的呢?

4.我采用轮询方法访问I2C,如果我在该发送停止位的时候(向命令寄存器STP位写1)被中断打断,写停止位时间会晚1ms左右,会对总线通讯有影响么,会造成BB一直是忙位的情况么?

5.我遇到过BB一直为1,向命令寄存器写停止位也不恢复的情况(复位I2C控制器可以BB=0),如果发生这种情况,我向I2C状态寄存器BB位写1清零是不是也没有实际作用,只是改变了状态寄存器的值,总线忙的实际状态没有改变呢?

问题有点多,麻烦大家了,谢谢。

29 个回复

  • 状元 213497 points
    1. 请问”命令寄存器“是哪个寄存器?是I2CMDR寄存器?

    2. 初始化时可以不清,因为I2CMDR.IRS=1后,BB位为0。

    3. ARDY是判断I2C寄存器是不是可以被访问,在重新配置I2C寄存器之前,要先判断ARDY位。发送准备和接收准备标致分别是ICXRDY和ICRRDY标志位。从手册中的流程图中可以看出ARDY NACK ICRRDY (ICXRDY)这些状态位在收发过程中变化的先后顺序是先判断NACK,ARDY ,再判断ICRRDY (ICXRDY)。

    4.被什么中断打断?为什么会晚1ms这么长时间,建议中断子程序里做的操作越少越好。

    5. 是的,要找出BB一直为1的原因。

    若该回复解决了您的问题,请点击“确认此为答案”,谢谢。

  • 回复 Shine:

    您好,命令寄存器是I2CMDR,另外我再请教一下,当stt stp都设置为1时,当发送字节数Count减少至0时会自动产生停止信号.

    如果我采用restart方式通讯,发送时stt 设置1,stp设置为0,当发送计数清到零时不会自动产生停止位。接着再启动接收时,att和stp都设置为1,接收计数写为要接受的字节数,count还会减么,会自动产生停止位么?我不知道我对restart的这种操作对不对,谢谢您

  • 状元 213497 points

    回复 user5157445:

    是的,当stt stp都设置为1时,当发送字节数Count减少至0时会自动产生停止信号。

    还会减的,有START信号,就会开始计数。

    若该回复解决了您的问题,请点击“确认此为答案”,谢谢。

  • 回复 Shine:

    好的 谢谢 另外 我上面描述的restart 方式通讯先配置stt为1 stp为0 发送写序列 再配置stt 为1 stp为1 完成读序列 这样操作 对吗 谢谢

  • 状元 213497 points

    回复 user5157445:

    您说的restart方式就是repeat方式吗?

    若该回复解决了您的问题,请点击“确认此为答案”,谢谢。

  • 状元 213497 points

    回复 user5157445:

    是的,具体数据格式参考3.5.4 Using a Repeated START Condition

    若该回复解决了您的问题,请点击“确认此为答案”,谢谢。

  • 回复 Shine:

    ni您好,最近在调试一个产品,其中用6713处理器的I2C控制器访问ADT7410测温芯片,其中使用了repeated start方式,即先是发送写命令,数据为要访问的测温芯片的寄存器地址,然后没有停止命令,再发送读命令,测温芯片返回2个字节数据。

    我的大致流程是I2C控制器初始化后,在BB位=0,ICXRDY位=1的条件下,先设置从地址,数据长度为1,正确填充要访问芯片寄存器地址作为发送的数据,I2CMDR=0x2620。发起主发送流程。

    根据手册说明,如果STP = 0, ARDY位当Counter减少至0时会置1,且在BB=1情况下产生start条件,就是repeated start模式。

    所以我在判断到BB=1且ARDY为1时,继续填写接收数据长度,接收从地址,I2CMDR = 0x2C20,启动接收序列,在判断到ICRRDY位为1时读取接收缓存数据,直至接收到2字节为止。

    最后判断BB=0后完成接收操作。

    产品有2个中断,一个外部中断,一个定时器中断,两个中断一共耗时50us左右。

    现在遇到的现象就是,在I2C通讯过程中,经常会出现启动发送序列后(已经填写完要发送的从地址,数据长度,要访问的从芯片的地址,并填写了I2CMDR=0x2C20),I2CSTR一直为0x400,等多久超时该状态都不会再改变,导致通讯出现错误(很奇怪的状态)。如果关闭两个中断,则通讯正常。

    想请教下其中原理,是我操作带来的问题,还是中断机制会影响I2C的repeated start通讯呢?十分感谢!

  • 状元 213497 points

    回复 user5157445:

    如果关闭中断就正常,那应该和中断有关。如果只开一个中断正常吗?中断子程序里做很多处理吗?建议中断子程序越简单越好。

    若该回复解决了您的问题,请点击“确认此为答案”,谢谢。

  • 回复 Shine:

    关闭中断正常,如果只开一个定时器中断,里面只做全局变量自增操作也没问题。出问题时我的终端操作也就是50us左右,里面会通过emif访问外设。但我没想明白的是,为什么中断能影响I2C通讯呢?