i2c的读取cmd发送完毕后并不会立刻同步的读到数据

来源:互联网 发布:编程语言执行效率 编辑:程序博客网 时间:2024/04/30 07:31

DDR和ARM的频率改变后I2C又出现了问题:

先前的处理逻辑是当发送缓冲区为空后我会去读接收缓冲区中的数据,其判断依据为进入中断后先读取接收缓冲区的数据计数器的值根据该值来决定读取接收fifo的次数。以前的这种逻辑一直是好的,这是建立在一个这样的假设上的:如果发送缓冲区为空了,说明要求读取的命令都已经成功发送完毕了,那么接收缓冲fifo中就应该有和读取命令发送成功次数相一致的数据被收到,也就是我每成功发出一个读取的CMD那么接收fifo当中就一定会有一个收到的字节。

在频率改变后我发现,当我把9个读取命令全部压入发送缓冲后,当发送缓冲为空的时候我去读取接收fifo的计数器,其值为8。这显然会使我丢掉一个数据。如此看来先前的假设就是错误的了,也就是发送和接收并不是同步的,当一个读取命令发送完毕后,接收缓冲会在稍晚的时候才会收到数据。因此我的驱动逻辑需要做出相应的改变。


顺便:

当接收fifo中没有新的数据时,你去读取它,总是读到上次的最后一个数据,也就是fifo为空的时候,总是残留着上次最后一个值