Part Number:TMS320F280025Other Parts Discussed in Thread:C2000WARE
例程路径D:\ti\c2000\C2000Ware_4_00_00_00\driverlib\f28002x\examples\i2c\CCS
我是用的是polling方式对E2PROM进行读写,在E2prom芯片手册中,随机读取时序最后是要求主机发送一个NACK位,但是例程中却没有发送。我查看芯片技术手册,如下图所示,需要在最后一个bit的上升沿发送NACK,请问在FIFO中如何操作呢,如何在FIFO模式下,正确发送NACK位呢
zhang xiaoming:
我在sendStopCondition之前发送NACK后,FIFO缓存中没有按照预期接收到两个字节,而是多了一个字节,请问这个情况怎么处理呢
,
zhang xiaoming:
当数据线和时钟线同时被长时间拉低时,数据读取就会出错,我尝试了几次抓取波形,每次读取数据出错的时候就是类似的波形
图中的SCL和SDA同时长时间拉低按照正常情况应该是同时拉高,这个情况是什么造成的呢
,
Yale Li:
长时间拉低就是y轴附近这一段吧?绿色ch2是SCL,蓝色ch1是SDA吧?
截图框中的部分已经说明了生成NACK的方法。我的建议就是使用FIFO接收中断,在最后一帧数据接收之前置NACKMOD位。
,
zhang xiaoming:
青色线是时钟线,蓝色是数据线,我程序中发送了NACK位,但是DSP发不出来,因为我尝试只发送NACK,示波器没有显示波形,
,
zhang xiaoming:
你好,问题再进一步定位:程序执行了Send_NACK函数,但是在示波器波形上,NACK却没有及时的发出,从Send_NACK函数执行,到NACK发出中间隔了大概560us。
下图中从上到下依次为时钟线-青色,数据线-蓝色,debug线-绿色,绿色线电平反转代表执行Send_NACK函数,蓝色线是数据线,青色线是时钟线
下图是程序
,
Yale Li:
看起来应该是IIC的时钟延展(clock stretching)问题。
从MCU运行I2C_sendNACK()函数,到NACK位被置位并发出相应的波形,需要一定的时间,为了避免出错,作为receiver的MCU就会拉低SCL。
你之前说数据读取会出错。可是按照IIC的设计,时钟被拉低的时候,传输就会阻塞;收发双方会等待时钟恢复正常后继续收发接下来的位。
我想知道在长时间的低电平恢复之后,数据的格式是否正确?因为波形图片的缩放比例太大,我没有办法判断。
,
zhang xiaoming:
还有一个问题,偶尔显示I2C总线忙碌的原因是什么呢,我已经执行了sendStopCondition函数,也对状态进行了判断,但是偶尔还是会显示总线忙碌
这个现象总是发生在对E2芯片全部读取完毕,延时5ms然后对E2芯片进行写入的时候,会出现总线忙碌
下面是程序
谢谢你啦
,
Yale Li:
这一段程序就只是检测到stop后的延时吧?
之后的程序是什么样的呢?BB位是什么状态?
,
zhang xiaoming:
如果程序不停止的话,后面状态会恢复
请问这个情况怎么解决呢,增加检测到STOP后的延时吗
,
zhang xiaoming:
还有一个问题:主机发送了NACK和STOP,波形上面只看到了NACK但是没有相应的stop 波形
如下图:有NACK的波形,并且send_NACK和sendStopCondition函数的执行是紧接着,并且有关闭中断,不会被中断打断,那为什么没有相应的STOP波形呢,
,
Yale Li:
zhang xiaoming said:
下面是程序
对于STP状态,driverlib和TRM中是这样描述的:
所以检测到STP置位只能说明将会有停止条件生成。
延时之后应该增加对于STP位的判断,判断是否为0,即stop状态是否已经产生。
,
Yale Li:
zhang xiaoming said:
如下图:有NACK的波形,并且send_NACK和sendStopCondition函数的执行是紧接着,并且有关闭中断,不会被中断打断,那为什么没有相应的STOP波形呢,
这个时候STP的状态是什么?NACK后面的数据格式正常吗?