TI中文支持网
TI专业的中文技术问题搜集分享网站

TMS320F280025: I2C读取E2PROM例程问题

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后面的数据格式正常吗?

赞(0)
未经允许不得转载:TI中文支持网 » TMS320F280025: I2C读取E2PROM例程问题
分享到: 更多 (0)

© 2024 TI中文支持网   网站地图 鲁ICP备2022002796号-1