STM32 的7 位寻址主机模式 一、 各寄存器内容与组织:控制、地址匹配、数据、状态、时钟控制、上升沿控制 二、 IIC 协议及 STM32 的 master 实现 EVENT 后的第一个符号表示事件发生后对应的标志位的状态,着重看 7 位地址的通信; 三、 基础知识(主要讨论起主机模式,从机模式的配置与使用可类比) 1. 默认工作在从机模式,产生起始信号后自动转为主机模式,产生终止信号或仲裁失权后自动转为从机模式;起止信号由主机模式下的软件实现,地址也只能由主机发送,响应信号由接收器发出(软件实现),要注意区别主机、从机、发送机、接收机; 2. 数据通信的直接通道,SDA Line ↔ Shift Register ↔ DR ↔ Memory(数据寄存器与存储器直接的数据交换发生在 DMA 模式,另外若从机在 SDA 接收到的是地址则直接会与地址寄存器比较,而不会送入数据寄存器) 3. 主机产生时钟信号,一串数据总是以起始于 start 信号,终止于 stop 信号,一旦 SDA 线上产生 start 位信号,主机模式便被选中;9 个寄存器的功能分配简单明了:I2C_CR2 主要配置时钟与模块中断及 DMA 使能位,I2C_CR1 则主要产生 Start 等控制信号,I2C_SR2 主要是 MSL、TRA 和 BUSY 标志位,I2C_SR1 则是其他事件的标志位,接下来就是存储数据的 I2C_DR,时钟设置的 I2C_CC4R 和 I2C_TRISE,地址匹配的 I2C_OAR1 和 I2C_OAR2; 4. 主机模式必要操作序列:外围时钟输入最少2M(标准模式)、4M(快速模式) 1) 配置 I2C_CR2 寄存器以产生正确时序; 2) 配置时钟控制寄存器 I2C_CCR; 3) 配置上升时间寄存器 I2C_TRISE; 4) 配置 I2C_CR1 寄存器以使能接口电路; 5) 配置 I2C_CR1 寄存器,置位 START 位以产生起始信号; 5. 时序具体解析 1) Start 信号,置位 I2C_CR1 的 START 位以产生起始信号(在总线空闲时,即I2C_SR2 的 BUSY 清零),使转为主机模式(置位 I2C_SR2 的 MSL);在主机模式下,置位 START 位会在当前字节传输完成后产生一个重启ReStart 信号;一旦 Start信号送出,I2C_SR1 的 SB 位会由硬件置位并产生中断(前提是 ITEVFEN 位被置位,貌似文档有误,我认为应是 IC2_SR2的 ITEVTEN 位),然后需要读SR1 和写DR 以清零SB(这也符合操作时序); 2) 从机地址发送,7 位模式下,地址字节一旦送出,I2C_SR1 的 ADDR 位会由硬件置位并产生中断(...