如果你的项目中用STM32,而你用模拟的I2C的话,好象STM32也比8位机快不了多少,

2019-07-21 01:53发布


 如果你选择了STM32, 说明了你的项目的需求是比较复杂的,使用EMBEDDED OS 和大量地运用中断+DMA的编程模型是必然的选择, 如果你的项目中用STM32,而你用模拟的I2C的话, 说明了两点: 一是浪费了STM32; 二, 如果你的项目很复杂的话,你会发现在项目的开发后期,好象STM32也比8位机快不了多少, WHY!! ,但这不是STM32的问题,而是你没有最有效地利用上STM32.


 很多朋友在搞STM32的I2C接口编程时总是时不时“当在某处”(GOOGLE时你会发现这个问题很普遍), 一些朋友这时就会用软件来模拟I2C,然后,很快发现和I2C设备能很好地通信了(但当机还是可能随机出现), 这些朋友于是大骂STM32的I2C硬件接口是个”杯具”(呵呵,我有时也会突然想骂骂,但我知道,99.999%的原因还是自已对于STM32硬件接口的熟悉程度不够,或者说,是我没有扬STM32 I2C的长,而总是捉住他的短不发。)。     固然,STM32 I2C硬件接口有设计不完善的地方,例如下面就是我从STM32最新的Errata sheet中总结出的,关于STM32 I2C接口设计上的一些缺陷和如何避开这些缺陷的推荐程序模型: (1)把I2C的中断优先级提升到最高 (2)把发送多于2个字节的发送与接收封装成利用DMA收发的函数,而把对某I2C设备接收和发送一个字节的函数单独封装为一个POLLING (轮询)函数。 (3)在寻址某一I2C DEVICE时要先CHECK I2C BUS 是否BUSY,如果忙,则等待指定时间,如果还是忙就说明I2C BUS 挂了(原因99.9%是由于我们的I2C通信时序并不十分尊守I2C规约,或者我们所封装的I2C通信模块没有加上防守代码(出错恢复代码)),这时要调用一个专门的用于通知 I2C BUS上的所有device,让他们结束当前内部的工作,重新准备好(下雨了,收衣服啦)。如下面的我的I2C模块的FUN 切片:
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
正点原子
1楼-- · 2019-07-21 03:50
 精彩回答 2  元偷偷看……
废墟崛起之厦
2楼-- · 2019-07-21 06:33
 精彩回答 2  元偷偷看……
正点原子
3楼-- · 2019-07-21 11:41
回复【3楼】废墟崛起之厦:
---------------------------------
STM8我也用软件模拟IIC,呵呵.
废墟崛起之厦
4楼-- · 2019-07-21 16:48
不过,我调试只能达到100K,太快了果断死机....
动次打次歌
5楼-- · 2019-07-21 20:37
我的使用经验是模拟IIC想要高速,逻辑分析仪一定是少不了了的,400K以上也是妥妥的,控制也比较灵活,缺点就是模拟主机会比较浪费CPU资源,模拟从机就更浪费了,但一个高可靠性的模拟iic做下来工作量和硬件也差不了多少了,移植起来确实方便许多
jcontheroad
6楼-- · 2019-07-22 01:38
本来打算学一下硬件I2C的,既然这样,那还是继续用软件模拟吧。

一周热门 更多>