STM32单片机I2C通信:详解I2C协议、硬件配置和应用的秘诀
发布时间: 2024-07-02 15:34:54 阅读量: 228 订阅数: 53
STM32 I2C硬件实现无bug版
3星 · 编辑精心推荐
![STM32单片机I2C通信:详解I2C协议、硬件配置和应用的秘诀](https://www.electronicshub.org/wp-content/uploads/2020/03/How-to-use-I2C-in-STM32F103C8T6-Circuit-Diagram.jpg)
# 1. I2C协议概述**
I2C(Inter-Integrated Circuit)是一种串行通信协议,广泛用于嵌入式系统中,连接微控制器和外围设备。它采用主从通信模式,其中一个主设备控制总线,而多个从设备连接到总线。
I2C协议基于以下关键概念:
- **主设备:**控制总线并发起通信的设备。
- **从设备:**连接到总线并响应主设备请求的设备。
- **数据位:**8位的数据单元,用于传输信息。
- **地址位:**7位或10位的地址,用于识别从设备。
- **起始条件:**由主设备发出的信号,表示通信的开始。
- **停止条件:**由主设备发出的信号,表示通信的结束。
# 2. STM32单片机I2C硬件配置
### 2.1 I2C接口引脚配置
STM32单片机上I2C接口一般由两根引脚组成:串行数据线(SDA)和串行时钟线(SCL)。这些引脚通常位于单片机的特定端口上,例如:
```
| 单片机型号 | SDA引脚 | SCL引脚 |
|---|---|---|
| STM32F103C8T6 | PB6 | PB7 |
| STM32F407VG | PB6 | PB7 |
| STM32F746ZG | PB6 | PB7 |
```
配置I2C接口引脚需要以下步骤:
1. **使能I2C外设时钟:**在RCC寄存器中使能I2C外设时钟。
2. **配置GPIO引脚:**将SDA和SCL引脚配置为复用功能,并选择I2C功能。
3. **配置引脚上拉电阻:**为SDA和SCL引脚配置上拉电阻,以防止总线浮动。
### 2.2 I2C时钟配置
I2C通信需要一个时钟信号来同步数据传输。STM32单片机上的I2C时钟可以由内部时钟源或外部时钟源产生。
**内部时钟源:**
内部时钟源由单片机的内部振荡器产生。使用内部时钟源时,需要配置I2C时钟预分频器和时钟分频器寄存器,以生成所需的时钟频率。
**外部时钟源:**
外部时钟源可以是外部晶振或其他时钟信号。使用外部时钟源时,需要配置I2C时钟源选择寄存器,以选择外部时钟源。
### 2.3 I2C中断配置
STM32单片机上的I2C外设支持中断功能。中断可以在以下事件发生时触发:
* **传输完成中断:**当数据传输完成时触发。
* **接收完成中断:**当数据接收完成时触发。
* **错误中断:**当发生错误(例如仲裁丢失)时触发。
配置I2C中断需要以下步骤:
1. **使能I2C中断:**在NVIC寄存器中使能I2C中断。
2. **配置中断优先级:**配置I2C中断的优先级。
3. **编写中断服务程序:**编写中断服务程序,以响应I2C中断。
**代码块:**
```c
// 使能I2C中断
NVIC_EnableIRQ(I2C1_EV_IRQn);
NVIC_EnableIRQ(I2C1_ER_IRQn);
// 配置中断优先级
NVIC_SetPriority(I2C1_EV_IRQn, 0);
NVIC_SetPriority(I2C1_ER_IRQn, 0);
// 中断服务程序
void I2C1_EV_IRQHandler(void)
{
// 处理传输完成中断
if (I2C1->SR1 & I2C_SR1_TXE) {
// 发送数据
}
// 处理接收完成中断
if (I2C1->SR1 & I2C_SR1_RXNE) {
// 接收数据
}
}
void I2C1_ER_IRQHandler(void)
{
// 处理错误中断
if (I2C1->SR1 & I2C_SR1_ARLO) {
// 仲裁丢失
}
}
```
**逻辑分析:**
* 使能I2C中断后,单片机会在发生中断事件时触发中断服务程序。
* 中断服务程序根据中断标志位判断中断类型,并执行相应的处理。
* 在传输完成中断服务程序中,发送数据。
* 在接收完成中断服务程序中,接收数据。
* 在错误中断服务程序中,处理仲裁丢失等错误。
# 3. I2C通信编程
### 3.1 I2C数据传输流程
I2C数据传输遵循以下基本流程:
1. **起始条件:**主设备发送一个起始条件,表示数据传输的开始。起始条件由一个高电平位和一个低电平位组成。
2. **从机地址:**主设备发送从机地址,指定要通信的从机设备。从机地址由7位地址和一个读/写位组成。读/写位为0表示写操作,为1表示读操作。
3. **应答:**从机收到从机地址后,如果地址匹配,则发送一个应答信号。应答信号由一个低电平位组成。
4. **数据传输:**主设备开始传输数据。如果为写操作,则主设备将数据发送到从机;如果为读操作,则主设备从从机接收数据。
5. **应答:**在每个数据字节传输后,接收设备(主设备或从机)发送一个应答信号。
6. **停止条件:**数据传输完成后,主设备发送一个停止条件,表示数据传输的结束。停止条件由一个低电平位和一个高电平位组成。
### 3.2 I2C主设备编程
主设备负责发起I2C通信并控制数据传输。以下代码示例展示了STM32单片机作为I2C主设备的编程:
```c
#include "stm32f1xx_hal.h"
void I2C_Master_Transmit(uint8_t slaveAddress, uint8_t *data, uint8_t dataLength
```
0
0