对IIC总线时序的一点理解以及ACK和NACK(NAK)

发布者:水墨人生最新更新时间:2023-06-27 来源: elecfans关键字:IIC  总线时序  ACK  NACK  NAK 手机看文章 扫描二维码
随时随地手机看文章

关于IIC的响应问题:对于每一个接收设备(从设备,slaver),当它被寻址后,都要求在接收到每一个字节后产生一个响应。因此,the master device 必须产生一个额外的时钟脉冲(第九个脉冲)用以和这个响应位相关联。


在这个脉冲期间,发出响应的从设备必须将SDA拉低并在时钟脉冲的高电平期间保持住。这表示该设备给出了一个ACK。如果它不拉低SDA线,就表示不响应(NACK)。


另外,在从机(发送方)发送完最后一个字节后主设备(接收方)必须产生一个不响应位,用以通知从机(发送方)不要再发送信息了,这样从机就知道该将SDA释放了,而后,主机发出一个停止位给slaver。


总结下,IIC通讯中,SDA 和 SCL 都是有主机控制的,从设备只是能够将SDA线拉低而已。对于SCL线,从机是没有任何能力去控制的。从机只能被动跟随SCL。


再说的清楚些:

主机发送数据到从机的状态下:主机控制SCL信号线和SDA信号线,从机只是在SCL线为高的时候去被动读取SDA线。

主机读取从机的数据的状态下:主机来发出时钟信号,从机只是保证在时钟信号为高电平的时候的SDA的状态而已。

//----------------------------------------

补充@201108311142

SDA和SCL已经通过上拉电阻被上拉,master可以控制(拉低或者释放)这两条线,而slaver只能控制SDA线。当master发送数据时,master会适时地将SDA和SCL拉低或释放(拉高)。确切的时序应该是这样的:

当mater要发送一个start时,mater会将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也可以控制。

阅读上述过程时,始终牢记:SDA上的数据必须在SCL为高电平期间保持稳定,SDA上的数据只能在SCL为低电平期间变化。(开始信号和结束信号例外)!

另外,需要注意的是,并非每传输8位数据之后,都会有ACK信号,有以下3种例外:

(1)当从机不能响应从机地址时(例如它正忙于其他事而无法相应I2C总线的操作,或者这个地址没有对应的从机),在第9个SCL周期内SDA线没有被拉低,即没有ACK信号。这时,主机发出一个P信号终止传输或者重新发出一个S信号开始新的传输。

(2)如果从机接收器在传输过程中不能接收更多的数据时,它也不会发出ACK信号。这样,主机就可以意识到这点,从而发出一个P信号终止传输或者发出一个S信号开始新的传输。

(3)主机接收器在接收到最后一个字节后,也不会发出ACK信号。于是,从机发送器释放SDA线,以允许主机发出P信号结束传输。


关键字:IIC  总线时序  ACK  NACK  NAK 引用地址:对IIC总线时序的一点理解以及ACK和NACK(NAK)

上一篇:s3c2440中GPIO上拉电阻的初步认识
下一篇:UART,SPI,IIC的一点理解

推荐阅读最新更新时间:2024-11-19 16:17

基于stm32单片机的模拟IIC时序
我下面要说的是基于stm32单片机的模拟IIC时序,以及是一些要注意的事项;结合自己所做的MMA7455加速度传感器,我把模拟IIC的源代码贴了出来,大家可以参考一下。 1.因为在IIC协议中,当总线空闲的时候,SDA和SCL都为高电平,所以硬件电路中SDA和SCL引脚都要接上拉电阻。 2.注意开始信号,停止信号,响应信号,非响应信号的时序,特别是要留意高低电平时间的延时: 3.应答信号分为主机应答和从机应答: 主机应答是在主机从从机中读取数据时每次读取完一个字节的数据后主机给从机的一个应答信号,表示主机已收到数据了。 从机应答是指主机给从机发送数据时从机给主机的应答,给一个应答就代表从机已经收到了数据,为主机
[单片机]
基于stm32单片机的模拟<font color='red'>IIC</font><font color='red'>时序</font>
PCI总线I/O时序波形观测及分析
1 引 言 PCI总线(Peripheral Component Interconnect)即外设部件互连,是一种新型的、同步的、高带宽的、独立于处理器的总线。从1992年创立规范到如今,PCI总线已成为了事实上计算机的标准总线。其所以能在各类总线中脱颖而出,是因为其具有传输速度快、支持无限猝发读写方式、支持并行工作方式、独立于处理器、提供4种规格、数据线和地址线采用了多路复用结构、支持即插即用功能等特点。本文重点介绍了PCI总线的写周期的时序波形的测量技术及分析方法,给出了时序波形的分析结果。 2 PCI总线的功能 2.1 连接到PCI总线上的设备 连接到PCI总线上的设备分为两类: (1)主控设备(master):P
[应用]
STM32 IIC 详解 之 stm32 IIC 从机模式(中断方式收发数据)
1、IIC简介 第二节代码会用到该部分内容,对于IIC来说,从机是不能主动发送数据的,开始条件都是由主机生成。 1.1、主机发送数据流程 1) 主机在检测到总线为“空闲状态”(即 SDA、SCL 线均为高电平)时,发送一个启动信号“S”,开始一次通信的开始 2) 主机接着发送一个命令字节。该字节由 7 位的外围器件地址和 1 位读写控制位 R/W组成(此时 R/W=0) 3) 相对应的从机收到命令字节后向主机回馈应答信号 ACK(ACK=0) 4) 主机收到从机的应答信号后开始发送第一个字节的数据 5) 从机收到数据后返回一个应答信号 ACK 6) 主机收到应答信号后再发送下一个数据字节 7) 当主机发送
[单片机]
Tiny210 IIC驱动之at24cxx访问
at24cxx_dev.c驱动源码: #include linux/kernel.h #include linux/module.h #include linux/platform_device.h #include linux/i2c.h #include linux/err.h #include linux/slab.h static struct i2c_board_info at24cxx_info = { I2C_BOARD_INFO( at24c08 , 0x50), }; static struct i2c_client *at24cxx_client; static int at24cxx_de
[单片机]
CIIC一体化智能底盘丨时代智能确认申报2024金辑奖
申请技术丨CIIC一体化智能底盘 申报领域丨智能底盘 独特优势: 时代智能脱胎于宁德时代,在全球范围内吸纳底盘、电驱、热管理、电子电气等领域的知名技术专家和优秀人才,持续在三电集成、底盘架构、服务模式等领域探索创新。 依托自主创新的软硬件架构设计和Toolkits解决方案套件,CIIC一体化智能底盘支持客户在底盘机械尺寸、续航里程、驱动形式、软件控制与服务等维度的自由选用、灵活搭配。 创新的总装模式和产品形态,可以更好地支持客户将整车生产制造流程由串行生产改为并行拼装,通过柔性化设计智慧工厂,减少总装投资,提升行业生产效率。 应用场景: 从载人到载物、人机共驾到无人驾驶,一体化智能底盘将
[汽车电子]
CIIC一体化智能底盘丨时代智能确认申报2024金辑奖
IIC总线读取E2PROM存储器数据
简单介绍一下I2C总线原理:         IIC总线是PHLIPS公司推出的一种串行总线,是具备多主机系统所需的包括总线裁决和高低速器件同步功能的高性能串行总线。       IIC总线只有两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。 (记住这个就够了,其他都是废话!)       II C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。 注意到IIC总线是需要接上拉电阻的!因为连到IIC总线的器件的输出基本为开漏输出.   起始和终止信号 :SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;SCL
[嵌入式]
示波器分析IIC波形图
测试设备: 1.MCU:STM32G0 2.IIC设备:lis2dh12(ST的三轴加速度计) 3.示波器:普源RIGOL DS1054Z 知识点: 1.开始信号:SCL在高电平期间,SDA由高变低即为开始信号 2.停止信号:SCL在高电平期间,SDA由低变高即为停止信号 3.应答信号ACK: 八位数据位发送完之后,第九个时钟即是ACK,0表示有ack,1表示nack 4.发送八位数据位的时候,电平变化总是发生在低电平期间,SCL为高电平器件不可以变动,只有开始信号和停止信号是在SCL为高器件变动 5.空闲态:SCL和SDA都为高 6.在切换数据的传输方向时,可以不必先产生停止条件再开始下次传输,而
[测试测量]
示波器分析<font color='red'>IIC</font>波形图
stm32之IIC应用实例(AT24C02芯片,硬件和软件方式驱动)
写完回头一看发现字数还不少,如果你觉得文字太枯燥,那么可以跳到后面程序设计,直接动手做实验。如果想仔细了解关于IIC协议的细节,那么希望你能慢慢把看完,看完后一定有所收获。 概述:IIC BUS(Inter Integrated Circuit BUS,内部集成电路总线)是飞利浦公司推出的二线制串行扩展总线;在IIC总线上,只需要两条线——数据线SDA线和时钟线SCL;多个器件可连接到同一个IIC总线上,每一个器件有一个唯一的识别地址,可一对多、多对一、一对一通讯;标准模式下传输速度为100Kb/s,快速模式下为400Kb/s。优点:引脚少,硬件实现简单,成本低。 关于IIC的接口原理有些书可以描述出好几页,但有时候看完了
[单片机]
stm32之<font color='red'>IIC</font>应用实例(AT24C02芯片,硬件和软件方式驱动)
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved