图 2 I²C 总线的数据传递时序
• 首先主节点器件发送一个起始信号。
• 接下来主节点器件发送从节点地址和读写方式,一共 8 位。其中从节点地址 7 位,读写方式 1 位。
• 与传输地址一致的从节点器件应答(即 ACK)。
• 开始数据传输,传输数据数量不限。每个字节(八位)后面跟接收数据方的应答位。例如主节点器件读取从节点数据,从节点发送数据,主节点应答;主节点器件写数据到从节点,主节点发送数据,从节点应答。
• 数据传输结束,主节点器件发送一个终止信号结束整个过程。
采用 I²C 总线后对传送的字节数没有限制,只要求每传送一个字节后对方回应一个应答位。在发送时首先发送的是数据的最高位(MSB,Most Significant Bit)。每次传送开始有起始信号,结束时有停止信号。在总线传送完一个字节后,可以通过对时钟线(SCL)的控制使传送暂停。例如当某个外围器件接收 N 个字节数据后需要一段处理时间以便继续接收以后的字节数据,这时可在应答信号后使 SCL 变为低电平控制总线暂停。如果主节点要求总线暂停也可使时钟线保持低电平控制总线暂停。
2)总线上的时序信号
I²C 总线为同步传输总线,总线信号完全与时钟同步。I²C 总线上与数据传送有关的信号有起始信号 S、终止信号 P、应答信号 A 以及位传送信号。下面将对这些信号一一介绍。
(1)起始信号
起始信号(Start Condition)如图 3 所示。当时钟线 SCL 为高电平时,数据线 SDA 从高电平向低电平变化将形成起始信号,启动 I²C 总线。
(2)终止信号
终止信号(Stop Condition)如图 3 所示。当时钟线 SCL 为高电平时,数据线 SDA 从低电平向高电平变化将形成终止信号,停止 I²C 总线。
(3)应答信号
如图 3 所中 ACK 第 9 个时钟脉冲对应应答位,相应数据线上低电平时为应答信号,高电平时为非应答信号。
图 3 起始信号和终止信号
(4)位传送信号
在 I²C 总线启动后或应答信号后的第 1~8 个时钟脉冲对应于一个字节的 8 位数据传送。脉冲高电平期间,数据串行传送;低电平期间为数据准备,允许总线上数据电平变换。
二、模拟 I²C 接口程序的基本框架
模拟 I²C 接口程序的基本框架如图 4 所示。
图 4 模拟 I²C 接口程序的基本框架
1)程序接口
用于和应用程序连接的接口,将应用程序的数据按照 I²C 协议的方式通过 SDA 传递给外部器件。包括下列内容:
• clk_I FPGA 外部时钟信号。
• rst_I 同步重起信号。
• arst_I 异步重起信号。
• adr_I 从节点地址。
• dat_I 输入数据。
• dat_o 输出数据。
• we_I 写有效信号。
• stb_I 接口有效信号。
• cyc_I 有效总线周期输入。
• ack_o 应答信号输出。
• inta_o 中断信号输出。
2)时钟设置寄存器
I²C 协议提供了 3 种速度模式:正常速度模式 100kbit/s、快速模式 400kbit/s、高速模式3.5Mbit/s。SCL 输出的时钟信号频率和速度模式一致。程序内部使用 5 倍 SCL 信号作为时钟,而 FPGA 外部时钟需要经过分频得到程序内部使用的时钟。
例如:采用正常速度 100kbit/s,FPGA 外部时钟为 50MHz,则时钟设置寄存器需要设置为(50MHz/5*100kHz – 1=99)。
3)时钟产生模块
时钟产生模块产生 4 倍 SCL 频率的时钟信号,它为位传输控制模块中所有同步动作提供触发信号。
4)命令寄存器
命令寄存器共 8 位,它决定是否在总线上产生各种时序信号、是否读/写数据,各位表示的含义如表 1 所示。
表 1 命令寄存器内容
5)状态寄存器
状态寄存器用来显示当前总线的状态,例如是否接收到从节点的应答信号、是否忙、是否在传递数据等,具体内容如表 2 所示。
表 2 状态寄存器内容
6)数据传输寄存器
数据传输寄存器用于保存等待传输的数据。当传递从节点地址信息时,前 7 位保存从节点地址,最后一位保存读写命令;当传递普通数据时,8 位保存一个字节数据。数据传输寄存器具体内容如表 3 所示。
表 3 数据传输寄存器内容
7)数据接收寄存器
数据接收寄存器用于保存通过 I²C 总线接收到的最后一个字节内容,具体内容如表4所示。
表 4 数据接收寄存器内容
8)字节传输控制模块
字节传输控制模块以字节为单位控制 I²C 总线的数据传输。这个模块按照命令寄存器设置的内容将数据传输寄存器内容传递到 I²C 总线的接收端,或者从 I²C 总线发送端接收数据并保存到数据接收寄存器中。
9)位传输控制模块
位传输控制模块以位为单位进行 I²C 总线的数据传输和产生各个 I²C 协议命令(如开始、停止、重复开始等)。字节传输控制模块控制位传输控制模块的各种动作。例如读取一个字节数据,位传输控制模块需要执行 8 个读的命令。
10)数据移位寄存器
数据移位寄存器保存的数据总是和当前的数据传输相关的。例如在进行读操作时,主节点通过移位寄存器依次通过 SDA 获得来自 I²C 发送端的数据,完成后数据拷贝到数据接收寄存器中。在写操作时,数据传输寄存器中的数据拷贝到数据移位寄存器中,然后依次通过 SDA 将数据传输到 I²C 总线的接收端。
本篇到此结束,下一篇带来基于 FPGA 的模拟 I²C 协议设计(中),I²C 协议的具体实现,包括位传输的实现、字节传输的实现以及程序主体的实现等相关内容。