本文主要是介绍DW_apb_i2c学习笔记之I2C协议部分,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
i2c 协议
START & STOP condition
- bus为IDLE的时候,SCL和SDA都为高
- 当SCL为高的时候,把SDA拉低发出START condition
- 当SCL为高的时候,把SDA拉高发出STOP condition
- 在SCL为low的时候可以改变数据,但是当SCL为1的时候必须要保持数据stable
address slave protocl
-
7 bit address format bits 7:1 表示slave地址,bit0表示读写 0为写,1为读
-
10 bit address format 由2个byte组成第一个byte的前5个bits表示告诉slave这是一个10 bits address,图中A9,A8 A7-A0都用来表示10bit的地址
- 第一个byte的定义
Transmitting & Receiving protocol
-
master- transmitter and slave-receiver
- 所有的data都是以byte长度进行传输,
- master发送address和R/W信号之后,slave需要response一个acknowledege信号
- master传输完每1 byte data之后slave也需要ACK,注意这里的ACK是receiver必须发给transmiter的,有可能发给master,也有可能发给slave
- 如果slave没有respond ACK pulse,master会用STOP去中断传输,slave必须拉高SDA这样master才能中断传输
-
master-receiver and slave-transmitter
- master每接收一个byte都要发一个ACK给slave,但是在最后1个byte的时候,master会发一个NACK表示这是最后1个byte。
- 在slave检测到master发出的NACK,会拉高SDA(释放SDA line) ,这样master才可以issue一个STOP condition,如果master不想交出总线,可以发出一个RESTART conditon之后他可以重新选择一次地址和R/W,如下图10bit的情况
START BYTE transfer protol
当没有板上的i2c HW module的时候,需要一个START BYTE的协议,比如和DW_apb_i2c交互的时候。为什么需要START BYTE,因为硬件上面没有处理器这种可以轮询的device的时候需要让软件去轮询总线的行为,使用常规的START condition的时候容易错过,因此扩展START BYTE为‘00000001’并用较低频率去采样SDA line,只要查到7个0中的任何1个0,就改为高速。
- 当DW_apb_i2c作为slave的时候i2c bus会一直处于最高速的状态,不需要START BYTE transfer
- 当DW_apb_i2c作为master的时候需要在每一个transfer的开头加上START BYTE,以确保slave device接收到了
- START byte的过程:
- master 产生 START condition
- master transmit START byte ’00000001‘
- master transmit ACK clock pulse
- No slave sets the ACK to 0(没有任何一个slave响应ACK)
- master generate RESTART conditon
HW receiver不需要respond START BYTE,因为它是保留地址
在RESTART conditionu之后就被复位
timing spec
-
tf tr,分别对应falling edge和rising edge的时间,两个transition之间的时间,30%-70%图中
-
setup time,hold time分别对应采样前/后数据要保持稳定的时间,图中分别对应了SCL 上升沿到数据改变状态的这段时间和SCL下降沿到数据改变状态的这段时间
-
START conditon setup hold time
- START conditon hold time 表示在SCL下降之前应该保持稳定的时间
- START conditon setup time只有在RESTART的情况下才有,表示在restart之前SDA应该保持为高的时间
-
STOP condition setup time
- 指的是在SCL为高的时候SDA在变高之前应保持稳定的时间
-
setup time for data
-
Buffer time
- buffer time specifies the bus free time between stop and start condition,如果不满足的话,slave device可能就不能把新的START condition看作一次新的传输,从而不会respond
这篇关于DW_apb_i2c学习笔记之I2C协议部分的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!