I2C外设简介
STM32内部集成了硬件I2C收发电路,可以由硬件自动执行时钟生成、起始终止条件生成、应答位收发、数据收发等功能,减轻CPU的负担
支持多主机模型
固定多主机:有多个主机,任意一个主机都可以控制从机
可变多主机:从机可以变成主机,通信完成后,这个主机就要跳回从机的位置
支持7位/10位地址模式
支持不同的通讯速度,标准速度(高达100 kHz),快速(高达400 kHz)
支持DMA
兼容SMBus协议
STM32F103C8T6 硬件I2C资源:I2C1、I2C2
I2C框图
I2C是半双工,是同一组数据寄存器与移位寄存器
时钟控制:控制SCL线,在CCR寄存器写对应位,就可以实现相应的功能
写入控制寄存器,可以对整个电路进行控制
读出状态寄存器,可以得知电路工作状态
I2C基本结构
移位寄存器高位先行,发送时最高位先移出去
GPIO口要设置成复用开漏输出模式
主机发送流程
EVx是标志位
EV5:代表起始条件已发送
EV6:代表寻址事件已完成
主机接收
EV7:数据寄存器非空
代码
void I2C_GenerateSTART(I2C_TypeDef* I2Cx, FunctionalState NewState);
//生成起始条件
void I2C_GenerateSTOP(I2C_TypeDef* I2Cx, FunctionalState NewState);
//生成终止条件
void I2C_AcknowledgeConfig(I2C_TypeDef* I2Cx, FunctionalState NewState);
//配置应答使能ACK
void I2C_SendData(I2C_TypeDef* I2Cx, uint8_t Data);
//把数据直接写入DR寄存器
uint8_t I2C_ReceiveData(I2C_TypeDef* I2Cx);
//读取DR数据作为返回值
void I2C_Send7bitAddress(I2C_TypeDef* I2Cx, uint8_t Address, uint8_t I2C_Direction);
//发送7位地址专用函数
I2C State Monitoring Functions
//Basic state monitoring:
I2C_CheckEvent();
//同时判断一个或多个标志位,来确定EVx是否发生
//Advanced state monitoring:
I2C_GetLastEvent();
//Flag-based state monitoring:
I2C_GetFlagStatus();
//基于标志位的状态监控,判断某个标志位是否置1