I2C外设简介
•STM32内部集成了硬件I2C收发电路,可以由硬件自动执行时钟生成、起始终止条件生成、应答位收发、数据收发等功能,减轻CPU的负担
•支持多主机模型
•支持7位(最常见,7位地址+读写位)/10位地址模式(为了挂载128个以上的设备)
•支持不同的通讯速度,标准速度(高达100 kHz),快速(高达400 kHz)
•支持DMA(读写多字节时,使用DMA自动转运数据)
•兼容SMBus协议(I2C改进的协议)
•STM32F103C8T6 硬件I2C资源:I2C1、I2C2
I2C框图

左侧的SDA和SCL是I2C通信引脚,下方的SMBALERT是smbus使用的,I2C用不到。
上方是SDA,数据控制部分。
数据收发的核心,是数据寄存器(DATA REGISTER)和数据移位寄存器,需要发送数据时,把这个数据写道数据寄存器DR,当移位寄存器没有数据移位时,这个数据寄存器的值就会转到移位寄存器里,在移位过程中,可以把下一个数据放到数据寄存器DR中等待,前一个数据移位完成,下一个数据直接到移位寄存器。
当数据由数据寄存器转移到数据移位寄存器时,置状态寄存器的TXE位为1,表示发送寄存器为空。
接收数据时,数据一位一位地从引脚到移位寄存器中,一个字节的数据收集好之后,数据整体从移位寄存器转移到数据寄存器,置标志位RXNE,表示接收寄存器非空,此时可以从数据寄存器读出数据。
下方为SCL,时钟控制部分。
I2C基本结构

移位寄存器和数据寄存器DR配合,是通信的核心。
由于I2C是高位先行,移位寄存器是向左移位,从高位到低位移位。一个SCL时钟移位一次,八次把一个字节传输完成。
接收时,数据从GPIO口移进来,移位8次,一个字节就接收完成了。
使用硬件I2C时,对应的2个GPIO口配置为复用开漏输出模式。
主机发送

主机接收

常用函数
1 | void I2C_DeInit(I2C_TypeDef* I2Cx); |
I2C恢复缺省配置
1 | void I2C_Init(I2C_TypeDef* I2Cx, I2C_InitTypeDef* I2C_InitStruct); |
I2C初始化
1 | void I2C_StructInit(I2C_InitTypeDef* I2C_InitStruct); |
I2C结构体初始化
1 | void I2C_Cmd(I2C_TypeDef* I2Cx, FunctionalState NewState); |
I2C使能
1 | void I2C_GenerateSTART(I2C_TypeDef* I2Cx, FunctionalState NewState); |
I2C生成起始条件,调用此函数生成起始条件。
1 | void I2C_GenerateSTOP(I2C_TypeDef* I2Cx, FunctionalState NewState); |
I2C生成终止条件。
1 | void I2C_AcknowledgeConfig(I2C_TypeDef* I2Cx, FunctionalState NewState); |
配置在收到一个字节之后,是否给从机应答
1 | void I2C_SendData(I2C_TypeDef* I2Cx, uint8_t Data); |
I2C发送数据,写入数据到数据寄存器DR。
1 | uint8_t I2C_ReceiveData(I2C_TypeDef* I2Cx); |
读取DR的数据作为返回值,接收数据
1 | void I2C_Send7bitAddress(I2C_TypeDef* I2Cx, uint8_t Address, uint8_t I2C_Direction); |
发送7位地址
硬件I2C读写MPU6050
MPU6050.c
1 |
|





























