IIC总线,是一种十分常见的总线通讯协议,他的又是主要是一条总线上可以存在多个主机和从机,这样就可以实现多对多的数据交互,我们通过IO模拟IIC的方式深入了解IIC基本知识,现在,很多MCU都是自带IIC,不过也有部分MCU是没有IIC功能的(例如51,本博没有用过51系列的MCU,有错误说法的请谅解),为了兼容此类IIC以及方便移植,我们通过IO模拟IIC的方式实现IIC总线协议。
1.IIC时序分析及其实现
IIC通常包括 开始、发送数据、应答(非应答)以及结束五个阶段,这些阶段都有严格的时序要求。
我们结合AT24C02的datasheet(下载链接)来实现我们的IIC,基本的IIC时序要对应相对应器件,主要改动的通常只是延时而已。
1.1开始
开始信号,我们要做的是三件事情,最重要是2步骤。1、3步骤不要是保证不受之前的时序影响,同时确保下一个时序的正确。
1.我们要将SDA、SCL置高,释放总线。
2.SCL保持高电平时刻、SDA要有从高到低的跳变过程
3.SCL置低占据总线
实现代码:
void IIC_Start(void){
//输出模式
SDA_OUTPUT();
//1.总线空闲
SDA_OUT = 1;
SCL = 1;
delay_us(5);
//2.SDA电平跳变 H -> L
SDA_OUT = 0;
delay_us(5);
//3.占据时钟总线
SCL = 0;
}
1.2 结束
结束信号关注的同样是2步骤。
void IIC_Stop(void){
//输出模式
SDA_OUTPUT();
//1.钳住总线同时SDA为零
SDA_OUT = 0;
SCL = 0;
delay_us(5);
//2.SCL、SDA电平跳变 L -> H
SCL = 1;
SDA_OUT = 1;
delay_us(5);
}