IIC(Inter-Integrated Circuit)通信协议由于它引脚少,硬件实现简单,可扩展性强,不需要使用USART、CAN等通信协议的外部收发设备,被广泛地用于系统内多个集成电路间的通信。
分层简化复杂问题
- 芯片被分为内核层和片上外设
- STM32标准库则是在寄存器与用户代码之间的软件层
- 通信协议则可将其分为物理层和协议层
- 物理层
规定通信系统中具有机械、电子功能部分的特性,确保原始数据在物理媒介中的传输。
- 协议层
主要规定通信逻辑,统一收发双方的数据打包、解包标准。
- 物理层
IIC物理层
1.它是一个支持设备的总线。在一个IIC通信总线中,支持多个通信主机及多个通信从机。
2.一个IIC总线只使用两条总线线路,一条双向串行数据线(SDA),一条串行时钟线(SCL)。数据线用来表示数据,时钟线用于同步数据的收发。
3.每个设备都有一个独立的地址,主机可利用这个地址进行不同设备之间的访问。
4.总线通过上拉电阻接到电源。当IIC设备空闲时,会输出高阻态,而当所有设备都空闲时,都输出高阻态,由上拉电阻把总线拉成高电平。(ps:高阻态:表示电路中的某个节点具有相对电路中其他点相对更高的阻抗。对下级电路无任何影响,电平高低由后面接到电路决定。)
5.多个主机同时使用总线时,为防止数据冲突,利用仲裁方式解决由哪个设备占用总线。
6.具有3种传输模式:标准模式100kbps, 快速模式400kbps, 高速模式3.4Mbps.
7.连接到相同总线的IC数量受到总线的最大电容400pF限制。
IIC协议层
定义了通信的起始信号、数据有效性、响应、仲裁、时钟同步和地址广播等环节。
传输时主机产生时钟,在第9个时钟时,数据发送端会释放SDA的控制权,由数据接收端控制SDA,若SDA为高电平,表示非应答信号(NACK),低电平表示应答信号(ACK)
STM32标准库IIC初始化结构体详解
STM32标准库提供了IIC初始化结构体及初始化函数,来配置IIC外设。
stm32f10x_i2c.h和stm32f10x_i2c.c中定义。
typedef struct{
uint32_t I2C_ClockSpeed; // 设置SCL时钟频率,此值要低于400000
uint16_t I2C_Mode; // 指定工作模式
uint16_t I2C_DutyCycle; // 指定时钟占空比
uint16_t I2C_OwnAddress1; // 指定自身的I2C设备地址
uint16_t I2C_Ack; // 使能或关闭响应
uint16_t I2C_AcknowledgedAddress; // 指定地址的长度, 7/10
}I2C_InitTypeDef;