IIC ACK信号

1,SCL一直由Master控制,SDA依照数据传送的方向,读数据时由Slave控制SDA,写数据时由Master控制SDA。当8位数据传送完毕之后,应答位或者否应答位的SDA控制权与数据位传送时相反。
2,开始位“Start”和停止位“Stop”,只能由Master来发出。
3,地址的8位传送完毕后,成功配置地址的Slave设备必须发送“ACK”。否则否则一定时间之后Master视为超时,将放弃数据传送,发送“Stop”。
4,当写数据的时候,Master每发送完8个数据位,Slave设备如果还有空间接受下一个字节应该回答“ACK”,Slave设备如果没有空间接受更多的字节应该回答“NACK”,Master当收到“NACK”或者一定时间之后没收到任何数据将视为超时,此时Master放弃数据传送,发送“Stop”。
5,当读数据的时候,Slave设备每发送完8个数据位,如果Master希望继续读下一个字节,Master应该回答“ACK”以提示Slave准备下一个数据,如果Master不希望读取更多字节,Master应该回答“NACK”以提示Slave设备准备接收Stop信号。
6,当Master速度过快Slave端来不及处理时,Slave设备可以拉低SCL不放(SCL=0将发生“线与”)以阻止Master发送更多的数据。此时Master将视情况减慢或结束数据传送。
在实际应用中,并没有强制规定数据接收方必须对于发送的8位数据做出回应,尤其是在Master和Slave端都是用GPIO软件模拟的方法来实现的情况下,编程者可以事先约定数据传送的长度,slave不检查NACK,有时可以起到减少系统开销的效果。但是如果slave方是硬件i2c要求一定要标准的NACK,master方是GPIO软件模拟i2c并没有正确的发送NACK,就会出现“slave收不到stop”导致i2c挂死。
 
在此我只发表对I2C确认信号(即所谓应答信号)的看法,至于它的一整套时序就不多罗嗦了。
   1) MASTER向SLAVE发送数据:
       MASTER没向SLAVE端发送8位数据后,就会将SDA置1,等待SLAVE端的确认;SLAVE端如果正确接受到数据,就会自动将SDA置0。我们程序员所能做的只能是检测确认信号,即每发送完8位数据后就检测一次SDA的状态,如果是0,则让程序继续往下执行,如果是1则强迫MASTER将刚才的8位数据再发送一遍;当然,如果SDA一直是1,也就是SLAVE一直未能正确接受到数据,我们也不能一直让MASTER反复发送,要做TIMEOUT处理,以防系统死机!
   2) MASTER从SLAVE读取数据:
       MASTER从SLAVE端读取数据,情况与发送数据有所区别,在读到最后8位数据时,要将SDA置1,也就是做UNACK动作,让系统知道读取数据到此结束;这个置1动作由程序员来做,而不是MASTER本身,因为数据读到哪里结束,只有我们程序员知道!
   3)说明:MASTER 指主控制端,在一般系统中就是我们常说的单片机了;SLAVE是指具备I2C协议的专用IC,比如ATMEL的24系列(24C16、14C32等)和PHILPS的SAA711X系列(VIDEO  DECODER)。

### IIC (I²C) 协议中的ACK信号IIC通信协议中,ACKnowledge (ACK) 信号用于确认数据的成功接收。每当发送器传输一个字节的数据给接收器之后,接收器会回送一个应答位来表示该字节已被成功接收到并存储。 #### 应答机制的工作原理 - 发送设备每传送一字节的信息,在第九个时钟周期内释放SDA线(即变为高阻态),以便接收装置能够控制这条线路。 - 接收方如果准备就绪接受下一个字节,则拉低 SDA 线至逻辑电平 '0' 来发出 ACK;反之如果不打算继续接收则保持 SDA 高电平状态形成 NACK(not acknowledge)[^5]。 这种握手过程确保了双方同步以及错误检测的能力,只有当接收端返回了一个有效的ACK后,发送方才认为此次传输有效,并可继续下一次操作。 对于主从架构下的多节点网络来说,每一个被寻址到的从机都必须对接收到地址给出回应——这同样遵循上述提到的标准流程[^3]。 ```c // 示例代码展示如何处理ACK信号 void handle_ack_signal(uint8_t ack_received){ if(ack_received == 0){ // 如果收到了ACK printf("Data was acknowledged by receiver.\n"); }else{ // 收到了NACK或其他情况 printf("Receiver did not acknowledge data or error occurred.\n"); } } ``` #### 数据验证的重要性 通过这种方式,即使是在较为复杂的环境下也能维持较高的可靠性,因为任何丢失或损坏的数据包都可以立即识别出来而不至于影响整个系统的正常运作[^1]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值