UART,SPI,IIC的详解与区别

1,UART,SPI,IIC的详解

UART,SPI,IIC是经常用到的几个数据传输标准,下面分别总结一下:


UART(通用异步接收发送器):也就是我们经常所说的串口,基本都用于调试。
主机和从机至少要接三根线,RX,TX和GND.TX用于发送数据,RX用于接受数据(收发不是一根线,所以是全双工方式)。注意甲和乙通信A.TX要接B.RX,A.RX要接B.TX(A用TX发乙当然要用RX来收了!)

如果甲是PC机,B是单片机,A和乙还要之间接一块 电平转换芯片 ,用于将TTL / CMOS(单片机电平)转换为RS232(PC机电平)。因为TTL / CMOS电平范围是0〜1.8 / 2.5 / 3.3 / 5V(不同单片机范围不同),高电压表示1,低电压表示0而RS232逻辑电平范围-12V〜12V,-5〜-12表示高电平,+ 5〜+ 12V表示低电平(对你没有听错!)为什么这么设置这就要追溯到调制解调器出生时代了,有兴趣自己去查资料。?!

数据协议:以PC机一给单片机乙发数据为例(1为高电平,0为低电平):A.TX to B.RX.刚开始B.RX的端口保持1,当A.TX发来 个0作为起始位告诉乙我要发数据了!然后就开始发数据,发多少呢?通常一次是5位,6位,7位,8位,这个双方事先要用软件设置好.PC机一般会用串口助手设置,单片机会在UART的驱动中设置。一小帧数据发送完了以后,A.TX给个高电平告诉B.RX我发完了一帧。如果还有数据,就再给个0然后重复上一步。如果双方约定由校验位,还要在发停止位1之前发送个校验位,不过现在一般都不需要校验位了,因为出错的概率太小了,而且一般用于调试。

一般在串口助手上还有个RTS / CTS流控选项,也叫握手,我从来没用过搬一段我能理解的介绍:。RTS(请求发送),CTS(清除发送)如果要用这两个功能,那就至少要接5根线:RX + TX + GND + RTS + CTS当甲要发送数据时,置RTS有效(可能是置1),告诉乙我要发送数据了当乙准备。好接受数据后,置CTS有效,告诉一个你可以发了。然后他们就实现了两次握手!挺耽误时间是不是?这个RTS还可以当电源使用,如果你不用它的握手功能,且电源电流在50毫安以下时,就可以把它置为高电平可以当电源用喔〜!

 

SPI(Serial Peripheral Interface,同步外设接口)是由摩托罗拉公司开发的全双工同步串行总线,该总线大量用于与EEPROM,ADC,FRAM和显示驱动器之类的慢速外设器件通信。

SPI是一种串行同步通讯协议,由一个主设备和一个或多个从设备组成,主设备启动一个与从设备的同步通讯,从而完成数据的交换.SPI接口一般使用 4 条线通信:

MISO 主设备数据输入,从设备数据输出。
MOSI 主设备数据输出,从设备数据输入。
SCLK 时钟信号,由主设备产生。
CS 从设备片选信号,由主设备控制。

CS决定了唯一的与主设备通信的从设备,片选信号低电平有效。如没有CS信号,则只能存在一个从设备,主设备通过产生移位时钟来发起通讯。通讯时,数据由SDO输出,SDI输入,数据在时钟的上升或下降沿由SDO输出,在紧接着的下降或上升沿由SDI读入,这样经过8/16次时钟的改变,完成8/16位数据的传输。

SPI 主要特点有:可以同时发出和接收串行数据;可以当作主机或从机工作;提供频率可
编程时钟;发送结束中断标志;写冲突保护;总线竞争保护等。
 

IIC(Inter Integrated Circuit):两根线:一个时钟线SCL和一个数据线SDA。只有一根数据线,所以是半双工通信。接线不难,而且两根线上也可以挂很多设备( - 个设备的IIC地址不同),数据协议比较麻烦:
 

还是假设A给B发数据(这里A.SCL接B.SCL,A.SDA接B.SDA)。起初SDA和SCL上的电平都为高电平。然后A先把SDA拉低,等SDA变为低电平后再把SCL拉低(以上两个动作构成了IIC的起始位),此时SDA就可以发送数据了,与此同时,SCL发送一定周期的脉冲(周期和PCLK有关,一般会在IIC的控制寄存器中设置).SDA发送数据和SCL发送脉冲的要符合的关系是:SDA必须在SCL是高电平是保持有效,在SCL是低电平时发送下一位(SCL会在上升沿对SDA进行采样)。规定一次必须传8位数据,8位数据传输结束后甲释放SDA,SCL但再发一个脉冲(这是第九个脉冲),这会触发乙通过将SDA置为低电平表示确认(该低电平称为ACK)。最后SCL先变为高电平,SDA再变为高电平(以上两个动作称为结束标志)如果乙没有将SDA置为0 ,则甲停止发送下一帧数据.IIC总线(即SDA和SCL)上的每个设备都有唯一地址,数 包传输时先发送地址位,接着才是数据。一个地址字节由7个地址位(可以挂128个设备)和1个指示位组成(7位寻址模式)。指示位是0表示写, 1表示读。还有10位寻址模式,使用两个字节来保存地址,第一个字节的最低两位和第二个字节的8位合起来构成10位地址。

在I2C总线的应用中应注意的事项
总结为以下几点:  1)严格按照时序图的要求进行操作, 
2)若与口线上带内部上拉电阻的单片机接口连接,可以不外加上拉电阻。 
3)程序中为配合相应的传输速率,在对口线操作的指令后可用NOP指令加一定的延时。 
4)为了减少意外的干扰信号将EEPROM内的数据改写可用外部写保护引脚(如果有),或者在EEPROM内部没有用的空间写入标志字,每次上电时或复位时做一次检测,判断EEPROM是否被意外改写。

关于IIC总线的操作注意事项

1,对IIC总线的一次操作完之后,需要等待一段时间才能进行第二次操作。否则是启动不了总线的:)
2,在时钟线(SCL)为高电平的时候,一定不能动数据线(SDA)状态,除非是启动或者结束总线

2,UART,SPI,IIC的区别与联系:

第一个区别当然是名字:

UART(通用异步接收发送器:通用异步收发器)
SPI(Serial Peripheral Interface:串行外设接口);
I2C(INTER IC BUS)


第二,区别在电气信号线上:

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

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

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


第三,从第二点明显可以看出,SPI和UART可以实现全双工,但I2C不行;
I2C线更少,我觉得比UART,SPI更为强大,但是技术上也更加麻烦些,因为I2C需要有双向IO的支持,而且使用上拉电阻,我觉得抗干扰能力较弱,一般用于同一板卡上芯片之间的通信,较少用于远距离通信spi的实现要简单一些,UART需要固定的波特率,就是说两位数据的间隔要相等,而SPI则无所谓,因为它是有
时钟的协议。快速通讯:I2C的速度比SPI慢一点,协议比SPI复杂一点,但是连线也比标准的SPI要少.UART

一帧可以传5/6/7/8位,IIC必须是8位.IIC和SPI都从最高位开始传

.SPI用片选信号选择从机,IIC用地址选择从机。

你可能感兴趣的:(嵌入式开发,单片机,嵌入式硬件)