• I2C中关于ACK和NACK的几点东西


    在最近的编程过程中,会经常使用I2C来读写数据,用示波器来查看I2C的波形,所以想总结一下I2C中关于ACK和NACK的几点东西。

    I2C简介
    I2C是由Philips公司发明的一种串行数据通信协议,仅使用两根信号线:SerialClock(简称SCL)和SerialData(简称SDA)。I2C是总线结构,1个Master,1个或多个Slave,各Slave设备以7位地址区分,地址后面再跟1位读写位,表示读(=1)或者写(=0),所以我们有时也可看到8位形式的设备地址,此时每个设备有读、写两个地址,高7位地址其实是相同的。

    I2C的数据格式
    无数据:SCL=1,SDA=1;
    开始位(Start):当SCL=1时,SDA由1向0跳变;
    停止位(Stop):当SCL=1时,SDA由0向1跳变;
    数据位:当SCL由0向1跳变时,由发送方控制SDA,此时SDA为有效数据,不可随意改变SDA;
    当SCL保持为0时,SDA上的数据可随意改变;
    地址位:定义同数据位,但只由Master发给Slave;
    应答位(ACK):当发送方传送完8位时,发送方释放SDA,由接收方控制SDA,且SDA=0;
    否应答位(NACK):当发送方传送完8位时,发送方释放SDA,由接收方控制SDA,且SDA=1。
    当数据为单字节传送时,格式为:
    开始位,8位地址位(含1位读写位),应答,8位数据,应答,停止位。
    当数据为一串字节传送时,格式为:
    开始位,8位地址位(含1位读写位),应答,8位数据,应答,8位数据,应答,……,8位数据,应答,停止位。

    几点注意事项
    SCL一直由Master控制,SDA依照数据传送的方向,读数据时由Slave控制SDA,写数据时由Master控制SDA。当8位数据传送完毕之后,应答位或者否应答位的SDA控制权与数据位传送时相反。
    开始位“Start”和停止位“Stop”,只能由Master来发出。
    地址的8位传送完毕后,成功配置地址的Slave设备必须发送“ACK”。否则否则一定时间之后Master视为超时,将放弃数据传送,发送“Stop”。
    当写数据的时候,Master每发送完8个数据位,Slave设备如果还有空间接受下一个字节应该回答“ACK”,Slave设备如果没有空间接受更多的字节应该回答“NACK”,Master当收到“NACK”或者一定时间之后没收到任何数据将视为超时,此时Master放弃数据传送,发送“Stop”。
    当读数据的时候,Slave设备每发送完8个数据位,如果Master希望继续读下一个字节,Master应该回答“ACK”以提示Slave准备下一个数据,如果Master不希望读取更多字节,Master应该回答“NACK”以提示Slave设备准备接收Stop信号。
    当Master速度过快Slave端来不及处理时,Slave设备可以拉低SCL不放(SCL=0将发生“线与”)以阻止Master发送更多的数据。此时Master将视情况减慢或结束数据传送。
    在实际应用中,并没有强制规定数据接收方必须对于发送的8位数据做出回应,尤其是在Master和Slave端都是用GPIO软件模拟的方法来实现的情况下,编程者可以事先约定数据传送的长度,slave不检查NACK,有时可以起到减少系统开销的效果。但是如果slave方是硬件i2c要求一定要标准的NACK,master方是GPIO软件模拟i2c并没有正确的发送NACK,就会出现“slave收不到stop”导致i2c挂死。

    from: https://blog.csdn.net/liebecl/java/article/details/76563083

  • 相关阅读:
    vue+ajax+bootstrap+python实现增删改
    django笔记
    阻止冒泡事件的另一种写法
    c# 字符串的内存分配和驻留池( 转 )
    c# 几种深拷贝方式的比较
    JS 常用函数
    Web Api 过滤器之 AuthorizationFilter 验证过滤器
    c# await 到底等待的是什么?
    ( 转 ) CORS 有一次 OPTIONS 请求的原理
    Web Api 过滤器之 ExceptionFilter 异常过滤器
  • 原文地址:https://www.cnblogs.com/aspirs/p/13088283.html
Copyright © 2020-2023  润新知