一、uart

通用异步收发器,就是常说的串口通信,常常用在异步通信并且是一种全双工的通信方式,不需要严格的时间限制,两个设备之间连线简单,往往只需要将RX,TX端交叉相连即可。现实中利用面很广,多用于调试,在以后学习Linux驱动开发时是非常重要的。uart的连接过程如下图,很简洁明了。

由图可见,数据在总线和uart之间还是并行传输的,但是两个设备之间的uart之间就采取了单线的传输,在传输的前,还会自动的添加起始位、奇偶校验位、停止位。具体的传输过程如下图:

这样对uart整个的工作流程就全部解刨开了,学习难度降了好多。在以前的文章里有手撕uart代码的文章,有兴趣的可以去看看。

二、spi-串行外设接口

这是一种同步全双工的传输方式,他的连线是这三种通信方式里面最多的,有一个clk串行时钟、MOSI主设备输出、MISO主设备输入、cs从设备片选。他的缺点就是每个从设备都需要有一个cs口用来对其在传输时进行选择。在数据传输时还需要考虑传输时是低电平有效还是高电平有效、第一个下降沿有效还是第二个下降沿有效,相当于有四种传输方式。内部spi通信相当于一个环路,输出数据后又读入数据:

具体读和取数据的过程如下(网上找到很好地一张工作流程图),需要16个脉冲才可以完成一个完整的读取周期。

三、iic

iic实现连线简单,只需要一个clk时钟线和sda数据线即可,但是iic的协议相对复杂。如图iic可以挂载多个设备,但是传输时只能有一个设备工作,iic是利用地址来选择从机的,这点和spi不同,两条线都有上拉电阻且都设为开漏输出,目的是为了数据传输时的稳定,也是一种规范,iic在高电平时是空闲状态。在数据传输时,clk在高电平的时候,SDA绝对不能发生改变,否则会发生错误。

在iic中想利用其收发数据必须会起始与终止信号:在SCL为高期间  SDA : 由高到低,起始信号、 SDA:由低到高,终止信号。

IIC一次最多可以挂载多少个设备呢?由iic地址决定,8位地址,减去1位广播地址,是7位地址,2^7=128,但是地址0x00不用,那就是127个地址, 所以理论上可以挂127个从器件。但是IIC协议没有规定总线上device最大数目,但是规定了总线电容不能超过400pF。管脚都是有输入电容的,PCB上也会有寄生电容,所以会有一个限制。实际设计中经验值大概是不超过8个器件。过多设备会导致信号传输速度变慢,这牵扯到模电方面的内容,不过多解释。

        主设备对从设备可以进行读写,主设备首先会发送7bit位的slave device地址,和1bit位的read或者write命令。

时序图如下write:

read:

语言描述就是:

(1)write命令

如果为write命令,则主设备释放总线(If the I2C-bus is free, both SDA and SCL lines should be both at High level),即SDA为高位;然后从设备拉低SDA,表示ACK主设备;然后主设备再发送8bit数据,从设备再ACK(A),通信结束(P)。

写寄存器的标准流程:

1.    Master发起START

2.    Master发送I2C addr(7bit)和w操作0(1bit),等待ACK

3.    Slave发送ACK

4.    Master发送reg addr(8bit),等待ACK

5.    Slave发送ACK

6.   Master发送data(8bit),即要写入寄存器中的数据,等待ACK

7.    Slave发送ACK

8.    第6步和第7步可以重复多次,即顺序写多个寄存器

9.    Master发起STOP

(2)read命令

如果为read命令,则从设备先拉低SDA表示ACK主设备,然后再发送8bit数据。主设备拉低SDA表示ACK从设备(我已经读取8bit的数据了),之后结束。

读寄存器的标准流程

1、Master发送I2Caddr(7bit)和 W操作1(1bit),等待ACK

2.    Slave发送ACK

3.    Master发送reg addr(8bit),等待ACK

4.    Slave发送ACK

5.   Master发起START

6.    Master发送I2C addr(7bit)和 R操作1(1bit),等待ACK

7.    Slave发送ACK

8.   Slave发送data(8bit),即寄存器里的值

9.   Master发送ACK

10.    第8步和第9步可以重复多次,即顺序读多个寄存器

以上文字来源于以下链接:原文链接:https://blog.csdn.net/oqqHuTu12345678/article/details/72356722

四、三种通信方式对比图

对比项          UART                      SPI             I2C
信号线数目 3根,RX、TX、GND 4根,SDO、SDI、SCLK、SS 2根,SDA、SCLK
设备从属关系            —— 存在主从设备。SPI用片选信号选择从机  存在主从设备。IIC用地址选择从机。
通信方式 全双工通信 全双工通信 半双工通信
通信速率 速度慢 比I2C总线要快,速度可达到几Mbps I2C的速度比SPI慢
应用领域

1、UART常用于控制计算机与串行设备的芯片

2、就是我们经常所说的串口,基本都用于调试。

主要应用在EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间 I2C一般是用在同一个板子上的2个IC之间的通信 ,它可以替代标准的并行总线,连接各种集成电路和功能模块。
传输距离 I2C需要有双向IO的支持,而且使用上拉电阻,抗干扰能力较弱,一般用于同一板卡上芯片之间的通信,较少用于远距离通信
通信特征 异步,一帧可以传5/6/7/8位 同步,SPI允许数据一位一位的传送,甚至允许暂停。从最高位开始传。 同步,电平信号,一次连续8bit。从最高位开始传
协议复杂度 结构比较复杂 SPI实现要比UART简单,UART需要固定的波特率,就是说两位数据的间隔要相等,而SPI则无所谓,因为它是有时钟的协议。 协议比SPI复杂,但是连线比标准的SPI要少
对比 只能与一个设备相连

在点对点的通信中,SPI接口不需要进行寻址操作,且为全双工通信,显得简单高效。

在多个从器件的系统中,每个从器件需要独立的使能信号,硬件上比I2C系统要稍微复杂一些。

单片机通信——spi、iic、uart相关推荐

  1. 金誉半导体笔记:什么是MCU单片机的SPI、UART、I2C通讯接口

    正如我们之前所了解的 ,MCU单片机是一个集成芯片 ,但这个集成芯片有一些特殊的功能 ,可以控制外部设备 ,处理外部设备收到的数据,就像人脑一样 ,可以控制手脚的运动 ,可以处理感官收到的信息,这就是 ...

  2. 单片机-硬件接口(UART/IIC/SPI/RS232/USB/CAN)异同

    1.中文名  USART:通用同步异步收发器   UART(Universal Asynchronous Receiver Transmitter:通用异步收发器)  I2C(INTER IC BUS ...

  3. 常用通信时序之UART、IIC、SPI(基于STM32)

    常用通信时序(UART.IIC.SPI,RS232.RS485)及协议(Modbus) 通讯时序 1. UART 2. IIC 3. SPI 4. RS323 5. RS485 通信协议 1. Mod ...

  4. UART, SPI, IIC的详解及三者的区别和联系

    1.UART, SPI, IIC的详解 UART.SPI.IIC是经常用到的几个数据传输标准,下面分别总结一下: UART(Universal Asynchronous Receive Transmi ...

  5. IIC、SPI和UART区别

    第一个区别当然是名字:      SPI(Serial Peripheral Interface:串行外设接口);      I2C(INTER IC BUS)      UART(Universal ...

  6. 串口通信,IIC通信,SPI通信的简单区别

    一.串口通信 串口通信就是RS-232通信,只有两根线txd和rxd,通信双方必须设定相同的波特率,传输距离比较近. 二.IIC通信 IIC通信是最简单的串行通信协议,只需要一根数据线和一根时钟线,就 ...

  7. XR20M1170实现FPGA 的SPI/IIC转UART

    最近基于FPGA实现UART通讯,因为项目中UART的各项参数需要可配置,使用verilog直接实现一个UART会麻烦一些,稳定性也会降低,因此使用了更为方便的方案,FPGA加上一块SPI/IIC转U ...

  8. GPIO,I2C,SPI,UART,USART,USB的区别

    1.简单区别: 1) GPIO(General Purpose Input Output )为通用输入/输出,通用端口,总线扩展器, 利用工业标准I2C.SMBus™或SPI™接口简化了I/O口的扩展 ...

  9. 串行通信协议(I2C、SPI、UART、SCCB、CAN)

    推荐一部书,在这本书里面介绍了I2C.SPI.UART和CAN等通信协议,写的蛮不错的. 串行通信:设备与设备之间,传输数据按顺序依次1bit位接1bit位进行传输. 并行通信:设备与设备之间,通过多 ...

最新文章

  1. 【组合数学】组合数学简介 ( 组合数学脉络 | 组合数学技巧 | 组合思想 1 : 一一对应 )
  2. linux中三个time:atime、mtime、ctime
  3. 小米手机系统服务组件是干什么的_怎么查看小米手机MIUI系统的基本功能-小米手机MIUI系统基础功能查询方法讲解...
  4. IDEA:vue中缺少vue-quill-editor富文本插件
  5. 【原创】全面剖析飞凌2440,6410开发板选型指南
  6. 松下NPM服务器怎么备份系统,松下NPM基本操作手册与教程
  7. [Java] 蓝桥杯BASIC-22 基础练习 FJ的字符串
  8. 罚函数(penalty function)的设计
  9. Java多线程(六)线程池
  10. python解释器错误
  11. 基于微信小程序的点餐系统设计
  12. 用vue将数字转为中文大写金额
  13. delphi盒子希腊打开潘多拉魔盒?债务重组或是唯一出
  14. JAVA通过COM接口操作PPT
  15. KETTLE 列转行
  16. excel任意单元格中自动插入页码和总页数
  17. kafka-13-windows中安装kafka
  18. ubuntu top命令详解
  19. 计算机主机之,计算机主机包括什么
  20. intra-mart产品开发相关介绍资料

热门文章

  1. android使用ContentProvider初始化sdk,初始化时机
  2. Python学习笔记---merge和concat数据合并(1)
  3. 说不清心里对于这个孩子是什么样的感情
  4. 杨辉三角c语言程序for循环,如何用C语言循环输出杨辉三角?
  5. 工信部发证 中国广电成第四大基础电信运营商
  6. 物联网设备网关系统架构设计
  7. 百度地图经纬度计算距离(Java)
  8. Echarts x轴字体倾斜
  9. 解决java编译错误( 程序包javax.servlet不存在javax.servlet.*)
  10. SpringBoot接入支付宝