你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32学习笔记 | I2C通信容易出错的情况

[复制链接]
STMCU小助手 发布时间:2021-3-1 10:05
STM32学习笔记 | I2C通信容易出错的情况

( O( s3 a  h& i; \4 `7 C
I²C:全称为Inter-IntegratedCircuit(内部集成电路),是一种串行通讯总线,常用于嵌入式电子产品中。
8 F! L) `; X; ~0 E, o/ {
I²C是飞利浦公司在1980年为了让各种低速设备(飞利浦芯片)连接起来而研发的一种通信总线。目前,I²C依然是最常见的通信总线之一,现在绝大部分MCU都内部集成了I²C控制器,STM32也不例外,至少有一个I²C控制器,有的型号甚至多达6个。

9 _" H* o* w" K9 w6 x: S% B
1.     STM32 I2C基础内容
I²C总线协议有多个版本,有的STM32遵循的是第2版本,有的是第3版本。所以,不同型号的STM32 中I²C 可能存在一些差异,但基本功能相似。

% b" l- v+ t% d
1. 主从模式特性

8 e" H% }- `! V, S6 ]% p$ K% Y
主模式特性:
※       时钟生成
※       起始位和停止位生成

9 H6 R6 L( z" s/ u: V( h
从模式特性:
※       可编程 I²C地址检测
※       双寻址模式,可对 2 个从地址应答
※       停止位检测
  H% {9 i1 \& G
2. 通信速度
$ f7 z4 l* O8 e9 y" L
标准速度:高达 100 kHz
快速速度:高达 400 kHz
超快速度:高达 1 MHz(第3版)
2 B3 x, k. h/ q% _3 j6 M, D
3.寻址模式
1 z) J' m4 V- W  `" o8 w
※       7 位寻址模式
※       10 位双寻址模式
※       广播呼叫地址

, u1 c: J3 w) w# |- @. r
4.收发模式
( f  \! {* ^, c3 m
※       从发送器
※       从接收器
※       主发送器
※       主接收器

1 M' V" g# `* N8 j7 Q) b! u
这些都是STM32 I²C 的基础功能,更多内容请查阅芯片对应的参考手册。

2 v6 \% \7 p7 g/ h. B
2.     I2C 总线协议
I²C总线就两根线:SCL时钟信号,SDA数据信号。其中SCL由主机产生,SDA由主机或者从机产生。

$ v9 |$ w( `; G6 {) G; H5 o
I²C是同步串行通信,同一时间SDA只能由一个设备发送信号,也就是说它属于半双工通信。
- S1 N5 f! g, ~; t# L' Y0 a
I²C 总线协议可参考总线(SDA和SCL)的时序进行理解:

$ S1 _9 _) P" N. |& ^. n
4.1.png

! ]( M9 V8 o3 N4 A
通常包含:起始位、数据/地址、ACK、结束位。
  T- u+ r3 |; M/ C( \! }: P3 P
1. 开始和停止
3 b, L. L. b9 W( U3 M9 i
在时钟线保持高的情况下,SDA数据线由高 -> 低:为总线开始条件;
在时钟线保持高的情况下,SDA数据线由低 -> 高:为总线结束条件;

0 x9 N9 T* ^( s2 y& M
2. 地址
) H! H2 W1 X+ H5 ?8 ]# Y5 q
I2C地址分7位和10位。

; D; D/ _( E9 c, R5 v
7位地址:
4.2.png

) O0 x! ~( r. ]* F6 a! o
10位地址:
4.3.png
0 L9 ], {' a8 p* O1 h
3. 应答(ACK)

% J! K; Q8 |6 `
应答(ACK)和非应答(NACK)发生在每个字节之后,是由接收方向发送方发出确认信号,表明数据已成功接收,并且可以继续发送下一字节数据。

6 p$ Y8 z: O+ Y9 m0 v
4.4.jpg
8 v8 j4 y7 W8 i
2 S. }8 e6 ^' r; m' X1 |
( B4 ~& ~5 u. F9 V! }
3.     STM32 I2C常见问题
I²C 总线通信,通常不会像CAN、USB这类总线添加一些复杂的(软件)通信协议。I²C 虽然硬件和协议简单,但在实际应用中还是经常出现各种问题。下面就来分析一下常见的问题。
7 i. C% o% d) W/ g7 l
问题一:IO模式不对
( _5 F" @9 w7 @* ~) n! C
有些工程师对用于I²C 总线的GPIO不了解,写驱动代码时把总线(SDA、SCL)配置成推挽输出模式,导致应用上的异常。
I²C 总线是一种特殊的总线,因为多器件需共用总线,加上数据线需支持双向通信。SDA要求开漏输出模式。由于开漏无法直接输出“高”时,需外加上拉电阻配合。

. G3 X9 q! S( T; P7 A
解决办法:STM32的IO有8种应用模式,如果你通过软件模拟I²C,并将SDA配置为开漏输出模式,配合上拉电阻。这往往适用于主模式器件。如果使用硬件I²C,则需要配置成开漏复用功能。建议使用STM32CubeMX工具配置底层初始化代码。

  Y* y" U9 h6 a) M+ }9 F
问题二:总线电压不匹配
. G# R( A9 U. s, j
I²C 总线电压通常为3.3V或5V。有的I²C C总线上挂的设备比较多,有可能存在特殊电压,比如2.5V,或者3.3V不兼容5V,就容易引起信号辨识错误导致总线通信失败的情况。

6 B' J4 r4 }) f' B* K: \
解决办法:如果存在电压不匹配的情况,需要从硬件方面来解决,比如:通过专业转换模块。
8 \, j  F$ X: f& i7 ~
问题三:软件检测死机

0 v( G% K$ J: r: M, L
I²C 总线一般通过ACK信号来判断总线的情况,STM32实现I²C 收发、检测等操作是由内部控制器自动完成。
然而由于一些外部因素,比如干扰信号、电压不匹配等,容易引起总线上的信号不正常,从而导致检测失败,通信失败。
! f, V6 Q# R4 V
解决办法:解决这种因异常引起的死机,除了从硬件方面做调整外,也可以从软件入手,常见的做法是添加超时处理机制,不要让程序一直死等检测应答信号。
比方当发送超时情形时,可以尝试复位STM32 I2C外设或相关设备。
7 J; D. F' _0 J2 K7 Y0 Z5 x
复盘一下
▼I²C 基础内容:主从模式特性、通信速度、寻址模式、收发模式;
▼I²C 总线协议:起始位、数据/地址、ACK、结束位;
▼I²C 常见问题:IO模式不对、总线电压不匹配、软件检测死机

2 ]9 P! g" k) B, J# C: ?6 A
------------ END ------------

+ X# c+ R7 b8 v1 H# Z; M: l  e
文章出处: STM32
1 F) R1 H' U: k3 ^5 Z' }' y$ q+ |

) b/ `8 c! r) n& j$ m
赞 收藏 1 评论1 发布时间:2021-3-1 10:05

举报

1个回答
sincomaster 回答时间:2021-3-1 14:55:21
学习了,谢谢分享
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版