一、IIC协议概括
IIC全称Inter-Integrated Circuit (集成电路总线)
是由PHILIPS公司在80年代开发的两线式串行总线,用于连接微控制器及其外围设备。IIC属于半双工同步通信方式。
1、特点:
简单性和有效性
由于接口直接在组件上,因此IIC总线占用的空间非常小,减少了电路的空间和芯脚管脚的数量,降低了互联成本。
2、主机/从机模式
一次数据传输的开始和结束只由主机(MCU)来发起;
3、硬件构成
IIC串行总线由两根线组成,一根是双向的数据线SDA,另一根是时钟线SCL,其SCL信号是由主机控制;
所有接到IIC总线上的设备的SDA线都接到总线的SDA,各设备的时钟线SCL接到总线的SCL上;总线上的每个设备都有一个唯一地址。
4、IIC协议
IIC总线在传输数据的过程中一共有三种类型信号,分别为:开始信号、应答信号、结束信号。
这些信号中,起始信号是必须的,结束信号和应答信号。
根据起始信号时序图,可以看出SCL在信号发生过程中没有发生变化,根据IIC接线图可以看出SCL空闲时置高,当信号发生时SDA置高延时4.7us后置低。由此我们可以写出IIC总线的起始信号函数:
void IIC_Start(void)
{
sda = 1;
scl = 1;
__NOP();
sda = 0;
__NOP();
}
根据终止信号图可以看出初始状态下,SCL置高,当信号发出后SDA拉高,延时4.7us,SDA置低。
void IIC_Stop(void)
{
sda = 0;
scl = 1;
__NOP();
sda = 1;
__NOP();
}
应答信号
发送器每发送一个字节(8Bit),就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。应答信号为低电平时,规定为有效应答位(ACK,简称应答位),表示接受器已经成功地接受了该字节;
应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。
因为发送器发送数据时,将释放数据线,则初始状态时SDA拉高,延时一段时间,到信号发生后,SCL拉高延时4us的同时进行对于SDA高低判断。在程序中设置一个标志位flag来存放SDA高低进行判断。
char IIC_ACK()
{
char flag;
sda = 1; //在时钟脉冲9期间释放数据线
__NOP();
scl = 1;
__NOP();
flag = sda;
__NOP();
scl = 0;
__NOP();
return flag;
}
数据发送时序:
void IIC_Send_Byte(char dataSend)
{
int i;
for(i = 0;i<8;i++){
scl = 0; //scl拉低,让sda做好数据准备
sda = dataSend & 0x80; //1000 0000获得dataSend的最高位,给sda
__NOP(); //发送数据建立时间
scl = 1; //scl拉高开始发送
__NOP(); //数据发送时间
scl = 0; //发送完毕拉低
__NOP();
dataSend = dataSend << 1;
}
}
-------- end ---------------------
希望能帮到和我一样的小白们!
本文参考了和借鉴了NCHui的帖子