UART(RS232、RS485)、IIC、SPI、USB、CAN、DMA、Modbus通讯协议

1、STM32中的通信协议_走出地球的博客-CSDN博客_stm32通信协议

 UART(RS232、RS485)、IIC、SPI、USB、CAN、DMA是最常用的几种种通信总线协议,广泛应用于项目开发之中。

UART(RS232、RS485)、IIC、SPI、USB、CAN、DMA、Modbus通讯协议_第1张图片
  并行总线:各个传输线之间相互干扰

UART(RS232、RS485)、IIC、SPI、USB、CAN、DMA、Modbus通讯协议_第2张图片

   串行总线:更加常用

UART(RS232、RS485)、IIC、SPI、USB、CAN、DMA、Modbus通讯协议_第3张图片
单工:单向传输
双工:通讯为双向,分为半双工和全双工。
         半双工:通道仅允许单项接受或者发射。
         全双工:双向两条通讯互不影响。


一、串口协议
      串行接口是一种可以将接收来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接收的串行数据流转换为并行的数据字符供给CPU的器件。
      串口通信是指外设和计算机间,通过数据信号线 、地线、控制线等,按位进行传输数据的一种通讯方式。

 UART(RS232、RS485)、IIC、SPI、USB、CAN、DMA、Modbus通讯协议_第4张图片

    串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。
波特率:衡量符号传输速率的参数,每秒钟传送二进制bit的数量。
数据位:衡量通信中实际数据位的参数
停止位:表示单个包的最后一位
奇偶校验位:四种检错方式偶、奇、高和低
     UART作为异步串口通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输。

UART(RS232、RS485)、IIC、SPI、USB、CAN、DMA、Modbus通讯协议_第5张图片
 

————————————————
版权声明:本文为CSDN博主「潇萧客」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_15211883/article/details/115449707

 二、USB协议

待补充

1、简单说说USB协议(一)_五月525的博客-CSDN博客_usb协议

2、USB协议简介_songze_lee-CSDN博客_usb传输协议

3、USB协议基础篇_kevin的博客-CSDN博客_usb接口协议

4、USB协议详解_leho666的博客-CSDN博客_usb协议详解

5、通俗易懂的USB协议详解(转载)_Branchesss_新浪博客

6、USB协议入门_whitefish520的博客-CSDN博客

UART(RS232、RS485)、IIC、SPI、USB、CAN、DMA、Modbus通讯协议_第6张图片

单片机常用的几种通信协议

一、UART和USART

  分别名为通用异步收发器和通用同步异步收发器,速率不快,可全双工,结构上一般由波特率产生器、UART/USART发送器、UART/USART接收器组成,硬件上两线,一收一发。

Universal Asynchronous Receiver/Transmitter,通用异步接收/发送装置

它包括了RS232、RS499、RS423、RS422和RS485等接口标准规范和总线标准规范,即UART是异步串行通信口的总称。

  • 在要求通信距 离为几十米到上千米时,广泛采用 RS-485 串行总线标准。 RS-485采用平衡发送和差分接收,因此具有抑制共模干扰的能力。
  • RS232 串口可以与 485 之间互转, 在单片机上使用 485 总线与使用 RS232 串口一样, 需要使用芯片转换电平即可!

  二、I2C(IIC)

  双向、两线、串行、多主控接口标准。速率不快,半双工,同步接口,具有总线仲裁机制,非常适合器件间近距离经常性数据通信,可实现设备组网。

  总线仲裁:线与,谁发0就仲裁成功。

  三、SPI

  高速同步串行口,高速,可全双工,收发独立,同步接口,可实现多个SPI设备互联,硬件3~4线;也是所有基于SPI的设备公共有的,他们是SDI(数据输入),SDO(数据输出),SCK(时钟),CS(片选)。

  • 通常 SPI 通信要求 4 根线,分别是 MOSI(mast output salve input), MISO, CLK, CS。
  • 当发送和接受数据的工作都准备好了,只要有时钟 CLK,就发送数据,没有时钟就不发送,而且一个时钟周期发送一位(bit)数据,所以发送数据的快慢由时钟频率来控制。
  • 至于时钟和数据的相位没有特别严格的要求(而 IIC 中,数据的变化只能在 SCL 是低电平的时候发生), SPI数据的变化是一个时钟周期一次,这样的方法来传输数据就简单多了。我们可以根据需求对时钟的极性和相位做调整,看看是在时钟上升沿还是下降沿来发送数据,还有停止发送时时钟的极性,是保持高电平还是低电平。
  • 另外在多机通信时, SPI 只是简单的通过一个片选信号来选择哪个设备占用总线,但是 IIC 是通过发送从设备地址来自动选择的。

  四、USB

  高速同步串行口,高速,可全双工,由主机、hub、设备组成。设备可以与下级的hub相连构成星型结构。一条USB的传输线分别由地线、电源线、D+、D-四条线构成,D+、D-是差分输入线,它使用的是3.3V的电压。数据在USB线里传送是由低位到高位发送的。

  五、CAN

  采用双线传输,两根导线分别作为CAN_H、CAN_L,并在终端配备有120Ω的电阻。收到总线信号时,CAN收发器将信号电平转化为逻辑状态,即CAN_H与CAN_L电平相减后,得到一个插值电平。各种干扰在两根导线上的作用相同,相减后的插值电平可以滤过这些干扰。

  六、DMA

  DMA是指外部设备不通过CPU而直接与系统内存交换数据的接口技术。这样数据的传送速度就取决于存储器和外设工作速度。

  通常系统总线是由CPU管理的,在DMA方式时,就希望CPU把这些总线让出来,即CPU连到这些总线上的线处于第三态(高阻状态),而由DMA控制器接管,控制传送的字节数,判断DMA是否结束,以及发出DMA结束信号。

     七、 Modbus 通讯协议

  • Modbus 协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。它已经成为一种通用工业标准。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。它描述了一个控制器请求访问其它设备的过程,如何回应来自其它设备的请求,以及怎样侦测错误并记录。它制定了消息域格局和内容的公共格式。
  • 当在同一 Modbus 网络上通信时,此协议决定了每个控制器需要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动。如果需要回应,控制器将生成反馈信息并用 Modbus 协议发出。在其它网络上,包含了 Modbus 协议的消息转换为在此网络上使用的帧或包结构。这种转换也扩展了根据具体的网络解决节地址、路由路径及错误检测的方法。
  • 此协议支持传统的 RS-232、 RS-422、 RS-485 和以太网设备。许多工业设备,包括 PLC, DCS,智能仪表等都在使用 Modbus 协议作为他们之间的通信标准。
    Modbus 具有以下几个特点:
  • 标准、开放,用户可以免费、放心地使用 Modbus 协议,不需要交纳许可证费,也不会侵犯知识产 权。目前,支持 Modbus 的厂家超过400家,支持 Modbus 的产品超过 600 种。
  • Modbus 可以支持多种电气接口,如 RS-232、 RS-485 等,还可以在各种介质上传送,如双绞线、光纤、无线等。
  • Modbus 的帧格式简单、紧凑,通俗易懂。用户使用容易,厂商开发简单。
    在这里插入图片描述

通信可以形象的比喻成两个人讲话:1、你说的别人得能听懂:双方约定信号的协议。2、你的语速别人得能接受:双方满足时序要求。

一、IIC协议:

2C串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。两条线可以挂多个设备。IIC设备(稍微有点智能的)里有个固化的地址。只有在两条线上传输的值等于我(IIC设备)的地址时,我才作出响应。


开始信号:处理器让SCL时钟保持高电平,然后让SDA数据信号由高变低就表示一个开始信号。同时IIC总线上的设备检测到这个开始信号它就知道处理器要发送数据了。

停止信号:处理器让SCL时钟保持高电平,然后让SDA数据信号由低变高就表示一个停止信号。同时IIC总线上的设备检测到这个停止信号它就知道处理器已经结束了数据传输,我们就可以各忙各个的了,如休眠等。

再看数据怎么传:SDA上传输的数据必须在SCL为高电平期间保持稳定:因为外接IIC设备在SCL为高电平的期间采集数据方知SDA是高或低电平。SDA上的数据只能在SCL为低电平期间翻转变化。

响应信号(ACK):处理器把数据发给外接IIC设备,如何知道IIC设备数据已经收到呢?就需要外接IIC设备回应一个信号给处理器。处理器发完8bit数据后就不再驱动总线了(SDA引脚变输入),而SDA和SDL硬件设计时都有上拉电阻,所以这时候SDA变成高电平。那么在第8个数据位,如果外接IIC设备能收到信号的话接着在第9个周期把SDA拉低,那么处理器检测到SDA拉低就能知道外接IIC设备数据已经收到。

IIC数据从最高位开始传输。IIC总线是允许挂载多个设备的,如何访问其中一个设备而不影响其他设备呢?

主机向从机发送7位地址寻址从IIC设备,用7bit表示从地址,那么可以挂载的从设备数是2的7次方128个。处理器想写的话:先发送起始位,再发一个8bit数据:前7bit表示从地址,第8bit表示读或者写。0write是处理器往IIC从设备发,1read是IIC从设备往处理器发。第9个时钟周期回复响应信号。例如写过程:

首先发出一个start信号,从设备地址,R/W(0,写),回应ACK表示有这个从设备存在。这时候是处理器从指定的从设备读数据的从设备里8bit存储地址的指定。所以这里R/W是0为写。ACK回应有这个设备的话,处理器把要访问的从设备里的8bit存储地址写好。ACK对方回应。继续一个start信号+从设备地址,最低位是高电平表示读数据(等待ACK回应),回应ACK表示有这个从设备存在。在读数据的时候,每发出一个时钟,处理器会SDA上的数据存起来。那么发出8个时钟后处理器就能得到8位的数据。这时候若想连续读就不断回应ACK信号否则就发出停止信号。

读的过程:start信号,从设备地址,写,待读取存储地址,再一个start信号,从设备地址,读,8个时钟,从设备就把对应的数据反馈给处理器。

(1)IIC的概述

  • I2C(Inter-Integrated Circuit BUS) 集成电路总线,该总线由 NXP(原 PHILIPS)公司设计,多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,任意时刻只能有一个主机等特性。
  • 经常 IIC 和 SPI 接口被认为指定是一种硬件设备,但其实这样的说法是不尽准确的,严格的说他们都是人们所定义的软硬结合体,分为物理层(四线结构)和协议层(主机,从机,时钟极性,时钟相位)。
    -IIC, SPI 的区别不仅在与物理层, IIC 比 SPI 有着一套更为复杂的协议层定义。下面来分别说明一下 IIC 的物理层和协议层

(2) IIC 的物理层

  • a.只要求两条总线线路,一条是串行数据线SDA,一条是串行时钟线SCL,(IIC 是半双工,而不是全双工)。
  • b.每个连接到总线的器件都可以通过唯一的地址和其它器件通信,主机/从机角色和地址可配置,主机可以作为主机发送器和主机接收器。
  • c.IIC 是真正的多主机总线,(而这个 SPI 在每次通信前都需要把主机定死,而 IIC 可以在通讯过程中,改变主机),如果两个或更多的主机同时请求总线,可以通过冲突检测和仲裁防止总线数据被破坏。
  • d.传输速率在标准模式下可以达到 100kb/s,快速模式下可以达到 400kb/s。
  • e.连接到总线的 IC 数量只是受到总线的最大负载电容 400pf 限制。
  • 一个典型的 IIC 接口如下图所示
    在这里插入图片描述

二、SPI协议:
SPI:高速同步串行口,是一种标准的四线同步全双工串行总线。SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(用于单向传输时,也就是半双工方式)。也是所有基于SPI的设备共有的,它们是SDI(数据输入),SDO(数据输出),SCLK(时钟),CS(片选)。 SPI 主要应用在 EEPROM, Flash, 实时时钟(RTC), 数模转换器(ADC), 数字信号处理器(DSP) 以及数字信号解码器之间. 它在芯片中只占用四根管脚 (Pin) 用来控制以及数据传输, 节约了芯片的 pin 数目, 同时为 PCB 在布局上节省了空间. 正是出于这种简单易用的特性, 现在越来越多的芯片上都集成了 SPI技术.SPI只有主模式和从模式之分,没有读和写的说法,因为实质上每次SPI是主从设备在交换数据。也就是说,你发一个数据必然会收到一个数据;你要收一个数据必须也要先发一个数据。

工作过程:

上升沿发送、下降沿接收、高位先发送;

上升沿到来的时候,SDO上的电平将被发送到从设备的寄存器中;

下降沿到来的时候,SDI上的电平将被接收到主设备的寄存器中。

一个完整的传送周期是16位,即两个字节。因为主机首先要发送命令给从机,然后从机根据主机的指令准备数据,所以主机在下一个8位时钟周期才把数据读回来。SPI总线有四种工作方式(SP0, SP1, SP2, SP3),其中使用的最为广泛的是SPI0和SPI3方式。SPI接口有四种不同的数据传输时序,取决于CPOL和CPHL这两位的组合,CPOL是用来决定SCK时钟信号空闲时的电平,CPOL=0,空闲电平为低电平,CPOL=1时,空闲电平为高电平。CPHA是用来决定采样时刻的,CPHA=0,在每个周期的第一个时钟沿采样,CPHA=1,在每个周期的第二个时钟沿采样。
三、UART协议:
UART:Universal Asynchronous Receiver/Transmitter,通用异步接收/发送装置,UART是一个并行输入成为串行输出的芯片,通常集成在主板上,多数是16550AFN芯片。因为计算机内部采用并行数据,不能直接把数据发到Modem,必须经过UART整理才能进行异步传输,其过程为:CPU先把准备写入串行设备的数据放到UART的寄存器(临时内存块)中,再通过FIFO(First Input First Output,先入先出队列)传送到串行设备,若是没有FIFO,信息将变得杂乱无章,不可能传送到Modem中。它是用于控制计算机与串行设备的芯片。有一点要注意的是,它提供了RS-232C数据终端设备接口,这样计算机就可以和调制解调器或其它使用RS-232C接口的串行设备通信了。作为接口的一部分,UART还提供以下功能:将由计算机内部传送过来的并行数据转换为输出的串行数据流。将计算机外部来的串行数据转换为字节,供计算机内部使用并行数据的器件使用。它包括了RS232、RS499、RS423、RS422和RS485等接口标准规范和总线标准规范,即UART是异步串行通信口的总称。

通信过程:

UART首先将接收到的并行数据转换成串行数据来传输。消息帧从一个低位起始位开始,后面是5~8个数据位,一个可用的奇偶位和一个或几个高位停止位。接收器发现开始位时它就知道数据准备发送,并尝试与发送器时钟频率同步。如果选择了奇偶,UART就在数据位后面加上奇偶位。奇偶位可用来帮助错误校验。在接收过程中,UART从消息帧中去掉起始位和结束位,对进来的字节进行奇偶校验,并将数据字节从串行转换成并行。UART也产生额外的信号来指示发送和接收的状态。例如,如果产生一个奇偶错误,UART就置位奇偶标志。

数据发送的思想是,当启动字节发送时,通过TxD先发起始位,然后发数据位和奇偶数效验位,最后再发停止位,发送过程由发送状态机控制,每次中断只发送1个位,经过若干个定时中断完成1个字节帧的发送。

数据接收的思想是,当不在字节帧接收过程时,每次定时中断以3倍的波特率监视RxD的状态,当其连续3次采样电平依次为1、0、0时,就认为检测到了起始位,则开始启动一次字节帧接收,字节帧接收过程由接收状态机控制,每次中断只接收1个位,经过若干个定时中断完成1个字节帧的接收。。UART典型为38400,9600波特 。如下图1,UART字符格式为1个起始位,5~8个数据位,1个地址位或奇偶位(可选),1个停止位。由于接收器、发送器异步工作,无需联接接收和发送时钟。接收器采取对输入数据流高度采样方式,通常采样为16,并根据采样值确定位值。按惯例,使用16个采样值的中间三个值。

UART链接典型为38400,9600波特。

如下图

1,UART字符格式为1个起始位,5~8个数据位,1个地址位或奇偶位(可选),1个停止位。由于接器、发送器异步工作,无需联接接收和发送时钟。

接收器采取对输入数据流高度采样方式,通常采样为16,并根据采样值确定位值。按惯例,使用16个采样值的中间三个值。

四、三种协议的区别

第一个区别当然是名字:
    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总线,则需一个输入口,一个输出口。
第三,从第二点明显可以看出,SPI和UART可以实现全双工,但I2C不行;
第四,看看牛人们的意见吧!
    wudanyu:I2C 线更少,我觉得比UART、SPI更为强大,但是技术上也更加麻烦些,因为I2C需要有双向IO的支持,而且使用上拉电阻,我觉得抗干扰能力较弱,一般用于同一板卡上芯片之间的通信,较少用于远距离通信。SPI实现要简单一些,UART需要固定的波特率,就是说两位数据的间隔要相等,而SPI则无所谓,因为它是有时钟的协议。
    quickmouse:I2C的速度比SPI慢一点,协议比SPI复杂一点,但是连线也比标准的SPI要少。
————————————————
版权声明:本文为CSDN博主「自由自在10」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u011196227/article/details/39830267

  • CAN 是控制器局域网络(Controller Area Network, CAN)的简称,是由以研发和生产汽车电子产品著称的德国BOSCH 公司开发的,并最终成为国际标准(ISO 11898),是国际上应用最广泛的现场总线之一。 在北美 和西欧, CAN总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线,并且拥有以 CAN 为底层协议专为大型货车和重工机械车辆设计的J1939 协议。
  • CAN 是 Controller Area Network 的缩写(以下称为 CAN),是 ISO 国际标准化的串行通信协议。在汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统被开发了出来由于这些系统之间通信所用的数据类型及对可靠性的要求不尽相同,由多条总线构成的情况很多,线束的数量也随之增加。为适应“减少线束的量”、“通过多个 LAN,进行大量数据的高速通信”的需要,1986 年德国电气商博世公司开发出面向汽车的 CAN 通信协议。此后, CAN 通过 ISO11898 及 ISO11519 进行了标准化,在欧洲已是汽车网络的标准协议。
  • CAN 的高性能和可靠性已被认同,并被广泛地应用于工业自动化、船舶、医疗设备、工业设备等方面。现场总线是当今自动化领域技术发展的热点之一,被誉为自动化领域的计算机局域网。它的出现为分布式控制系统实现各节点之间实时、可靠的数据通信提供了强有力的技术支持。

CAN 的报文格式

  • 在总线中传送的报文,每帧由 7 部分组成。 CAN 协议支持两种报文格式,其唯一的不同是标识符(ID)长度不同,标准格式为 11位,扩展格式为 29 位。
  • 在标准格式中,报文的起始位称为帧起始(SOF),然后是由 11 位标识符和远程发送请求位 (RTR)组成的仲裁场。 RTR 位标明是数据帧还是请求帧,在请求帧中没有数据字节。
  • 控制场包括标识符扩展位(IDE),指出是标准格式还是扩展格式。它还包括一个保留位 (ro),为将来扩展使用。它的最后四个位用来指明数据场中数据的长度(DLC)。数据场范围为 0~8 个字节,其后有一个检测数据错误的循环冗余检查(CRC)。
  • 应答场(ACK)包括应答位和应答分隔符。发送站发送的这两位均为隐性电平(逻辑 1),这时正确接收报文的接收站发送主控电平(逻辑 0)覆盖它。用这种方法,发送站可以保证网络中至少有一个站能正确接收到报文。
  • 报文的尾部由帧结束标出。在相邻的两条报文间有一很短的间隔位,如果这时没有站进行总线存取,总线将处于空闲状态。

你可能感兴趣的:(USB接口,SPI总线,I2C总线,通信协议)