首先在上一篇文章中我们搞出来了在没有外界干扰情况下的硬件i2c不卡死的一个办法
但是考虑到工程可靠性,我在后来又不断的对四个管脚进行了反复插拔测试,终于又发现了问题
在vcc和gnd两个脚上不论如何变化,硬件i2c均不存在太大的问题
对SDA管脚进行蹂躏,也未发现较大问题,硬件i2c可以继续工作
但是SCL管脚一旦受到较大电磁冲击,甚至是接上或者拔出示波器这么小的冲击,均会导致scl管脚不再输出方波信号作为时钟
经过调试发现,产生这一问题的关键原因在于,i2c1_SR2这一寄存器中的BUSY位会被置位,而且stop位不论如何操作均不可将此位置零,scl失效
我们注意到在user guide中对于这种情况是有描述的
所以解决这个问题的关键就在于直接进行软件SWRST复位i2c
至于复位完之后的i2c重新初始化,建议使用寄存器直接操作
在第一次初始化时将寄存器值记录下来,而在此处直接赋值即可
给出函数
将此函数植入我们上一篇文章中说过的那个函数中即可大致完美解决
至于说大致完美解决的意思是
在某些情况下,过度的对sda和scl进行反复干扰会出现sda被始终拉低的情况,这种情况的来源尚不清楚,而导致的结果就是busy位在SWRST被还原的时候被强制置1,上述方法失效,解决这种办法的唯一途径就是看门狗自动复位。
关键字:stm32 硬件I2C BUSY锁死
引用地址:
关于stm32硬件I2C BUSY锁死的一点说法
推荐阅读最新更新时间:2024-11-02 06:07
针对煤矿井下安全设计数字语音通信系统
中国作为产煤大国,煤矿安全一直都是重中之重。如何保证井下和井上之间可靠的实时语音通信,越来越受到关注和重视。目前煤矿通信系统主要分为两种:一种是调度电话,包括有线和无线电话;另一种是井下局部扩音电话系统。对于数字通信方式,目前许多公司仍采用模拟信号来实现煤矿语音系统,与数字语音通信系统相比,其存在不稳定、不灵活等缺点,而现阶段模拟通信系统已逐渐被代替。目前,现场总线已发展成为集计算机网络、现场控制、生产管理等内容为一体的现场总线控制系统。由于现场总线分布在自动化应用的各个角落,给设计者和使用者提供了方便,但这些应用均被限制于数据传输。本设计基于CAN总线构建井下对讲系统,与其他通信方式相比,其具有较好的实时性、可靠性和灵活性。
[单片机]
stm32 驱动2.4g cc2500 无线模块
驱动代码 BYTE spi_writebyte(BYTE value) { BYTE i,T; for(i=8; i; i--) { SPI_CLR_CLK(); SETDATA(value); Delay(3); value =1; SPI_SET_CLK(); T = 1; T |= RF_SPI_MISO; Delay(1); } SPI_CLR_CLK(); return T; } /** *@brief send one byte **/ void SpiStrobe(value) { SPI_SELECT(); spi_writebyte(value); SPI_DIS_SELECT(
[单片机]
利用STM32编码器进行任意位置确定
车轮位置的确定是在制作小车的过程中必不可少的部件,好在STM32中包含了硬件的编码器。但使用的过程中却存在诸多不方便。下面由我一一道来: 1。编码器原理 什么是正交?如果两个信号相位相差90度,则这两个信号称为正交。由于两个信号相差90度,因此可以根据两个信号哪个先哪个后来判断方向、根据每个信号脉冲数量的多少及整个编码轮的周长就可以算出当前行走的距离、如果再加上定时器的话还可以计算出速度。 2。为什么要用编码器 从上图可以看出,由于TI,T2一前一后有个90度的相位差,所以当出现这个相位差时就表示轮子旋转了一个角度。但有人会问了:既然都是脉冲,为什么不用普通IO中断?实际上如果是轮子一直正常旋转当
[单片机]
STM32 HardFault_Handler 硬件错误 解决办法
在用Keil对STM32的程序进行仿真时程序有时会跑飞,停止仿真程序会停在HardFault_Handler函数里的死循环while(1)中。这说明STM32出现了硬件错误。 STM32出现硬件错误可能有以下原因: (1)数组越界操作; (2)内存溢出,访问越界; (3)堆栈溢出,程序跑飞; (4)中断处理错误; 遇到这种情况,可以通过以下2种方式来定位到出错代码段。 方法1: 1.1在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击“STOP”停止仿真。 1.2 在Keil菜单栏点击“View”——“Registers Window”,在寄存器查看窗口查找R14(LR
[单片机]
基于STM32的嵌入式以太网门禁系统设计
引言 当前,有很多的企业是采用佩戴工作证来完成门禁管理,而且还是采用传统的人工方式完成,不仅容易被人混入,且没有记录,存在各种人为的失误。同时,市场上门禁系统存在传输距离受限制、性能不佳等问题。 随着嵌入式技术日新月异的发展,以及以太网技术的普及,使得基于以太网的嵌入式产品越来越多,发展也越来越快。本文研究的就是采用以太网传输数据和射频芯片识别智能卡相结合的门禁系统,相对于传统的门禁系统,以太网解决了传输距离上的问题。其次,采用了基于80C51内核的射频芯片PN532,使得性能更加稳定。其工作的基本原理是先将智能卡放在门禁系统上,系统读取数据并传送给主芯片STM32进行处理,主芯片处理后再通过以太网协议LwIP将数
[单片机]
【STM32 Cotex-M3处理器系列编程】定时器输出PWM波
//使用定时器TIM4的3通道CH3输出占空比为25%的PWM波 #include stm32f10x.h int main(void) { // SystemInit(); //配置IO口 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE,ENABLE);//IO口使能设置 GPIO_InitTypeDef GPIO_InitStructure; //定义结构体 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //TIM3的C
[单片机]
STM32串口输出乱码的原因
最近学习 STM32 开发,申请了一块免费的开发版,按照书上的内容学习,学到USART,发现串口输出始终乱码,妈蛋的,搞不懂为啥,代码啥的都是按照书上来的啊,最后搜索很久,发现是外部 时钟 频率配置错误导致的,库使用默认8MHz晶震,可以通过宏使用25MHz晶震。具体定义在stm32f10x.h文件中 这里提供了实用8MHz或者25MHz晶震,但是我2个都尝试了,还是乱码,最后一想,是不是我的开发版晶震不是这个值哦,最后拿着开发版一看,妈蛋的,果然不是,而是使用的12MHz晶震,立马自己定义一个宏修改成12000000,编译,烧写,一下就对了。坑啊! 怎么看自己的开发版晶震是多少,看图 然后修改上面的代码,加一个宏定义就
[单片机]
详解stm32能跑什么系统
STM32系列32位微控制器,基于ARM Cortex-M3处理器。它能支持32位广泛的应用,支持包括高性能、实时功能、数字信号处理,和低功耗、低电压操作,同时拥有一个完全集成和易用的开发。 基于STM平台且满足实时控制要求的操作系统,有以下4种可供选择。分别为μC/OS-II、μClinux、eCos、FreeRTOS和都江堰操作系统(djyos)。下面分别介绍这五种嵌入式操作系统的特点及不足。 1、μC/OS-II μC/OS-II 是一种基于优先级的抢占式多任务实时操作系统,包含了实时内核、任务管理、时间管理、任务间通信同步(信号量,邮箱,消息 队列)和内存管理等功能。它可以使各个任务独立工作,互不干涉,很容易实现准时而且无
[单片机]