打印
[应用相关]

Stm32 I2c分析

[复制链接]
534|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Mozarts|  楼主 | 2016-8-31 19:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
许多将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总线接口.
沙发
feiqi1| | 2016-8-31 19:30 | 只看该作者
某些软件事件必须在发送当前字节之前处理。。

使用特权

评论回复
板凳
androidbus| | 2016-8-31 19:37 | 只看该作者
24c04,100KHZ(2.5v) 和400KHZ(5v)兼容。。

使用特权

评论回复
地板
litengg| | 2016-8-31 19:42 | 只看该作者
这个寄存器问题相关的总是让人很难理解啊。

使用特权

评论回复
5
qiangweii| | 2016-8-31 20:09 | 只看该作者
记得好像页面写周期典型值为2ms吧。

使用特权

评论回复
6
Mozarts|  楼主 | 2016-8-31 20:25 | 只看该作者
litengg 发表于 2016-8-31 19:42
这个寄存器问题相关的总是让人很难理解啊。

多看看就熟悉啦

使用特权

评论回复
7
shashaa| | 2016-8-31 20:41 | 只看该作者
使用I/O来模拟i2c总线时序是一种很常见的做法.

使用特权

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

本版积分规则

70

主题

1320

帖子

0

粉丝