请选择 进入手机版 | 继续访问电脑版

集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 1480|回复: 4

I2C通信时序图解析

[复制链接]
fpga_feixiang 发表于 2020-8-11 15:27:28 | 显示全部楼层 |阅读模式
写数据
  首先我们先来看一下写数据的时序图,如下图所示:
  将上图中的写数据时序图进行分解,经分解后如下图所示:

  结合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

}
zhangyukun 发表于 2020-8-11 18:02:30 | 显示全部楼层
I2C通信时序图解析
大鹏 发表于 2020-8-12 16:44:13 | 显示全部楼层
I2C通信时序图解析
zxopenhl 发表于 2020-8-15 09:26:36 | 显示全部楼层
I2C通信时序图解析
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|集成电路技术分享 ( 京ICP备20003123号-1 )

GMT+8, 2024-3-28 21:39 , Processed in 0.326405 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表