• IIC 通信协议 (一)






    目录

    引言

    IIC协议

    1、历史

    2、特点

    3、信号线

    4、主从关系

    5、通信过程

    6、协议规范

    地址

    1、器件地址

    2、存储器地址

    读写时序

    1、写时序

    1.1、单字节写时序

    1.2、连续写时序

    2、读时序

    2.1、单字节读时序

    2.2、连续读时序

    参考声明




    引言

    这个专栏闲置好久了,最近忙里偷闲想学一下IIC通信的协议以及对应的FPGA实现。顺便以博客的形式记录一下~

    本篇博文主要就是介绍与 IIC 通信相关的基础内容。


    IIC协议

    1、历史

    IIC总线由飞利浦公司在上世纪80年代推出的总线协议。

    2、特点

    IIC总线属于串行、同步、低速、低距、半双工、多主机的通信协议。

    3、信号线

    2根信号线,一根时钟线(SCL),一根数据(地址)线(SDA)。

    4、主从关系

     IIC总线上相互通信的设备,可以分为两类,即主设备和从设备。

    主设备有权利主动发起、结束一次通信。从设备只能被动响应。如果总线上有多个设备同时启用总线,IIC有自身的检测和仲裁机制,防止产生错误。

    连接在IIC总线上的设备都有一个唯一的地址(典型的地址位宽:7bits,也有10bits),每个设备都可以作为主机或从机,BUT,同一时刻只能有一个主机存在

    对于7位地址线位宽的地址寻址:

     

    5、通信过程

    1. 主机发送起始信号 启用IIC总线;
    2. 主机发送一个字节数据指示从机地址以及读写方向;
    3. 被寻址的从机发送应答信号回应主机;
    4. 发送器发送一个字节的数据;
    5. 接收器发送应答信号回应接收器;
    6. 重复4 5 步骤;
    7. 主机发送停止信号释放 IIC 总线;

    6、协议规范

    1、时钟信号为高电平期间,数据总线必须保持稳定,时钟信号为低电平时,数据总线才能变化。示意图如下:

     2、时钟信号为高电平时,数据信号由高电平跳变到低电平为总线的 起始信号;由低电平跳变到高电平为总线的停止信号。示意图:空闲时,SCL信号和SDA信号均为高电平。

     3、当IIC 主机(不一定是发送端还是接受端)将8 位数据或命令传出后,会将数据总线(SDA)释放,然后等待从机应答(低电平0 表示应答,1 表示非应答),此时的时钟仍然是主机提供的。示意图:

     4、数据帧格式,I2C 器件通讯的时候首先是要发送“起始信号”,紧跟着就是七位器件地址,第八位是数据传送方向位(0:代表写,1:代表读),再后面就是等待从机的应答。当然传送结束后,“终止信号”也是由主机来产生的。发送数据的时候是高位先发送。IIC 一帧数据有9位,8个数据位加1个应答位。

    地址

    1、器件地址

    从机的器件地址,一般是器件本身在制造完成就已经确定,或者部分确定。以AT24C64为例:

     

    2、存储器地址

    这个存储器地址分为单字节和双字节两种:

    单字节:

     双字节:

     

    读写时序

    典型时序图:

    1、主机——>从机

     蓝色表示数据源自主机,黄色表示数据源自从机。绿色表示数据循环发送。S表示起始信号,P表示结束信号,A表示应答信号。在主机发送停止信号前的应答信号一般为不应答。

    2、从机——>主机

      蓝色表示数据源自主机,黄色表示数据源自从机。绿色表示数据循环发送。S表示起始信号,P表示结束信号,A表示应答信号。在主机发送停止信号前的应答信号一般为不应答。

    3、主机——>从机 (先)        从机——>主机 (后)

     注意此处重新发起通信 更改发送方向,主从机并没有改变,可以不发送停止信号。即使从机更改了,主机也可以不发送停止信号,直接与另一个从机开始新的通信。因为如果主机发送了停止信号,总线被释放,释放后可能被其他的主机抢下总线的使用权。

    1、写时序

    1.1、单字节写时序

    单字节 存储器地址:

     

     时序过程描述:

    1、主机设置SDA 为输出
    2、主机发起起始信号;
    3、主机传输器件地址字节,其中最低位为0,表明为写操作;
    4、主机设置SDA 为三态门输入,读取从机应答信号;
    5、读取应答信号成功,主机设置SDA 为输出,传输1 字节地址数据;
    6、主机设置SDA 为三态门输入,读取从机应答信号;
    7、读取应答信号成功,主机设置SDA 为输出,传输待写入的数据;
    8、设置SDA 为三态门输入,读取从机应答信号;
    9、读取应答信号成功,主机产生STOP 位,终止传输。

    双字节 存储器地址:

    时序过程描述:

    1、主机设置SDA 为输出;
    2、主机发起起始信号;
    3、主机传输器件地址字节,其中最低位为0,表明为写操作;
    4、主机设置SDA 为三态门输入,读取从机应答信号;
    5、读取应答信号成功,主机设置SDA 为输出,传输地址数据高字节;
    6、主机设置SDA 为三态门输入,读取从机应答信号;
    7、读取应答信号成功,主机设置SDA 为输出,传输地址数据低字节;
    8、设置SDA 为三态门输入,读取从机应答信号;
    9、读取应答信号成功,主机设置SDA 为输出,传输待写入的数据;
    10、设置SDA 为三态门输入,读取从机应答信号;
    11、读取应答信号成功,主机产生STOP 位,终止传输。

    1.2、连续写时序

    单字节 存储器地址:

    1、主机设置SDA 为输出;
    2、主机发起起始信号;
    3、主机传输器件地址字节,其中最低位为0,表明为写操作;
    4、主机设置SDA 为三态门输入,读取从机应答信号;
    5、读取应答信号成功,主机设置SDA 为输出,传输1 字节地址数据;
    6、主机设置SDA 为三态门输入,读取从机应答信号;
    7、读取应答信号成功,主机设置SDA 为输出,传输待写入的第1 个数据;
    8、设置SDA 为三态门输入,读取从机应答信号;
    9、读取应答信号成功后,主机设置SDA 为输出,传输待写入的下一个数据;
    10、设置SDA 为三态门输入,读取从机应答信号;n 个数据被写完,转到步骤11,若数据未被写完,转到步骤9;
    11、读取应答信号成功,主机产生STOP 位,终止传输。

    双字节 存储器地址:

    1、主机设置SDA 为输出;
    2、主机发起起始信号;
    3、主机传输器件地址字节,其中最低位为0,表明为写操作;
    4、主机设置SDA 为三态门输入,读取从机应答信号;
    5、读取应答信号成功,主机设置SDA 为输出,传输地址数据高字节;
    6、主机设置SDA 为三态门输入,读取从机应答信号;
    7、读取应答信号成功,主机设置SDA 为输出,传输地址数据低字节;
    8、设置SDA 为三态门输入,读取从机应答信号;
    9、读取应答信号成功,主机设置SDA 为输出,传输待写入的第1 个数据;
    10、设置SDA 为三态门输入,读取从机应答信号;
    11、读取应答信号成功后,主机设置SDA 为输出,传输待写入的下一个数据;
    12、设置SDA 为三态门输入,读取从机应答信号;n 个数据被写完,转到步骤13,若数据未被写完,转到步骤11;
    13、读取应答信号成功,主机产生STOP 位,终止传输。
     

    2、读时序

    2.1、单字节读时序

    单字节 存储器地址:

    1、主机设置SDA 为输出;
    2、主机发起起始信号;
    3、主机传输器件地址字节,其中最低位为0,表明为写操作;

    4、主机设置SDA 为三态门输入,读取从机应答信号;
    5、读取应答信号成功,主机设置SDA 为输出,传输1 字节地址数据;
    6、主机设置SDA 为三态门输入,读取从机应答信号;
    7、读取应答信号成功,主机发起起始信号;
    8、主机传输器件地址字节,其中最低位为1,表明为读操作;
    8、设置SDA 为三态门输入,读取从机应答信号;
    9、读取应答信号成功,主机设置SDA 为三态门输入,读取SDA 总线上的一个字节的数据;
    10、产生无应答信号(高电平)(无需设置为输出高电平,因为总线会被自动拉高);
    11、主机产生STOP 位,终止传输。

    双字节 存储器地址:

    1、主机设置SDA 为输出;
    2、主机发起起始信号;
    3、主机传输器件地址字节,其中最低位为0,表明为写操作;
    4、主机设置SDA 为三态门输入,读取从机应答信号;
    5、读取应答信号成功,主机设置SDA 为输出,传输地址数据高字节;
    6、主机设置SDA 为三态门输入,读取从机应答信号;
    7、读取应答信号成功,主机设置SDA 为输出,传输地址数据低字节;
    8、设置SDA 为三态门输入,读取从机应答信号;
    9、读取应答信号成功,主机发起起始信号;
    10、主机传输器件地址字节,其中最低位为1,表明为读操作;
    11、设置SDA 为三态门输入,读取从机应答信号;
    12、读取应答信号成功,主机设置SDA 为三态门输入,读取SDA 总线上的一个字节的
    数据;
    13、主机设置SDA 输出,产生无应答信号(高电平)(无需设置为输出高电平,因为总
    线会被自动拉高);
    14、主机产生STOP 位,终止传输。

    2.2、连续读时序

    单字节 存储器地址:

     

    1、主机设置SDA 为输出;
    2、主机发起起始信号;
    3、主机传输器件地址字节,其中最低位为0,表明为写操作;
    4、主机设置SDA 为三态门输入,读取从机应答信号;
    5、读取应答信号成功,主机设置SDA 为输出,传输1 字节地址数据;
    6、主机设置SDA 为三态门输入,读取从机应答信号;
    7、读取应答信号成功,主机发起起始信号;
    8、主机传输器件地址字节,其中最低位为1,表明为读操作;
    9、设置SDA 为三态门输入,读取从机应答信号;
    10、读取应答信号成功,主机设置SDA 为三态门输入,读取SDA 总线上的第1 个字节的数据;
    11、主机设置SDA 输出,发送一位应答信号;
    12、设置SDA 为三态门输入,读取SDA 总线上的下一个字节的数据;若n 个字节数据
    读完成,跳转到步骤13,若数据未读完,跳转到步骤11;(对于AT24Cxx,一次读取长度最大为32 字节,即n 不大于32)
    13、主机设置SDA 输出,产生无应答信号(高电平)(无需设置为输出高电平,因为总线会被自动拉高);
    14、主机产生STOP 位,终止传输。

    双字节 存储器地址:

     

    1、主机设置SDA 为输出;
    2、主机发起起始信号;
    3、主机传输器件地址字节,其中最低位为0,表明为写操作;
    4、主机设置SDA 为三态门输入,读取从机应答信号;
    5、读取应答信号成功,主机设置SDA 为输出,传输地址数据高字节;
    6、主机设置SDA 为三态门输入,读取从机应答信号;
    7、读取应答信号成功,主机设置SDA 为输出,传输地址数据低字节;
    8、设置SDA 为三态门输入,读取从机应答信号;
    9、读取应答信号成功,主机发起起始信号;
    10、主机传输器件地址字节,其中最低位为1,表明为读操作;
    11、设置SDA 为三态门输入,读取从机应答信号;
    12、读取应答信号成功,主机设置SDA 为三态门输入,读取SDA 总线上的第1 个字节的数据;
    13、主机设置SDA 输出,发送一位应答信号;
    14、设置SDA 为三态门输入,读取SDA 总线上的下一个字节的数据;若n 个字节数据读完成,跳转到步骤15 ,若数据未读完,跳转到步骤 13 ;(对于 AT24Cxx ,一次读取长度最大为 32 字节,即 n 不大于 32

    15、主机设置 SDA 输出,产生无应答信号(高电平)(无需设置为输出高电平,因为总线会被自动拉高);
    16、主机产生 STOP 位,终止传输。

    参考声明

    【1】 创客学院视频;

    【2】芯路恒开发板教程;

  • 相关阅读:
    什么样的文旅项目将更适合市场
    C Primer Plus(6) 中文版 第9章 函数 9.2 ANSI C 函数原型
    【C++】STL04 适配器-stack
    神经网络可以预测数据吗,神经网络为什么能预测
    彩虹云商城自助发卡商城-卡卡云主题
    冥想第五百二十二天
    高频面试题 | RabbitMQ如何防止重复消费?
    挑战杯 基于大数据的社交平台数据爬虫舆情分析可视化系统
    YOLOv8-Seg改进:Backbone改进 |Next-ViT堆栈NCB和NTB 构建先进的CNN-Transformer混合架构
    docker报错Error response from daemon: Container xxx is not running
  • 原文地址:https://blog.csdn.net/qq_43045275/article/details/125958246