打印
[应用相关]

Stm32 I2c分析

[复制链接]
1043|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Listate|  楼主 | 2016-10-23 17:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
许多将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的中断并把它的优先级设置最高,使得他不能被中断.
沙发
bbapple| | 2016-10-23 17:37 | 只看该作者
使用I/O来模拟i2c总线时序是一种很常见的做法吧.

使用特权

评论回复
板凳
handleMessage| | 2016-10-23 17:43 | 只看该作者
但是相对于硬件i2c,在实时性和传输速度上会带来无法避免的下降啊

使用特权

评论回复
地板
bbapple| | 2016-10-23 17:51 | 只看该作者
相比之下,使用stm32的I/O口模拟i2c时序完全可以满足大部分场合的需求吧

使用特权

评论回复
5
xia00| | 2016-10-23 17:54 | 只看该作者
24c04,100KHZ(2.5v) 和400KHZ(5v)兼容

使用特权

评论回复
6
hfdy01| | 2016-10-23 18:00 | 只看该作者
许多开发人员更倾向于使用模拟i2c总线接口啊.

使用特权

评论回复
7
CallReceiver| | 2016-10-23 18:01 | 只看该作者
使用stm32的I/O口模拟i2c时移植性更佳。。

使用特权

评论回复
8
Soraka| | 2016-10-23 21:04 | 只看该作者
i2c大多都是模拟的

使用特权

评论回复
9
linxiaotuzi| | 2016-10-24 09:58 | 只看该作者
模拟的,从来没问题,其实很多情况下都不会在乎那几百微妙的延时的

使用特权

评论回复
10
woody005| | 2016-10-25 10:44 | 只看该作者
模拟的,从来没问题,其实很多情况下都不会在乎那几百微妙的延时的   确实

使用特权

评论回复
11
IversonCar| | 2016-10-25 10:58 | 只看该作者
就是速度快的话会出现bug

使用特权

评论回复
12
Snow7| | 2016-10-26 21:07 | 只看该作者
IIC比较简单,模拟IIC方便移植,所以大多都是用的模拟IIC

使用特权

评论回复
13
豆腐块| | 2016-10-26 21:42 | 只看该作者
好像硬件i2c存在bug

使用特权

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

本版积分规则

161

主题

1233

帖子

1

粉丝