关于stm32硬件I2C BUSY锁死的一点说法

2019-08-15来源: eefocus关键字:stm32  硬件I2C  BUSY锁死

首先在上一篇文章中我们搞出来了在没有外界干扰情况下的硬件i2c不卡死的一个办法

但是考虑到工程可靠性,我在后来又不断的对四个管脚进行了反复插拔测试,终于又发现了问题

在vcc和gnd两个脚上不论如何变化,硬件i2c均不存在太大的问题

对SDA管脚进行蹂躏,也未发现较大问题,硬件i2c可以继续工作

但是SCL管脚一旦受到较大电磁冲击,甚至是接上或者拔出示波器这么小的冲击,均会导致scl管脚不再输出方波信号作为时钟

经过调试发现,产生这一问题的关键原因在于,i2c1_SR2这一寄存器中的BUSY位会被置位,而且stop位不论如何操作均不可将此位置零,scl失效

1

我们注意到在user guide中对于这种情况是有描述的

2

所以解决这个问题的关键就在于直接进行软件SWRST复位i2c

至于复位完之后的i2c重新初始化,建议使用寄存器直接操作

3

在第一次初始化时将寄存器值记录下来,而在此处直接赋值即可

给出函数

4

将此函数植入我们上一篇文章中说过的那个函数中即可大致完美解决

5


至于说大致完美解决的意思是

在某些情况下,过度的对sda和scl进行反复干扰会出现sda被始终拉低的情况,这种情况的来源尚不清楚,而导致的结果就是busy位在SWRST被还原的时候被强制置1,上述方法失效,解决这种办法的唯一途径就是看门狗自动复位。

关键字:stm32  硬件I2C  BUSY锁死

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic471184.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:小熊STM32学习总结:STM32的定时器--输入捕捉模式
下一篇:STM32F429DISCO+AT070TN92 7寸LCD

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

【STM32F103】中断综述

一、中断内核: STM32的中断很强大,每个外设都可以产生中断,F103在内核水平上搭载了异常响应系统,系统异常有8个(算上RESET和HardFault也就10个),外部中断有60个,但是根据NVIC(嵌套向量中断控制器,控制整个芯片中断相关的功能),IP(中断优先级寄存器)数组中预留了240个位置(NVIC结构如上图),可见眼光之远,用于扩展,这是STM32F103用不到这么多。如果以后要找跟内核相关的函数,都存在core_cm3.c和misc.c中,包括NVIC的函数的声明,但是其具体的库函数内容并不是和固件库头文件core_cm3.h一致(不在core_cm3.c),而是放在库函数的misc.c中,这点需要
发表于 2019-08-23
【STM32F103】中断综述

关于由CubeMx生成stm32f4+freertos,不正常分析之堆栈大小设置

freertos官方手册上有说,移植中出现的问题大多数是由堆栈设置不合理造成的,今天结合自身遇到问题分析一下1.任务堆栈设置过小,很容易造成硬件溢出,跳转到void HardFault_Handler(void);调试方法,可以通过调用函数,UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask );来跟踪剩余堆栈,不过在CubeMx中的Configuration->FreeRtos->Include parameters中使能uxTaskGetStackHighWaterMark函数;2.整体设置过小,TOTAL_HEAP_SIZE
发表于 2019-08-23

CubeMX Stm32F407生成一定周期的占空比不同的方波DMA+定时器

先上图如图 是我生成的一个波形  这个波形的占空比在连续的四个周期内分别是10%,20%,30%,40%, 并且按照这个顺序循环这里大致介绍一下实现的方式。使用的软件是Cubemx(库函肯定也可以实现)第一步是器件选型  这一部分不做介绍  用的是Stm32F407第二是时钟配置接下来是定时器配置 第三步就是生成代码了这里 需要在生成的代码里面加上一行开始的代码。
发表于 2019-08-23
CubeMX Stm32F407生成一定周期的占空比不同的方波DMA+定时器

STM32学习日志--使用DMA功能自动更新PWM的输出

/******************************************************************************* 编译环境: EWARM V5.30 硬件环境: DZY2.PCB STM32 FW:   V3.0.0 作者 : szlihongtao ****************************************************************************** REV  : V1.00 DATE : 2011-04-18 NOTE
发表于 2019-08-23

STM32控制SG90舵机

简介通过使用STM32控制SG90舵机进行转动PWM输出:PC6定时器:TM3,通道1接线如下:控制原理及PWM配置舵机的控制一般需要一个20ms的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分PWM周期为20ms = (7200*200)/72000000=0.02所以TIM_Period = 199,TIM_Prescaler = 7199占空比 = t / T 相关参数如下:t = 0.5ms——————-舵机会转动 0 °t = 1.0ms——————-舵机会转动 45°t = 1.5ms——————-舵机会转动 90°t = 2.0ms——————-舵机会转动 135°t = 2.5ms
发表于 2019-08-23
STM32控制SG90舵机

用PWM控制舵机(以是stm32为例)

为0.5ms-2.5ms<占空比2.5%~12.5%>范围内的角度控制脉冲部分,总间隔为2ms。即:0.5ms--------------0度;1.0ms------------45度;1.5ms------------90度;2.0ms-----------135度;2.5ms-----------180度;注意:注意控制舵机的信号,电源要共地。 STM32的实现/* 系统默认时钟72MHz, 初始化定时器生成PWM, 参考正点原子的程序 * 72000000/(719+1)/(1999+1)=50Hz  1/50*1000=20ms */TIM3_PWM_Init(1999,719
发表于 2019-08-23
用PWM控制舵机(以是stm32为例)

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved