本篇文章介绍如何使用STM32微控制器通过I2C总线协议来读写EEPROM存储器的数据,包括硬件连接和软件编程。
### STM32 I2C 访问 EEPROM
#### 12.1 I2C简介
I2C(Inter-Integrated Circuit)总线是由Philips公司开发的一种两线式串行通信接口,主要用于连接微控制器及其外围设备。由于其简单、低成本和高可靠性特点,广泛应用于各种嵌入式系统中。
**主要特性:**
- **总线线路**: 仅需两条线路:串行数据线SDA和串行时钟线SCL。
- **地址与主机从机关系**: 每个连接到总线的设备都可通过唯一的地址识别,并且可以软件设定地址。系统存在明确的主机与从机关系。
- **多主机冲突处理**: 具备冲突检测和仲裁机制,能够防止多个主机同时传输数据时发生的数据破坏。
- **传输速度**: 标准模式下的最大传输速率为100 kbps,快速模式下为400 kbps,高速模式下可达3.4 Mbps。
- **连接数量限制**: 连接到同一总线上的设备数量受总线的最大电容限制(通常不超过400 pF)。
**数据和地址传输方式**: 数据和地址按8位字节进行传输,并且高位在前。接口可以四种模式之一运行:从发送器、从接收器、主发送器以及主接收器模式。本章节重点介绍主发送模式与主接收模式,因为下面的实例将会使用这两种模式来写入和读取EEPROM的内容。
#### 12.2 I2C应用实例——读写EEPROM
##### 12.2.1 实例描述
此部分将展示如何利用STM32硬件I2C接口访问外部EEPROM存储器。通过本实例,读者可以学习到配置STM32的I2C接口,并了解其基本工作原理。
##### 12.2.2 硬件设计
- **微控制器**: STM32 (基于 Cortex-M3 架构)
- **外部EEPROM**: 标准 I2C 接口 EEPROM 芯片
- **连接方式**: SDA 和 SCL 引脚分别与STM32的相应引脚相连。
##### 12.2.3 软件设计
为了使STM32能够通过I2C接口访问外部EEPROM,需要完成以下步骤:
1. **配置时钟**: 首先需设定正确的时钟源以启用 I2C 模块。
2. **初始化I2C模块**: 设置基础参数如传输模式和频率等。
3. **产生起始条件**: 通过设置START位在寄存器中生成开始信号。
4. **发送从设备地址**: 将EEPROM的7位地址写入相应寄存器。
5. **数据读写**:
- 在主发送器模式下,先清除ADDR位并把字节送至DR 寄存器,然后通过SDA线传输到外部设备。
- 主接收器模式下,在完成从设备地址后立即开始接收来自EEPROM的数据,并将它们存储在寄存器中。
**示例代码结构**:
```c
初始化I2C模块
void I2C_Init(void) {
设置时钟频率
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
配置I2C时钟控制寄存器
I2C_InitStructure.I2C_ClockSpeed = I2C_CLOCK_SPEED;
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_01;
I2C_InitStructure.I2C_OwnAddress1 = 0x00;
I2C_InitStructure.I2C_Ack = ENABLE;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
初始化I2C模块
I2C_Init(I2C1, &I2C_InitStructure);
启用I2C模块
I2C_Cmd(I2C1, ENABLE);
}
发送数据到EEPROM
void I2C_SendData(uint8_t data) {
// 设置从设备地址并启动传输模式
I2C_Send7bitAddress(I2C1, EEPROM_ADDRESS, I2C_Direction_Transmitter);
等待发送缓冲区为空
while (!I2C_GetFlagStatus(I2C1, I2C_FLAG_TXE));
发送数据至EEPROM
I2C_SendData(I2C1, data);
}
接收来自EEPROM的数据
uint8_t I2C_ReceiveData(void) {