美文网首页
FPGA笔记 | I2C通信-读写数据过程

FPGA笔记 | I2C通信-读写数据过程

作者: 力卉编程 | 来源:发表于2020-02-18 10:43 被阅读0次

    预置条件:

    在通信之初,主从机必须根据自己的要求约定好通信规则:command的定义和位置、address的位数和位置。
    以读写从机寄存器数据为例:
    假设从机寄存器地址为8位、从机寄存器也位8位(被读取数据为8位);
    约定读command为0x01,写command位0x02;
    约定主机发起通信后,第一个slave address字节收到ack后,紧跟的一个字节为command,再下面一个字节为address。

    读寄存器数据步骤:

    1.1 主机先发起一次通信,将读command(0x01)和需要读取的寄存器地址address写入从机;(主机发出写操作)
    1.2 从机firmware的处理:
          1.2.1 将command和address分别提取出来;
          1.2.2 判断command的含义(本例中,是读指令还是写指令);
          1.2.3 根据收到的的address,将对应寄存器的的数据放入从机I2C输出buffer;(这个步骤可以使用指针)
    1.3 主机再次发起一次通信,读取从机的数据;(主机发出读操作)
    
    读寄存器数据
    读寄存器数据2

    写操作步骤:

    2.1 主机发起通信,按约定依次写入command、要写入的从机寄存器地址address和要写入的数据data;
    2.2 从机firmware要做的处理:
          2.2.1 分别提取command、address和data;
          2.2.2 根据command做出判断(本例中则判断是写入还是读取);
          2.2.3 将data写入与接收到的address对应的寄存器。(这个步骤可以使用指针)。
    
    写寄存器数据

    主机发送数据流程

    (1)主机在检测到总线为“空闲状态”(即 SDA、SCL 线均为高电平)时,发送一个启动信号“S”,开始一次通信的开始
    (2)主机接着发送一个命令字节。该字节由 7 位的外围器件地址和 1 位读写控制位 R/W组成(此时 R/W=0)
    (3)相对应的从机收到命令字节后向主机回馈应答信号 ACK(ACK=0)
    (4)主机收到从机的应答信号后开始发送第一个字节的数据
    (5)从机收到数据后返回一个应答信号 ACK
    (6)主机收到应答信号后再发送下一个数据字节
    (7)当主机发送最后一个数据字节并收到从机的 ACK 后,通过向从机发送一个停止信号P结束本次通信并释放总线。从机收到P信号后也退出与主机之间的通信


    发送数据图

    注意:①主机通过发送地址码与对应的从机建立了通信关系,而挂接在总线上的其它从机虽然同时也收到了地址码,但因为与其自身的地址不相符合,因此提前退出与主机的通信;②主机的一次发送通信,其发送的数据数量不受限制。主机是通过 P 信号通知发送的结束,从机收到 P 信号后退出本次通信;③主机的每一次发送后都是通过从机的 ACK 信号了解从机的接收状况,如果应答错误则重发。

    主机接收数据流程

    (1)主机发送启动信号后,接着发送命令字节(其中 R/W=1)
    (2)对应的从机收到地址字节后,返回一个应答信号并向主机发送数据
    (3)主机收到数据后向从机反馈一个应答信号
    (4)从机收到应答信号后再向主机发送下一个数据
    (5)当主机完成接收数据后,向从机发送一个“非应答信号(ACK=1)”,从机收到ASK=1 的非应答信号后便停止发送
    (6)主机发送非应答信号后,再发送一个停止信号,释放总线结束通信


    接收数据流程

    注意:主机所接收数据的数量是由主机自身决定,当发送“非应答信号/A”时从机便结束传送并释放总线(非应答信号的两个作用:前一个数据接收成功,停止从机的再次发送)。

    文 | 力卉编程

    相关文章

      网友评论

          本文标题:FPGA笔记 | I2C通信-读写数据过程

          本文链接:https://www.haomeiwen.com/subject/vwawfhtx.html