/**
******************************************************************************
* @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确实是个坑,可以正常工作的环境要求十分苛刻,
上一篇:STM32软件定时器的设计
下一篇:在Mac OS X中使用VIM开发STM32(4)
推荐阅读最新更新时间:2024-11-22 11:12
推荐帖子
- Cadence16.6破解完后,打开PCB Editor报错,如图所示。求助。。。
- Cadence16.6破解完后,打开PCBEditor报错,如图所示。求助。。。打开不能正常使用?直接就弹出这个?是不是破解没破解好?你是不是选错editor了? 都试过了,还是报错。。。我现在下个16.5试试~~~ :time:额,,,我16.6前前后后在N台电脑上都安装成功,从来没遇到过你的问题额。。重装吧 我问同事,也没遇到这种问题。。。装了个win732bit的虚拟机,现在好用了,估计是我原来系统组件有冲突 装了四五遍没用,,实在没法装了个WIN7
- 周张超 PCB设计
- lwIP的TCP client在资料接收问题?
- 使用8962範例专案enet_lwip中加入tcpclient,使mcu能连接到PC端的tcplistener.已测试可正常连线至pc,接通时发送6个byte至pc端去,如下程式码:staticerr_tTcpClient_Connected(void*arg,structtcp_pcb*pcb,err_terr){unsignedcharbb={0x00,0x01,0x02,0x03,0x04,0xFF};tcp_write(pcb,bb,
- tomexou 微控制器 MCU
- 51定时器任意io输出pwm的呼吸灯
- /*定时器iopwm程序*/typedefunsignedcharuint8;typedefunsignedintuint16;sfrAUXR=0x8E;//0000,0000辅助寄存器//按键和led接口定义sbitLED=P3^4;//定时器重装值#defineSYSTEM_CLOCK11059200//时钟频率#defineTIMER0_OVERFLOW_FREQ(25600)//定时器溢出频率//定时器重装值,指定类型避
- huo_hu 51单片机
- stm32串口通讯时怎样接收字符串
- 串口通讯时我想实现把pc机发过来的字符串提取出来,且提取结果能在main函数里使用,怎么配置?stm32串口通讯时怎样接收字符串附件是野火的中断例子,哪位大侠能在此基础上配置将接收的数据能在主函数里使用?定义一个数组缓冲,中断接收后放入缓冲,之后在任何想用的地方都可以直接从数组中获取。。。。。最简单的做法就是定义一个全局变量的数组,在中断中把接收到的字符逐个存储到数组中处理。请问楼主怎么解决的啊,我也遇到了同样的问题,845588678@qq.com万分感谢会问这样的问题,
- 飓风狂飙 stm32/stm8
- 为什么会输出负电压?
- 在Vi=-12v时,Vo会输出负电压,大概有-2v,为什么呢?基极和发射极反偏不应该截止吗?(两个电阻分别是174欧和300欧) 为什么会输出负电压?截止区也是在一定电压范围的为什么会输出负电压?怀疑你的测量方法或是电路的实际连接。我在Vi端输入2.7v,Vo输出2v,Vo接一个50欧的负载,三极管变得烫手,这正常吗?9014的Pcm为0.4w,没超呀。我用的9014是贴片的,是不是贴片的不好?无语,,同板凳的意见,,,,Vi=-12v时,Vo会输出负电压对!楼主英明。但多数
- PCB板 模拟电子
- 滤波器基础知识-滤波器种类
- 滤波器基础知识-滤波器种类 滤波器是一种用来消除干扰杂讯的器件,它是由集中参数的电阻、电感和电容,或分布参数的电阻、电感和电容构成的对特定频率的频点或该频点以外的频率进行有效滤除的电路(滤波器电路)。那么,滤波器种类有哪些呢?小编通过搜集整理资料,对滤波器种类及相关知识作了详细的归纳总结。 滤波器的分类(数字滤波器的分类) 1、按所处理的信号 按所处理的信号分为模拟滤波器和数字滤波器两种。 2、按所通过信号的频段 按所通过信号的频段分为低通、高通、带
- sairvee 模拟电子
设计资源 培训 开发板 精华推荐
- 具有跟踪功能的 LTM4630AIV 3.3V 和 2.5V 输出 DC/DC 稳压器的典型应用电路
- LT3091MPDE 负输出电流监视器的典型应用
- ADM00434,用于 MCP19035 300 kHz 同步降压控制器的评估板
- DC2329A,基于 LTC7124 17 VIN、具有超低静态电流的双通道 3.5A 同步降压稳压器的演示板
- 485转TTL485通信模块正常双相自动切换收发数据modbus
- AM6TW-2424DZ ±24V 6 瓦单输出 DC-DC 转换器的典型应用
- 【CW32】基于CW32无刷电机控制系统
- TCR2LN08 200mA、0.8V 输出电压 CMOS 低压降稳压器的典型应用
- DC590B,用于凌力尔特快速演示板的 USB 串行控制器
- NCP301HSN22T1 2.2V 窗口电压检测器的典型应用