I2C通信时序图解析
写数据首先我们先来看一下写数据的时序图,如下图所示:
将上图中的写数据时序图进行分解,经分解后如下图所示:
结合I2C总线协议的知识,我们可以知道OZ9350的I2C写数据由一下10个步骤组成。
第一步,发送一个起始信号。
第二步,发送7bit从机地址,即OZ9350的地址。此处需要注意,发送数据时,无法发送7bit数据,此处发送了7bit地址+1bit读写选择位,即发送7bit+r/w。最低位为1表示读,为0表示写。
第三步,产生一个ACK应答信号,此应答信号为从机器件产生的应答。
第四步,发送寄存器地址,8bit数据。
第五步,产生一个ACK应答信号,此应答信号为从机器件产生的应答。
第六步,发送一个数据,8bit数据。
第七步,产生一个ACK应答信号,此应答信号为从机器件产生的应答信号。
第八步,发送一个CRC校验码,此CRC校验值为2、4、6步数据产生的校验码。
第九步,既可以发送一个应答信号,也可以发送一个无应答信号,均有从机器件产生。
第十步,发送一个停止信号。
接下来,按照以上是个步骤,可以写出OZ9350的i2c写数据的函数。代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
u8 I2C_WriteBytes(void)
{
I2C_Start(); //1
I2C_SendByte(Slaver_Addr | 0);//2
I2C_WaitToAck(); //3
I2C_SendByte(Reg_Addr); //4
I2C_WaitToAck(); //5
I2C_SendByte(data); //6
I2C_WaitToAck(); //7
I2C_SendByte(crc); //8
I2C_WaitToAck(); //9
I2C_Stop(); //10
}
3.2 读数据
读数据的时序图如下图所示:
读数据的时序图经分解后如下图所示:
通过分解后的时序图,可以看到OZ9350的读数据由以下13个步骤组成。
第一步,发送一个起始信号。
第二步,发送7bit从机地址,即OZ9350的地址。此处需要注意,发送数据时,无法发送7bit数据,此处发送了7bit地址+1bit读写选择位,即发送7bit+r/w。最低位为1表示读,为0表示写。
第三步,产生一个ACK应答信号,此应答信号为从机器件产生的应答。
第四步,发送寄存器地址。
第五步,产生一个ACK应答信号,此应答信号为从机器件产生的应答。
第六步,再次发送一个骑士信号。
第七步,发送7bit从机地址,即OZ9350的地址。此处需要注意,发送数据时,无法发送7bit数据,此处发送了7bit地址+1bit读写选择位,即发送7bit+r/w。最低位为1表示读,为0表示写。
第八步,产生一个ACK应答信号,此应答信号为从机器件产生的应答。
第九步,读取一个字节(8bit)的数据。
第十步,产生一个ACK应答信号,此应答信号为CPU产生。
第十一步,读取一个CRC校验码。
第十二步,产生一个NACK信号。此无应答信号由CPU产生。
第十三步,产生一个停止信号。
接下来,由以上分析步骤,可以写出OZ9350的I2C读数据代码。如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
u8 I2C_ReadBytes(void)
{
u8 data;
u8 crc;
I2C_Start(); //1
I2C_SendByte(Slaver_Addr | 0);//2
I2C_WaitToAck(); //3
I2C_SendByte(Reg_Addr); //4
I2C_WaitToAck(); //5
I2C_Start(); //6
I2C_SendByte(Slaver_Addr | 1);//7 1-读
I2C_WaitToAck(); //8
data=I2C_ReadByte(); //9
I2C_Ack(); //10
crc=I2C_ReadByte(); //11
I2C_NoAck(); //12
I2C_Stop(); //13
} I2C通信时序图解析 I2C通信时序图解析 I2C通信时序图解析
页:
[1]