GD32 MCU碰到IIC总线卡死怎么办?

发布者:Huanle最新更新时间:2024-11-07 来源: elecfans关键字:GD32  MCU  IIC总线 手机看文章 扫描二维码
随时随地手机看文章

大家在使用MCU IIC通信时,若碰到设备复位或者总线干扰等情况,可能会导致IIC总线卡死,表现上总线上SDA或者SCL其中一根线为低电平,IIC总线一直处于busy状态。此时若代码上一直等待总线空闲,则可能导致软件死机,为解决该问题,本视频提供了软件配置释放IIC总线的方法。


首先为大家介绍发生IIC总线卡死的两种情况:(1)主机在发送 START 信号后, 控制 SCL 产生 8 个时钟脉冲,然后拉低 SCL 信号为低电平,在这个时候,从设备输出应答信号,将 SDA 信号拉为低电平。如果这个时候主机异常复位, SCL 就会被释放为高电平。此时,如果从机没有复位,就会继续 I2C 的应答,将 SDA一直拉为低电平,直到 SCL 变为低电平,才会结束应答信号。 而由于 I2C 主机复位后检测总线的状态,如果 SDA 信号为低电平,则 I2C 总线被占用,会一直等待 SCL 和 SDA信号变为高电平,因此,在 I2C 主机等待从机释放 SDA 信号时, I2C 从机又在等待主机将 SCL 信号拉低以释放应答信号,两者相互等待, I2C 总线进入死锁状态 ;(2)主机在发送 START 信号后, 控制 SCL 产生 8 个时钟脉冲,然后拉低 SCL 信号为低电平,在这个时候,从设备输出应答信号,将 SDA 信号拉为低电平。如果这个时候主机异常复位, SCL 就会被释放为高电平。此时,如果从机没有复位,就会继续 I2C 的应答,将 SDA一直拉为低电平,直到 SCL 变为低电平,才会结束应答信号。 而由于 I2C 主机复位后检测总线的状态,如果 SDA 信号为低电平,则 I2C 总线被占用,会一直等待 SCL 和 SDA信号变为高电平。因此,在 I2C 主机等待从机释放 SDA 信号时, I2C 从机又在等待主机将 SCL 信号拉低以释放应答信号,两者相互等待, I2C 总线进入死锁状态 。

wKgZomXZShGAD0AVAAC3zH17MmY045.png


以下为两种复位IIC总线卡死的软件方法,大家可以尝试使用:

(1)将SDA和SCL配置为推挽输出,强制输出stop信号

在 I2C 主机复位后,主机检测 I2C 总线一直为 BUSY 状态,且超过设定的时间,则总线被锁死。可通过将 I2C 的 SCL 和 SDA 引脚初始化成普通 GPIO 功能,配置成推挽输出。 先拉高SCL 信号,在拉高 SDA 信号,模拟产生一个 STOP 信号,然后再配置为 I2C 的引脚复用功能。配置代码如下所示。

/*! brief reset i2c bus param[in] none param[out] none retval none */ void i2c_bus_reset() { GPIO_BC(GPIOB) |= GPIO_PIN_6 | GPIO_PIN_7; gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6|GPIO_PIN_7); __nop(); __nop(); __nop(); __nop(); __nop(); GPIO_BOP(GPIOB) |= GPIO_PIN_6; __nop(); __nop(); __nop(); __nop(); __nop(); GPIO_BOP(GPIOB) |= GPIO_PIN_7; gpio_init(GPIOB, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_6 | GPIO_PIN_7); } /*! brief check the I2C is or not busy param[in] none param[out] none retval none */ void check_bus_status(void) { while(i2c_flag_get(I2C0,I2C_FLAG_I2CBSY)) { if(--time_out == 0){ i2c_bus_reset(); } } }

wKgaomXZShiAbcOxAACtlqGCdfA351.png


(2)将SCL配置为推挽输出,强制输出9个clk

在 I2C 主机中增加 I2C 总线恢复程序。每次 I2C 主设备复位后,如果检测到 SDA 数据线被拉低,则控制 I2C 中的 SCL 时钟线产生 9 个时钟脉冲(针对 8 位数据的情况),这样 I2C 从设备就可以完成被挂起的操作,从死锁状态中恢复过来。

I2C 主机通过将 SCL 引脚初始化为普通 GPIO 功能,配置成推挽输出。保证连续发送 9 个时钟脉冲,为保证后续 I2C 正常通信,先将 I2C 模块复位,再置位,最后再配置为 I2C 的引脚复用功能。配置代码如下所示。

/*! brief reset i2c bus param[in] none param[out] none retval none */ void i2c_bus_reset() { uint8_t I = 0; gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6); /* SCL output clock signal */ for(I = 0; I < 10; i++){ gpio_bit_reset(GPIOB, GPIO_PIN_6); delay_1us(2); gpio_bit_set(GPIOB, GPIO_PIN_6); delay_1us(2); } /* reset I2C */ i2c_software_reset_config(I2C0, I2C_SRESET_RESET); i2c_software_reset_config(I2C0, I2C_SRESET_SET); gpio_init(GPIOB, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_6 | GPIO_PIN_7); } /*! brief check the I2C is or not busy param[in] none param[out] none retval none */ void check_bus_status(void) { while(i2c_flag_get(I2C0,I2C_FLAG_I2CBSY)) { if(--time_out == 0){ i2c_bus_reset(); } } }

wKgaomXZSh6AfaDhAADGMKXklJo287.png

关键字:GD32  MCU  IIC总线 引用地址:GD32 MCU碰到IIC总线卡死怎么办?

上一篇:GD32 FATFS+FTL Nand解决方案
下一篇:基于GD32驱动BLDC电机(1)定时器和PWM

推荐阅读最新更新时间:2024-11-20 10:02

AVR单片机跑马灯的仿真设计
简易的跑马灯设计。基于AVR单片机 仿真原理图如下: 单片机源程序如下: /******************************************************************** 汇诚科技 *********************************************************************/ #include iom16v.h /********************************************************************** 函数数据类型说明
[单片机]
AVR<font color='red'>单片机</font>跑马灯的仿真设计
51 单片机简单的多任务调度例子
利用定时器2产生10mS的定时中断作为时钟节拍,任务切换时保存工作寄存器等操作 嵌入了汇编指令,因此Task_Switch.C文件要做相应的设置才能编译通过。受硬件资源和编译器的限制,有很多无奈。程序只好这样写了,不管怎么说,到底是能调度起来了。 注:这里是老版本,后面又改动的新版本。 /******************************************************* 本程序只供学习使用,未经作者允许,不能用于其它任何用途 AT89S52 MCU 使用24M晶振 时钟节拍设置为10mS main.c file Created by Computer-lov. Date: 2005.10.27 Co
[单片机]
STC89C52RC单片机额外篇 | 07 - 使用Keil搭建与管理项目式多文件工程
1 单一式与项目式工程对比 新建一个Keil工程,初学者一般都会新建一个文件夹,然后将每个涉及到的.c与.h文件,还有keil的输出文件都一下放在这个文件夹里,如下图: 图中有我们自己建立的.c与.h文件以外,那些没有图标的就是Keil输出的一些文件,当然也包括我们要的.hex文件,这样看起来就会感觉乱乱的。 我们再看看下面这个文件夹: 在这个工程下分别建立了以下文件夹: include:用来存放我们头文件.h。 output:用来存放Keil输出的一些文件。 source:用来存放.c的一些源码。 utility:是用来存放一些通用的工具,比如将hex转为bin二进制文件。 其他的是一些工程文件。(这里的
[单片机]
STC89C52RC<font color='red'>单片机</font>额外篇 | 07 - 使用Keil搭建与管理项目式多文件工程
单片机自身的抗干扰措施研制
  为提高单片机本身的可靠性。近年来单片机的制造商在单片机设计上采取了一系列措施以期提高可靠性。这些技术主要体现在以下几方面。 1.降低外时钟频率   外时钟是高频的噪声源,除能引起对本应用系统的干扰之外,还可能产生对外界的干扰,使电磁兼容检测不能达标。在对系统可靠性要求很高的应用系统中,选用频率低的单片机是降低系统噪声的原则之一。以8051单片机为例,最短指令周期1 s时,外时钟是12MHz。而同样速度的Motorola 单片机系统时钟只需4MHz,更适合用于工控系统。近年来,一些生产8051兼容单片机的厂商也采用了一些新技术,在不牺牲运算速度的前提下将对外时钟的需求降至原来的1/3。而Motorola 单片机在新推出的68HC
[单片机]
51单片机 (4)中断系统
相关概念 中断源:引起中断的事件 中断请求:中断源向CPU提出处理的请求 断点:发生中断时被打断程序的暂停点 中断响应:CPU暂停现行程序而转为响应中断请求的过程 中断处理程序:处理中断源的程序 中断处理:CPU执行有关的中断处理程序 中断返回:返回断点的过程 中断与子程序的区别 调用有点相似、但两者是不同的概念。 源不同。中断是由外部中断源产生的、具有不可预测和随机性、比如抛异常。子程序是由主程序安排调用的。 响应不同。中断系统需要保护断点和现场、子程序只需保存断点。 功能不同。中断程序主要处理CPU外部异步事件、子程序调用是为主程序服务。 中断类型 外部中断源:外部硬件资源产生。上
[单片机]
Microchip新增低成本USB PIC单片机
2008年6月3日,单片机和模拟半导体供应商——Microchip Technology Inc.(美国微芯科技公司)今天宣布新增一系列支持USB应用的8位PIC®单片机(MCU)。PIC18F13K50及PIC18F14K50(PIC18F1XK50)是目前Microchip所有USB单片机中成本最低的,可提供多种其他平价8位单片机欠缺的功能,使得更多应用能添加嵌入式USB功能。 有了这一新的产品系列,Microchip现拥有业界最全面的8位、16位及32位USB单片机产品线,且均由单一集成开发环境——免费的MPLAB® IDE支持。该集成开发环境为所有PIC单片机提供了统一的开发平台,为设计工程师研发性能更高及功
[新品]
烧录Hex文件到Silabs单片机
通常我们会用烧录器EC5或者EC6在Silabs IDE下载程序 但是有很多人会比较习惯用Keil生成Hex文件再烧录 其实这也是可以的 Silabs也提供了下载的工具 路径:C:SiLabsMCUUtilitiesProduction Programmer 下面有个exe文件:MCUProductionProgrammer.exe 打开后在program menu 下面有个config programming information 选项 进去如下所示 part number 处选择单片机型号,Hex file location选择hex文件所在位置 accept setting后 program d
[单片机]
单片机系统设计的误区与对策
单片机系统在军事、工业、民用产品中的应用越来越广。它将许多以往用硬件实现的功能由软件来完成,体积小巧、功能丰富、智能化程序度,但在可靠性方面也面临许多新问题。用现场电磁兼容性(EMC)理论剖析单片机系统设计中的某些传统观念,会发现许多误区,并且有些误区至今还在工程界广为存在。 1 误区之一:有了看门狗就不会死机 死机是指CPU的程序指针进入一个死循环,无法执行正常的程序流程。其外在表现常常是:正常功能丧失,按键无响应,显示凝固。单片机死机后,只有复全才能走出死循环,执行正常的程序流程。众所属知,克服死机的最有效手段是加看门狗(WatchDog)。 目前用得最广泛的看门狗实际上是一个特殊的定时器DogTimer。DogTime
[单片机]
<font color='red'>单片机</font>系统设计的误区与对策
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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