STM32学习笔记| I2C通讯容易出错的情况
I²C:全名是Inter-Integrated Circuit。它是串行通信总线,通常用于嵌入式电子产品中。
I²C是飞利浦在1980年开发的一种通信总线,用于连接各种低速设备(飞利浦芯片)。目前,I²C仍然是最常见的通信总线之一。
现在,大多数MCU都在内部集成了I²C控制器,STM32也不例外。至少有一个I²C控制器,有些型号甚至多达六个。
嵌入式第1栏STM32& I2C基本内容I²C总线协议具有多个版本,某些STM32遵循第二版本,有些是第三版本。因此,在不同型号的STM32中,I²C可能有所不同,但是基本功能是相似的。
1.主从模式特性主模式特性:时钟生成起始位和停止位生成从模式特性:可编程I²C地址检测双寻址模式,可以通过停止位检测来响应2个从地址。2.通信速度标准速度:上升最高100 kHz最快速度:最高400 kHz超快速度:最高1 MHz(版本3)3.寻址模式7位寻址模式10位双寻址模式通用呼叫地址4.从发送器到接收器的收发器模式这些是STM32I²C的基本功能。
有关更多信息,请参阅与该芯片对应的参考手册。嵌入式第2列I2C总线协议I²C总线有两条线:SCL时钟信号和SDA数据信号。
其中,SCL由主机生成,而SDA由主机或从属设备生成。 I²C是同步串行通信。
SDA只能同时由一台设备发送,这意味着它属于半双工通信。可以通过参考总线的时序(SDA和SCL)来理解I²C总线协议:它通常包含:起始位,数据/地址,ACK和结束位。
1.当时钟线保持高电平时,SDA数据线从高电平变为低电平时启动和停止:这是总线启动条件;当时钟线保持高电平时,SDA数据线从低电平变为高电平:这是总线结束条件; 2.地址I2C地址分为7位和10位。 7位地址:10位地址:3.确认(ACK)确认(ACK)和非确认(NACK)发生在每个字节之后,并且接收方向发送方发送确认信号,表明数据已成功发送收到并可以继续发送下一个数据字节。
有关I2C总线协议的更多信息,请参阅:https://zh.wikipedia.org/wiki/I²Chttps://www.nxp.com/docs/zh-CN/user-guide/UM10204.pdf嵌入式列3 STM32 I2C常见问题I²C总线通信通常不添加某些复杂的(软件)通信协议,例如CAN和USB。尽管I²C的硬件和协议很简单,但在实际应用中经常会出现各种问题。
让我们分析以下常见问题。问题1:IO模式不正确。
一些工程师不了解用于I²C总线的GPIO。编写驱动程序代码时,总线(SDA,SCL)被配置为推挽输出模式,这会导致应用程序异常。
I²C总线是一种特殊的总线,因为多个设备需要共享总线,并且数据线需要支持双向通信。 SDA需要漏极开路输出模式。
当由于漏极开路而无法直接输出“高”电平时,则需要一个外部上拉电阻。解决方案:STM32的IO具有8种应用模式。
如果您通过软件模拟I²C并将SDA配置为带上拉电阻的开漏输出模式。这通常适用于主模式设备。
如果使用硬件I²C,则需要将其配置为漏极开路复用功能。建议使用STM32CubeMX工具配置基础初始化代码。
问题2:总线电压与I²C总线电压不匹配,通常为3.3V或5V。 I²CC总线上有许多设备,并且可能有特殊的电压,例如2.5V或3.3V与5V不兼容,这很容易引起信号识别错误和总线通信故障。
解决方案:如果存在电压不匹配,则需要从硬件方面解决,例如:通过专业的转换模块。问题3:崩溃I²C总线的软件检测通常使用ACK信号来确定总线的状态。
STM32实现I²C的发送和接收,检测及其他操作由内部控制器自动完成。但是,由于干扰信号,电压不匹配等外部因素的影响,很容易在总线上引起异常信号,从而导致检测失败和通信失败。
解决方案:为解决这种由异常导致的崩溃,除了调整硬件之外,还可以从软件开始。常见的方法是添加超时处理机制,并且不要让程序一直死掉并等待