在谈IIC前,我们先将IIC的通信分为三步,准备、通信、结束阶段
1.通信准备
IIC通信至少要两条通道,一条时钟线SCL,一条数据线SDA,而这两条线可以连接很多的设备。虽然IIC连接着很多的设备,但是在IIC没有与各个设备通信时,IIC均处于休眠状态,这时候就需要通过主机来唤醒设备了。
我们首先看时序图,怎么开始IIC的动作,及怎么结束II:
然后再看代码(somenop()为延时函数,延时时间主要是看单片的时钟周期,我所使用的单片机芯片是IAP15F2K6102)
void somenop(void)
{
uchar t;
_nop_();
_nop_();
t = 12;
while(--t);
}
void IIC_Start(void)
{
SDA = 1;SCL = 1;
somenop();
SDA = 0;
somenop();
SCL = 0;
}
void IIC_Stop(void)
{
SDA = 0; SCL = 1;
somenop();
SDA = 1;
somenop();
}
当我们启动IIC后,下一步就是寻找设备了,于是我们发送一个地址,像PCF8591,唤醒它的地址就是0x90(二进制数1001 0000),唤醒AT24C02的地址则是0 (二进制数1010 0000)这时候需要设备给一个响应来说明设备收到消息了,然后由单片机接受即可,所以设备与单片机达成通信的条件了,然后两边建立了通信通道后,单片机就开始选用所需设备的功能端口地址了。
如:选择PCF8591的A0、A1、A2、A3通道的话,就可以分别发送0x00、0x01、0x10、0x11;选择AT24C02的A0、A1、A2通道的话,就可以分别发送对应地址(因为AT24C02还带有读/写地址,该地址是在最后一位,这里就不详细谈了)。
在IIC开始,选择设备地址以及,选择使用那个通道以及选择读数据还是写数据后,通信准备阶段完成。
2.开始通信
首先我们要知道IIC是半双工通信,同一时刻只有一个设备发送数据个另一个设备,两个设备开始通信时,主机一直控制SCL时钟线并由它来产生出时钟信号(也就是脉冲信号),然后,两设备通过SDA线发送数据来互相通信。
当主机接受从机数据时(也就是主机读取从机数据),时钟信号的电平为低的时间内,从机通过数据线发出高低电平的信号;当时钟信号为高电平期时,主机读取读取信号,此时数据线的电平不能改变。发送八位数据后,主机会收到从机的应答,也就是第九个脉冲的时候是应答时间,从机将SDA数据线置为低电平,此时被主机检测到。于是一个数据就传输成功了,主机收到的数据是一个二进制,数据如果为00101101,转换十六进制是0x2D,然后多做几个这样的步骤,数据就读取到了。
同理从机接受主机的数据时(主机写数据给从机),时钟信号还是主机产生的,然后数据是由从机发给主机,发送8位数据后,主机发给从机应答信号,此时一个数据也就成功发送了。
3.结束通信
主机再数据发送完后(即应答时间内)给从机一个非应答信号(主机将SDA电平拉高)后解释IIC,这时候IIC通信告一段落了,最后也就完成了一次通信,数据传输进行完毕。
4.注意点
IIC开始、结束及SCL的时钟周期是必须合适的,一般都大于5us就可以了(这个时间也可能和设备有关)。时间太短会导致数据传输有问题,或者从机来不急应答;时间太长的话……可能数据传输太慢吧(知识盲区了)。
以上就是我对IIC的理解了,这也仅仅是我个人的理解,避免不了错误之处,也希望诸位指正
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』