IIC通讯的若干问题

1、IIC简介

IIC 总线是一种串行数据总线,只有二根信号线,通常我们为了方便把IIC设备分为主设备和从设备,基本上谁控制时钟线(即控制SCL的电平高低变换)谁就是主设备。

为了避免总线信号的混乱,要求各设备连接到总线的输出端时必须是漏极开路(OD)输出或集电极开路(OC)输出。总线空闲时,因各设备都是开漏输出,上拉电阻Rp使SDA和SCL线都保持高电平。任一设备输出的低电平都将使相应的总线信号线变低,也就是说:各设备的SDA是“与”关系,SCL也是“与”关系

设备上的串行数据线SDA接口电路应该是双向的,输出电路用于向总线上发送数据,输入电路用于接收总线上的数据。而串行时钟线也应是双向的,作为控制总线数据传送的主机,一方面要通过SCL输出电路发送时钟信号,另一方面还要检测总线上的SCL电平,以决定什么时候发送下一个时钟脉冲电平;作为接受主机命令的从机,要按总线上的SCL信号发出或接收SDA上的信号,也可以向SCL线发出低电平信号以延长总线时钟信号周期。

I2C 总线的数据传送速率在标准工作方式下为100kbit/s,快速方式下最高传送速率400kbit/s。

总线的运行(数据传输)由主机控制。所谓主机是指启动数据的传送(发出启动信号)、发出时钟信号以及传送结束时发出停止信号的设备,通常主机都是微处理器。被主机寻访的设备称为从机。为了进行通讯,每个接到I2C总线的设备都有一个唯一的地址,以便于主机寻访。主机和从机的数据传送,可以由主机发送数据到从机,也可以由从机发到主机。凡是发送数据到总线的设备称为发送器,从总线上接收数据的设备被称为接受器。

2、IIC总线数据传输机制

2.1 开始和停止

在I2C总线传输过程中,将两种特定的情况定义为开始和停止条件:
开始: 当SCL保持“高”时,SDA由“高”变为“低”为开始条件。同时IIC总线上的设备检测到这个开始信号它就知道处理器要发送数据了。
停止: 当SCL保持“高”且SDA由“低”变为“高”时为停止条件。同时IIC总线上的设备检测到这个停止信号它就知道处理器已经结束了数据传输,我们就可以各忙各个的了,如休眠等。
开始和停止条件均由主控制器产生。使用硬件接口可以很容易地检测到开始和停止条件。

在这里插入图片描述

2.2 数据的传输

SDA线上的数据在时钟“高”期间必须是稳定的,只有当SCL线上的时钟信号为低时,数据线上的“高”或“低”状态才可以改变。输出到SDA线上的每个字节必须是8位,每次传输的字节不受限制,但每个字节必须要有一个应答ACK。IIC设备只在SCL为高电平期间采集SDA数据。
在这里插入图片描述
数据传送具有应答是必须的。与应答对应的时钟脉冲由主控制器产生,发送器在应答期间必须下拉SDA线。当寻址的被控器件不能应答时,数据保持为高并使主控器产生停止条件而终止传输。简单的讲就是,主机发完8bit数据后就不再驱动总线了(SDA引脚变输入),而SDA和SCL硬件设计时都有上拉电阻,所以这时候SDA变成高电平。那么在第8个数据位,如果外接IIC设备能收到信号的话接着在第9个周期把SDA拉低,那么处理器检测到SDA拉低就能知道外接IIC设备数据已经收到。
在这里插入图片描述

如果一接收器件在完成其他功能(如一内部中断)前不能接收另一数据的完整字节时,它可以保持时钟线SCL为低,以促使发送器进入等待状态;当接收器准备好接受数据的其它字节并释放时钟SCL后,数据传输继续进行。

  • 一般的,一个合法的数据传输格式如下:

I2C总线在开始条件后的首字节决定哪个被控器将被主控器选择(例外的是“通用访问”地址,它可以在所有期间寻址)。当主控器输出一地址时,系统中的每一器件都将开始条件后的前7位地址和自己的地址进行比较。如果相同,该器件即认为自己被主控器寻址,而作为被控接收器或被控发送器则取决于R/W位(0表示Write,1表示Read)

  • 在单片机系统中可以这样应用:

系统传输数据的过程如下:先由单片机发出一个启始数据信号,接着送出要访问器件的7位地址数据,并等待被控器件的应答信号。当收到应答信号后,根据访问要求进行相应的操作。如果是读入数据,则数据线可一直设为输入方式,中间不需要改变SDA线的工作方式,每读入一个字节均应依次检测应答信号;如果是输出数据,则首先将SDA设置为输出方式,当发送完一个字节后,需要改变SDA线为输入方式,此时读入被控器件的应答信号就完成了一个字节的传送。当所有数据传输完毕后,应向SDA发出一个停止信号,以结束该次数据传输。

  • 对于AWINIC芯片的IIC通讯而言,IIC有如下定义:

ACK表示I2C总线数据的成功传输。
当主设备发送数据时,主设备发送8位数据后,必须释放SDA:当从设备确认时,从设备将SDA拉到GND。
当主设备读取数据时,从设备发送8位数据后,释放SDA并等待主进程的ACK,如果主设备发送ACK而没有发送I2C停止的信息,从设备发送下一个数据。如果主设备没有发送ACK,则从设备停止发送数据并等待主设备发送的IIC Stop信号。

2.3 IIC写数据的过程

每一个时钟脉冲传送1位数据。该数据是在SCL为高的状态下采样的,因此在SCL为高的时间内,SDA上的数据必须保持稳定。在SCL为高期间,任何SDA总线上的数据变化都将终止该次传输。SDA上新的数据应该在SCL为低的状态下发送。IIC协议允许数据线传送数据、指令和控制信息。
每一次数据的传输都包括以下程序:开始条件、若干字节的传输、结束条件。写入SDA总线的字节必须是8位的,每个字节后必须跟一个ACK信号。

写数据的过程,应该遵循以下步骤:

  1. 主设备产生“Start”条件
    “Start”条件由主设备产生,在SCL为高时,将SDA从高电平拉到低电平。

  2. 主设备发送地址和数据方向位
    主设备发出所要操作的从设备的地址(7位地址)和R/W数据方向位(1位)。

  3. 从设备发出ACK信号
    如果从设备确认地址正确,那么从设备发送ACK信号到SDA总线。

  4. 主设备发送控制寄存器地址
    主设备向从设备发送所要写入数据的控制寄存器的地址(8位)。

  5. 从设备发送ACK信号

  6. 主设备写入数据到寄存器
    主设备向被寻址的寄存器发送16位数据的高8位(最重要的位放最前面)。

  7. 从设备发送ACK信号

  8. 主设备写入数据到寄存器
    主设备向被寻址的寄存器发送16位数据的低8位。

  9. 从设备发送ACK信号

  10. 主设备继续发送更多数据
    如果主设备将发送更多的16位数据字节,那么在得到第7步的ACK信号后,控制寄存器地址将自动加1,再重复6~9步骤。

  11. 主设备产生“Stop”信号
    主设备产生停止信号,终止Write Cycle。
    IIC Write Byte Cycle

2.4 IIC读数据的过程

每一个时钟脉冲传送1位数据。该数据是在SCL为高的状态下采样的,因此在SCL为高的时间内,SDA上的数据必须保持稳定。在SCL为高期间,任何SDA总线上的数据变化都将终止该次传输。SDA上新的数据应该在SCL为低的状态下发送。IIC协议允许数据线传送数据、指令和控制信息。
每一次数据的传输都包括以下程序:开始条件、若干字节的传输、结束条件。写入SDA总线的字节必须是8位的,每个字节后必须跟一个ACK信号。

读数据的过程,应该遵循以下步骤:

  1. 主设备产生“Start”条件
    “Start”条件由主设备产生,在SCL为高时,将SDA从高电平拉到低电平。

  2. 主设备发送地址和数据方向位
    主设备发出所要操作的从设备的地址(7位地址)和R/W数据方向位(r/w=0)。

  3. 从设备发出ACK信号
    如果从设备确认地址正确,那么从设备发送ACK信号到SDA总线。

  4. 主设备发送控制寄存器地址
    主设备向从设备发送所要写入数据的控制寄存器的地址(8位)。

  5. 从设备发送ACK信号

  6. 主设备动作:
    方式1:主设备发送 “Stop”信号后紧接着发出“Start”信号;
    方式2:主设备再次发出“Start”信号,两次连续的Start信号形成“REPET Start”信号。

  7. 主设备发送地址和数据方向位
    主设备发出所要操作的从设备的地址(7位地址)和R/W数据方向位(r/w=1)。

  8. 从设备发送ACK信号

  9. 从设备发送数据到总线
    从设备向总线发送被寻址的寄存器的16位数据的高8位。

  10. 主设备发送ACK信号

  11. 从设备发送数据到总线
    从设备向总线发送被寻址的寄存器的16位数据的低8位。

  12. 主设备应答
    如果主设备发出ACK应答信号,那么从设备将寄存器地址加1,发送下一个寄存器的数据。
    如果主设备发出“Stop”信号,那么数据读取操作结束。
    在这里插入图片描述

3 IIC总线的仲裁机制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值