在使用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中断里发送停止条件则不会产生此问题.
|