打印
[STM32F1]

STM32使用DMA方式I2C传输问题

[复制链接]
8139|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lgnativs|  楼主 | 2014-6-13 11:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
   在使用STM32的I2C并使用DMA传输时发现一个问题,正常通讯一个事务后会,再次启动传输时会重复进入EV8_2事件中断,导致通讯无法进行.

  原代码如下:
        I2C_ITConfig(I2C1, I2C_IT_EVT | I2C_IT_ERR , ENABLE);                // only SB int allowed       
        I2C_GenerateSTART(I2C1, ENABLE);       
  同时在DMA传输中断完成里发送停止条件
       
  仔细查阅文档后发现,如果在最后一次写操作后,没有写DR,BTF位就会置1,此为主发送器的EV8_2事件,也即是当DMA写入传输完成时,I2C1会设置BTF位

若在下次传输启动时先使能了I2C_IT_EVT就会立刻触发中断(BTF位为1)
        I2C_ITConfig(I2C1, I2C_IT_EVT | I2C_IT_ERR , ENABLE);                // 因为BTF为1,立刻进入中断
此时,因通过读SR1,SR2是无法清除BTF的,就导致了中断不停触发,代码无法执行,
        I2C_GenerateSTART(I2C1, ENABLE);                                       // CPU被不断中断,代码艰难执行中,

若代码改为
        I2C_GenerateSTART(I2C1, ENABLE);                                     // 发送起始条件会硬件清除BTF
        I2C_ITConfig(I2C1, I2C_IT_EVT | I2C_IT_ERR , ENABLE);                // only SB int allowed       
,或者在I2C EV8_2中断里发送停止条件则不会产生此问题.
沙发
玄德| | 2014-6-13 13:59 | 只看该作者

没用过,据说STM32的IIC太复杂而且有bug,一般都用IO口模拟。

使用特权

评论回复
板凳
jxmzzr| | 2014-6-13 19:56 | 只看该作者
据说STM32的I2C和其他模块有些不同,其他模块完全可以交给DMA控制器,但I2C不行,必须结合中断或者IO方式,不建议IO方式,得等,万一出点岔子,被狗咬就麻烦了,所以最佳方式是结合中断。

使用特权

评论回复
地板
YingziSeek| | 2014-12-18 14:43 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

96

帖子

1

粉丝