找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1640|回复: 0
收起左侧

关于我对IIC协议的一些理解

[复制链接]
ID:549507 发表于 2020-7-30 21:13 | 显示全部楼层 |阅读模式
    在谈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的地址则是0xa0(二进制数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的理解了,这也仅仅是我个人的理解,避免不了错误之处,也希望诸位指正。(2020年7月30日写)



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表