IIC 总线协议(Verilog)

        IIC (Inter - Integrated Circuit BUS) 集成电路总线,它是一种串行通信总线,多使用主从架构。IIC 接口共有两条总线线路,即 SCL(串行时钟线)、SDA(串行数据线)。IIC 总线是半双工数据传输,所以 IIC 总线上的每个连接的器件都有唯一的器件地址,但任何时刻都只有一个主机,这样主机就能按照地址来找相应的从机传输数据了。

IIC 协议:

       1、在时钟(SCL)为高电平的时候,数据总线(SDA)必须保持稳定,所以数据总线(SDA) 在时钟(SCL)为低电平的时候才能改变。

       2、时钟线(SCL)为高电平期间,数据线(SDA)由高电平向低电平的变化表示起始信号)(Start);时钟线(SCL)为高电平期间,数据线(SDA)由低电平向高电平的变化表示终止信号(Stop);   

起始信号和终止信号都是由主机发出的,在起始信号产生前,总线就处于空闲状态SCL = 1,SDA = 1);在起始信号产生后,总线就处于被占用的状态;在终止信号产生后,总线就处于空闲状态。  

       3、IIC 主机将 8 bit 数据或命令传出去之后,当时钟线(SCL)为高电平期间,如果监测到数据线(SDA)为低电平,说明有应答信号(ACK:低电平 0 表示应答,1 表示非应答),应答信号是由数据接收方即从机发出的。

        使用 IIC 总线传输数据的时候首先是要发送“起始信号”,紧跟着就是七位器件地址,第八位是数据读写控制位(0:代表写(Write),1:代表读(Read)),再后面就是等待从机的应答。传输结束后,“终止信号”也是由主机来产生的,由此可知,在整个传输过程中,从机只发出了应答信号,而且发送数据的时候是高位先发送。

start从机地址R/WACKdata[7:0]ACKdata[7:0]ACKSTOP

IIC 器件地址:

        每个 IIC 器件都有一个器件地址,有的器件地址在出厂时地址就设置好了,用户不可以更改,有的确定了几位,剩下几位由硬件确定,例如常见的 IIC 接口的 EEPROM 存储器,前四个地址已经确定为1010,后三个地址由用户自己在硬件设计时确定。

        严格来说,主机不是直接向从机发送地址,而是主机往 IIC 总线上发送地址,所有的从机都能接收到主机发出的地址,然后每个从机都将主机发出的地址与自己的地址比较,如果匹配上了,这个从机就会向总线发出一个响应信号。主机收到响应信号后,开始向总线上发送数据, 这样就与这个从机的通讯就建立起来了。如果主机没有收到响应信号,则表示寻址失败。通常情况下,主从器件的角色是确定的,也就是说从机一直工作在从机模式。

        IIC 协议在进行数据传输时,主机需要首先向总线上发出控制命令,其中控制命令就包括了从机器件地址和读写控制,然后等待从机响应。下图为 IIC 控制命令传输的数据格式。

IIC 存储器地址:

        每个支持 IIC 协议的器件,内部总会有一些可供读写的寄存器或存储器,例如, EEPROM 存储器,内部就是顺序编址的一系列存储单元(寄存器和存储器)。因此,我们要对一个器件中的存储单元进行读写,就必须要能够指定存储单元的地址。IIC 协议设计了从机存储单元寻址地址段,在主机确认收到从机返回的控制字节响应后由主机发出。该地址段为一个字节或两个字节长度,例如同是 EEPROM 存储器,AT24C04 的址段长度为一个字节,而 AT24C64 的地址段长度为两个字节。具体是一个字节还是两个字节,与器件的存储单元数量有关,以下为 1 字节地址和 2 字节地址器件的地址分布图。

IIC 写时序:

      单/双字节地址写时序与连续写时序(页写)

单字节地址写时序

 单字节地址连续写时序

 双字节地址写时序

  双字节地址连续写时序

        单字节地址连续多字节写数据过程:

        ①主机发起起始信号;

        ②主机传输器件地址字节,其中最低位为 0,表明为写操作;

        ③主机设置 SDA 为三态门输入,读取从机应答信号;

        ④主机读取应答信号成功,主机设置 SDA 为输出,传输 1 字节地址数据;

        ⑤主机设置 SDA 为三态门输入,读取从机应答信号;

        ⑥主机读取应答信号成功,主机设置 SDA 为输出,传输待写入的第 1 个数据;

        ⑦设置 SDA 为三态门输入,读取从机应答信号;

        ⑧读取应答信号成功后,主机设置 SDA 为输出,传输待写入的下一个数据;

        ⑨设置 SDA 为三态门输入,读取从机应答信号;n 个数据被写完,转到步骤⑩,若数据未被写完,转到步骤⑧;

        ⑩读取应答信号成功,主机产生 STOP 位,终止传输。

        单字节地址单字节写数据过程: ①②③④⑤⑥⑦⑩

        双字节地址单字节写数据过程: ①②③④⑤④⑤⑥⑦⑩  其中第一个④⑤传输高字节地址数据,第二个④⑤传输低字节地址。

        双字节地址连续多字节写数据过程: ①②③④⑤④⑤⑥⑦⑧⑨⑩  其中第一个④⑤传输高字节地址数据,第二个④⑤传输低字节地址。

IIC 读时序:

      单/双字节地址读时序与连续读时序(页读取)

单字节地址读时序

单字节地址连续读时序 

双字节地址读时序 

 双字节地址连续读时序

        单字节地址连续多字节读数据过程: 

        ①主机发起起始信号;

        ②主机传输器件地址字节,其中最低位为 0,表明为写操作;

        ③主机设置 SDA 为三态门输入,读取从机应答信号;

        ④读取应答信号成功,主机设置 SDA 为输出,传输 1 字节地址数据;

        ⑤主机设置 SDA 为三态门输入,读取从机应答信号;

        ⑥读取应答信号成功,主机发起起始信号;

        ⑦主机传输器件地址字节,其中最低位为 1,表明为读操作;

        ⑧设置 SDA 为三态门输入,读取从机应答信号;

        ⑨读取应答信号成功,主机设置 SDA 为三态门输入,读取 SDA 总线上的第 1 个字节 的数据;

        ⑩主机设置 SDA 输出,发送一位应答信号;

        ⑪设置 SDA 为三态门输入,读取 SDA 总线上的下一个字节的数据;若 n 个字节数据读完成,跳转到步骤 ⑫,若数据未读完,跳转到步骤 ⑩;

        ⑫主机设置 SDA 输出,产生无应答信号(高电平)(无需设置为输出高电平,因为总 线会被自动拉高);

        ⑬主机产生 STOP 位,终止传输。

        单字节地址单字节读数据过程: ①②③④⑤⑥⑦⑧⑨⑫⑬

        双字节地址单字节读数据过程: ①②③④⑤④⑤⑥⑦⑧⑨⑫⑬  其中第一个④⑤传输高字节地址数据,第二个④⑤传输低字节地址。

        双字节地址连续多字节读数据过程: ①②③④⑤④⑤⑥⑦⑧⑨⑩⑪⑫⑬  其中第一个④⑤传输高字节地址数据,第二个④⑤传输低字节地址。

IIC_TOP:

        此次设计的 IIC 从机模块 IIC_TOP 的结构图如下:

        如图所示,IIC_TOP 模块包括一个 IIC_slave 模块和 SRAM 模块。IIC_Master,也就是 IIC 主机给 IIC 从机模块通过串行时钟线 scl 和串行数据线 sda_in 把所要输入的 device_id ( 最低位为 0 ) 、w_addr 、w_data 以 IIC 协议的形式写入 IIC_slave 中,IIC_slave 根据 w_addr 把 w_data 存入SRAM 中,这也就构成了 IIC 协议的写操作;IIC_Master 再次通过串行时钟线 scl 和串行数据线 sda_in 输入 device_id ( 最低位为 1 ) 、r_addr 以 IIC 协议的形式输入到 IIC_slave 中,IIC_slave 根据 r_addr 把 r_data 从 SRAM 中读出并由 sda_out 把 r_data 从最高位到最低位依次读出,这也就构成了 IIC 协议的读操作。

        以下为 IIC_slave 模块的结构图: 

         引脚列表:

序号名称位宽I/O 类型说明
1w_dataO写数据
2sda_out1OIIC 串行输出数据线
3addr 8

地址信号
4w_en1O写使能信号
5r_en1O读使能信号
6r_data8I读数据
7sda_in1IIIC 串行输入数据线
8scl1IIIC 串行时钟线
9rst_n1I复位信号,低电平有效

        写数据波形:

         读数据波形:

  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值