一、IIC总线结构
由数据线 SDA 和时钟 SCL 构成的串行总线,可发送和接收数据(半双工)
一主多从模式,即总线上挂载多个从机,每个从机均有其固定地址。
二、IIC协议
(1)空闲状态
12C总线总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。此时各个器件的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电H把电平拉高。
(2)起始信号与停止信号
开始信号:SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送数据。
结束信号:SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。
(3)应答信号ACK
接收数据的 IC 在接收到 8bit 数据后,向发送数据的 IC 发出特定的低电平脉冲,表示已收到数据,即在发送器(CPU)发送一个字节单元之后,在时钟脉冲9期间释放数据线,等待接收器反馈信号,CPU 接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。应答信号一般为SDA低电平。
(4)数据传输
数据在上升沿到来之前就要准备好,且在SCL高电平期间保持稳定(不稳定有变化的话就变成了开始信号或者结束信号),在传输过程中,高电平期间是啥电平就是传输啥电平,其中,一帧数据最先发送最高位
二.IIC底层驱动
以EEPROM(24C02)为例
正点原子例程里没有采用stm32自带的IIC模块,采用两个IO口实现IIC时序
24C02读写时序
写时序:
读时序:
器件地址
器件地址高四位默认为0xA(1010),低四位前三位A2、A1、A0用于器件寻址,第四位为读写控制
驱动程序
//产生IIC起始信号
void IIC_Start(void)
{
SDA_OUT(); //sda线输出,这里是对IO口方向设置,此时为对从机设备(24C02)进行输出,所以设置为输出
IIC_SDA=1;
IIC_SCL=1;
delay_us(4);
IIC_SDA=0;//START:when CLK is high,DATA change form high to low
delay_us(4);
IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
}
//产生IIC停止信号
void IIC_Stop(void)
{
SDA_OUT();//sda线输出
IIC_SCL=0;
IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
dela