赞
踩
IIC (Inter - Integrated Circuit BUS) 集成电路总线,它是一种串行通信总线,多使用主从架构。IIC 接口共有两条总线线路,即 SCL(串行时钟线)、SDA(串行数据线)。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/W | ACK | data[7:0] | ACK | data[7:0] | ACK | STOP |
每个 IIC 器件都有一个器件地址,有的器件地址在出厂时地址就设置好了,用户不可以更改,有的确定了几位,剩下几位由硬件确定,例如常见的 IIC 接口的 EEPROM 存储器,前四个地址已经确定为1010,后三个地址由用户自己在硬件设计时确定。
严格来说,主机不是直接向从机发送地址,而是主机往 IIC 总线上发送地址,所有的从机都能接收到主机发出的地址,然后每个从机都将主机发出的地址与自己的地址比较,如果匹配上了,这个从机就会向总线发出一个响应信号。主机收到响应信号后,开始向总线上发送数据, 这样就与这个从机的通讯就建立起来了。如果主机没有收到响应信号,则表示寻址失败。通常情况下,主从器件的角色是确定的,也就是说从机一直工作在从机模式。
IIC 协议在进行数据传输时,主机需要首先向总线上发出控制命令,其中控制命令就包括了从机器件地址和读写控制,然后等待从机响应。下图为 IIC 控制命令传输的数据格式。
每个支持 IIC 协议的器件,内部总会有一些可供读写的寄存器或存储器,例如, EEPROM 存储器,内部就是顺序编址的一系列存储单元(寄存器和存储器)。因此,我们要对一个器件中的存储单元进行读写,就必须要能够指定存储单元的地址。IIC 协议设计了从机存储单元寻址地址段,在主机确认收到从机返回的控制字节响应后由主机发出。该地址段为一个字节或两个字节长度,例如同是 EEPROM 存储器,AT24C04 的址段长度为一个字节,而 AT24C64 的地址段长度为两个字节。具体是一个字节还是两个字节,与器件的存储单元数量有关,以下为 1 字节地址和 2 字节地址器件的地址分布图。
单字节地址写时序
单字节地址连续写时序
双字节地址写时序
双字节地址连续写时序
单字节地址连续多字节写数据过程:
①主机发起起始信号;
②主机传输器件地址字节,其中最低位为 0,表明为写操作;
③主机设置 SDA 为三态门输入,读取从机应答信号;
④主机读取应答信号成功,主机设置 SDA 为输出,传输 1 字节地址数据;
⑤主机设置 SDA 为三态门输入,读取从机应答信号;
⑥主机读取应答信号成功,主机设置 SDA 为输出,传输待写入的第 1 个数据;
⑦设置 SDA 为三态门输入,读取从机应答信号;
⑧读取应答信号成功后,主机设置 SDA 为输出,传输待写入的下一个数据;
⑨设置 SDA 为三态门输入,读取从机应答信号;n 个数据被写完,转到步骤⑩,若数据未被写完,转到步骤⑧;
⑩读取应答信号成功,主机产生 STOP 位,终止传输。
单字节地址单字节写数据过程: ①②③④⑤⑥⑦⑩
双字节地址单字节写数据过程: ①②③④⑤④⑤⑥⑦⑩ 其中第一个④⑤传输高字节地址数据,第二个④⑤传输低字节地址。
双字节地址连续多字节写数据过程: ①②③④⑤④⑤⑥⑦⑧⑨⑩ 其中第一个④⑤传输高字节地址数据,第二个④⑤传输低字节地址。
单字节地址读时序
单字节地址连续读时序
双字节地址读时序
双字节地址连续读时序
单字节地址连续多字节读数据过程:
①主机发起起始信号;
②主机传输器件地址字节,其中最低位为 0,表明为写操作;
③主机设置 SDA 为三态门输入,读取从机应答信号;
④读取应答信号成功,主机设置 SDA 为输出,传输 1 字节地址数据;
⑤主机设置 SDA 为三态门输入,读取从机应答信号;
⑥读取应答信号成功,主机发起起始信号;
⑦主机传输器件地址字节,其中最低位为 1,表明为读操作;
⑧设置 SDA 为三态门输入,读取从机应答信号;
⑨读取应答信号成功,主机设置 SDA 为三态门输入,读取 SDA 总线上的第 1 个字节 的数据;
⑩主机设置 SDA 输出,发送一位应答信号;
⑪设置 SDA 为三态门输入,读取 SDA 总线上的下一个字节的数据;若 n 个字节数据读完成,跳转到步骤 ⑫,若数据未读完,跳转到步骤 ⑩;
⑫主机设置 SDA 输出,产生无应答信号(高电平)(无需设置为输出高电平,因为总 线会被自动拉高);
⑬主机产生 STOP 位,终止传输。
单字节地址单字节读数据过程: ①②③④⑤⑥⑦⑧⑨⑫⑬
双字节地址单字节读数据过程: ①②③④⑤④⑤⑥⑦⑧⑨⑫⑬ 其中第一个④⑤传输高字节地址数据,第二个④⑤传输低字节地址。
双字节地址连续多字节读数据过程: ①②③④⑤④⑤⑥⑦⑧⑨⑩⑪⑫⑬ 其中第一个④⑤传输高字节地址数据,第二个④⑤传输低字节地址。
此次设计的 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 类型 | 说明 |
1 | w_data | 8 | O | 写数据 |
2 | sda_out | 1 | O | IIC 串行输出数据线 |
3 | addr | 8 | O | 地址信号 |
4 | w_en | 1 | O | 写使能信号 |
5 | r_en | 1 | O | 读使能信号 |
6 | r_data | 8 | I | 读数据 |
7 | sda_in | 1 | I | IIC 串行输入数据线 |
8 | scl | 1 | I | IIC 串行时钟线 |
9 | rst_n | 1 | I | 复位信号,低电平有效 |
写数据波形:
读数据波形:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。