IIC协议笔记
网络上有很多IIC协议的Verilog代码,就不在本文中过多赘述。
I2C 通讯协议(Inter-Integrated Circuit,集成电路总线)是由 Philips 公司开发的一种简单、双向二线制同步串行总线,只需要两根线即可在连接于总线上的器件之间传送信息。 I2C 通讯协议和通信接口在很多工程中有广泛的应用,如数据采集领域的串行 AD,图像处理领域的摄像头配置,工业控制领域的 X 射线管配置等等。除此之外,由于 I2C 协议占用引脚特别少,硬件实现简单,可扩展型强,现在被广泛地使用在系统内多个集成电路(IC)间的通讯。
I2C的物理层有如下特点:
(1) 它是一个支持多设备的总线。“总线”指多个设备共用的信号线。在一个 I2C 通讯总线中,可连接多个 I2C 通讯设备,支持多个通讯主机及多个通讯从机,理论上一个主机最多可以接127个从机。
(2) 一个 I2C 总线只使用两条总线线路,一条双向串行数据线(SDA) ,一条串行时钟线(SCL)。数据线即用来表示数据,时钟线用于数据收发同步,只能实现半双工通信。
(3) 每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备之间的访问。
(4) 总线通过上拉电阻接到电源。当 I2C 设备空闲时,会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平。
(5) 多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线。
(6) 具有三种传输模式:标准模式传输速率为 100kbit/s ,快速模式为 400kbit/s ,高速模式下可达 3.4Mbit/s,但目前大多 I2C 设备尚不支持高速模式。
(7) 连接到相同总线的 IC 数量受到总线的最大电容 400pF 限制。
I2C协议时序图(总线)

I2C 协议整体时序图分为 4 个部分,图中标注的①②③④表示 I2C 协议的4个状态,分别为“总线空闲状态”、“起始信号”、“数据读/写状态”和“停止信号”。
(1) 图中标注①表示“总线空闲状态”,在此状态下串口时钟信号 SCL 和串行数据信号 SDA 均保持高电平,此时无 I2C 设备工作。
(2) 图中标注②表示“起始信号”,在 I2C 总线处于“空闲状态”时,SCL 保持高电平时, SDA 出现由高电平转为低电平的下降沿,产生一个起始信号,此时与总线相连的所有 I2C 设备在检测到起始信号后,均跳出空闲状态,等待控制字节的输入。
(3) 图中标注③表示“数据读/写状态”。I2C 通讯设备的通讯模式是主从通讯模式,通讯双方有主从之分。当主机向从机进行指令或数据的写入时,串行数据线 SDA 上的电平在串行时钟 SCL 为高电平时保持稳定(方便从机进行采样),每次只写入一位数据;串行数据线 SDA 中的数据在串行时钟 SCL 为低电平时进行数据更新,以保证在 SCL 为高电平时采集到 SDA 数据的稳定状态。当一个完整字节的指令或数据传输完成,从机设备正确接收到指令或数据后,会通过拉低 SDA 为低电平,向主机设备发送单比特的应答信号,表示数据或指令写入成功。若从机正确应答,可以结束或开始下一字节数据或指令的传输,否则表明数据或指令写入失败,主机就可以决定是否放弃写入或者重新发起写入。
(4) 图中标注④表示“停止信号”,完成数据读写后,串口时钟 SCL 保持高电平,当串口数据信号 SDA 产生一个由低电平转为高电平的上升沿时,产生一个停止信号,I2C 总线跳转回“总线空闲状态”。
Device Addressing

I2C 协议中通过设备地址来寻址以及控制读写,控制字节是主机发送起始信号后被收到的第一个字节。控制字节由一个4 bit 控制位和3 bit的Block Select位以及1 bit 读写控制位组成,其中4 bit 控制位和和3 bit的Block Select位组成从机地址。Read/Write Bit位为 1 时表示Read,Read/Write Bit位为 0 时表示Write。从机成功接收该控制字节后会发送ACK信号至主机。
Write Operation
- Byte Write

(1) 主机产生并发送起始信号到从机,将控制命令写入从机,读写控制位设置为低电平,表示对从机进行数据写操作,控制命令的写入高位在前低位在后;
(2) 从机接收到控制指令后,回传应答信号,主机接收到应答信号后开始写入存储地址。若为 2 字节地址,先向从机写入高 8 位地址,且高位在前低位在后;接收到从机回传的应答信号,再写入低 8 位地址,且高位在前低位在后。若为单字节地址,按高位在前低位在后的顺序写入单字节存储地址;
(3) 地址写入完成,主机接收到从机回传的应答信号后,开始单字节数据的写入;
(4) 单字节数据写入完成,主机接收到应答信号后,向从机发送停止信号,单字节写操作完成。
- Page Write

(1) 主机产生并发送起始信号到从机,将控制命令写入从机,读写控制位设置为低电平,表示对从机进行数据写操作,控制命令的写入高位在前低位在后;
(2) 从机接收到控制指令后,回传应答信号,主机接收到应答信号后开始写入存储地址。若为 2 字节地址,先向从机写入高 8 位地址,且高位在前低位在后;接收到从机回传的应答信号,再写入低 8 位地址,且高位在前低位在后。若为单字节地址,按高位在前低位在后的顺序写入单字节存储地址;
(3) 地址写入完成,主机接收到从机回传的应答信号后,开始单字节数据的写入;数据写入完成,主机接收到应答信号后,开始下一个单字节数据的写入;数据写入完成,主机接收到应答信号。
(4)若所有数据均写入完成,主机向从机发送停止信号,页写操作完成。
Read Operation
- Random Read

(1) 主机产生并发送起始信号到从机,将控制命令写入从机,读写控制位设置为低电平,表示对从机进行数据写操作,控制命令的写入高位在前低位在后(Dummy Write);
(2) 从机接收到控制指令后,回传应答信号,主机接收到应答信号后开始写入存储地址。若为 2 字节地址,先向从机写入高 8 位地址,且高位在前低位在后;接收到从机回传的应答信号,再写入低 8 位地址,且高位在前低位在后。若为单字节地址,按高位在前低位在后的顺序写入单字节存储地址;
(3) 地址写入完成,主机接收到从机回传的应答信号后,主机再次向从机发送一个起始信号;
(4) 主机向从机发送控制命令,读写控制位设置为高电平,表示对从机进行数据读操作;
(5) 主机接收到从机回传的应答信号后,开始接收从机传回的第一个单字节数据;数据接收完成后,主机产生一个时钟的高电平无应答信号;
(6) 主机向从机发送停止信号,顺序读操作完成。
- Sequential Read

(1) 主机产生并发送起始信号到从机,将控制命令写入从机,读写控制位设置为低电平,表示对从机进行数据写操作,控制命令的写入高位在前低位在后(Dummy Write);
(2) 从机接收到控制指令后,回传应答信号,主机接收到应答信号后开始写入存储地址。若为 2 字节地址,先向从机写入高 8 位地址,且高位在前低位在后;接收到从机回传的应答信号,再写入低 8 位地址,且高位在前低位在后。若为单字节地址,按高位在前低位在后的顺序写入单字节存储地址;
(3) 地址写入完成,主机接收到从机回传的应答信号后,主机再次向从机发送一个起始信号;
(4) 主机向从机发送控制命令,读写控制位设置为高电平,表示对从机进行数据读操作;
(5) 主机接收到从机回传的应答信号后,开始接收从机传回的第一个单字节数据;数据接收完成后,主机产生应答信号回传给从机,从机接收到应答信号开始下一字节数据的传输,若数据接收完成,主机产生一个时钟的高电平无应答信号;若数据接收未完成,则重复此操作;
(6) 主机向从机发送停止信号,顺序读操作完成。
总线
assign i2c_sda = sda_out_en?sda_out:1'bz;
assign sda_in = i2c_sda;
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
