/**

******************************************************************************

* @author    Maoxiao Hu

* @version   V1.0.0

* @date       May-2015

******************************************************************************

* < COPYRIGHT 2015 ISE of SHANDONG UNIVERSITY >

******************************************************************************

**/

调试STM32的硬件I2C已经有很长一段时间了,几乎搜遍了所有资料,对于其到底能不能正常工作,今天做一个彻底的研究。

下面是我在测试中得到的几个结论:

1、硬件I2C的CLK在50kHz及以下的情况下工作,不会出现任何情况下的卡住。(本人测试时间为20h)

2、硬件I2C的CLK在常用的100kHz和400KHz下工作,99%的概率下会在1小时之内卡住,甚至只有几十秒。

3、硬件I2C的CLK在任何频率下工作,在读取或者发送数据时,都绝对不允许其它中断事件打断它的工作,否则一定会卡住,只是时间问题。

综上,硬件I2C的稳定工作情况是:工作在50kHz及以下,并且保证无其它任何中断打断它的工作。这样只适用于某些对速率要求不高的场所,比如EEPROM的读取等,而对于高速器件例如某些型号的AD芯片,就不能用了。

如果你一定需要高速率(400KHz),那么推荐大家使用STM32的替代方案GD32(兆易创新),它与STM32完全兼容但是解决了STM32的硬件I2C bug,经过本人实际测试,在400KHz的情况下工作,48小时无任何错误发生。但是仍需注意的是不能有外部中断打断I2C的工作。

对于ST公司推荐的将I2C工作在DMA和最高优先级的中断,我只能说大家可以根据自己的情况使用,因为如果你使用了ucos ii或者其它实时操作系统,那么这种设置最高优先级的方式是绝对不推荐的。如果你是裸机程序,并且任务数量不多,可以考虑这种DMA+中断的方式,否则一定会出现问题,只是测试时间长短问题。

最后需要说明的是:

(1)以上只是考虑了最纯粹的硬件I2C代码,对于某些使用了软件弥补的方法,例如在经常卡住的部分设置超时退出,不在本文的讨论范围内,因为这样已经破坏了正常的I2C协议。

(2)由于使用STM32的较高境界是使用中断调度任务而不是死等循环,而硬件I2C对于中断打断十分忌讳,所以随着你的编程和对操作系统理解水平的提高,你会越来越感觉STM32硬件I2C是个坑。

所以,STM32的硬件I2C确实是个坑,可以正常工作的环境要求十分苛刻,所以本人现在已转而使用GD32芯片。

来源于http://www.cnblogs.com/humaoxiao,转载请注明出处。

STM32 硬件I2C 到底是不是个坑?的更多相关文章

  1. 浅谈 STM32 硬件I2C的使用 (中断方式 无DMA 无最高优先级)(转)

    引子 STM32的硬件I2C很多人都对它望而却步.因为很多电工都说,STM32 硬件 I2C有BUG.不稳定.死机等等……最后都使用GPIO模拟I2C. 的确,模拟I2C好用.但是在我看来在一个72M ...

  2. 转载:关于STM32硬件I2C读写EEPROM代码实现原理的理解与总结

    http://home.eeworld.com.cn/my/space-uid-716241-blogid-655190.html 一.I2C协议简介 I2C是两线式串行总线,用于连接微控制器及其外围 ...

  3. (转)stm32硬件IIC

    cube与I2C:https://www.cnblogs.com/121792730applllo/p/5044920.html I2C官网:https://www.i2c-bus.org/stand ...

  4. 浅谈STM32L071硬件I2C挂死

    STM32的IIC问题一直存在,在网上也被很多人吐槽,然而FAE告诉我,硬件IIC的问题在F1,F3,F4系列单片机存在,而在L0上已经解决了,然而这几天调试加密芯片和显示芯片,都是IIC芯片,却再一 ...

  5. STM32F10x_硬件I2C主从通信(轮询发送,中断接收)

    Ⅰ.写在前面 关注我分享文章的朋友应该知道我在前面讲述过(软件.硬件)I2C主机控制从机EEPROM的例子.在I2C通信主机控制程序是比较常见的一种,可以说在实际项目中,很多应用都会使用到I2C通信. ...

  6. STM32F10x_硬件I2C读写EEPROM(标准外设库版本)

    Ⅰ.写在前面 上一篇文章是“STM32F10x_模拟I2C读写EEPROM”,讲述使用IO口模拟I2C总线通信,对EEPROM(AT24Xxx)进行读写操作的过程. 上一篇文章主要内容:I2C协议.模 ...

  7. 关于STM32的I2C硬件DMA实现

    关于STM32的I2C硬件DMA实现 网上看到很多说STM32的I2C很难用,但我觉得还是理解上的问题,STM32的I2C确实很复杂,但只要基础牢靠,并没有想象中的那么困难. 那么就先从基础说起,只说 ...

  8. STM32F407的硬件I2C

    源:STM32F407的硬件I2C 我使用的是STM32的固件库. 硬件模块使用之前必须配置其参数,I2C的配置如下: void IIC_Config(void) { GPIO_InitTypeDef ...

  9. STM32硬件IIC驱动设计(转)

    源: STM32硬件IIC驱动设计 参考: STM32—硬件IIC主机通信 STM32’s I2C 硬件BUG引发的血案(qzm) 解决STM32 I2C接口死锁在BUSY状态的方法讨论

随机推荐

  1. SQL 基本知识

    四个基础语法 1. insert into 表名 (列名) [values] 值列表 insert into 表名 values 值列表 [扩展]插入多行: 1. insert into <表名 ...

  2. 【Excel】宏之初认识

    出于提高效率的原因,希望excel能够不需要人为干预的完成一些操作,学习excel宏的编写与调试: 第一列输入公式,第二类输出计算结果:(如果自动获取文件的行数,待补充) Sub Calc() a = ...

  3. Qt5 主窗口组成

    1. 菜单栏 菜单是一系列命令的列表.为了实现菜单.工具栏按钮.键盘快捷键等命令的一致性,Qt使用动作(Action)来表示这些命令.Qt的菜单就是由一系列的QAction动作对象构成的列表,而菜单栏 ...

  4. Ubuntu 使用Cisco VPN、AnyConnect、OpenConnect的方法。

    自己建的廉价Shadowsocks服务器总是不稳定,众所周知,PPTP在中国大陆已经废了.为了连接外网,所以购买了BlueCloud的VPN.但是他们家的VPN是使用Cisco VPN,可以使用Any ...

  5. 设置vim默认参数 例如设置默认背景颜色

    因个人喜好问题,本人使用vim的时候喜欢将背景颜色设为dark. 但是每次打开一个vim的时候都要重新设置一次,感觉非常麻烦. 总要输入[Esc] :set bg=dark很不方便 粗暴的办法是直接进 ...

  6. js参数传递分析

    需要明白,js基本类型存放在栈,对象存放在堆. 结论:基本类型变量作为参数,不会改变变量值.对象变量作为参数,不修改属性(访问原始对象的操作),也不会改变变量值 起因,是群里一个问题: var a = ...

  7. wordpress视频教程

    wordpress还不错的一套自动赚钱视频教程 http://www.ggfenxiang8.com/?p=256

  8. SQLALchemy(连表)、paramiko

    本节内容:

  9. js调用函数时括号加与不加的区别,function()&function

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  10. Linux系统上通知网关更新arp

    经常会有在线更换Linux服务器IP的操作,该操作带来的一个问题是: 我们已经执行了修改IP的操作,但由于网络上(网关)的ARP缓存暂未更新,导致在某一段时间内,该服务器会有网络不通的情况存在. 因此 ...