|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
I2C与串行端口、SPI对比
# u1 b. S7 X9 e4 Q0 q, P7 @0 ~4 S3 T W9 c/ c
串行端口0 C9 k8 [" r9 J- }$ K9 T5 k; v* J
串行端口是异步的(不传输时钟相关数据),两个设备在使用串口通信时,必须先约定一个数据传输速率,并且这两个设备各自的时钟频率必须与这个速率保持相近,某一方的时钟频率相差很大都会导致数据传输混乱。
, c& }% ], T* k$ X8 c! D' C异步串行端口在每个数据帧中都要插入至少一个起始位和一个终止位,意味着每传输8bits的数据实际要花费10bits的传输时间,从而降低了数据传输速率。 7 Y1 O7 k6 V1 \ [$ F& X
另一个问题是异步串行端口的设计就是针对两个设备之间通信的,那么如果有多个设备连接到一个串口上,就必须解决信号碰撞的问题(bus contention),通常要通过额外硬件来完成。 4 n! R) [1 l: s& J' j
最后就是数据传输速率,异步串行通信并没有一个理论上的速率限制,大部分UART设备只支持一些特定的波特率,最高通常在230400bps左右。. u+ y6 M) b- l
2 u5 A* k8 ` K ~) L% h4 iSPI
5 W4 h$ f. t0 R0 ~7 r+ X" T3 VSPI最明显的缺点就是引脚数量,使用SPI总线相连的一个master和一个slave需要四根线(MISO/MOSI/SCK/CS),每增加一个slave,就需要在master上增加一个CS引脚。当一个master接多个slaves的时候,疯狂增长的引脚连接是难以忍受的,并且对紧凑的PCB layout是一个挑战。 * E0 k! }1 W, o" ?$ v
SPI总线上只允许有一个master,但可以有任意多个slaves(只受限于总线上设备的驱动程序的能力,以及设备上最多能有多少个CS引脚)。
0 P7 _5 |; l% C/ A8 `SPI可以很好的用于高速率全双工的连接,对一些设备可支持高达10MHz(10Mbps)的传输速率,因此SPI吞吐量大得多。SPI两端的设备通常是一个简单的移位寄存器,让软件的实现很简单。
; v" `1 X$ @" Z0 [; h
. B! V! p) R& q' {0 r; M0 m) J( x+ |I2C" C; B7 B3 s2 q6 e) E4 o! ^7 ?3 k/ R
I2C最少只需要两根线,和异步串口类似,但可以支持多个slave设备。和SPI不同的是,I2C可以支持mul-master系统,允许有多个master并且每个master都可以与所有的slaves通信(master之间不可通过I2C通信,并且每个master只能轮流使用I2C总线)。master是指启动数据传输的设备并在总线上生成时钟信号以驱动该传输,而被寻址的设备都作为slaves。 ; L0 ^2 b. y( Q$ T% `/ m, l
4 D7 t' c% f) o" i M& C$ a/ ]$ K& J
I2C的数据传输速率位于串口和SPI之间,大部分I2C设备支持100KHz和400KHz模式。使用I2C传输数据会有一些额外消耗:每发送8bits数据,就需要额外1bit的元数据(ACK或NACK)。I2C支持双向数据交换,由于仅有一根数据线,故通信是半双工的。 ; f+ W% o* T$ K) F; v# h
硬件复杂度也位于串口和SPI之间,而软件实现可以相当简单。 |
2 o! h1 R4 T7 k" z# B+ I |
|