文章目录
一、I2C 简介
I2C(Inter-Integrated Circuit)是由飞利浦公司开发的一种简单的两线制串行通信总线。它只需要两根线:
- SDA(Serial Data Line): 串行数据线,用于双向数据传输。
- SCL(Serial Clock Line): 串行时钟线,由主机产生,用于同步数据传输。
二、核心特性
- 半双工通信: 同一时间只能进行发送或接收。
- 多主多从: 总线上可以连接多个主机和多个从机。
- 地址寻址: 每个从设备都有一个唯一的7位或10位地址,主机通过地址选择通信对象。
- 低速通信: 标准模式速度为100kbps,快速模式为400kbps,高速模式可达3.4Mbps。
- 线与逻辑: 总线采用开漏输出结构,必须通过上拉电阻接到正电源。这意味着任何设备都可以将总线拉低(输出0),但释放后总线由电阻拉高(输出1)。这种结构便于实现时钟同步和仲裁。
三、通信过程解析
一次完整的I2C通信包含以下几个阶段:
1. 起始条件
- 主机在SCL为高电平时,将SDA线从高电平拉低。
- 这个下降沿通知总线上所有设备,一次传输开始了。
- 函数:
HAL_I2C_Master_Transmit(&hi2c1, devAddr, pData, Size, Timeout)
2. 地址帧
- 主机发送一个7位或10位的从机地址,后面跟一个读写位。
- 读写位(R/W#): 0表示主机要向从机写入数据,1表示主机要向从机读取数据。
- 从机收到地址后,如果与自身地址匹配,会回复一个应答位。
3. 应答(ACK)与非应答(NACK)
- 每传输完一个字节(8位数据)后,接收方(无论是主机还是从机)需要在第9个时钟脉冲期间发送一个应答信号。
- 应答(ACK): 接收方将SDA拉低,表示成功收到字节,并希望继续传输。
- 非应答(NACK): 接收方不拉低SDA(保持高电平),表示不希望继续传输,通常用于终止通信。
4. 数据帧
- 在地址帧之后,开始传输数据。每个数据字节也是8位,同样后跟一个ACK/NACK位。
- 数据的方向由地址帧中的R/W位决定。
5. 停止条件
- 主机在SCL为高电平时,将SDA线从低电平拉高。
- 这个上升沿通知总线上所有设备,本次传输结束。
- 函数:
HAL_I2C_Master_Transmit(&hi2c1, devAddr, pData, Size, Timeout)
6. 读写序列流程图
6.1主机向从机写数据
流程图解读:
1.起始: 主机通过产生Start条件宣告通信开始。
2.寻址: 主机发送目标从机的地址和写方向位(0)。
3.应答检查: 从机如果地址匹配且准备就绪,会回复ACK。如果无应答(NACK),说明地址错误或从机不存在,主机直接终止传输。
4.数据循环:
- 主机发送一个数据字节。
- 从机每收到一个字节,回复ACK确认。
- 主机继续发送下一个字节,直到所有数据发送完毕。
- 如果从机在过程中回复NACK,表示它无法继续接收,主机会提前终止传输。
5.结束: 所有数据发送完毕后,主机产生Stop条件,释放总线。
6.2主机从从机读数据:
流程图解读:
1.起始: 主机产生Start条件,开始本次通信。
2.寻址(写模式):
主机发送目标从机的7位地址和写方向位(0)。
这告诉从机:“我要向你写入信息”。
3.发送寄存器地址:
主机发送要读取的寄存器地址。
这明确告诉从机:“我要读取的是你这个位置的数据”。
4.重复起始:
主机产生重复Start条件。
关键点: 在不释放总线的情况下,准备切换通信方向。
5.重新寻址(读模式):
主机再次发送从机地址,但改为读方向位(1)。
这告诉从机:“现在请把数据发给我”。
6.数据读取与终止:
从机开始发送数据字节。
主机接收数据后,回复NACK。
关键点: NACK明确告知从机“这是我要的最后一个字节”。
主机产生Stop条件,结束通信。
- 核心要点:
- 先通过写模式指定要读取的寄存器地址
- 通过重复起始条件切换通信方向
- 最后必须用NACK明确终止数据传输
- 适用于需要指定内部地址的复杂I2C设备
四、STM32CubeMX 配置 I2C(硬件I2C)
注:如果你不使用STM32的硬件I2C外设,而是用两个普通的GPIO口,通过软件控制其高低电平来模拟I2C的时序,那么就不需要在CubeMX中配置硬件I2C。你只需要配置那两个GPIO口为输出模式即可,相关代码可查看下一篇文章“【STM32CubeMX学习教程】——10.软件模拟IIC”。
1.新建工程
1.双击打开桌面下载好的STM32CubeMX,点击File–>New Project,或直接点击ACCEE TO MCU SELECTOR

2.在左边搜索栏里输入使用的芯片型号,右边选中并开始创建

2.设置RCC时钟源
设置高/低速时钟源都由外部晶振产生。

3.设置IIC参数

1.I2C Speed Mode(I2C速度模式):是STM32CubeMX中配置I2C通信速率的关键参数。选择建议: 1)不确定时,或与常见传感器/存储器通信:选择 Fast Mode (400 kHz)。2)与老旧设备通信或长线传输:选择 Standard Mode (100 kHz)。
2.I2C Clock Speed (Hz)(I2C时钟速度):用于设置I2C总线通信时SCL(串行时钟线)的实际频率。它直接决定了数据传输的快慢。
3.Clock No Stretch Mode(时钟无延展模式):禁用(Disabled):允许时钟延展。这是标准且推荐的模式。启用(Enabled):禁止时钟延展。这是一种特殊模式,用于特定场景。
4.Primary Address Length selection(主地址长度选择):用于设置STM32作为I2C从机时,它自身的I2C地址是7位还是10位。通俗来讲: 当另一个I2C主机(比如另一个MCU)在总线上发送寻址帧时,STM32会根据这里设置的长度来判断“主机呼叫的是不是我?”
5.Dual Address Acknowledged(双地址应答):允许STM32在作为I2C从机时,同时响应两个不同的I2C从机地址。 当这个功能使能后,STM32的I2C外设会监听总线上的寻址帧。如果主机发送的地址与两个预设地址中的任意一个匹配,STM32都会产生应答(ACK),表示“我收到了,是我!”,并准备进行后续通信。
6.Primary slave address(主从设备地址):用于设置当STM32微控制器工作在I2C从机模式(Slave Mode) 时,它在I2C总线上的唯一标识地址。当总线上的I2C主机想要与这个STM32从机通信时,主机必须在发送的数据帧中包含这个地址。STM32的I2C硬件会持续监听总线,一旦检测到与自己“主从设备地址”匹配的呼叫,就会做出响应。
7.General Call address detection(通用呼叫地址检测):决定STM32的I2C从机是否响应一个特殊的广播地址(0x00)。当这个功能使能后,如果I2C主机向地址0x00发送数据,总线上所有使能了该功能的从机都会同时接收这些数据。
4.时钟配置
1.时钟源设置
默认时钟源是由内部RC振荡器产生,可通过图中按钮进行修改,外部晶振数值取决于实际电路板上的晶振大小.

提示:
- 这里用到的芯片的最大时钟频率是100MHz,有的芯片最大只有72MHz,实际最大频率可通过查看芯片数据手册确定。
2.时钟频率设置

①PLLM—PLL输入时钟分频系数,根据自己需要的系统时钟频率来进行修改
②PLLN—主PLL倍频系数(自动计算)
③PLLP—主PLL分频系数(自动计算)
④SYSCLK—系统时钟
⑤HCLK—AHB总线时钟,由系统时钟SYSCLK 分频得到,一般不分频,等于系统时钟
⑥APB1/APB2 Prescaler—APB1/APB2总线的预分频系数,可根据需要修改
5.工程文件设置
1.工程设置
注:工程路径中不能有中文,否则会输出错误。
库文件要提前下载好,具体方法在 “【STM32CubeMX学习教程】——1.软件安装” 这一篇文章中有提到。

2.代码生成设置

3.点击右上角按钮生成代码,之后会出现下面的窗口,再点击打开工程即可在用keil查看工程代码。

6.编译成功,0错误0警告

以上就是本章的全部内容,如果对你有帮助,欢迎点赞支持,谢谢!
1704

被折叠的 条评论
为什么被折叠?



