IIC,SPI,UART,单总线


因为面试时被问到IIC和SPI通信,所以又重新学习了一下。

IIC

IIC顾名思义就是两根线,一根SCL(时钟线),一根SDA(数据线)。时钟线用来通过电平变化来标志数据传输过程,SDA线传输数据。
通信过程

  • 首先,SCL处于高电平,SDA从高电平变化为低电平表示START信号,此时将SCL线拉低便可通过SDA线读写数据(SCL线高电平时无法读写)。
  • 然后,由于IIC通信分为主设备(比如单片机),从设备可能会有多个,这时候我们在读写数据之前要先确定从设备,每个从设备会对应一个特定的地址,所以主设备需要传输一个七位地址(好像现在有10位的地址)和一位R/W读写位,每个从设备接受到地址会和自己的地址进行对比,相同就会传输一个应答信号给主机。
  • 主机收到应答信号确认从设备后可以进行数据传输。数据传输一般一帧数据为为8位,尾随一位应答位。从设备收到应答位,做出应答或非应答信号表示数据的接收成功与否(读操作主从应答相反)。
  • 主机接收到应答,选择STOP信号输出便可以结束一帧的传输。
    在这里插入图片描述

SPI通信

与IIC不同的是SPI通信有四根线,MOSI(master input slave output,主发从收),MISO(主收从发),SCLK(时钟线)和SS(serial select)(片选信号,每个从机都需要单独的一条SS线与主机相连,而不是所有从机共用一条)。
在这里插入图片描述
通信过程

  • 首先,主机拉低SS线选择要通信的从机。
  • 开始发送数据,时钟线不断输出脉冲,MOSI和MISO可以在相应时钟沿同时进行数据(1bit)的传输,所以SPI是全双工通信。
  • SS线被拉高,结束传输。

SPI_MOD
此外在数据传输时钟沿选择上有四种方式

CKP(时钟极性)//0–>ss休闲状态为低电平,1–>ss休闲状态为高电平
CKE(时钟相位) //0–>第一个时钟沿采集信号,1–>第二个时钟沿采集信号

在这里插入图片描述

理论上,SPI通信的速率取决于时钟频率,所以就这一点来说会比IIC的传输速率要快得多,硬件设备的最大时钟频率的大小可以影响SPI通信。

IIC与SPI的比较

对于SPI我觉得优点可以有以下几点

  1. 高速率,传输bit频率最大与系统的时钟频率相当
  2. 传输bit无限制,对于IIC每次传输8位一个字节,而SPI是一位一位的传输,所以避免了某些无意义位的传输
  3. 硬件软件的配置比较轻便简单,硬件方面,没有IIC从机对应的逻辑地址,一根SS线连接一个从机;软件方面也没有过多复杂的时序,IIC中的起始应答停止的信号反复转换显得有点复杂。

缺点我觉得就是SPI通信没有应答,可能导致数据传输无效,或者在从机出现故障时主机依旧发送数据,就显得有点盲目。还有主机设备需要更多的引脚接口才能容纳更多的从设备。而且主设备只能有一个。

UART

通用异步收发器,三根线RX(接收数据端),TX(发送数据端),GND。

在这里插入图片描述
通信过程

  • 数据线上休闲时为高电平,将其拉低表示起始信号,从而可以开始通信。

单总线

1-wire通信,如DS18B20(温度传感器),DHT11(温湿度传感器)

这是DS18B20的单总线电路图,由图中可以看到单总线是收发双向的,但是也不能同时进行收发,所以是半双工。

在这里插入图片描述
以上传输过程

  • 初始化,主机发送复位脉冲(拉低总线一段时间),从机产生应答脉冲(拉低总线一段时间)。
  • 写bit,低电平时为写0,高电平时为写1

单总线的数据传输速率一般为16.3Kbit/s,最大可达142 Kbit/s,通常情况下采用100Kbit/s以下的速率传输数据。相比于IIC和SPI传输速率比较慢,但是硬件结构比较简单。

第一个区别当然是名字: 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总线,则需一个输入口,一个输出口。 第三,从第二点明显可以看出,SPIUART可以实现全双工,但I2C不行; 第四,看看牛人们的意见吧! wudanyu:I2C线更少,我觉得比UARTSPI更为强大,但是技术上也更加麻烦些,因为I2C需要有双向IO的支持,而且使用上拉电阻,我觉得抗干扰能力较弱,一般用于同一板卡上芯片之间的通信,较少用于远距离通信。SPI实现要简单一些,UART需要固定的波特率,就是说两位数据的间隔要相等,而SPI则无所谓,因为它是有时钟的协议。 quickmouse:I2C的速度比SPI慢一点,协议比SPI复杂一点,但是连线也比标准的SPI要少。 1、UART和USART两个别区说不出来,USART是新出的,不过区别在什么地方我也搞不清楚。UART就是两线,一根发送一根接收,可以全双工通信,线数也比较少。数据是异步传输的,对双方的时序要求比较严格,通信速度也不是很快。在多机通信上面用的最多。 2、SPI接口和上面UART相比,多了一条同步时钟线,上面UART的缺点也就是它的优点了,对通信双方的时序要求不严格不同设备之间可以很容易结合,而且通信速度非常快。一般用在产品内部元件之间的高速数据通信上面,如大容量存储器等。 3、I2C接口也是两线接口,它是两根线之间通过复杂的逻辑关系传输数据的,通信速度不高,程序写起来也比较复杂。一般单片机系统里主要用来和24C02等小容易存储器连接。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值