SPI、I2C、UART(即串口)三种串行总线详解

以下内容均来源于网络资源的学习与整理,如有侵权请告知删除。


参考博客

几个串口协议学习整理 UART IIC SPI_mainn的博客-CSDN博客

SPI、I2C、UART三种串行总线的原理、区别及应用_嵌入式Linux,的博客-CSDN博客

RS-232 和 UART 之间有什么区别? - 知乎

UART和RS232/RS485的关系是什么?

串口、COM口、UART口, TTL、RS-232、RS-485区别详解_flyingju的博客-CSDN博客_串口类型

详细剖析I2C和SPI通信协议的区别_隋边边的博客-CSDN博客_i2c和spi的区别


目录

一、名字解释

二、UART、SPI、I2C的对比

三、串行外设接口:SPI

1、速览点

2、数据传输

3、spi读写

四、IC之间总线:I2C

1、速览点

2、详细介绍

3、时序

4、代码

五、通用异步收发器:UART

1、速览点

2、通信协议

3、详细介绍

4、代码学习

六、心得体会

1、通信接口分为物理层和协议层

2、总线的选择

七、UART和RS232的联系和区别

1、RS232

2、UART

3、TTL和RS232

4、嵌入式常用串口实物图


一、名字解释

SPI(Serial Peripheral Interface:串行外设接口),是Motorola公司提出的一种同步串行数据传输标准。

I2C(INTER IC BUS:IC之间总线),是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备是微电子通信控制领域广泛采用的一种总线标准。

UART(Universal Asynchronous Receiver Transmitter:通用异步收发器),是电脑硬件的一部分,它把将要传输的资料在串行通信与并行通信之间加以转换,UART通常被集成于其他通讯接口的连接上。UART即我们通常说的“串口”。

二、UART、SPI、I2C的对比


三、串行外设接口:SPI

1、速览点

(1)四条信号线:串行时钟(SCLK)、串行数据输出(SDO)、串行数据输入(SDI)、片选线(SS)。(所谓的进出,是针对信号进出主机而言)

(2)SPI总线可以实现多SPI设备互相连接。提供时钟的SPI设备为主设备(Master),其他设备为从设备(Slave)。SCLK信号线只由主设备控制,从设备不能控制信号线。

(3)在SPI总线上,某一时刻可以出现多个从机,但只能存在一个主机。主机通过片选线来确定要通信的从机。这就要求从机的MISO口具有三态特性,使得该口线在器件未被选通时表现为高阻抗。

(4)主从设备间可以实现全双工通信,收发独立,操作简单,数据传输速率较高,但需要占用主机较多的口线(每个从机都需要一根片选线),而且只支持单个主机,没有指定的流控制,有应答机制确认是否接收到数据

(5)数据输出通过SDO线,数据在时钟上沿或下沿时改变(即发送),在紧接着的下沿或上沿被读取,从而完成一位数据传输。数据输入也使用同样原理。因此,8位数据的传输,至少需要8次时钟信号的改变(上沿和下沿为一次)。

(6)普通的串行通讯一次连续传送至少8位数据,而SPI允许数据一位一位的传送,甚至允许暂停,因为SCK时钟线由主控设备控制,当没有时钟跳变时,从设备不采集或传送数据。也就是说,主设备通过对SCK时钟线的控制可以完成对通讯的控制。

(7)SPI接口在CPU和外围低速器件之间进行同步串行数据传输,在主器件的移位脉冲下,数据按位传输,高位在前(先传?),低位在后,为全双工通信。

2、数据传输

(1)SPI在数据传输的时候,需要确定两件事情:

  • 其一,数据是在时钟的上升沿采集还是下降沿采集;
  • 其二,时钟的初始(空闲)状态是为高电平还是低电平。
  • 对比:I2C空闲状态时,时钟线(不是数据线?)为高电平,数据采集时,时钟线也为高电平,但SPI给出了更自由的方式。

(2)两个概念

  • CPOL:时钟极性,表示SPI在空闲时,时钟信号是高电平还是低电平。
  • CPHA:时钟相位,表示SPI设备是在在时钟的上升沿采集还是下降沿采集。
  • 则SPI数据传输就有四种可能。按照标准的说法,SPI数据传输就有四种模式

(3)四种模式

模式CPOLCPHA
000
101
210
311
  • 模式0(杠cs表示片选信号)

  • 模式1

  • 模式2

  • 模式3

3、spi读写

(1)SPI在硬件设计上采用的双数据线制,根据设计,在SPI通信过程中,主从设备之间会形成一个数据环形链路——即主设备向从设备写一次数据,从设备就会回一次数据(至于从设备回复的数据是否有效,则另当别论——如果有效,主设备就把它读入,否则丢弃)

(2)例子说明

假设上升沿发送、下降沿接收、高位先发送,假设主机8位寄存器装的是待发送的数据10101010,那么第一个上升沿时,数据将会是SDO=1,寄存器=0101010x。下降沿到来的时候,SDI上的电平将存到主机的寄存器中的最低位(最右边),SDO上的电平将存到从机的寄存器的最低位(最右边),则此时主机寄存器=0101010SDI(SDI表示1bit),从机寄存器=1010101SDO。这样在 8个时钟脉冲以后,两个寄存器的内容互相交换一次,这样就完成里一个spi时序。

假定主机和从机初始化就绪,并且主机的sbuff=0xaa=0b1010 1010,从机的sbuff=0x55=0b0101 0101 ,下面将分步对SPI的8个时钟周期的数据情况演示一遍。

  • 其中“上”表示上升沿、“下”表示下降沿,SDI、SDO相对于主机而言的。
  • ss引脚作为主机时,从机可以把它拉低,被动选为从机;作为从机时,可以作为片选脚用。
  • 一个完整的传送周期是16位。因为主机首先要发送命令过去,然后从机准备数据,主机在下一个8位时钟周期才把数据读回来。


四、IC之间总线:I2C

1、速览点

(1)由图可知

  • 由两条信号线组成:串行数据线(SDA)、串行时钟线(SCL)。
  • 由1,2箭头指示可知,I2C器件内部采用开漏的方法,总线被上拉。
  • 那么总线状态只能被下拉为0(当MOS管输入0的时候)。
  • 只要有一方下拉了总线,总线状态必定为0。

(2)任何一个设备都能像主控器一样工作,并控制总线,但同一时刻只能有一个主控设备。

(3)总线上的每一个设备都有一个独一无二的地址,根据设备的能力,作为发射器或接收器工作。

(4)在它的协议体系中,传输数据时都会带上目的设备的设备地址,因此可以实现设备组网。

(5)连接到相同总线的IC 数量只受到总线的最大电容限制。

(6)SDA传输数据是大端传输(高位先传,低位后传?),是以字节为单位的。

2、详细介绍

s5pv210——I2C基础详解、I2C时序详解_天糊土的博客-CSDN博客

3、时序

s5pv210——I2C基础详解、I2C时序详解_天糊土的博客-CSDN博客

嵌入式常用技术概览之IIC(I2C)_C_XianRen的博客-CSDN博客_嵌入式iic

4、代码

s5pv210——I2C的代码实践_天糊土的博客-CSDN博客


五、通用异步收发器:UART

1、速览点

(1)UART由波特率产生器、UART接收器、UART发送器组成。

(2)由三条信号线组成:RX、TX、GND

(3)UART包括RS232、RS499、RS423、RS422和RS485等接口标准规范和总线标准规范。它们的主要区别在于其各自的电平范围不相同。 嵌入式设备中常常使用到的是TTL、TTL转RS232的这种方式。

2、通信协议

(1)起始位:先发出一个逻辑”0”的信号,表示传输字符的开始。

(2)数据位:紧接着起始位之后。数据位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCII码。

(3)奇偶校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。

(4)停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。

(5)空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。

(6)波特率:数据传输的速率。有以下几个档位:300、600、1200、2400、4800、9600、19200、38400、43000、56000、57600、115200。在数据传输和接收双方,需要预先统一波特率,以便正确的传输数据。

3、详细介绍

s5pv210——串口(UART)通信接口详解_天糊土的博客-CSDN博客

s5pv210——串口通信的基础概念_天糊土的博客-CSDN博客

几个串口协议学习整理 UART IIC SPI_mainn的博客-CSDN博客

4、代码学习

s5pv210——串口(UART)通信实战_天糊土的博客-CSDN博客


六、心得体会

1、通信接口分为物理层和协议层

(1)物理层(硬件):如UART,PC和单片机通信,PC机的串口是232电平而单片机的串口是TTL电平,两个设备之间通信如果电平不一致就相当于语言不通,造成逻辑混乱。因此一般的单片机系统板上都会有一个串口模块电路(串口控制器)用来进行电平转换,将PC机的232电平转化成单片机能识别的232电平,常用芯片如PL2303、CH340。

(2)协议层:就相当于规定了一个标准或规则,比如SPI协议中,主机向从机发出一个数据,从机接收到后会发出应答信号,这就是协议规定的内容,不需要人为干预。当然有的单片机没有这些协议的控制器(硬件),如51单片机和24c02通信,需要模拟IIC协议,用软件来实现硬件的功能,这就增加了软件的复杂度。

2、总线的选择

(1)SPI总线有4根线,分别是SCK,SDO,SDI,SS,可以挂多个从设备,但是在挂多个从设备时,主设备端还需要做一个n选一的译码器,用于选择将要访问的从设备,因此,主设备上的管脚需求比较多。SPI总线在只有一个从设备时,只要用到SCK,SDO,SDI这三根线,此时选择SPI比I2C总线占优。

(2)I2C总线只有两根线,SCL,SDA.,也可以挂多个从设备,对从设备的选择直接依靠协议完成,无需增加物理连线。一般情况下,当一块电路板上有多个从设备时,往往选用I2C而非SPI,因为SPI增加了额外额硬件开销以及电路板走线。

(3)I2C和SPI总线一般是读取一些PROM等从设备用。 而串行通信接口SCI(UART?),主要应用在两个智能设备之间的互相通讯。有别于SPI和I2C总线的主从模式,SCI可以是主-主模式。

另一种说法

(1)总线拓扑结构/信号路由/硬件资源耗费

IIC 只需两根信号线,而标准SPI至少四根信号,如果有多个从设备,信号需要更多。一些SPI变种虽然只使用三根线——SCLK, SS和双向的MISO/MOSI,但SS线还是要和从设备一对一根。另外,如果SPI要实现多主设备结构,总线系统需额外的逻辑和线路。用IIC 构建系统总线唯一的问题是有限的7位地址空间,但这个问题新标准已经解决——使用10位地址。从第一点上看,IIC是明显的大赢家。

(2)数据吞吐/传输速度

如果应用中必须使用高速数据传输,那么SPI是必然的选择。因为SPI是全双工,IIC 的不是。SPI没有定义速度限制,一般的实现通常能达到甚至超过10 Mbps。IIC 最高的速度也就快速+模式(1 Mbps)和高速模式(3.4 Mbps),后面的模式还需要额外的I/O缓冲区,还并不是总是容易实现的。

(3)优雅性

IIC 常被称更优雅于SPI。公正的说,我们更倾向于认为两者同等优雅和健壮。IIC的优雅在于它的特色——用很轻盈的架构实现了多主设备仲裁和设备路由。但是对使用的工程师来讲,理解总线结构更费劲,而且总线的性能不高。SPI的优点在于它的结构相当的直观简单,容易实现,并且有很好扩展性。SPI的简单性不足称其优雅,因为要用SPI搭建一个有用的通信平台,还需要在SPI之上构建特定的通信协议软件。也就是说要想获得SPI特有而IIC没有的特性——高速性能,工程师们需要付出更多的劳动。另外,这种自定的工作是完全自由的,这也说明为什么SPI没有官方标准。IIC和SPI都对低速设备通信提供了很好的支持,不过,SPI适合数据流应用,而IIC更适合“字节设备”的多主设备应用。

(4)小结

在数字通信协议簇中,IIC和SPI常称为“小”协议,相对Ethernet, USB, SATA, PCI-Express等传输速度达数百上千兆字节每秒的总线。但是,我们不能忘记的是各种总线的用途是什么。“大”协议是用于系统外的整个系统之间通信的,“小”协议是用于系统内各芯片间的通信,没有迹象表明“大”协议有必要取代“小”协议。IIC和SPI的存在和流行体现了“够用就好”的哲学。


七、UART和RS232的联系和区别

1、RS232

RS232是早期的一种串行通信标准,它描述了使用RS-232标准进行通信时的电平要求(定义多少电平表示数据0和1)、接线要求、线材要求,其实更多的是电平标准。

2、UART

UART是通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),既然是“器”,显然,它就是个设备而已,完成一个特定功能的硬件。它最基本的功能是串并数据转换。

另外UART还要控制数据的格式(波特率、起始位、数据位、校验位、停止位等内容),这表示它也是异步串行通信的一种方式,它本身不是协议,但具有协议的特征,然而比RS232协议更具一般性。

因此可以说,UART同时具有硬件和协议的范畴。

3、TTL和RS232

在嵌入式MCU中的UART使用TTL电平,而在PC中的UART使用的则是RS232电平。所以UART并没有规范该使用什么电平,取决于你使用什么通信标准。即UART可以使用RS232规定的电平来通信,也可以用其他协议规定的电平来工作。

P.s:RS232与常见的TTL电平不同,RS232采用的是负逻辑,因此一般会使用MAX-232双向转化芯片。

TTL标准:低电平为0,高电平为1(+5V电平,3.3V以上即可)

RS-232标准:正电平为0,负电平为1(±15V电平)

------------------------------------------------------------------------

4、注意RS232不是接口标准,DB9、DB25才叫接口标准,现在RS232用的多的都是DB9

5、接设备的时候,一般只接GND RX TX。不会接Vcc或者+3.3v的电源线,避免与目标设备上的供电冲突。

6、PL2303、CP2102芯片是USB转TTL串口的芯片,用USB来扩展串口(TTL电平)。

------------------------------------------------------------------------

4、嵌入式常用串口实物图

(1)串口(嵌入式中指的是UART)与 COM口的区别

COM口有两种物理标准:D型9针插头和4针杜邦头。下面的左图是UART,中间是4针杜邦头COM口,右图是D型9针插头。由此可知,4针杜邦头和UART是一样的?另外D型9针插头我们一般只接GND、RXD、TXD,因此D型9针其实也和UART是一样的?这么说,COM口和串口其实是同概念的。

                     

(2)常见的串口实物图

a、下图是用PL2303芯片的USB转TTL串口

b、下图是用CP2102芯片的USB转TTL串口

c、下图是USB转RS-232串口

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461987.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET

从别人的博客中转载过来了这一篇文章,经过重新编辑排版之后展现于此,做一个知识点保存与学习。select函数用于在非阻塞中,当一个套接字或一组套接字有信号时通知你,系统提供select函数来实现多路复用输入/输出模型,原型…

网络4 交换机终端命令

1、switch> 是用户模式 en/enable switch# 是特权模式 conf t/ configure temral switch(config)#是全局模式 int f0/1 /interface f0/1 switch (config-if)# 是接口模式2、show version 显示系统ISO 名称ctrlE 把光标移动到命令行结尾处ctrlA 把光标移动…

解决Office系列安装不上的办法

安装Office时提示“扩展属性不一致”的解决办法:使用系统自带的输入法,Win空格键就搞定了。转载于:https://blog.51cto.com/dreamerhan/1313823

用数据辅助设计-搜索中的实践

设计时不能单凭经验和直觉,因为涉及到的目标人群、场景、操作习惯的不同。为了获取更准确、有效的信息去辅助、检测设计,设计师会选择定性(用户访谈、焦点小组)和定量(调研问卷、网站数据分析)的方式进行用…

在IBM服务器安装Windows server 2012的心得

一个简单的问题被我搞复杂了! 前些日子,由于连接服务器时卡顿、没有反应,我把服务器强制重启了,之后很不幸地,系统开机进入界面后,不断地转圈圈,一段时间后提示“你的电脑遇到问题,…

fd_set 详解

一、winsock中#include <winsock.h> 原型 int select( int nfds , fd_set* readfds , fd_set* writefds , fd_set* exceptfds , const struct timeval* timeout ); nfds&#xff1a;本参数忽略&#xff0c;仅起到兼容作用。 readfds&#xff1a;&#…

VisualVM远程连接Linux服务器通过jstatd方式监控JVM内存状态

2019独角兽企业重金招聘Python工程师标准>>> VisualVM远程连接Linux监控JVM的方式有两种,一种是jstatd,另外一种是JMX,这里描述jstatd的方式: 1.通过google/baidu出来的文章做法大致都雷同这里给出我开始参考的连接http://lixjluck.iteye.com/blog/516447 2. 但是…

STRUTS2 标签调用静态方法

struts2 ognl 调用静态方法 用ognl的静态调用<s:property value"%{java.lang.SystemcurrentTimeMillis()}"/>来显示,发现结果集为空.查了好多资料都发现这个是正确的引用,困惑......最后在查struts2.1.2的文档时发现struts2.1.2中加了很多配置元素,其中有一个名…

一些自己编写的字符串操作函数

1、编写strcat函数。&#xff08;在目的字符串结束处添加源字符串&#xff09; /*已知strcat函数的原型是char *strcat(char *strDest, const char *strSrc); 其中strDest 是目的字符串&#xff0c;strSrc 是源字符串。 不调用C / C 的字符串库函数&#xff0c;请编写函数 strc…

Android开发实践:常用NDK命令行参数

Android提供了NDK工具&#xff0c;用来编译native代码&#xff08;c/c&#xff09;&#xff0c;该工具配置好了相关的交叉编译环境和工具链&#xff0c;只需要你简单地编写几个.mk文件即可将你的c/c代码编译为Android的java工程/Android手机可以识别、加载和运行的库或者应用程…

QT问题记录之warning: ‘xxx’ will be initialized after [-Wreorder]

QT问题记录之warning: ‘xxx’ will be initialized after [-Wreorder] 在使用Qt进行Application开发的过程中&#xff0c;经常出现如下警告&#xff1a; warning: ‘xxx’ will be initialized after [-Wreorder] struct TreeNode {TreeNode *left;TreeNode *right;int val;//…

SD读写流程

一、1bit-4bit数据传输对比 CPU/EDMA与SD的数据传输可以设置为1bit或4bit模式&#xff0c;1bit模式仅使用DAT0数据线&#xff0c;4bit模式使用DAT3-DAT0四位数据线。例如&#xff0c;传输512字节的数据&#xff0c;传输的数据格式如下图所示&#xff1a; 二、读写命令 读写分为…

ubuntu14.04 64bit主机下面安装android的NDK开发环境

通过wget工具下载bin包&#xff1a; $ wget -c http://dl.google.com/android/ndk/android-ndk-r10e-linux-x86_64.bin1 2&#xff0c;因为下载下来的是bin包&#xff0c;所以可以直接移动到需要安装的目录下面。 将Android NDK bin包移动到你想要的目录下,如 /opt/NDK/1 $ …

二维数组数和指针操作的理解

#include<string.h> #include <stdio.h> int main(void) {int a[4][2] { { 2,4 },{ 6,8 },{ 1,3 },{ 5,7 } };char *p[5] { "acvsadf", "cwerqwenn", "tttttt" };//字符串指针数组int c[4] { 0,1,2,3 };int *ptr c;/*这个正确&…

最近重构公司消息服务的架构设计

目标 研发一套独立的消息系统&#xff0c;此系统进行集中配置管理供各业务系统使用&#xff0c;用于支撑站内信、短信通知、短信验证码、邮件、微信消息、APP消息、IM等消息形式。 架构 1&#xff09; 基于消息队列采用发布、订阅模式。消息的生产者为对外的消息接口&#xff0…

高性能的MySQL(6)查询慢与重构查询

只有好的库表结构、合理的索引还不够&#xff0c;我们还需要合理的设计查询&#xff0c;齐头并进&#xff0c;一个不少才能充分发挥MySQL的优势。一、查询为什么会慢&#xff1f;每一个查询由一系列的子任务组成&#xff0c;每个子任务都会消耗一定的时间。这个我们在之前的单个…

生成n个从1到M(n = M)之间的不重复的随机数问题(洗扑克牌算法)

结合了对数组的使用、随机数生成等算法的知识。 学习这种由特殊到一般性的学习方法。面对复杂问题时候的逻辑僵滞和停顿。要加快速度锻炼这种缺陷&#xff0c;使之得到弥补。 思维僵滞的时候可以把问题联想成具体的模型&#xff0c;做到在脑海中有个具体的形象。这总比茫然一片…

CFLAGS详解

CFLAGS 表示用于 C 编译器的选项&#xff0c; CXXFLAGS 表示用于 C 编译器的选项。 这两个变量实际上涵盖了编译和汇编两个步骤。 CFLAGS&#xff1a; 指定头文件&#xff08;.h文件&#xff09;的路径&#xff0c;如&#xff1a;CFLAGS-I/usr/include -I/path/include。同样地…

一道大小端题目

今天看到一道关于大小端的题目&#xff0c;觉得很有趣&#xff0c;理解一番后摘抄如下&#xff1a; 题目&#xff1a; 示意图&#xff1a; 结果说明&#xff1a; 小端模式 大端模式

算法复杂度速查表

图例 数据结构操作 数组排序算法 图操作 堆操作 大 O 复杂度图表 Big O 复杂度 推荐阅读 Cracking the Coding Interview: 150 Programming Questions and Solutions[33] Introduction to Algorithms, 3rd Edition[34] Data Structures and Algorithms in Java (2nd Edition)…