STM32单片机I2C通信:掌握低速通信精髓,解锁设备间高效协作
发布时间: 2024-07-01 11:38:48 阅读量: 56 订阅数: 31
![STM32单片机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)是一种低速串行通信总线,用于连接微控制器、传感器和其他外围设备。它以其简单、低成本和可靠性而著称,使其成为嵌入式系统中广泛使用的通信协议。
I2C通信采用主从模式,其中一个设备(主机)控制总线并发起通信,而其他设备(从机)响应主机的请求。总线由两根线组成:串行数据线(SDA)和串行时钟线(SCL)。主机通过SDA线发送数据,而从机通过SDA线接收数据。SCL线由主机控制,它为数据传输提供时钟信号。
# 2. STM32单片机I2C接口
### 2.1 I2C接口硬件结构
STM32单片机I2C接口由两个双向开漏输出引脚组成:SCL(串行时钟线)和SDA(串行数据线)。
- **SCL:**负责时钟信号的传输,由主设备产生,从设备接收。
- **SDA:**负责数据信号的传输,双向传输,由主设备和从设备共同使用。
### 2.2 I2C接口寄存器
I2C接口寄存器用于控制和配置I2C接口。
#### 2.2.1 I2C_CR1寄存器
| 位段 | 名称 | 描述 |
|---|---|---|
| PE | Peripheral enable | I2C接口使能 |
| TXIE | Transmit interrupt enable | 发送中断使能 |
| RXIE | Receive interrupt enable | 接收中断使能 |
| ADDRIE | Address match interrupt enable | 地址匹配中断使能 |
| NACKIE | Not acknowledge received interrupt enable | 未应答中断使能 |
| STOPIE | Stop condition interrupt enable | 停止条件中断使能 |
| START | Start generation | 产生起始信号 |
| ACK | Acknowledge | 发送应答信号 |
| PECIE | Packet error checking interrupt enable | 数据包错误检查中断使能 |
| SMBTYPE | SMBus type | SMBus类型选择 |
| SMBUS | SMBus mode | SMBus模式选择 |
| GCEN | General call enable | 通用调用使能 |
| ENARP | ARP enable | 自动重复启动使能 |
#### 2.2.2 I2C_CR2寄存器
| 位段 | 名称 | 描述 |
|---|---|---|
| FREQ | Clock speed | 时钟频率选择 |
| I2CPOL | I2C clock polarity | 时钟极性选择 |
| CCR | Clock control register | 时钟控制寄存器 |
| F | Fast mode | 快速模式选择 |
| DNF | Digital noise filter | 数字噪声滤波器 |
| DMAEN | DMA enable | DMA使能 |
#### 2.2.3 I2C_SR1寄存器
| 位段 | 名称 | 描述 |
|---|---|---|
| SB | Start bit | 起始位标志 |
| ADDR | Address matched | 地址匹配标志 |
| TXE | Data register empty | 数据寄存器为空标志 |
| RXNE | Receive data register not empty | 接收数据寄存器非空标志 |
| AF | Acknowledge failure | 未应答标志 |
| BTF | Byte transfer finished | 字节传输完成标志 |
| OVR | Overrun/underrun | 溢出/欠载标志 |
| PECERR | Packet error | 数据包错误标志 |
| TIMEOUT | Timeout or slave mode timeout | 超时或从机模式超时标志 |
| SMBHOST | SMBus host address | SMBus主机地址 |
| SMBDEFAULT | SMBus default address | SMBus默认地址 |
| I2CBSY | Bus busy | 总线忙标志 |
#### 2.2.4 I2C_SR2寄存器
| 位段 | 名称 | 描述 |
|---|---|---|
| PEC | Packet error checking | 数据包错误检查 |
| DUALF | Dual flag | 双重标志 |
| SMBHOST1 | SMBus host address bit 1 | SMBus主机地址位1 |
| SMBDEFAULT1 | SMBus default address bit 1 | SMBus默认地址位1 |
| GENCALL | General call | 通用调用标志 |
| TRA | Transmitter/receiver | 发送器/接收器标志 |
| BUSY | Bus busy | 总线忙标志 |
### 2.3 I2C接口时序
I2C通信时序由以下三个信号组成:
#### 2.3.1 起始信号
- 主设备拉低SCL和SDA,保持SCL低电平,SDA上升沿表示起始信号。
#### 2.3.2 数据传输
- 主设备或从设备发送8位数据,每位数据传输前,主设备产生一个时钟脉冲。
- 数据传输完成后,接收设备发送一个应答信号(拉低SDA)。
#### 2.3.3 停止信号
- 主设备拉高SDA和SCL,保持SDA高电平,SCL下降沿表示停止信号。
# 3. STM32单片机I2C通信编程
### 3.1 I2C通信初始化
**代码块 1:I2C通信初始化**
```c
void I2C_Init(I2C_TypeDef *I2Cx, uint32_t ClockSpeed)
{
// 使能I2C时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
// 配置I2C模式为I2C模式
I2Cx->CR1 &= ~I2C_CR1_SMBUS;
// 配置I2C时钟频率
I2Cx->CR2 = (ClockSpeed & 0x3F) << I2C_CR2_FREQ_Pos;
// 使能I2C外设
I2Cx->CR1 |= I2C_CR1_PE;
}
```
**逻辑分析:**
* 第一行使能I2C时钟。
* 第二行配置I2C模式为I2C模式,清除SMBUS位。
* 第三行配置I2C时钟频率,将时钟速度移位到FREQ位置。
* 第四行使能I2C外设。
**参数说明:**
* I2Cx:I2C外设指针
* ClockSpeed:I2C时钟速度
### 3.2 I2C数据传输
#### 3.2.1 主机模式数据传输
**代码块 2:主机模式数据传输**
```c
void I2C_Master_Transmit(I2C_TypeDef *I2Cx, uint8_t SlaveAddress, uint8_t *pData, uint16_t Size)
{
// 发送起始信号
I2C_GenerateSTART(I2Cx, ENABLE);
// 等待起始信号发送完成
while (!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT));
// 发送从机地址
I2C_Send7bitAddress(I2Cx, SlaveAddress, I2C_Direction_Transmitter);
// 等待从机地址发送完成
while (!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
// 发送数据
for (uint16_t i = 0; i < Size; i++)
{
I2C_SendData(I2Cx,
```
0
0