无缝交互STM32单片机I2C通信:与外部设备的亲密接触
发布时间: 2024-07-02 02:57:03 阅读量: 55 订阅数: 24
![无缝交互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)是一种串行通信协议,广泛应用于嵌入式系统中。它用于连接微控制器和各种外围设备,如传感器、存储器和显示器。STM32单片机内置I2C外设,支持I2C通信。
I2C通信基于主从模式,一个主设备可以与多个从设备通信。主设备负责启动通信,指定从设备地址,并控制数据传输。从设备响应主设备的请求,接收或发送数据。
I2C通信具有以下特点:
- 双线制:仅需要两根线(时钟线SCL和数据线SDA)进行通信。
- 多主机:总线上可以连接多个主设备,通过仲裁机制解决冲突。
- 低速率:标准模式下传输速率为100kbps,快速模式下可达400kbps。
# 2. I2C通信理论基础
### 2.1 I2C通信协议
#### 2.1.1 I2C总线拓扑结构
I2C总线采用多主从结构,由一条串行数据线(SDA)和一条串行时钟线(SCL)组成。所有连接到总线上的设备都通过SDA和SCL线连接,形成一个总线网络。
- 主设备:负责发起通信并控制总线,可以有多个主设备。
- 从设备:响应主设备的请求,可以有多个从设备。
#### 2.1.2 I2C数据传输机制
I2C数据传输采用半双工通信方式,即总线上的设备只能同时发送或接收数据,不能同时进行。数据传输过程如下:
1. **起始条件:**主设备发送一个起始条件,表示数据传输的开始。起始条件由一个高电平到低电平的下降沿表示。
2. **设备地址:**主设备发送从设备的7位地址,地址后跟一个读/写位(R/W)。读/写位为0表示写入操作,为1表示读取操作。
3. **应答:**从设备收到地址后,如果地址匹配,则发送一个应答信号,表示已准备好进行数据传输。应答信号由一个低电平到高电平的上升沿表示。
4. **数据传输:**主设备发送或接收数据,每个字节后面跟一个应答信号。如果主设备发送数据,则从设备发送应答信号;如果主设备接收数据,则主设备发送应答信号。
5. **停止条件:**主设备发送一个停止条件,表示数据传输的结束。停止条件由一个低电平到高电平的上升沿表示。
### 2.2 I2C通信硬件实现
#### 2.2.1 STM32单片机I2C外设
STM32单片机内置I2C外设,提供硬件支持I2C通信。I2C外设包含以下寄存器:
- **CR1:**控制寄存器,用于配置I2C外设的工作模式。
- **CR2:**配置寄存器,用于配置I2C外设的时钟频率和中断使能。
- **OAR1:**从机地址寄存器,用于配置从机地址。
- **OAR2:**从机地址寄存器,用于配置从机地址掩码。
- **DR:**数据寄存器,用于发送和接收数据。
- **SR1:**状态寄存器,用于获取I2C外设的状态信息。
- **SR2:**状态寄存器,用于获取I2C外设的附加状态信息。
#### 2.2.2 I2C通信接口电路
I2C通信接口电路主要包括以下元件:
- **上拉电阻:**连接在SDA和SCL线上,用于提供总线偏置电压。
- **滤波电容:**连接在SDA和SCL线上,用于滤除总线上的噪声。
- **保护二极管:**连接在SDA和SCL线上,用于保护总线免受过压损坏。
**代码示例:**
```c
// 配置I2C外设为从机模式
I2C_HandleTypeDef hi2c;
void I2C_Config(void) {
hi2c.Instance = I2C1;
hi2c.Init.ClockSpeed = 100000;
hi2c.Init.DutyCycle = I2C_DUTYCYCLE_2;
hi2c.Init.OwnAddress1 = 0x08;
hi2c.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
HAL_I2C_Init(&hi2c);
}
```
**逻辑分析:**
该代码配置I2C1外设为从机模式,时钟频率为100kHz,占空比为2,从机地址为0x08,地址模式为7位。HAL_I2C_Init()函数将根据这些配置初始化I2C外设。
# 3.1 I2C通信库函数
#### 3.1.1 HAL库函数介绍
HAL(硬件抽象层)库函数是STM32标准外设库的一部分,它提供了一组通用的、可移植的函数,用于配置和控制STM32单片机的各种外设。对于I2C通信,HAL库提供了以下主要函数:
- **HAL_I2C_Init():**初始化I2C外设,配置时钟、数据速率、地址模式等参数。
- **HAL_I2C_DeInit():**反初始化I2C外设,释放资源。
- **HAL_I2C_Master_Transmit():**以主设备模式发送数据。
- **HAL_I2C_Master_Receive():**以主设备模式接收数据。
- **HAL_I2C_Slave_Transmit():**以从设备模式发送数据。
- **HAL_I2C_Slave_Receive():**以从设备模式接收数据。
**参数说明:**
| 参数 | 说明 |
|---|---|
| hi2c | I2C外设句柄 |
| DevAddress | 从设备地址 |
| pData | 数据缓冲区指针 |
| Size | 数据长度 |
| Timeout | 超时时间(毫秒) |
**代码块:**
```c
#include "stm32f4xx_hal.h"
I2C_HandleTypeDef hi2c;
void I2C_Init(void)
{
hi2c.Instance = I2C1;
hi2c.Init.ClockSpeed = 100000;
hi2c.Init.DutyCycle = I2
```
0
0