许多将STM32微控器应用到实际项目中的开发人员发现,I2c接口存在工作不稳定的现象,比如经常出现传输失败或陷入死循环,原因在于:stm32的硬件i2c时序不能被中断!
根据ST所给出的建议对i2c接口中断优先级进行修改使用,确实可以避免这个问题.
但若将i2c总线接口的中断优先级改至最高,那便意味着使用了i2c中断的潜入系统中,其余的中断服务将有可能被i2c中断所嵌套,这种霸道的处理方式很显然无法适用于所有的i2c总线应用场合.
而若使用i2c的DMA模式,则会显著提升应用程序的开发难度,同时i2c接口的灵活性大大降低!
I2c外设:
某些软件事件必须在发送当前字节之前处理
问题描述:
如果没有在传输当前字节之前处理EV7,EV7_1,EV6_1,EV2,EV8和EV3事件,有可能产生问题,如收到一个额外字节,两次读到相同的数据或丢失数据.
暂时解决办法:
当不能再传输当前字节之前和改变ACK控制位送出相应脉冲之前,处理EV7,EV7_1,EV6_1,EV2,EV8和EV3事件时,建议如下操作:
①使用i2c的DMA模式,除非作为主设备时只接受一个字节.
②使用i2c的中断并把它的优先级设置最高,使得他不能被中断.
但是,
使用I/O来模拟i2c总线时序是一种很常见的做法.
但是相对于硬件i2c,在实时性和传输速度上会带来无法避免的下降,但i2c总线本身就不是一种速度很快的总线(最高400khz),同时也不需要具备很高的实时性能.相比之下,使用stm32的I/O口模拟i2c时序完全可以满足大部分场合的需求,并且移植性更佳,因此许多开发人员更倾向于使用模拟i2c总线接口.
|