STM32单片机I2C编程:详解I2C通信协议,解锁设备互联新境界
发布时间: 2024-07-03 17:08:48 阅读量: 78 订阅数: 51
![STM32单片机I2C编程:详解I2C通信协议,解锁设备互联新境界](https://img-blog.csdnimg.cn/c3437fdc0e3e4032a7d40fcf04887831.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LiN55-l5ZCN55qE5aW95Lq6,size_20,color_FFFFFF,t_70,g_se,x_16)
# 1. I2C通信协议概述**
I2C(Inter-Integrated Circuit)是一种串行通信协议,用于在集成电路(IC)之间进行数据传输。它是一种简单、低成本且广泛使用的协议,特别适用于短距离、低速的通信应用。
I2C协议采用主从模式,其中一个设备担任主机(Master),负责控制通信流程,而其他设备担任从机(Slave),响应主机的请求。通信过程通过两条线进行:串行数据线(SDA)和串行时钟线(SCL)。
# 2. STM32单片机I2C编程基础
### 2.1 I2C硬件接口和寄存器
#### 2.1.1 I2C引脚定义
STM32单片机上的I2C接口通常由两根引脚组成:
* **SCL (串行时钟):**时钟信号引脚,由主机生成,用于同步数据传输。
* **SDA (串行数据):**数据信号引脚,用于传输数据。
#### 2.1.2 I2C寄存器结构
STM32单片机上的I2C外设包含以下寄存器:
| 寄存器 | 描述 |
|---|---|
| I2C_CR1 | 控制寄存器 1,控制 I2C 外设的基本功能。 |
| I2C_CR2 | 控制寄存器 2,控制 I2C 外设的时钟和中断。 |
| I2C_OAR1 | 自己的地址寄存器 1,存储从机模式下的设备地址。 |
| I2C_OAR2 | 自己的地址寄存器 2,存储从机模式下的设备地址掩码。 |
| I2C_DR | 数据寄存器,用于发送和接收数据。 |
| I2C_SR1 | 状态寄存器 1,指示 I2C 外设的当前状态。 |
| I2C_SR2 | 状态寄存器 2,提供有关 I2C 外设的附加信息。 |
### 2.2 I2C通信时序和协议
#### 2.2.1 起始信号和停止信号
I2C通信以一个起始信号开始,以一个停止信号结束。
* **起始信号:**SCL为高电平时,SDA从高电平变为低电平。
* **停止信号:**SCL为高电平时,SDA从低电平变为高电平。
#### 2.2.2 数据传输和应答机制
I2C数据传输以字节为单位进行。每个字节包含 8 位数据和 1 位应答位。
* **数据传输:**主机或从机发送数据时,SDA上的数据位依次从最高位 (MSB) 到最低位 (LSB) 传输。
* **应答机制:**接收方在收到每个字节后,必须发送一个应答位,以表示已成功接收数据。应答位为低电平表示应答,高电平表示无应答。
### 2.3 I2C通信模式
#### 2.3.1 主机模式
在主机模式下,单片机充当I2C总线上的主设备,负责发起数据传输并控制总线。
**代码块:**
```c
void I2C_Master_Init(I2C_TypeDef *I2Cx)
{
// 配置时钟
I2Cx->CR2 |= (I2C_CR2_FREQ_16MHZ | I2C_CR2_FREQ_400KHZ);
// 配置控制寄存器 1
I2Cx->CR1 |= (I2C_CR1_PE | I2C_CR1_ACK);
}
```
**逻辑分析:**
* `I2C_CR2_FREQ_16MHZ` 设置 I2C 时钟源为 16 MHz。
* `I2C_CR2_FREQ_400KHZ` 设置 I2C 通信速率为 400 kHz。
* `I2C_CR1_PE` 使能 I2C 外设。
* `I2C_CR1_ACK` 使能应答位生成。
#### 2.3.2 从机模式
在从机模式下,单片机充当I2C总线上的从设备,负责响应主机发起的请求并接收或发送数据。
**代码块:**
```c
void I2C_Slave_Init(I2C_TypeDef *I2Cx)
{
// 配置自己的地址
I2Cx->OAR1 |= (I2C_OAR1_OA1EN | 0x0A);
// 配置控制寄存器 1
I2Cx->CR1 |= (I2C_CR1_PE | I2C_CR1_ACK);
}
```
**逻辑分析:**
* `I2C_OAR1_OA1EN` 使能自己的地址 1。
* `0x0A` 设置从机设备地址为 0x0A。
* `I2C_CR1_PE` 使能 I2C 外设。
* `I2C_CR1_ACK` 使能应答位生成。
# 3. STM32单片机I2C编程实践
### 3.1 I2C初始化和配置
#### 3.1.1 I2C时钟配置
I2C时钟配置主要涉及以下寄存器:
- **I2C_CR2寄存器**:用于配置时钟频率和时钟源。
- **I2C_CCR寄存器**:用于配置时钟控制寄存器,包括时钟预分频器和时钟倍频器。
时钟配置步骤如下:
1. 设置时钟源:使用I2C_CR2寄存器的CLKSEL位选择时钟源(APB1或APB2)。
2. 设置时钟预分频器:使用I2C_CCR寄存器的PRESC[3:0]位设置时钟预分频器值。
3. 设置时钟倍频器:使用I2C_CCR寄存器的F_S[1:0]位设置时钟倍频器值。
**代码块:**
```c
// I2C时钟配置
void I2C_ClockConfig(I2C_TypeDef *I2Cx, uint32_t PCLK, uint32_t I2C_Speed)
{
uint32_t freqrange = 0;
uint16_t ccr_val = 0;
uint16_t trise = 0;
// 计算时钟频率范围
freqran
```
0
0