EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Heaven_1 于 2023-8-15 09:22 编辑 . ~# {' M; v$ d g. Z
9 w/ Q6 M U+ N* _ H
9 E. M5 ]: p2 h4 B1 v% |8 J' aI2C(Inter-Integrated Circuit),其实是 I2C Bus简称,中文就是集成电路总线,它是一种串行通信总线,使用多主从架构,由飞利浦公司在1980年代为了让主板、 嵌入式系统或手机用以连接低速周边设备而发展。I2C的正确读法为“I平方C”("I-squared-C"),而“I二C”("I-two-C")则是另一种错误但被广泛使用的读法。自2006年10月1日起,使用 I2C 协议已经不需要支付专利费,但制造商仍然需要付费以获取 I2C 从属设备地址。
) s K; P( f/ R在现代电子系统中,有为数众多的 IC 需要进行相互之间以及与外界的通信。为了简化电路的设计,Philips 公司开发了一种用于内部 IC 控制的简单的双向两线串行总线 I2C(Intel-Integrated Circuit bus)。1998 年当推出 I2C 总线协议 2.0 版本时,I2C 协议实际上已经成为一个国际标准。 - f3 I4 e! o6 I0 ~/ K
本篇将详细讲解在 FPGA 芯片中使用 VHDL/Verilog HDL 模拟 I2C 协议,以及编写 TestBench仿真和测试程序的方法。 , \ i& F6 L! P
1 \+ @; U8 {" a5 S; }
下面先对 I2C 协议中有关数据格式和时序的内容进行介绍,这里没有涉及的地方请参考《THE I2C-BUS SPECIFICATION VERSION 2.1 JANUARY 2000》。 ) i$ M# U/ q, I+ E# D1 R& x
& B% K. ]$ s9 U& `! n+ D$ F
1 Z, W+ x# p" I1 G, K: m% Y# m7 V# `+ P& j
I2C 协议作为一个串行总线标准尽管没有并行总线的数据吞吐能力,但是它的以下特点使其有着广泛的应用: • 每个连接到总线的器件都可以通过惟一的地址和一直存在的简单的主/从节点关系软件设定地址,主节点可以发送数据或接收数据; 4 t0 a4 M+ S% _# h7 c+ o- Q \9 |# f' N
• 串行的 8 位双向数据传输位速率在标准模式下可达 100kbit/s,快速模式下可达400kbit/s,高速模式下可达 3.4Mbit/s;
2 J- E" [1 ~" V+ X3 K- J2 m• 连接到相同总线的 IC 数量只受到总线的最大电容(400pF)限制。 9 j& R/ r P4 r. f9 P
* O( E# m; \* Q l1.2 I2C 协议的基本概念 ; h; V |1 r+ z4 w0 b
8 C1 @ H' ]# m+ h5 h7 {
, }5 U1 s$ i/ O* q
! `- w6 @# H/ R" H) o/ P) {图 1 高性能集成电视 ; b# c8 |( ]' G0 x
+ |! O0 v) ~, R- N* A. ]
9 Y) M. ]% k! o
1)主/从节点
* Y: I4 r. a6 ?% {; V8 p2)总线上节点的寻址方式 " C* u$ S. C4 Z" ?& _7 d
I2C 总线上主节点的地址由软件给定,此地址存放在 I2C 总线的地址寄存器中。I2C 总线上所有的外围器件都有规范的器件地址。器件地址由 7 位数字组成,它和 1 位方向位构成了 I2C 总线器件的寻址字节 SLA(Slave address)。
3 H, K- t% M: L! p2 i0 B. ~0 k1.3 I2C协议的时序要求 % r" r U/ f' f% x1 m" s" H* w) D
I2C 总线上数据传递时序如图 2 所示,具体步骤如下。
0 W" F4 C0 ^+ ~# W! V$ {
$ ^# H: @' O+ y8 v) [6 }" A- A a• 首先主节点器件发送一个起始信号。 0 z0 {! Y0 H, V
• 与传输地址一致的从节点器件应答(即 ACK)。 8 o+ c* t. i1 ] M: v: j
• 数据传输结束,主节点器件发送一个终止信号结束整个过程。
! T7 @8 F( U S- f7 G9 F1 y8 B2)总线上的时序信号 2 N" f' {7 ?8 D6 Y" a& ?( E1 L
(1)起始信号 3 Q4 U6 x2 {, P2 W+ u+ D+ S2 `
(2)终止信号 ]$ j {9 A& A
(3)应答信号 # u% _( x" z6 ^, t
$ W# H: X0 ^5 ^. v6 m: y& l( v: M) f! b+ L
(4)位传送信号
% F2 G" b* x5 d8 u# R" I5 t9 y- D+ y模拟 I2C 接口程序的基本框架如图 4 所示。
) b9 v: ?% P+ B4 r1 H
* ]! h3 X8 ?! z* U& V2 {图 4 模拟 I2C 接口程序的基本框架
8 v( U9 _( M, Z# g用于和应用程序连接的接口,将应用程序的数据按照 I2C 协议的方式通过 SDA 传递给外部器件。包括下列内容: ( F$ @9 V" m1 I* M/ z6 O
• rst_I 同步重起信号。 • adr_I 从节点地址。 • dat_o 输出数据。 • stb_I 接口有效信号。 • ack_o 应答信号输出。 2)时钟设置寄存器
) b! I4 k6 \0 l例如:采用正常速度 100kbit/s,FPGA 外部时钟为 50MHz,则时钟设置寄存器需要设置为(50MHz/5*100kHz – 1=99)。
( k. s# @# Y+ u# H- q9 i4 o时钟产生模块产生 4 倍 SCL 频率的时钟信号,它为位传输控制模块中所有同步动作提供触发信号。
' L5 T1 ]& l+ _ t* z命令寄存器共 8 位,它决定是否在总线上产生各种时序信号、是否读/写数据,各位表示的含义如表 1 所示。 2 A; B* g+ s+ e1 t: C5 S0 R
! h3 p. y& p8 `7 `3 _6 V6 l( _
7 a$ Q; j! E9 m* `, b状态寄存器用来显示当前总线的状态,例如是否接收到从节点的应答信号、是否忙、是否在传递数据等,具体内容如表 2 所示。
1 W0 z7 ^; W$ \! L7 [* \ C
6 i% f" ?* v" H+ E3 @
, q- j2 H2 {0 C4 }2 R5 E# h: K" y
6 t+ f+ o+ s% C7 A4 A3 C数据传输寄存器用于保存等待传输的数据。当传递从节点地址信息时,前 7 位保存从节点地址,最后一位保存读写命令;当传递普通数据时,8 位保存一个字节数据。数据传输寄存器具体内容如表 3 所示。 5 e* ` O2 ^( p/ o
" R+ m2 B- o, P* ]" N
5 H7 ~, |1 q9 h: R! s
2 y6 Q7 O1 C2 A) j: \( N, x5 \; P数据接收寄存器用于保存通过 I2C 总线接收到的最后一个字节内容,具体内容如表4所示。
% u: v; _ g, F# g) b$ [2 \2 c0 G* q5 Z& v+ b3 s: C
$ m7 D( ]1 y8 P4 Y4 f% R3 H; L) m, u6 N w8 M# m
; M! U: c( ~! y; ^" U3 o" E
字节传输控制模块以字节为单位控制 I2C 总线的数据传输。这个模块按照命令寄存器设置的内容将数据传输寄存器内容传递到 I2C 总线的接收端,或者从 I2C 总线发送端接收数据并保存到数据接收寄存器中。 # v3 H" w7 U6 }3 V: ?; W
位传输控制模块以位为单位进行 I2C 总线的数据传输和产生各个 I2C 协议命令(如开始、停止、重复开始等)。字节传输控制模块控制位传输控制模块的各种动作。例如读取一个字节数据,位传输控制模块需要执行 8 个读的命令。
8 b" u# p# l- k' f8 K6 \4 n! J F数据移位寄存器保存的数据总是和当前的数据传输相关的。例如在进行读操作时,主节点通过移位寄存器依次通过 SDA 获得来自 I2C 发送端的数据,完成后数据拷贝到数据接收寄存器中。在写操作时,数据传输寄存器中的数据拷贝到数据移位寄存器中,然后依次通过 SDA 将数据传输到 I2C 总线的接收端。
1 x" ~6 y& G) s1 @+ Q( K" k# Z9 `2 L( H
! O( f. w, [- n4 R; L7 N2 j1 N; k
+ l, d: |: g+ [# g M) G, D, V* j$ [) e/ |6 V( N7 {
本篇到此结束,下一篇带来基于 FPGA 的模拟 I2C 协议设计(中),I2C 协议的具体实现,包括位传输的实现、字节传输的实现以及程序主体的实现等相关内容。
' N o5 \, p5 Y" Y |