对I2C总线时序的一点理解以及ACK和NACK(NAK)
I2C时序分析和基础知识总结
但如果从机要完成一些其他功能后才能接收或发送下一个完 整的数据字节,那么可以使时钟信号保持低电平迫使主机进入等 待状态。这也是唯一一个从机改变主机时钟的情况。
当从机准备好接受下一个字节时,释放时钟线SCL,数据传 输继续。
(2)数据帧格式 I2C总线上传送的数据信号是广义的,既包括地址
信号,又包括真正的数据信号。
I2C总线只有两根双向信号线。一根是数据线SDA,另 一根是时钟线SCL。
I2C总线通过上拉电阻接正电源。当总线空闲时,两根线均 为高电平。连到总线上的任一器件输出的低电平,都将使总线 的信号变低,即各器件的SDA及SCL都是线“与”关系。
二、I2C时序分析
1、数据位的有效性规定
I2C总线进行数据传送时,时钟信号为高电平期间,数据 线上的数据必须保持稳定,只有在时钟线上的信号为低电平 期间,数据线上的高电平或低电平状态才允许变化。
每个器件都有一个唯一的地址识别,而且都可以作为一个 发送器和接收器(由器件的功能决定)。很明显,LCD驱动器 只能是接收器,而存储器既可以接收又可以发送数据。
• 连接到I2C总线上的器件,若具有I2C总线的硬件接口,则
很容易检测到起始和终止信号。对于不具备I2C总线硬件接 口的有些单片机来说,为了检测起始和终止信号,必须保证
在起始信号后必须传送一个从机的地址(7位), 第8位是数据的传送方向位(R/),用“0”表示主机 发送数据(T),“1”表示主机接收数据(R)。每 次数据传送总是由主机产生的终止信号结束。但是, 若主机希望继续占用总线进行新的数据传送,则可 以不产生终止信号,马上再次发出起始信号对另一 从机进行寻址。
I2C时序分析和基础知识简介
一、什么是I2C 二、I2C 三、I2C基础知识 四、I2C注意事项
I2C总线信号时序总结
I2C总线信号时序总结I2C(Inter-Integrated Circuit)总线是一种串行通信协议,它用于在集成电路之间进行短距离的数据交换。
I2C总线信号时序对于正确实现I2C通信非常重要。
本文将详细总结I2C总线信号时序,包括起始条件、数据传输、停止条件等。
1.总线状态2.起始条件起始条件是指从I2C主设备(Master)向I2C从设备(Slave)发送数据之前的一系列信号。
起始条件由两个信号组成:SCL(时钟)和SDA(数据)。
当SCL为高电平时,SDA发生一个下降沿,表示开始传输数据。
3.数据传输在数据传输阶段,数据位通过SCL时钟控制的边缘传输。
这个过程类似于同步串行通信协议。
数据的传输在I2C总线上是以字节为单位进行的,每个字节有8位(bit)。
数据传输过程中,SCL和SDA的状态发生变化的规则如下:-当SCL为低电平时,数据线SDA可以发生变化。
此时SDA数据线的电平变化将被忽略。
-当SCL为高电平时,SDA数据线的电平变化将被读取或写入。
4.读取数据在I2C总线上进行数据读取时,接收设备通常在时钟的上升沿读取数据。
主设备将在SCL为高电平时将数据传输到SDA数据线上。
而从设备将在SCL下降沿读取数据。
5.写入数据在I2C总线上进行数据写入时,发送设备通常在时钟的下降沿写入数据。
主设备在SCL为高电平时,将数据传输到SDA数据线上。
从设备将在SCL下降沿写入数据。
6.停止条件停止条件是指在I2C通信完成后,由主设备发送的一系列信号。
停止条件由两个信号组成:SCL(时钟)和SDA(数据)。
当SCL为高电平时,SDA发生一个上升沿,表示结束传输。
对于I2C总线信号时序的更详细说明可以如下:-在起始条件中,SCL先于SDA变为高电平。
SDA变化的任何时间必须在SCL变高之前完成。
起始条件的结束是在SCL为高电平时,SDA发生一个下降沿。
-在数据传输阶段,数据的传输是由主设备控制的,每个字节8位。
i2c 时序状态
i2c 时序状态
I2C总线是一种串行数据总线,用于连接微控制器(MCU)和外部设备。
它的时序状态包括:
- 启动信号:SCL为高电平的时候,SDA由高电平向低电平跳变。
- 结束信号:SCL为高电平的时候,SDA由低电平向高电平跳变。
- 数据传送时序:由于一个I2C总线上可以挂多个设备,因此开始信号后,要先发送7bit的从设备地址;第8个bit表示读或者写,该信号由主机发送;然后从机会发送ACK 的应答信号;之后才是要发送的数据,数据发送完,从机再发送ACK信号。
- 空闲状态:由I2C的启动条件可知,I2C总线在空闲时需要总线的SDA和SCL两条信号线同时处于高电平。
- 总线仲裁:I2C总线上可能挂接有多个器件,有时会发生两个或多个主器件同时想占用总线的情况,这种情况叫做总线竞争。
在使用I2C总线时,必须严格遵循其时序要求,以确保数据传输的可靠性和准确性。
如需了解更多关于I2C总线的信息,可以补充相关背景后再次向我提问。
对I2C总线时序的一点理解以及ACK和NACK(NAK)
关键字:i2c ,IIC,bus,ACK,NACK,NAK,SDA,SCL,timing,master,slaver,时序,响应,总线关于i2c的响应问题:对于每一个接收设备(从设备,slaver),当它被寻址后,都要求在接收到每一个字节后产生一个响应。
因此,the master device必须产生一个额外的时钟脉冲(第九个脉冲)用以和这个响应位相关联。
在这个脉冲期间,发出响应的从设备必须将SDA拉低并在时钟脉冲的高电平期间保持住。
这表示该设备给出了一个ACK。
如果它不拉低SDA线,就表示不响应(NACK)。
另外,在从机(发送方)发送完最后一个字节后主设备(接收方)必须产生一个不响应位,用以通知从机(发送方)不要再发送信息了,这样从机就知道该将SD A释放了,而后,主机发出一个停止位给s laver。
总结下,i2c通讯中,SDA 和SCL 都是有主机控制的,从设备只是能够将SDA 线拉低而已。
对于SCL线,从机是没有任何能力去控制的。
从机只能被动跟随SCL再说的清楚些:主机发送数据到从机的状态下:主机控制SC L信号线和SDA信号线,从机只是在S CL线为高的时候去被动读取SD A线。
主机读取从机的数据:主机来发出时钟信号,从机只是保证在时钟信号为高电平的时候的SD A的状态而已。
//----------------------------------------补充@201108311142SDA和SC L已经通过上拉电阻被上拉,master可以控制(拉低或者释放)这两条线,而slave r只能控制SDA线。
当maste r发送数据时,master会适时地将SDA和S CL拉低或释放(拉高)。
确切的时序应该是这样的:当maste r要发送一个star t时,master会将SDA拉低,这就可以了,因为此时的S CL一定是High。
i2c时序验证方法
I2C时序验证方法主要有以下步骤:
1. 应答信号检测:在I2C总线的数据线上,低电平表示有效应答位(ACK),高电平表示非应答位(NACK)。
接收器在接收到每个字节后,都需要在数据线SDA上产生一个低电平,表示应答信号,如果接收器没有成功接收字节,则会产生高电平,即非应答信号。
2. 时序延迟:在数据线上产生应答信号后,接收器需要等待特定的延迟时间。
这段时间足够长,以使得主控制器可以处理其他任务或在总线上进行其他操作。
3. 读取数据:当接收器产生应答信号后,它将通过数据线SDA 读取数据。
每个字节必须被正确地读取和处理。
4. 确认接收:主控制器通过监测数据线SDA上的信号,确认接收器已经成功接收到数据。
如果接收器没有成功接收到数据,它将产生非应答信号(NACK),通知主控制器数据传输失败。
5. 结束传输:当所有数据都成功传输后,主控制器将发送一个停止信号(P),以通知接收器数据传输已经结束。
在测试I2C总线上的时序验证方法时,可以使用示波器等工具来观察和验证SDA线上的信号波形是否符合预期。
同时,通过模拟不同的场景和错误情况,可以测试和验证I2C总线的稳定性和可靠性。
i2c信号的ACK与NACK
i2c信号的ACK与NACK2013-12-25 14:11 21664人阅读评论(1) 收藏举报分类:电路(39)版权声明:本文为博主原创文章,未经博主允许不得转载。
我们平时在调试I2C的时候可能很少去关注NACK信号,只知道如果Master发送数据,MSB先发,LSB后发,连续发送一个字节(8个bit),之后Slave会回复一个ACK信号,但是有时I2C slave可能会发出NACK信号,下面让我们来看看NACK信号存在的情况。
1、从spec下摘取一段:2、翻译:每个字节后会跟随一个ACK信号。
ACK bit使得接收者通知发送者已经成功接收数据并准备接收下一个数据。
所有的时钟脉冲包括ACK信号对应的时钟脉冲都是由master产生的。
ACK信号:发送者在ACK时钟脉冲期间释放SDA线,接收者可以将SDA拉低并在时钟信号为高时保持低电平。
NACK信号:当在第9个时钟脉冲的时候SDA线保持高电平,就被定义为NACK信号。
Master要么产生STOP条件来放弃这次传输,或者重复START条件来发起一个新的开始。
3、实例:可以看到如下波形,Master发送01101100(0x6c,MSB先发),在第9个时钟的时候SDA 为高电平,表示Slave发送了NACK信号,之后整个I2C通信就结束了。
这是一次失败的I2C通信,原因可能是I2C设备那边出的问题,或者访问I2C设备的地址与I2C设备实际的地址不对应,导致没接收到Master的数据从而返回NACK。
下面我拿一个OV8825 Sensor的I2C来说明,OV8825的Slave Write Address为0x6c,OV8825的ID register Address为0x300a,0x300b,ID register里面存的Value是0x88,0x25正常的I2C波形如下:1)设定I2C写的地址:01101100(0x6c) 00110000(0x30) 00001010(0x0a)Slave Write Address:0x6c,ID register address:0x300a2)设定I2C读的地址:01101101(0x6d) 10001000(0x88) Slave Read Address:0x6d,ID register value:0x8820150716看到这里有点奇怪,i2c write是以ack+stop结束通信,而i2c read是以nack+stop 结束通信的,原因如下:i2c write的时候,master在写完最后一个字节之后slave会回ACK,然后master发送stop 信号结束通信i2c read的时候,master在接收完slave发送的最后一个字节之后会回NAK,因为这个时候master已经接收到足够的字节,NAK告诉slave不要在发送数据了。
i2c时序图的详细讲解
i2c时序图的详细讲解i2c时序图是一种重要的工具,可以帮助开发人员更好地理解I2C总线通信交换过程。
在这篇文章中,我们将详细介绍I2C时序图的概念,并讨论其主要元素和目的。
I2C时序图是一种用于帮助开发人员更好的理解I2C总线通信流程的工具。
它按照时间顺序展示I2C总线传输的信号和事件。
时序图是一种示意图,它用不同的颜色线来描述不同的时序信号,并附上关键时间延迟和其它信息,以帮助开发人员更好理解I2C总线通信过程。
I2C时序图由4个主要元素构成,它们分别是SDA(数据线)、SCL (时钟线)、ACK(应答确认)和Rx(接收)。
每个元素都有自己的特定功能,它们是I2C总线进行数据交换的基础。
SDA(数据线)是I2C总线上的双向数据传输线,它用来传输主机和从机之间的数据。
SCL(时钟线)是I2C总线上双向同步时钟传输线,它用于同步主机和从机之间的数据传输过程,以保证数据的有效性和正确性。
ACK(应答信号)是I2C总线上的双向应答接收确认线,用于确认双方之间的数据交互过程是否完成。
Rx(接收)是I2C 总线上单向数据接收信号,用于接收从机发出的数据。
I2C总线通信过程按照以下时序运行:1.发送Start Bit,2.发送从机地址,3.发送操作位,4.发送数据,5.发送结束位,6.发送ACK信号,7.接收数据,8.发送Stop Bit。
在I2C总线通信过程中,每一步都有它的关键时间延迟。
这些延迟确保了从机的有效反应时间,同时为主机和从机之间的数据传输提供了一个稳定的数据传输环境。
I2C时序图有助于帮助开发人员理解I2C总线通信过程,并确保程序的正确性和有效性。
时序图可以帮助开发人员发现和debug I2C 总线通信中出现的问题,提高设计的可靠性和可维护性。
I2C时序图是开发I2C总线通信应用的重要工具,它可以帮助开发人员更好地理解I2C总线通信,发现和debug I2C总线通信中出现问题,并保证程序的正确性和有效性。
i2c 连续读 时序
i2c 连续读时序
I2C(Inter-Integrated Circuit)是一种串行通信协议,它允
许多个设备通过两根线进行通信。
在I2C连续读取时,首先需要发
送一个起始条件,然后发送设备的地址和读取位(R/W = 1),接着
设备会发送一个ACK信号,表示已经准备好接收数据。
接下来,主
设备可以连续读取从设备的数据,每次读取完数据后,主设备会发
送一个ACK信号以继续读取下一个字节的数据,直到主设备发送一
个NACK信号为止,表示读取结束,最后发送一个停止条件。
在I2C连续读取过程中,时序非常重要。
首先是起始条件的产生,主设备发送起始信号后,从设备准备好之后发送应答信号。
接
下来是设备地址和读取位的发送,主设备发送完地址后,从设备再
次发送应答信号。
接着是连续读取数据的过程,每次读取完数据后,主设备发送ACK信号,从设备再次发送数据,直到读取结束。
最后
是停止条件的产生,主设备发送停止信号后,通信结束。
除了时序外,还需要考虑通信过程中的时钟频率、数据传输的
稳定性等因素。
在实际应用中,需要根据具体的I2C设备和控制器
的规格书来确定正确的时序,以确保通信的稳定和可靠性。
总的来说,I2C连续读取的时序包括起始条件、设备地址和读取位发送、数据读取和停止条件,时序的准确性对于通信的成功非常重要。
希望这个回答能够满足你的需求。
i2c中ack和nack时序
i2c中ack和nack时序I2C(Inter-Integrated Circuit)是一种串行通信协议,用于连接芯片之间的通信。
在I2C通信中,ACK(Acknowledge)和NACK (Not Acknowledge)是两种可能的应答信号,用于指示数据的接收状态。
下面是I2C通信中ACK和NACK的时序图:
ACK(应答)时序:
主设备(通常是微控制器)在发送一个字节的数据后,释放SDA (Serial Data Line)线,并等待从设备拉低SDA线来发送ACK。
从设备(被主设备访问的设备)在成功接收数据后,拉低SDA线来发送ACK。
ACK是一个低电平脉冲,通常在时钟信号的下降沿检测。
主设备: SDA -----| |-----
从设备: |-----
NACK(非应答)时序:
主设备在发送完一个字节的数据后,不释放SDA线,或者从设备在接收数据时未能拉低SDA线来发送ACK,表示不应答。
NACK通常是一个高电平,也是在时钟信号的下降沿检测。
主设备: SDA ----------
从设备: |-----
I2C总线上的ACK和NACK信号对于确认数据传输的成功或失败非常重要。
这些时序图仅提供了一般情况下的典型时序,具体实现可能会受到硬件和设备之间的差异。
如果你在使用特定的I2C设备,请参考该设备的数据手册或规范以获取详细的时序要求。
对I2C总线时序的一点理解以及ACK和NACK(NAK)
关键字:i2c ,IIC,bus,ACK,NACK,NAK,SDA,SCL,timing,master,slaver,时序,响应,总线关于i2c的响应问题:对于每一个接收设备(从设备,slaver),当它被寻址后,都要求在接收到每一个字节后产生一个响应。
因此,the master device 必须产生一个额外的时钟脉冲(第九个脉冲)用以和这个响应位相关联。
在这个脉冲期间,发出响应的从设备必须将SDA拉低并在时钟脉冲的高电平期间保持住。
这表示该设备给出了一个ACK。
如果它不拉低SDA线,就表示不响应(NACK)。
另外,在从机(发送方)发送完最后一个字节后主设备(接收方)必须产生一个不响应位,用以通知从机(发送方)不要再发送信息了,这样从机就知道该将SDA释放了,而后,主机发出一个停止位给slaver。
总结下,i2c通讯中,SDA 和SCL 都是有主机控制的,从设备只是能够将SDA 线拉低而已。
对于SCL线,从机是没有任何能力去控制的。
从机只能被动跟随SCL再说的清楚些:主机发送数据到从机的状态下:主机控制SCL信号线和SDA信号线,从机只是在SCL线为高的时候去被动读取SDA线。
主机读取从机的数据:主机来发出时钟信号,从机只是保证在时钟信号为高电平的时候的SDA的状态而已。
//----------------------------------------补充@201108311142SDA和SCL已经通过上拉电阻被上拉,master可以控制(拉低或者释放)这两条线,而slaver只能控制SDA线。
当master发送数据时,master会适时地将SDA和SCL拉低或释放(拉高)。
确切的时序应该是这样的:当master要发送一个start时,master会将SDA拉低,这就可以了,因为此时的SCL一定是High。
好了,一个start就这样发出去了。
而slaver也会发现这个start信号的发生,slaver便会准备好接收接下来的数据了。
I2C通信原理
I2C通信原理一、I2C的时序是比较复杂的,你如果能把I2C的时序弄清,那其他器件的时序都不成问题了。
我就按照我的理解来跟你讲吧。
直接用程序来说明吧。
NOP(),一个机器周期时间的延迟,12M晶振时为1微秒NOPS(),4个NOP()。
sbit SDA P2^0;sbit SCL P2^1; 定义数据线和时钟线接口首先,I2C有2个重要的线,SDA数据线SCL时钟线,当总线上没有进行信息传送时,SDA 和SCL都为高电平,我们称之为释放总线。
开始传送信息时,要有一个开始信号,开始信号:定义为在SCL为高电平的时候,SDA从高电平拉低。
start(){SDA=1;NOP(); //同你图中SDA/SCL上升/下降所用时间1USSCL=1;NOPS(); //建立开始信号(同你图中TSU起始信号建立时间一样4US)SDA=0; //SDA拉低NOPS();SCL=0; //SCL拉低,钳住总线,准备发送或接收数据NOP();}结束信号:与开始信号相反,在SCL为高电平时,SDA从低拉高stop(){SDA=0;NOP();SCL=1;NOPS(); //建立信号时间SDA=1; //拉高结束。
NOPS();}我晕,发现写了半天还有好多。
算了帮人帮到底了发送/接收一个数据:数据的发送和接收都是在SCL为低电平的时候发生,因为SCL为高电平时已给了开始和结束信号。
发送数据时,当数据准备读入时,将SCL线暂时拉高(SCL 为高时,SDA无法改变状态),保持一段时间然后拉低(同你图中的TDH,数据输出保持时间),这时数据则发送完毕到SDA上。
接收则与之大同小异。
当SDA线上有数据过来时,先将SCL拉高,建立好时间,然后拉低,数据则被读入。
(关于如何被发出以及如何被读入则是芯片做的事,我们不用管,只需记住SCL拉低,数据发出/读入)用程序来讲就是:send(uchar c) //发送一个字节{uint i;for(i=0;i<8;i++) //该字节8位从高往低发送{if((c<<i)&0x80) SDA=1;else SDA=0;NOP();SCL=1; //建立信号时间NOPS();SCL=0; //发送完毕}}recieve(){uchar r;uint i;r=0;SDA=1;for(i=0;i<8;i++) //读取8位数据{NOP();SCL=0;NOPS();SCL=1;NOP();r<<=1;if(SDA==1) r+=1;NOP();}SCL=0;NOP();return (r);}程序可能有点难懂,不过没关系,使用I2C时候,直接调用写好的程序,如我写的start.stop.send receive 等,这些程序应该有现成的。
I2C总线时序与数据传输.
16.1.2 I2C总线时序与数据传输当I2C总线处在空闲状态时,因为各设备都是开漏输出,所以在上拉电阻的作用下,SDA和SCL均为高电平。
I2C总线上启动一次数据传输过程的标志为主机发送的起始信号,起始信号的作用是通知从机准备接收数据。
当数据传输结束时,主机需要发送停止信号,通知从机停止接收。
因此,一次数据传输的整个过程由从起始信号开始,到停止信号结束。
同时这两个信号也是启动和关闭I“C设备的信号。
图16—2是I2C总线时序示意图,图中最左边和最右边给出了起始信号和停止信号的时序条件。
>起始信号时序:当SCL为高电平时,SDA由高电平跳变到低电平。
>停止信号时序:当SCL为高电平时,SDA由低电平跳变到高电平。
I2C总线规定,当SCL为高电平时,SDA的电平必须保持稳定不变的状态,只有当SCL处在低电平时,才可以改变SDA的电平值,但起始信号和停止信号是特例。
因此,当SCL处于高电平时,SDA的任何跳变都会被识别成为一个起始信号或停止信号。
因此在I2C总线上的数据传输过程中,数据信号线5DA的变化只能发生在SCL 为低电平的期间内。
从图16—2中间部分的时序中.可以清楚地看到这一点。
在I2C总线的数据传输过程中,发送到SDA信号线上的数据以字节为单位,每个字节必须为8位,而且是高位在前,低位在后,每次发送数据的字节数量不受限制。
但在这个数据传输过程中需要着重强调的是,当发送方发送完每一字节后,都必须等待接收方返回一个应答响应信号ACK,如图16—3所示。
响应信号ACK宽度为1位,紧跟在8个数据位后面,所以发送1字节的数据需要9个SCL时钟脉冲。
响应时钟脉冲也是由主机产生的,主机在响应时钟脉冲期间释放SDA线,使其处在高电平(见图16—3上面的信号)。
而在响应时钟脉冲期间,接收方需要将SDA拉低,使SDA在响应时钟脉冲高电平期间保持稳定的低电平(见图16—3中间的信号)。
实际上,图16—3中上面和中间的两个信号应该“线与”后呈现在SDA上的。
I2C总线信号时序总结
I2C总线信号时序总结总线空闲状态I2C总线总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。
此时各个器件的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高。
启动信号在时钟线SCL保持高电平期间,数据线SDA上的电平被拉低(即负跳变),定义为I2C总线总线的启动信号,它标志着一次数据传输的开始。
启动信号是一种电平跳变时序信号,而不是一个电平信号。
启动信号是由主控器主动建立的,在建立该信号之前I2C总线必须处于空闲状态。
重启动信号在主控器控制总线期间完成了一次数据通信(发送或接收)之后,如果想继续占用总线再进行一次数据通信(发送或接收),而又不释放总线,就需要利用重启动Sr信号时序。
重启动信号Sr既作为前一次数据传输的结束,又作为后一次数据传输的开始。
利用重启动信号的优点是,在前后两次通信之间主控器不需要释放总线,这样就不会丢失总线的控制权,即不让其他主器件节点抢占总线。
重启动信号在主控器控制总线期间完成了一次数据通信(发送或接收)之后,如果想继续占用总线再进行一次数据通信(发送或接收),而又不释放总线,就需要利用重启动Sr信号时序。
重启动信号Sr既作为前一次数据传输的结束,又作为后一次数据传输的开始。
利用重启动信号的优点是,在前后两次通信之间主控器不需要释放总线,这样就不会丢失总线的控制权,即不让其他主器件节点抢占总线。
停止信号在时钟线SCL保持高电平期间,数据线SDA被释放,使得SDA返回高电平(即正跳变),称为I2C总线的停止信号,它标志着一次数据传输的终止。
停止信号也是一种电平跳变时序信号,而不是一个电平信号,停止信号也是由主控器主动建立的,建立该信号之后,I2C总线将返回空闲状态。
不是在数据有效性中规定在SDA只能在SCL的低电平的时候变化,为何STAR,STOP不一样?首先STAR和STOP不是数据,所以可以不遵守数据有效性中的规定,其它数据都遵守,而STAR和STOP “不遵守”导致STAR和STOP更容易被识别。
iic协议的时序
iic协议的时序
IIC(Inter-Integrated Circuit)协议,也被称为I2C(Inter-IC)
协议,是一种串行通信协议,用于在集成电路(IC)之间进行数
据通信。
以下是IIC协议的时序:
1. 起始条件(Start Condition):主设备发送一个低电平的起
始信号,表示要开始一次通信。
2. 地址传输(Address Transmission):主设备发送从设备的地址,由7位地址和一个读/写位组成。
地址包括一个从设备的
唯一标识符,告诉其他设备谁是通信的对象。
3. 应答(ACK):主设备发送完地址后,等待从设备发送应
答信号。
应答信号是一个低电平,表示从设备正常响应。
4. 数据传输(Data Transmission):主设备发送数据到从设备。
每个字节的传输都以一个起始位、8位数据和一个应答位结束。
5. 应答(ACK):从设备在接收到数据后发送应答信号,表
示已经成功接收。
6. 重复起始条件(Repeated Start Condition):主设备可以在
没有停止条件的情况下发送一个重复的起始条件,用于在多个字节数据传输之间保持通信。
7. 停止条件(Stop Condition):主设备发送一个高电平的停止信号,表示通信结束。
需要注意的是,IIC协议是多主设备的协议,每个主设备都有自己的时序控制。
以上时序只是IIC协议的基本流程,实际应用中可能会有其他补充协议或时序约定。
smbus中的应答位 ACK和NACK 的理解
ACK和NACK的理解1,ACK和NACK的含义ACK是acknowledge的前三个字母,含义是“告知收到”,这个词在书信中常用到。
NACK=Non-ACK,就是“告知没有收到”或者“没有告知收到”。
2,ACK和NACK的电性本质实现ACK是在CLK高电平期间保持低电平,NACK是在CLK高电平期间保持高电平。
一个数据接收器(可以是从设备,也可以是主设备)发出ACK,从电路上看,本质是data线上的开漏MOS导通使得漏极D接地短路,从而把SMBus总线的data线的电平拉低。
当然,如果发出的是NACK,从电路上看,本质是data线上的开漏MOS截止使得漏极D对地开路,释放SMBus总线的data线,让data线的电平被上拉电阻和电压置高。
可见,数据接收器发出ACK应答,该设备就会把data MOS导通拉低data线。
如果数据接收器发出NACK应答,该设备就会把data MOS截止释放data线。
由于一个从设备被主设备访问时,其他从设备是没有被寻址的,所以这些设备的data 开漏MOS管都是截止的,对data线是释放的,所以这时data线的电平只能由的数据接收器(从设备或者主机)来控制。
3,ACK和NACK发生的条件发送设备在与接收设备通讯时,接收设备要通过ACK或者NACK来告知数据发送设备自己当前对数据的接收状态,ACK表示接收设备已经安全地接收了发送设备传送过来的数据,NACK表示接收设备还没有完成对发送设备传送来的数据的接收。
一般地,一次通讯中,发出ACK或NACK的设备一定是数据接收设备,它可以是主设备,也可以是从设备。
从设备通常发出NACK的情况:1,主设备试图寻址该从设备时,但该从设备不存在。
当然该从设备不会对data 线产生拉低的效应。
2,由于某种原因从设备出现故障而没有对主设备的寻址作出应答,就是该从设备不知道是否接收到了主设备写入的数据,但就是没有把data 线的电平拉低,比如因为该设备data开漏MOS损坏没有导通到地。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
对I2C总线时序的一点理解以及ACK和NACK(NAK)
关键字:i2c ,IIC,bus,ACK,NACK,NAK,SDA,SCL,timing,master,slaver,时序,响应,总线
关于i2c的响应问题:对于每一个接收设备(从设备,slaver),当它被寻址后,都要求在接收到每一个字节后产生一个响应。
因此,the master device 必须产生一个额外的时钟脉冲(第九个脉冲)用以和这个响应位相关联。
在这个脉冲期间,发出响应的从设备必须将SDA拉低并在时钟脉冲的高电平期间保持住。
这表示该设备给出了一个ACK。
如果它不拉低SDA线,就表示不响应(NACK)。
另外,在从机(发送方)发送完最后一个字节后主设备(接收方)必须产生一个不响应位,用以通知从机(发送方)不要再发送信息了,这样从机就知道该将SDA释放了,而后,主机发出一个停止位给slaver。
总结下,i2c通讯中,SDA 和SCL 都是有主机控制的,从设备只是能够将SDA 线拉低而已。
对于SCL线,从机是没有任何能力去控制的。
从机只能被动跟随SCL
再说的清楚些:
主机发送数据到从机的状态下:主机控制SCL信号线和SDA信号线,从机只是在SCL线为高的时候去被动读取SDA线。
主机读取从机的数据:主机来发出时钟信号,从机只是保证在时钟信号为高电平的时候的SDA的状态而已。
//----------------------------------------
补充@201108311142
SDA和SCL已经通过上拉电阻被上拉,master可以控制(拉低或者释放)这两条线,而slaver只能控制SDA线。
当master发送数据时,master会适时地将SDA和SCL拉低或释放(拉高)。
确切的时序应该是这样的:
当master要发送一个start时,master会将SDA拉低,这就可以了,因为此时的SCL一定是High。
好了,一个start就这样发出去了。
而slaver也会发现这个start信号的发生,slaver便会准备好接收接下来的数据了。
紧接着,master 要发送一个Byte的数据了,一位一位的发出这8个bits。
这时master会先将SCL拉低,然后在SCL为低的状态下将一个bit准备好放到SDA上(比如要发送一个0,master就会通过拉低SDA来放好这个0),然后master会把SCL
拉高(释放),此时slaver会立刻检测到SCL的变化,由此聪明的slaver便知道master已经将要发送的那个bit准备好了,slaver便会在这个SCL的高电平期间尽快(maser不会等你很久的哦)去读取一下SDA,嗯读到了一个0,slaver就把这个0放到自己的移位寄存器中待后续处理。
master会在一个设定好的时间后把SCL再次拉低,然后在SCL为低电平期间把下一个bit放到SDA 上,然后再把SCL拉高,然后slaver在SCL的高电平期间再去读SDA。
如此反复8次,一个Byte的传输便告结束。
当这8个bit发完后,SCL是处于低电平的(被master拉低的),SDA是出于高电平的(master已经释放了SDA)。
当一个字节发送完毕后,master会释放SDA(拉高)并拉低SCL,此时slaver 如果打算发出一个ACK的话,它必须在这个SCL被master拉低的短暂时间内去主动将SDA拉低并保持住(此前我们说过,SDA此时已经被master释放,所以slaver才有机会去拉低这个SDA)。
master会在一个确定的时间后再次将SCL拉高,并在拉高的期间去读取SDA线的状态,如果读到低电平,则认为收到了来自slaver的响应(ACK),否则认为slaver没有响应(NACK)刚才发送的那一个Byte。
这个过程就是我们说的i2c通讯中的第9个时钟周期。
当master读完这个ACK / NACK 后,会再次将SCL拉低,用以通知slaver:第9个时钟周期已经结束,你现在可以释放SDA了。
而此时master也可以向SDA 上准备下一个Byte的第一个bit。
继而重复上述过程。
或者,master也许想在接下来发送一个stop过去,那么master会在这个SCL为低的时间内将SDA拉低,而后再将SCL拉高,在SCL为高的期间再将SDA释放(拉高) 。
这样,一个STOP位就产生了。
你会发现此后的SDA和SCL都是高,这就是是所谓的总线空闲了!
一句话:SCL是单向的,由master控制。
而SDA是双向的,master可以控制,slaver也可以控制。
Yasin Lee@201109091400
昨天在调试mma8452q的过程中发现一个新的问题:
我一直以为用i2c读取slaver的某个寄存器的过程是:1.向slaver写一个寄存器地址过去。
2.读取slaver。
就是这样两步,可是这样的想法在读取mma8452q 时却出现了问题,总是无法读到正确的数据。
上述两步我是通过这样的方法实
现的:1.调用i2c_master_send发送一个字节的数据(寄存器地址)过去。
2.调用i2c_master_recv读取一个字节。
完毕。
之所以这么做是基于这样的想法:当向slaver写入(发送)一个寄存器地址过去后,slaver就会把当前的读写指针(假想的)指向这个寄存器,此后,读取的时候自然是读到这个寄存器的值了。
可是这样的想法不行,考虑到,这个假设可能不对,我便直接使用i2c_transfer 来进行操作,因为这个函数可以实现在由写入状态切换到读取状体的过程中不发送stop,也就是直接再次发送一个start,即Restart。
问题解决,看来对mma8452q的读取操作必须经由restart来做中间的切换。
而不能在切换过程中发送stop命令。
而先前采用的分部操作在每一步完成后都有一个i2c stop命令发生,所以出了问题。