原创 SPI、I2C、UART三种串行总线的区别

2009-6-7 10:53 5173 5 6 分类: 通信

第一个区别当然是名字:
    SPI(Serial Peripheral Interface:串行外设接口);
    I2C(INTER IC BUS:意为IC之间总线)
    UART(Universal Asynchronous Receiver Transmitter:通用异步收发器)

第二,区别在电气信号线上:
    SPI总线由三条信号线组成:串行时钟(SCLK)、串行数据输出(SDO)、串行数据输入(SDI)。SPI总线可以实现 多个SPI设备互相连接。提供SPI串行时钟的SPI设备为SPI主机或主设备(Master),其他设备为SPI从机或从设备(Slave)。主从设备间可以实现全双工通信,当有多个从设备时,还可以增加一条从设备选择线。
    如果用通用IO口模拟SPI总线,必须要有一个输出口(SDO),一个输入口(SDI),另一个口则视实现的设备类型而定,如果要实现主从设备,则需输入输出口,若只实现主设备,则需输出口即可,若只实现从设备,则只需输入口即可。

    I2C总线是双向、两线(SCL、SDA)、串行、多主控(multi-master)接口标准,具有总线仲裁机制,非常适合在器件之间进行近距离、非经常性的数据通信。在它的协议体系中,传输数据时都会带上目的设备的设备地址,因此可以实现设备组网
    如果用通用IO口模拟I2C总线,并实现双向传输,则需一个输入输出口(SDA),另外还需一个输出口(SCL)。(注:I2C资料了解得比较少,这里的描述可能很不完备)

    UART总线是异步串口,因此一般比前两种同步串口的结构要复杂很多,一般由波特率产生器(产生的波特率等于传输波特率的16倍)、UART接收器、UART发送器组成,硬件上由两根线,一根用于发送,一根用于接收。
    显然,如果用通用IO口模拟UART总线,则需一个输入口,一个输出口。

第三,从第二点明显可以看出,SPI和UART可以实现全双工,但I2C不行

第四,看看牛人们的意见吧!
    wudanyu:I2C线更少,我觉得比UART、SPI更为强大,但是技术上也更加麻烦些,因为I2C需要有双向IO的支持,而且I2C使用上拉电阻,我觉得抗干扰能力较弱,一般用于同一板卡上芯片之间的通信,较少用于远距离通信。SPI实现要简单一些,UART需要固定的波特率就是说两位数据的间隔要相等,而SPI则无所谓,因为它是有时钟的协议
    quickmouse:I2C的速度比SPI慢一点,协议比SPI复杂一点,但是连线也比标准的SPI要少。


1、SPI(Serial Peripheral Interface串行外围接口):高速、全双工、同步串行口。
三或四个信号用于数据交换:
SIMO:从进,主出
SOMI:从出,主进
UCLK:时钟,由主机驱动,从机用它发送和接收数据
STE:从机发送允许,用于四线模式中控制多主从系统中的多个从机



三线SPI组成:串行时钟(SCLK)、串行数据输出(SDO)、串行数据输入(SDI);当有多个从设备时,还可以增加一条从设备选择线。四线SPI模式用附加控制线,来允许从机数据的发送和接收,它由主机控制。

SPI总线可以实现多个SPI设备互相连接。
提供SPI串行时钟的SPI设备为SPI主机或主设备(Master),其他设备为SPI从机或从设备(Slave)。


主从设备间可以实现全双工通信,SPI接口是在CPU和外围低速器件之间进行同步串行数据传输,在主器件的移位脉冲下,数据按位传输,高位在前,地位在后,为全双工通信。
    如果用通用IO口模拟SPI总线,必须要有一个输出口(SDO),一个输入口(SDI),另一个口则视实现的设备类型而定,如果要实现主从设备,则需输入输出口,若只实现主设备,则需输出口即可,若只实现从设备,则只需输入口即可。


UART需要固定的波特率,而SPI则无所谓,因为它是有时钟的协议。
SPI接口主要应用在EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。


2、I2C(Inter IC Bus)接口定义:
I2C总线是双向两线(SCL——串行时钟、SDA——串行数据线)制同步串行总线,具有竞争检测和仲裁机制,可使多个主机任意同时发送数据而不破坏总线上的数据信息。非常适合在器件之间进行近距离、非经常性的数据通信。在它的协议体系中,传输数据时都会带上目的设备的设备地址,因此可以实现设备组网。
特点:
A、每个连到总线上的器件都可由软件唯一的地址寻址,并建立简单的主从关系。主器件既可作为发送器,又可作为接收器。
B、同步时钟允许器件通过总线以不同的波特率进行通信
C、同步时钟可以作为停止和重新启动串行口发送的握手方式
D、连接到同一总线上的集成电路器件数只受400PF的总大总线电容的限制
    如果用通用IO口模拟I2C总线,并实现双向传输,则需一个输入输出口(SDA),另外还需一个输出口(SCL)。


注:组成I2C总线的串行数据线SDA和串行时钟线SCL必须经过上拉电阻Rp接到正电源上,连接到总线上的器件的输出极必须为“开漏”或“开集”的形式,以便完成“线与”的功能。


I2C需要有双向IO的支持,而且使用上拉电阻,抗干扰能力较弱,一般用于同一板卡上芯片之间的通信,较少用于远距离通信。


各种接口之间的区别如下:


1、UART和USART两个别区说不出来,USART是新出的,不过区别在什么地方我也搞不清楚。UART就是两线,一根发送一根接收,可以全双工通信,线数也比较少。数据是异步传输的,对双方的时序要求比较严格,通信速度也不是很快。在多机通信上面用的最多。


2、SPI接口和上面UART相比,多了一条同步时钟线,上面UART的缺点也就是它的优点了,对通信双方的时序要求不严格不同设备之间可以很容易结合,而且通信速度非常快。一般用在产品内部元件之间的高速数据通信上面,如大容量存储器等。


3、I2C接口也是两线接口,它是两根线之间通过复杂的逻辑关系传输数据的,通信速度不高,程序写起来也比较复杂。一般单片机系统里主要用来和24C02等小容易存储器连接。



 

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户365858 2011-7-30 17:27

假设主机和从机初始化就绪:并且主机的sbuff=0xaa,从机的sbuff=0x55,下面将分步对spi的8个时钟周期的数据情况演示一遍:假设上升沿发送数据   脉冲 主机sbuff 从机sbuff sdi sdo   0 10101010 01010101 0 0   1上 0101010x 1010101x 0 1   1下 01010100 10101011 0 1   2上 1010100x 0101011x 1 0   2下 10101001 01010110 1 0   3上 0101001x 1010110x 0 1   3下 01010010 10101101 0 1   4上 1010010x 0101101x 1 0   4下 10100101 01011010 1 0   5上 0100101x 1011010x 0 1   5下 01001010 10110101 0 1   6上 1001010x 0110101x 1 0   6下 10010101 01101010 1 0   7上 0010101x 1101010x 0 1   7下 00101010 11010101 0 1   8上 0101010x 1010101x 1 0   8下 01010101 10101010 1 0   这样就完成了两个寄存器8位的交换,上面的上表示上升沿、下表示下降沿,sdi、sdo相对于主机而言的。其中ss引脚作为主机的时候,从机可以把它拉底被动选为从机,作为从机的是时候,可以作为片选脚用。根据以上分析,一个完整的传送周期是16位,即两个字节,因为,首先主机要发送命令过去,然后从机   根据主机的命令准备数据,主机在下一个8位时钟周期才把数据读回来。 从百科那里摘录的,意思是SPI口一定会同时用到收发吗?
相关推荐阅读
cz81_503897891 2011-11-21 17:13
博客备份--查找
大家好:     各位朋友现在博客如何备份?如何指定关键词进行查找?     以前的版本可以,现在新版以来我一直找这个功能,找不到. 谢谢...
cz81_503897891 2011-11-01 11:20
查看Keil MDK-ARM各种数据类型占用的字节数
  笔者正在学习uCOS-II,移植到ARM时考虑到数据类型的定义,但对于Keil MDK编译器的数据类型定义还是很模糊,主要就是区分不了short int、i...
cz81_503897891 2011-10-28 16:44
理解指针函数 区别:*(pfun(int, int))与 (*pfun)(int, int)
1.int *(pfun(int, int)):一个返回值为整型指针的函数 2.int (*pfun)(int, int):是一个指向返回值为int的函数的指针 3.#define  IAP_ENT...
cz81_503897891 2011-10-20 15:49
各种接口与管脚 232,VGA、USB、DVI、PS/2 RJ45网线、HDMI 的接口引脚定义
232,VGA、USB、DVI、PS/2 RJ45网线、HDMI 的接口引脚定义 学习 2010-06-07 20:20:15 阅读82 评论0 字号:大中小 经常看到网络上很多人要各种电脑接口引...
cz81_503897891 2011-10-20 11:50
ARM 中断编程入门 寄存器介绍及编写过程
最近一直在和ARM2200打交道,总结了下在ARM zlg模版中如和编写中断的方法(涉及了向量中断,非向量中断和外部中断的编写方法) 本人初学,以下为本人观点,若有错误,请与我联系交流 一.   ...
cz81_503897891 2011-10-18 17:17
LPC2478 向量中断控制器(VIC)
简介:         VIC是处于芯片外设和ARM内核之间的一个模块,对芯片所有外设中断进行管理,决定哪些中断源可以产生中断、产生哪种类型的中断以及中断后执行哪段服务程序。  ARM处理器内核具...
EE直播间
更多
我要评论
1
5
关闭 站长推荐上一条 /3 下一条