在嵌入式中,有以下5种常见接口协议: 

  • UART
  • RS232
  • RS485
  • IIC
  • SPI

其他的还有:

  • USB
  • 以太网(网络通信协议入TCP/IP、UDP等)
  • CAN(汽车领域常用接口)

本文重点讲述最常用的5种接口协议,其他的附带说明。

UART

51单片机内部外设:串口通信_路溪非溪的博客-CSDN博客


在实际产品中,很少使用串口,现在一般都只是用串口来做输出调试。

为什么串口很少用于实际产品开发呢?因为它存在很多问题:

使用的是TTL电平,抗干扰能力差;

通信距离短;

最重要的一点是电气接口不统一。UART只是对信号的时序进行了定义,而未定义接口的电气特性。UART通信时,一般直接使用处理器使用的电平,即TTL电平,但不同的处理器使用的电平存在差异,比如51是5V电压,32是3.3V电压,所以不同的处理器使用UART通信时一般不能直接相连。UART没有规定不同器件连接时连接器的标准,所以不同器件之间通过UART通信时连接很不方便。

工作中,遇到一个问题,那就是程序用STLINK下载后,再通过串口调试,可是串口工具上没有任何显示。将电源拔掉重新插上,就可以显示了。起初,我以为是串口的问题,难道是串口没有连接电源吗?但是,这个想法存在问题。

不管是串口还是其他的接口,在连接时,连接线是不需要连接电源和地的,只需要将对应的信号线连接起来即可,此时,连接线其实就只起到个连接导通的作用。至于连接的两端接口,自有其供电和接地的设计,但是,这个过程和连接介质是没有关系的。

串口之所以需要接地,是因为地线对于串口来说,是根参考的信号线,而不要当做一般的接地来看,看作是一根信号线即可。

还有个问题,看到一个电路图,没有设计CH340,只有TTL串口,于是我就想,这没有设计CH340芯片,咋用USB转串口调试?我之前一直使用的是普通的USB线,那是因为板上已经设计有CH340芯片了,如果板上没有CH340芯片,就需要使用USB转串口线,而不是普通的USB线了,USB转串口线里自带了CH340芯片,这样,照样可以实现调试功能。 

RS232

通常在电路板的两个芯片之间使用的串口是基于TTL电平标准的。电平电压范围小,适合距离近且干扰小的情况。为了进一步提升其抗干扰能力,又有另一种RS232标准。无论是TTL标准、RS232标准,还是接下来要讲的RS485标准来说,这都是属于电气层面的标准,都是为了串口服务的,只不过,各标准之上的串口的抗干扰能力不一样。

RS(recommended standard)代表推荐标准,232是标识号。


DB9接口介绍
DB9接口是串口通信早期比较常用的一种规范化接口。
串行通信在早期是计算机与外界通信的主要手段,那时候的计算机都有标准配置的串口以实现和外部通信。那时候就定义了一套标准的串口规约,DB9接口就是标准接口。
DB9接口中有9根通信线,其中3根很重要,为GND、Tx、Rx,必不可少;剩余6根都是和流控有关的,现代我们使用串口都是用来做调试一般都禁用流控,所以这6根没用。
现在一般使用串口时要记得把流控禁止掉,不然可能发生意想不到的问题。

串口及引脚定义:

android接口协议栈 常见接口协议_串口

以上,就是RS232协议的标准接口。

RS-232是串行数据接口标准,最初都是由电子工业协会(EIA)制订并发布的,RS-232在1962年发布,命名为EIA-232-E,作为工业标准,以保证不同厂家产品之间的兼容。

RS232电平规定:-5V~-15V为电平1,+5~+15位电平0。目的在于提高抗干扰能力,增大通信距离。一般可达15米传输。


如何在单片机中使用RS232?

虽然很多处理器中都会集成UART控制器,但处理产生的信号一般都是TTL信号并不是符合RS232标准的信号,所以一般我们还需要在处理器外部去添加电路对信号的电平进行转换。

android接口协议栈 常见接口协议_udp_02

android接口协议栈 常见接口协议_网络协议_03

注意,RS232只是电气层的协议,对于软件编程来说,只用针对串口即可,没有任何影响。


RS232的缺陷:

接口的信号电平电平值较高,易损坏接口电路的芯片,又因为与TTL电平不兼容,所以需要使用电平转换芯片才能与TTL电路连接;

通信速率较低;

易产生共模干扰,抗干扰抗噪声性弱;

使用的是电平信号,传输距离还是不够长。

RS485

RS485又名TIA-485-A, ANSI/TIA/EIA-485或TIA/EIA-485是由电信行业协会和电子工业联盟定义。使用该标准的数字通信网络能在远距离条件下以及电子噪声大的环境下有效传输信号。并且,该标准允许连接多个收发器,即具有多站能力,这样可以利用单一的RS485接口方便地建立起一个设备网络。RS485只是支持但并没有规定具体如何管理多个设备,我们可以通过编程实现,比如采取iic的管理逻辑,即确定主设备和从设备,然后寻址。

android接口协议栈 常见接口协议_android接口协议栈_04

RS485标准规定采用差分信号进行数据传输,当两线间电压差为+2V ~ +6V时为逻辑“1”,而电压差为-2V ~ -6V时为逻辑“0”;使用差分信号能有效减少噪声信号的干扰,延长传输距离,可达1500米。RS485电平信号比RS232降低了,所以不易损坏接口电路的芯片,且该电平与TTL电平兼容,可方便地与TTL电路连接。


为什么差分信号能够有效降低干扰呢?

首先了解下什么是共模干扰:“共模”干扰的定义是指电源线对大地,或中线对大地之间的电位差。对于三相电路来说,共模干扰存在于任何一相与大地之间。共模干扰有时也称为纵模干扰,不对称干扰或接地干扰,这是载流导体与大地之间的电位差。

差分信号能够降低共模干扰带来的误差,因为差分信号采用的是相对值,即电压差来表示电平,如果有干扰,那么两根线一起干扰了,电压差仍然是不变的。

更通俗点说,假如电平信号输出时是5V,但是因为电线也有一定的压降,可能等到接收时,就只有4V了,但是差分信号不同,5V的电压差,到了接收端仍然是5V。


RS485采用两线制,这种连接方式为总线式拓扑结构,在同一总线上可以同时存在多个节点。因为采用两线制,数据的发送和接收都要使用这对差分信号,发送和接收不能同时进行,所以是半双工的,编程时也要注意加以处理(发的时候不能收,收的时候不能发)


和RS232同理,我们需要和单片机的TTL电平之间接上转换芯片。

android接口协议栈 常见接口协议_串口_05

实际操作时,芯片的接收器输出端RO与单片机的Rxd相连,驱动器输入端DI则与单片机的Txd相连。

IIC

51单片机存储篇:EEPROM(I2C)_路溪非溪的博客-CSDN博客_51单片机 eeprom

SPI

51单片机内部外设:实时时钟(SPI)_路溪非溪的博客-CSDN博客_单片机实时时钟

USB

通用串行总线(英语:Universal Serial Bus,缩写:USB)是连接计算机系统与外部设备的一种串口总线标准,也是一种输入输出接口的技术规范。USB为解决即插即用需求而诞生,支持热插拔。USB协议版本有USB1.0、USB1.1、USB2.0、USB3.1等,USB2.0目前比较常用。由于USB是主从模式的结构,设备与设备之间、主机与主机之间不能互连,为解决这个问题,扩大USB的应用范围,出现了USB OTG,全拼 ON The Go。USB OTG同一个设备,在不同的场合下可自行在主机和从机之间切换。


先来看看日常使用中常见的USB接口

android接口协议栈 常见接口协议_网络协议_06

较早的设备通常使用的是Mini-B接口,后来慢慢的,Micro-B得到了普遍使用。现在最常见的就是Type-C和Lighting,一个用在安卓机,一个用在苹果机。

USB传输标准

自1996年USB-IF(USB Implementers Forum)组织发布USB 1.0标准以来,USB标准经历了USB 1.1、USB 2.0、USB 3.0、USB 3.1、USB 3.2多个版本的发展。2019年,USB-IF组织发布了最新的USB4标准(USB和4之间没有空格),为USB接口带来了全新的标准规范。

android接口协议栈 常见接口协议_网络协议_07

USB接口标准

USB接口分为标准USB接口Mini USB接口Micro USB接口和Type-C四种类型。


标准USB接口,又分为Type-A和Type-B两种,样貌如下:

android接口协议栈 常见接口协议_网络协议_08

其中Type-A和Type-B根据支持的USB标准不同,又可以分为USB 2.0和USB 3.0标准USB接口。根据接口的颜色,我们很容易区分该接口是支持USB 2.0还是支持USB 3.0的。Type-A型接口也是我们日常生活中最常见的USB接口,广泛应用于鼠标、键盘、U盘等设备上,Type-B型则常用于打印机、特殊显示器等设备上。


Mini USB接口,是一种小型的USB接口,其指标与标准USB相同,但是加入了ID针脚(用于区分设备是主机还是外设),以支持OTG(On The Go,该功能允许在没有主机的情况下,实现设备间的数据传送)功能。Mini USB接口主要分为Mini-A和Mini-B两种,样貌如下:

android接口协议栈 常见接口协议_android接口协议栈_09

Mini USB接口由于相对较小的体型,常见于一些小型设备上,比如MP3、MP4、收音机等,某些型号的手机也采用了该接口。


Micro USB接口,属于Mini USB的下一代规格接口,Micro USB接口的插头采用了不锈钢材料,插拔寿命提高为10000次,相比Mini USB接口,在宽度几乎不变的情况下,高度减半,更为小巧。Micro USB接口也可分为Micro-A和Micro-B两种,样貌如下:

android接口协议栈 常见接口协议_网络_10

Micro-B类型的USB接口,相信大家都认识,只是不知道它的专业名称,在智能手机发展的前期,绝大多数的智能手机(苹果手机除外)都采用了Micro-B型接口作为充电和数据接口。在USB 3.0标准发布后,Micro-B接口也有了新的造型,相信大家也不陌生,我们购买的支持USB 3.0的移动硬盘盒大部分就采用了该接口。


Type-C接口,是近几年出现的新型USB接口,该接口对于使用者来说,相信最大的好处就是可以正反插拔了吧。

据统计,平均每人每年在插USB上浪费的时间是30分钟!第一次插总是插不进去的,多次插拔到怀疑人生时,最后发现还是第一次的才是对的,后面的N次尝试不过是人生中的小小曲折,有了type-C接口后终于可以一次搞定了。Type-C接口的样貌如下:

android接口协议栈 常见接口协议_网络协议_11

最新的USB4标准目前仅支持Type-C接口,同时USB4采用了Thunderbolt协议(俗称雷电接口协议,是由Intel主导开发的接口协议,具有速度快,供电强,可同时兼容雷电、USB、Display Port、PCIe等多种接口/协议的特点),因此,支持USB4标准的Type-C接口也是可以兼容雷电接口的。如此看来,Type-C接口已是大势所趋了。

关于各类型USB接口的引脚定义,参考这篇文章:

常见几种USB接口引脚定义,Type A、Type B、Micro USB、Mini USB、Type C_【ql君】qlexcel的博客-CSDN博客_usb引脚

Type-C专题介绍:Type-C引脚、24Pin Type-C、16Pin Type-C、12Pin Type-C、6Pin Type-C_【ql君】qlexcel的博客-CSDN博客_typec6pin接口定义


补充关于Lighting接口

苹果高速多功能I/O接口是2012年9月12日,美国旧金山芳草地会议中心苹果发布了全新的Lightning Dock接口,中文可将其译为”闪电”接口。新接口标准的发布,同时也意味着苹果使用了长达9年的30针Dock接口将被正式取代。

参考:苹果iphone lightning引脚接口图,自己焊接图_hu5566798的博客-CSDN博客_苹果接口定义

USB接口结构

USB只有4根线,分别是+5V(电源)、DATA+(传输数据端+ DP)、DATA-(传输数据端- DM)、和GND(地线),故信号是串行传输的。usb接口也称为串行口。

android接口协议栈 常见接口协议_网络_12

DM,DP是用来传输数据的,VCC,GND充电。

USB是通过DM和DP两根线来实现差分信号传输数据的。

DM:data minus 负,DP:data plus 正。

工作原理

当一个USB设备插入PC机,PC机怎么知道有设备插入?        


如图1-1和图1-2所示,USB接口只有4条线: VCC(5V),GND,D-,D+。 PC机的USB插孔的D-和D+数据线均连接15K欧姆的下拉电阻。而USB设备端的D-或D+数据线连接1.5K欧姆的上拉电阻。当设备插入PC机的时候,会将PC机的D-或D+端的电压拉高,当PC机在D-或D+端检测到高电平时,就知道有设备插入了。如果是PC机D-端被拉高,接入的则是USB低速设备;如果是PC机D+端被拉高,接入的则是USB全速或高速设备,具体是全速设备还是高速设备,会由PC机和USB设备发包握手确定。

android接口协议栈 常见接口协议_网络_13


当USB设备插入后,PC机 会提醒我们“某某设备接入”,PC机怎么知道我们插入的设备的信息的呢?

如图2-1所示,当PC机检测到有USB设备插入后,会主动向设备发送命令包,要求设备告诉PC机,设备信息。这时设备必须向PC机回复自己的信息(以描述符形式)。

明确一点:USB设备不会主动给PC机发数据,只能被动的等待PC机来拿。

android接口协议栈 常见接口协议_udp_14

PC机上接有非常多的USB设备,怎么分辨它们?

每一个USB设备接入PC时,USB总线驱动程序都会给它分配一个编号,接在USB总线上的每一个USB设备都有自己的编号(地址)。PC机想访问某个USB设备时,发出的命令都含有对应的编号(地址)。


USB设备刚接入PC时,还没有编号;那么PC怎么把"分配的编号"告诉它?
新接入的USB设备的默认编号是0,在未分配新编号前,PC使用0编号和它通信。

USB传输协议

事务

在介绍USB传输类型之前,请允许我先简答介绍一下USB事务。

事务一般由令牌包、数据包(可选)、握手包组成。

  • 令牌包:用来启动一个事务,总是由主机发送。
  • 数据包:可以从主机到设备,也可以由设备到主机,方向由令牌包决定。
  • 握手包:通常情况,数据的接收者发送握手包(ACK或者NAK)。

USB协议规定了四种传输类型:控制传输、批量传输、同步传输、中断传输。下面简答介绍一下这四种传输类型及其注意事项。


具体参考:USB 四种传输方式详解_申小白的博客-CSDN博客_usb传输

USB包结构

可直接参考:

USB协议详解第19讲(USB包-包的组成及分类)_一个早起的程序员的博客-CSDN博客

以太网

网络通信是一个较大的板块,具体内容可详见《计算机网络》,主要使用的是TCP/IP协议。


网线采用的是差分信号。因为是四线制,所以是全双工的。

android接口协议栈 常见接口协议_网络_15


无线通信参考:

五种无线通信协议及其特点_要月亮的博客-CSDN博客_无线通信协议


电磁波传输原理参考:通俗讲解无线通信背后的物理原理_哔哩哔哩_bilibili


更多内容参考:无线通信原理


了解:手机里的wifi接收和热点用的是同一个部件吗?

iPhone是的,因为iPhone上的WiFi接收器和热点发射器用的是同一个零件,不能既接收又发射,所以iPhone是不能同时开启WiFi和热点;但是安卓手机是可以的,因为安卓手机的WiFi接收器和热点发射器是两个部件,而且互不影响,所以是可以同时开启WiFi和热点的,连WiFi的时候开热点是不会消耗数据流量的,连WiFi的时候开热点给别的设备用,WiFi信号从路由器到手机再到其他设备就是信号的远路传输,所以安卓手机WiFi和热点用的不是同一个部件。


关于信号塔(基站):信号塔_百度百科


了解:手机信号空中传输原理是什么?

手机信号以电磁波的形式在空气中进行传播。手机通信系统由三大部分组成,即手机(移动站)、基站(天线、无线电信号的接收、发射设备及基站控制器等),还有交换网络(移动交换机、跨地区的中继传送设备等)。
手机信号是一种高频的振荡波,它将声波加密后,加载在手机自身电路产生的高频电波上,在功放放大后,通过天线发送到最近的一个移动基站,基站通过有线连接到机房的交换机,交换机再通过线连接到另一部手机最近的基站,基站将信号发送出去,通过已知信道被另一部手机接收,另一站手机解调解密后变成声波。
当用手机拨打电话时,手机会把语音转化成信号,然后通过电磁波的形式,发送到距离最近的基站A,基站A接收到信号之后,再通过交换机转发到覆盖对方手机信号的基站B,基站B再把信号发送给对方手机,手机接收到信号之后再把信号转换成语音,从而实现双方通话。

CAN

可直接参考:CAN详解(小白教程)_瓶邪!·的博客-CSDN博客_邮箱种类


CAN 是控制器局域网络 (Controller Area Network) 的简称,它是由研发和生产汽车电子产品著称的德国 BOSCH 公司开发的,并最终成为国际标准(ISO11519以及ISO11898),是国际上应用最广泛的现场总线之一。


CAN 总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线,并且拥有以CAN 为底层协议专为大型货车和重工机械车辆设计的 J1939 协议。近年来,它具有的高可靠性和良好的错误检测能力受到重视,被广泛应用于汽车计算机控制系统和环境温度恶劣、电磁辐射强及振动大的工业环境。
 

贴图一个车载网络构想图:

android接口协议栈 常见接口协议_网络协议_16

CAN 物理层

与 I2C、SPI 等具有时钟信号的同步通讯方式不同,CAN 通讯并不是以时钟信号来进行同步的,它是一种异步通讯,只具有 CAN_High 和 CAN_Low 两条信号线,共同构成一组差分信号线,以差分信号的形式进行通讯(USB 协议、485 协议、以太网协议及 CAN 协议的物理层中,都使用了差分信号传输。)。我们来看一个示意图:

android接口协议栈 常见接口协议_网络协议_17


闭环总线网络

CAN 物理层的形式主要有两种,下图中的 CAN 通讯网络是一种遵循 ISO11898 标准的高速、短距离“闭环网络”,它的总线最大长度为 40m,通信速度最高为 1Mbps,总线的两端各要求有一个“120 欧”的电阻。

android接口协议栈 常见接口协议_网络协议_18


开环总线网络

下图中的是遵循 ISO11519-2 标准的低速、远距离“开环网络”,它的最大传输距离为 1km,最高通讯速率为 125kbps,两根总线是独立的、不形成闭环,要求每根总线上各串联有一个“2.2千欧”的电阻。

android接口协议栈 常见接口协议_udp_19


通讯节点

从 CAN 通讯网络图可了解到,CAN 总线上可以挂载多个通讯节点,节点之间的信号经过总线传输,实现节点间通讯。由于 CAN 通讯协议不对节点进行地址编码,而是对数据内容进行编码的,所以网络中的节点个数理论上不受限制,只要总线的负载足够即可,可以通过中继器增强负载。

CAN 通讯节点由一个 CAN 控制器及 CAN 收发器组成,控制器与收发器之间通过 CAN_Tx 及CAN_Rx 信号线相连,收发器与 CAN 总线之间使用 CAN_High 及 CAN_Low 信号线相连。其中CAN_Tx 及 CAN_Rx 使用普通的类似 TTL 逻辑信号,而 CAN_High 及 CAN_Low 是一对差分信号线,使用比较特别的差分信号,下一小节再详细说明。

当 CAN 节点需要发送数据时,控制器把要发送的二进制编码通过 CAN_Tx 线发送到收发器,然后由收发器把这个普通的逻辑电平信号转化成差分信号,通过差分线 CAN_High 和 CAN_Low 线输出到 CAN 总线网络。而通过收发器接收总线上的数据到控制器时,则是相反的过程,收发器把总线上收到的 CAN_High 及 CAN_Low 信号转化成普通的逻辑电平信号,通过 CAN_Rx 输出到控制器中。

例如,STM32 的 CAN 片上外设就是通讯节点中的控制器,为了构成完整的节点,还要给它外接一个收发器,在我们实验板中使用型号为 TJA1050 的芯片作为 CAN 收发器。 CAN 控制器与 CAN收发器的关系如同 TTL 串口与 MAX3232 电平转换芯片的关系, MAX3232 芯片把 TTL 电平的串口信号转换成 RS-232 电平的串口信号,CAN 收发器的作用则是把 CAN 控制器的 TTL 电平信号转换成差分信号 (或者相反) 。

目前有以下CAN电平转换芯片(不全)

android接口协议栈 常见接口协议_udp_20

我们来用TJA1050来看下原理图:

android接口协议栈 常见接口协议_android接口协议栈_21


CAN 协议中的差分信号
CAN 协议中对它使用的 CAN_High 及 CAN_Low 表示的差分信号做了规定,见表及图。以高速 CAN 协议为例,当表示逻辑 1 时 (隐性电平) ,CAN_High 和 CAN_Low 线上的电压均为 2.5v,即它们的电压差 VH-V:sub:L=0V;而表示逻辑 0 时 (显性电平) ,CAN_High 的电平为 3.5V,CAN_Low 线的电平为 1.5V,即它们的电压差为 VH-V:sub:L=2V。例如,当 CAN收发器从 CAN_Tx 线接收到来自 CAN 控制器的低电平信号时 (逻辑 0),它会使 CAN_High 输出3.5V,同时 CAN_Low 输出 1.5V,从而输出显性电平表示逻辑 0 。

android接口协议栈 常见接口协议_串口_22

由于 CAN 总线协议的物理层只有 1 对差分线,在一个时刻只能表示一个信号,所以对通讯节点来说,CAN 通讯是半双工的,收发数据需要分时进行。在 CAN 的通讯网络中,因为共用总线,在整个网络中同一时刻只能有一个通讯节点发送信号,其余的节点在该时刻都只能接收。

CAN 协议层

进一步内容参考:秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4 CAN!_Wireless_Link的博客-CSDN博客_can控制器与can收发器

常见协议速率对比

IIC总线的工作速度分为3种版本:

S(标准模式):100Kbps,即 100/8 = 12.5KB/s

F(快速模式):400Kbps,即400/8 = 50KB/s

HS(高速模式):3.4Mbps,即3.4M/8 = 435KB/s

超高速模式:5Mbit/s,即5M/8 = 525KB/s

最高才525KB/s

算一下,如果你要下载一张10M的图片,要花多久?

10*1024/525,大约需要20秒。

看起来好像也还可以。


看看SPI

SPI:

全双工同步传输,速度约有50Mbps,即约5.9MB/s

传输一张10M的图片需要多久?

10/5.9,1.7秒左右,理论上,只需要嗖两下,就传完了。这么一看,20秒还是挺长的。

在IIC以最高速率运行时,SPI的速率约为IIC的10倍。

当IIC以标准模式运行时,SPI的速率约为IIC的500倍。


UART:

理论上无限制,速度取决于波特率,常用9600bps(1.2KB/s)和115200bps(14KB/s)

115200波特率的情况下和IIC的标准速率差不多。


RS232:

RS232传输距离有限,最大传输距离标准值为15米,且只能点对点通讯,最大传输速率最大为20KB/s。


RS485:

RS485最大无线传输距离为1200米。

最大传输速率为10Mbps(1.2MB/s),在100Kb/S(12.5KB/s)的传输速率下,才可以达到最大的通信距离。


CAN:

距离小于40米:速度有1Mbps,即约128KB/s

距离大于40米小于10千米,速度低于5Kbps


SDIO:

SD内存卡接口基础上的接口

10Mbps以上


USB

android接口协议栈 常见接口协议_udp_23

以USB4为例,传输一张10M图片需要多久?

10/(40/8*1024),约2毫秒,传输500张这样的图片仅需1秒。

速度很夸张。


至于网络传输,就是我们平时入网时的速率。

以前10Mbps/50Mbps的比较常见。

现在基本都是100Mbps起步了,即12.5MB/S。

还有200Mbps/300Mbps/500Mbps/1000Mbps等。

我家开的是200M的网,理想情况下,每秒传输字节数为25M。

如果我想要下载一部6G的电影,需要多久?

理想情况下,6*1024/25,约246秒,即4分钟左右。

注意:

有时候,有些地方会用Hz来作为速率的单位。

比如STM32中讲IIC的速率的时候。

android接口协议栈 常见接口协议_网络协议_24

频率本来就是表示单位时间内的次数(每秒)

如果传输协议是一个时钟周期传输一位数据,那么此时100kHz就相当于100kbps。