STM32单片机I2C总线应用:从硬件连接到数据传输,权威解读
发布时间: 2024-07-02 13:48:22 阅读量: 75 订阅数: 45
![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. STM32单片机I2C总线简介
I2C总线(Inter-Integrated Circuit Bus)是一种串行通信总线,广泛应用于嵌入式系统中连接微控制器和各种外围器件。它具有简单、低成本、易于实现的特点。
STM32单片机内置I2C外设,支持I2C总线通信。I2C总线在STM32单片机上通常由两条线组成:串行数据线(SDA)和串行时钟线(SCL)。
# 2. I2C总线硬件连接与配置
### 2.1 I2C总线原理及硬件接口
**I2C总线原理**
I2C(Inter-Integrated Circuit)总线是一种串行通信总线,用于在集成电路(IC)之间进行数据传输。它采用主从模式,其中一个设备(主设备)控制总线,而其他设备(从设备)响应主设备的请求。
**硬件接口**
I2C总线使用两条信号线:
* **SDA(串行数据线):**用于传输数据。
* **SCL(串行时钟线):**用于同步数据传输。
### 2.2 STM32单片机I2C外设配置
**STM32单片机I2C外设**
STM32单片机内置I2C外设,支持标准模式(100 kbps)和快速模式(400 kbps)通信。
**配置步骤**
配置STM32单片机I2C外设需要以下步骤:
1. **使能I2C外设时钟:**使用RCC寄存器组中的RCC_APB1ENR寄存器使能I2C外设时钟。
2. **配置I2C引脚:**使用GPIO寄存器组中的GPIOx_MODER和GPIOx_AFRx寄存器配置SDA和SCL引脚为复用功能。
3. **初始化I2C外设:**使用I2C寄存器组中的I2C_CR1寄存器配置I2C外设的模式、波特率和地址。
**代码示例**
```c
// 使能I2C1时钟
RCC->APB1ENR |= RCC_APB1ENR_I2C1EN;
// 配置I2C1引脚
GPIOB->MODER &= ~(GPIO_MODER_MODE10_Msk | GPIO_MODER_MODE11_Msk);
GPIOB->MODER |= (GPIO_MODER_MODE10_1 | GPIO_MODER_MODE11_1);
GPIOB->AFR[1] &= ~(GPIO_AFRH_AFSEL10_Msk | GPIO_AFRH_AFSEL11_Msk);
GPIOB->AFR[1] |= (GPIO_AFRH_AFSEL10_1 | GPIO_AFRH_AFSEL11_1);
// 初始化I2C1外设
I2C1->CR1 = (I2C_CR1_PE | I2C_CR1_MODE | I2C_CR1_SMBUS | I2C_CR1_ACK | I2C_CR1_NACK);
I2C1->CR2 = (I2C_CR2_FREQ | I2C_CR2_DUTY);
I2C1->OAR1 = (I2C_OAR1_OA1EN | I2C_OAR1_OA1);
```
**代码逻辑分析**
* `RCC->APB1ENR |= RCC_APB1ENR_I2C1EN;`:使能I2C1外设时钟。
* `GPIOB->MODER &= ~(GPIO_MODER_MODE10_Msk | GPIO_MODER_MODE11_Msk);`:清除PB10和PB11引脚的模式位。
* `GPIOB->MODER |= (GPIO_MODER_MODE10_1 | GPIO_MODER_MODE11_1);`:配置PB10和PB11引脚为复用功能。
* `GPIOB->AFR[1] &= ~(GPIO_AFRH_AFSEL10_Msk | GPIO_AFRH_AFSEL11_Msk);`:清除PB10和PB11引脚的复用功能选择位。
* `GPIOB->AFR[1] |= (GPIO_AFRH_AFSEL10_1 | GPIO_AFRH_AFSEL11_1);`:配置PB10和PB11引脚为I2C1复用功能。
* `I2C1->CR1 = (I2C_CR1_PE | I2C_CR1_MODE | I2C_CR1_SMBUS | I2C_CR1_ACK | I2C_CR1_NACK);`:配置I2C1外设为标准模式、使能ACK和NACK。
* `I2C1->CR2 = (I
0
0