STM32单片机C语言I2C通信:掌握I2C协议、配置和数据传输
发布时间: 2024-07-02 20:34:59 阅读量: 105 订阅数: 36
![STM32单片机C语言I2C通信:掌握I2C协议、配置和数据传输](https://www.circuitbasics.com/wp-content/uploads/2016/01/Introduction-to-I2C-Message-Frame-and-Bit-2.png)
# 1. I2C通信简介**
I2C(Inter-Integrated Circuit)是一种串行通信协议,广泛应用于嵌入式系统中连接不同设备。它是一种半双工通信,使用两条信号线(SDA和SCL)进行数据传输。I2C协议具有以下特点:
* **低成本:**仅需两条信号线,无需额外的时钟线。
* **简单易用:**协议简单,易于实现和使用。
* **低功耗:**采用低压电平,功耗较低。
* **多主从:**支持多主设备和多从设备同时连接。
# 2. STM32单片机I2C硬件配置**
**2.1 I2C引脚配置**
STM32单片机上的I2C引脚通常为两根:SDA(数据线)和SCL(时钟线)。在配置I2C引脚时,需要将这两根引脚设置为复用功能,并连接到相应的I2C外设。
**代码块:**
```c
// I2C引脚配置
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
```
**逻辑分析:**
该代码块配置了PB6和PB7引脚作为I2C1外设的SDA和SCL引脚。
* `GPIO_MODE_AF_OD`:将引脚设置为复用推挽输出模式。
* `GPIO_PULLUP`:启用引脚上拉电阻。
* `GPIO_SPEED_FAST`:将引脚速度设置为快速模式。
* `GPIO_AF4_I2C1`:将引脚复用为I2C1外设功能。
**2.2 I2C时钟配置**
I2C时钟由STM32单片机内部的APB1时钟源提供。在配置I2C时钟时,需要设置I2C外设的时钟分频系数,以获得所需的I2C通信速率。
**代码块:**
```c
// I2C时钟配置
RCC_I2CCLKConfig(RCC_I2C1CLK_APB1);
```
**逻辑分析:**
该代码块将I2C1外设的时钟源设置为APB1时钟。APB1时钟的频率通常为系统时钟频率的2倍。
**2.3 I2C中断配置**
I2C外设支持中断功能,可以用于处理I2C通信过程中发生的事件。在配置I2C中断时,需要设置中断优先级和使能中断。
**代码块:**
```c
// I2C中断配置
HAL_NVIC_SetPriority(I2C1_EV_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(I2C1_EV_IRQn);
```
**逻辑分析:**
该代码块设置了I2C1外设的事件中断优先级为0,并使能了中断。事件中断用于处理I2C通信过程中发生的事件,如传输完成、接收完成等。
# 3. STM32单片机I2C软件编程
### 3.1 I2C初始化
I2C初始化是I2C通信的基础,主要包括以下步骤:
- **配置I2C时钟源和时钟频率:**
- STM32单片机支持多种时钟源,如APB1、APB2等。时钟频率可以根据实际需要配置,一般设置为100kHz或400kHz。
- 初始化代码:
```c
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
I2C1->CR2 = 100000; // 设置时钟频率为100kHz
```
- **配置I2C模式:**
- STM32单片机支持标准模式和快速模式两种I2C模式。标准模式速率为100kHz,快速模式速率为400kHz。
- 初始化代码:
```c
I2C1->CCR = 0x10; // 设置标准模式
```
- **配置I2C地址:**
- I2C设备都有一个唯一的地址,用于识别设备。
- 初始化代码:
```c
I2C1->OAR1 = 0x12; // 设置设备地址为0x12
```
- **使能I2C外设:**
- 初始化代码:
```c
I2C1->CR1 |= I2C_CR1_PE; // 使能I2C外设
```
### 3.2 I2C数据传输
I2C数据传输主要分为以下几个步骤:
- **启动传输:**
- 初始化代码:
```c
I2C1->CR1 |= I2C_CR1_START; // 发送启动信号
```
- **发送设备地址:**
- 初始化代码:
```c
I2C1->DR = 0x12; // 发送设备地址
```
- **发送数据:**
- 初始化代码:
```c
I2C1->DR = 0x01; // 发送数据
```
- **停止传输:**
- 初始化代码:
```c
I2C1->CR1 |= I2C_CR1_STOP; // 发送停止信号
```
### 3.3 I2C中断处理
I2C中断处理主要包括以下几个方面:
- **配置I2C中断:**
- 初始化代码:
```c
NVIC_EnableIRQ(I2C1_EV_IRQn
```
0
0