1. I²C总线基础与LCM32F067硬件特性
I²C(Inter-Integrated Circuit)总线是Philips半导体(现NXP)在1980年代设计的同步串行通信协议,其双线制设计(SCL时钟线和SDA数据线)使其成为嵌入式系统中连接低速外设的理想选择。在LCM32F067这类Cortex-M0内核MCU上,硬件I²C控制器通过专用寄存器接口大大减轻了CPU负担。
1.1 I²C物理层关键特性
开漏输出结构要求每根信号线必须接上拉电阻(典型值4.7kΩ),这种设计实现了"线与"逻辑:
- 任何设备拉低线路都会使整条线变低
- 所有设备释放时由上拉电阻恢复高电平
- 支持多主多从架构的冲突检测
在LCM32F067上,GPIO需配置为:
c复制GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; // 复用开漏
GPIO_InitStruct.Pull = GPIO_PULLUP; // 内部上拉
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
1.2 协议层通信时序
标准模式(100kHz)下的时序参数要求:
- 起始条件:SCL高时SDA下降沿(>4.7μs保持)
- 停止条件:SCL高时SDA上升沿(>4.0μs保持)
- 数据有效性:SCL高电平期间稳定(>4.7μs)
- 时钟同步:当主设备检测到SCL被从设备拉低时自动延长周期
注意:LCM32F067的硬件I²C控制器会自动处理起始/停止条件生成,但需确保时序参数寄存器(I2C_TIMINGR)配置正确。例如100kHz时钟对应配置值0x2000090E。
1.3 LCM32F067的I²C外设特点
这款Cortex-M0芯片的I²C控制器包含三个关键状态机:
- 主发送器:处理地址发送、数据写入
- 主接收器:处理数据读取
- 从设备:响应主机请求
特殊功能寄存器值得关注:
- CR1:控制寄存器(使能、中断配置)
- CR2:传输控制(目标地址、数据长度)
- ISR:状态寄存器(TXE、RXNE、BUSY等标志)
- TIMINGR:时序参数配置
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 主从通信架构设计
2.1 寄存器映射模型
典型的寄存器型设备通信协议包含:
- 主机发送起始条件 + 从机地址(写)
- 主机发送寄存器地址
- 主机发送重复起始条件 + 从机地址(读/写)
- 数据传输(单字节或多字节)
在LCM32F067上实现时,从机需要维护寄存器映射表:
c复制#define REG_MAP_SIZE 32
uint8_t RegisterMap[REG_MAP_SIZE] = {0};
2.2 主机状态机设计
主机操作应遵循以下状态转换:
mermaid复制graph TD
A[IDLE] -->|Start| B[ADDR_SEND]
B -->|ACK| C[REG_ADDR_SEND]
B -->|NACK| E[ERROR]
C -->|ACK| D[DATA_TRANSFER]
C -->|NACK| E
D -->|STOP| A
D -->|ReStart| B
对应代码实现框架:
c复制typedef enum {
I2C_STATE_IDLE,
I2C_STATE_ADDR_SENT,
I2C_STATE_REG_SENT,
I2C_STATE_TX_DATA,
I2C_STATE_RX_DATA,
I2C_STATE_ERROR
} I
