Skip to content

通讯篇 ​

课程:https://www.bilibili.com/video/BV1U84y147G6/?spm_id_from=333.788&vd_source=619fa276d09547bea474351e4a3a4f62

1. 通讯基本概念 ​

        通讯可分为串行通讯与并行通讯,串行通讯是指设备之间通过少量数据信号线,按数据位形式一位一位地传输数据的通讯方式,而并行通讯一般是指使用8、16、32及64根或更多的数据线进行传输的通讯方式。并行通讯可以同时传输多个数据位的数据,而串行通讯,而串行通讯同一时刻只能传输一个数据位的数据。

         根据数据通讯的方向,通讯又分为全双工、半双工及单工通讯,它们主要以信道的方向来区分,以公路来类比,全双工的通讯就是一个双向车道,两个方向上的车流互不相干;半双工则像乡间小道那样,同一时刻只能让一辆小车通过,另一方向的来车只能等待道路空出来时才能经过;而单工则像单行道,另一方向的车辆完全禁止通行。

        根据通讯的数据同步方式,又分为同步和异步两种,可以根据通讯过程中是否有使用到时钟信号进行简单的区分。

        在同步通讯中,收发设备双方会使用一根信号线表示时钟信号,在时钟信号的驱动下双方进行协调,同步数据。通讯中通常双方会统一规定在时钟信号的上升沿或下降沿对数据线进行采样。

        在异步通讯中不使用时钟信号进行数据同步,它们直接在数据信号中穿插一些同步用的信号位,或者把主体数据进行打包,以数据帧的格式传输数据,见图某种异步通讯,某些通讯中还需要双方约定数据的传输速率,以便更好地同步。

2. 串口通讯 ​

        串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。

        STM32芯片具有多个USART外设用于串口通讯,它是Universal Synchronous Asynchronous Receiver and Transmitter的缩写,即通用同步异步收发器可以灵活地与外部设备进行全双工数据交换。有别于USART,它还有具有UART外设(Universal Asynchronous Receiver and Transmitter),它是在USART基础上裁剪掉了同步通信功能,只有异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本都是UART。

  • TX:发送数据输出引脚。
  • RX:接收数据输入引脚。
  • SW_RX︰数据接收引脚,只用于单线和智能卡模式,属于内部引脚,没有具体外部引脚。
  • nRTS:请求以发送(Request To Send), n表示低电平有效。如果使能 RTS流控制,当USART 接收器准备好接收新数据时就会将nRTS变成低电平;当接收寄存器已满时, nRTS将被设置为高电平。该引脚只适用于硬件流控制。
  • nCTS:清除以发送(Clear To Send), n表示低电平有效。如果使能CTS流控制发送器在发送下一帧数据之前会检测 nCTS引脚,如果为低电平,表示可以发送数据,如果为高电平则在发送完当前数据帧之后停止发送。该引脚只适用于硬件流控制。
  • SCLK:发送器时钟输出引脚。这个引脚仅适用于同步模式

        在目前的其它工业控制使用的串口通讯中,一般只使用RXD、TXD以及GND三条信号线,直接传输数据信号。而RTS、CTS信号都被裁剪掉了。

2.1 全双工传输 ​

2.2 半双工传输 ​

        RS485采用平衡发送和差分接收方式实现通信:发送端将串行口的TTL电平信号转换成差分信号A,B两路输出,经过线缆传输之后在接收端将差分信号还原成TTL电平信号。由于传输线通常使用双绞线,又是差分传输,所以有强大的抗共模干扰的能力。

        对于驱动器(发送器),逻辑1 (正)是A>B,AB之间电压为+2 ~ +6V,而逻辑O负)是A<B,AB之间的电压为-2 ~ -6V。

        而对于接收器,则逻辑1 (正)则是B>A,BA之间的电压不小于200mV,逻辑0则是A>B,BA之间的电压小于-200mv,即正负逻辑,电压绝对值都大于200mv。

2.3 注意 ​

1、波特率

        异步通讯中由于没有时钟信号,所以两个通讯设备之间需要约定好波特率,即每个码元的长度,以便对信号进行解码,图中用虚线分开的每一格就是代表一个码元。常见的波特率为4800、9600、115200等。

2、通讯的起始和停止信号

        串口通讯的一个数据包从起始信号开始,直到停止信号结束,起始信号由一个逻辑O的数据位表示,而数据包的停止信号可由0.5、1、1.5或2个逻辑1的数据位表示,只要双方约定一致即可。

3、有效数据

        有效数据的长度常被约定为5、6、7或8位长。

4、数据校验

        在有效数据之后,有一个可选的数据校验位,由于数据通信相对更容易受到外部干扰导致传输数据出现偏差,可以在传输过程加上校验位来解决这个问题。

2.4 拓展 ​

1、差模共模信号

差模信号:幅度相等,相位相反的信号 共模信号︰幅度相等,相位相同的信号。

2、直联式串口接法为啥不能实现总线通信

1、开漏输出:输出0和高阻态

        正常使用时必须外部接上拉电阻,参考图开漏电路中等效电路。它具有"线与"特性,也就是说,若有很多个开漏模式引脚连接到一起时,只有当所有引脚都输出高阻态,才由上拉电阻提供高电平,此高电平的电压为外部上拉电阻所接的电源的电压。若其中一个引脚为低电平,那线路就相当于短路接地,使得整条线路都为低电平,0伏。

2、推挽输出:输出0或1

        推挽输出模式一般应用在输出电平为О和3.3伏而且需要高速切换开关状态的场合。在STM32的应用中,除了必须用开漏模式的场合,都习惯使用推挽输出模式。

        Uart不属于总线通信,无法同时挂2个或以上的进行通信,同一时间只能是一对一。

        串口的GPIO工作在推挽输出模式,非0即1,当从机1向主机回传数据时,从机2的TX端假如置1,从机1回传高电平,无影响,回传低电平时由于从机2的TX端时高电平,就会造成短路,损坏芯片。

  • RS485总线         发送数据时,串口控制器的TX信号经过收发器转换成差分信号AB传输到总线上,而接收数据时,收发器把总线上的差分信号AB转化成TTL信号通过RX引脚传输到串口控制器中

3. Can通讯 ​

3.1 基础 ​

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

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

        与I2C、SPI等具有时钟信号的同步通讯方式不同,CAN通讯并不是以时钟信号来进行同步的,它是一种异步通讯,只具有CAN_High 和CAN_Low两条信号线,共同构成一组差分信号线,以差分信号的形式进行通讯。

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

        2、CAN通讯节点由一个CAN控制器及CAN收发器组成,控制器与收发器之间通过CAN_Tx及CAN_Rx信号线相连,收发器与CAN总线之间使用CAN_High及CAN_Low信号线相连。CAN_High 及CAN_Low是一对差分信号线,使用比较特别的差分信号。

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

        当表示逻辑1时(隐性电平),CAN_High和CAN_Low线上的电压均为2.5v,即它们的电压差VH-VL=0V;而表示逻辑0时(显性电平),CAN_High的电平为3.5V,CAN_Low线的电平为1.5V,即它们的电压差为VH-VL=2V。

3.2 特点 ​

(1) 多主控制(CAN无所谓主机从机)

        在总线空闲时,所有的单元都可开始发送消息。

        多个单元“同时"开始发送时,发送高优先级ID消息的单元可获得发送权。

(2) 消息的发送(对比I2C是根据地址进行访问,这里ID非地址,而是一种表征优先级的标识符)

        在CAN协议中,所有的消息都以固定的格式发送。当两个以上的单元同时开始发送消息时,根据ID(标识符)决定优先级,对各消息ID的每个位进行逐个仲裁比较。仲裁获胜(被判定为优先级最高)的单元可继续发送消息.仲裁失利的单元则立刻停止发送而进行接收工作,此处这里ID非地址,而是一种表征优先级的标识符。

(3) 系统的柔软性(对比I2C总线上的每个单元都有一个独立的地址)

        与总线相连的单元没有类似于"地址"的信息。因此在总线上增加单元时,连接在总线上的其它单元的都不需要改变。

(4) 通信速度(波特率)

        由CAN的物理层就可以看出,CAN是一种异步通信方式,所以通信前必须统一好同一网络上每个单元的波特率,即使有一个单元的通信速度与其它的不一样,此单元也会输出错误信号,妨碍整个网络的通信。不同网络间则可以有不同的通信速度。

(5) 连接

        CAN总线可连接的单元总数理论上是没有限制的。但实际上可连接的单元数受总线上的时间延迟及电气负载的限制。

CAN总线lD是包含在报文帧中的。

        1、主要用作CAN总线的仲裁使用,所以一般来说网络上的每个节点(向总线上发送)的ID应该有所不同。ID值越低,报文优先级越高,在两组不同ID报文同时上线时候,仲裁机制使得ID值低的占用总线,ID值高的退出。

        2、ID的另一个作用是配合接收方滤波使用,就是说—般接收的滤波器可以设定接收ID的范围等,用于过滤掉不需要接收的信息,减轻CPU的处理负担。

        ID是赋给帧的,不是直接给节点的,只是某节点知道自己要接收某个ID的帧。总线上的节点来说它只管取总线上他应该取的ID的帧,并不管是谁发的。即使是远程帧,发出请求的节点在获得相应时也仅仅是根据帧ID判定,并不影响其他节点的接收。

4. I2C通讯 ​

4.1 基础 ​

        I2C通讯协议(Inter - Integrated Circuit)是由Phiilps 公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要 USART、CAN等通讯协议的外部收发设备,现在被广泛地使用在系统内多个集成电路(IC)间的通讯。

它的物理层有如下特点:

        (1)它是一个支持多设备的总线。"总线"指多个设备共用的信号线。在一个I2C通讯总线中,可连接多个I2C通讯设备,支持多个通讯主机及多个通讯从机。

        (2)一个I2C总线只使用两条总线线路,一条双向串行数据线(SDA),一条串行时钟线(SCL)。数据线即用来表示数据,时钟线用于数据收发同步。

        (3)每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备之间的访问。

        (4)总线通过上拉电阻接到电源。当I2C设备空闲时,会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平。

        (5)多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线。

        (6)具有三种传输模式:标准模式传输速率为100kbit/s ,快速模式为400kbit/s,高速模式下可达3.4Mbit/s,但目前大多I2C设备尚不支持高速模式。

        (7)连接到相同总线的I2C数量受到总线的最大电容400pF限制。

  • SDA(Serial Data):这是I2C总线上的数据线,用于在设备之间传输数据。
  • SCL(Serial Clock):这是I2C总线上的时钟线,用于同步数据传输。

        I2C使用SDA信号线来传输数据,使用SCL信号线进行数据同步。见图数据有效性。SDA数据线在SCL的每个时钟周期传输一位数据。传输时,SCL为高电平的时候SDA表示的数据有效,即此时的SDA为高电平时表示数据“1",为低电平时表示数据"0”。当SCL为低电平时,SDA的数据无效,一般在这个时候SDA进行电平切换,为下一次表示数据做好准备。

        1、S表示由主机的I2C接口产生的传输起始信号(S),这时连接到I2C总线上的所有从机都会接收到这个信号。

        2、起始信号产生后,所有从机就开始等待主机紧接下来广播的从机地址信号(SLAVE_ADDRESS)。在12C总线上,每个设备的地址都是唯一的,当主机广播的地址与某个设备地址相同时,这个设备就被选中了,没被选中的设备将会忽略之后的数据信号。

        3、在地址位之后,是传输方向的选择位,该位为0时,表示后面的数据传输方向是由主机传输至从机,即主机向从机写数据。该位为1时,则相反,即主机由从机读数据。

        4、从机接收到匹配的地址后,主机或从机会返回一个应答(ACK)或非应答(NACK)信号,只有接收到应答信号后,主机才能继续发送或接收数据。

        5、当数据传输结束时,主机向从机发送一个停止传输信号(P),表示不再传输数据。

5. SPI通讯 ​

        SPI协议是由摩托罗拉公司提出的通讯协议(Serial Peripheral Interface),即串行外围设备接口,是一种高速全双工的通信总线。它被广泛地使用在ADC、LCD等设备与MCU间,要求通讯速率较高的场合。

SPI通讯使用3条总线及片选线,3条总线分别为SCK、MOSI、MISO,片选线为,它们的作用介绍如下:

        (1) (Slave Select):从设备选择信号线,常称为片选信号线,也称为NSS、CS,以下用NSS表示。当有多个SPI从设备与SPI主机相连时,设备的其它信号线SCK、MOSI 及MISO同时并联到相同的SPI总线上,即无论有多少个从设备,都共同只使用这3条总线;而每个从设备都有独立的这一条NSS信号线,本信号线独占主机的一个引脚,即有多少个从设备,就有多少条片选信号线。I2C协议中通过设备地址来寻址、选中总线上的某个设备并与其进行通讯;而SPI协议中没有设备地址,它使用NSS信号线来寻址,当主机要选择从设备时,把该从设备的NSS信号线设置为低电平,该从设备即被选中,即片选有效,接着主机开始与被选中的从设备进行SPI通讯。所以SPI通讯以NSS线置低电平为开始信号,以 NSS线被拉高作为结束信号。

        (2)SCK(Serial Clock):时钟信号线,用于通讯数据同步。它由通讯主机产生,决定了通讯的速率,不同的设备支持的最高时钟频率不一样,如STM32的SPI时钟频率最大为fpclk/2,两个设备之间通讯时,通讯速率受限于低速设备。         (3)MOSI (Master Output,Slave Input):主设备输出/从设备输入引脚。主机的数据从这条信号线输出,从机由这条信号线读入主机发送的数据,即这条线上数据的方向为主机到从机。

        (4)MISO(Master Input,, Slave Output):主设备输入/从设备输出引脚。主机从这条信号线读入数据. 从机的数据由这条信号线输出到主机,即在这条线上数据的方向为从机到主机。

总结 ​

        1、UART不能直接用作总线通信,需选用驱动器转为RS485进行总线通信,类似于CAN通信。

        2、I2C与CAN、RS485通信都需要设置ID。SPI通信则牺牲一个单片机引脚作为片选。

        3、CAN与RS485通信都需要总线匹配电阻,始末两端各加120欧姆电阻即保证总线的阻值为60欧姆。

        4、I2C总线SCL、SDA需要外部上拉,因为引脚工作在开漏模式,不上拉则无高电平。

        5、STM32 12C通信速率最高为400K,CAN一般最高为1Mpbs,SPI最高为42Mpbs (SPI1),串口一般为115200pbs,最高也可设置为Mpbs(平衡车RS485关节电机)(仅限USART1、6) 。

        6、STM32I2C硬件lI2C由于权限问题暂时未解决,存在bug,一般则使用GPIO模拟I2C通信。

        7、一般串口为全双工,RS485、CAN、I2C为半双工,SPI为全双工。

        8、硬件设计较为简单,注意458\CAN的差分信号线要尽量紧靠,保证同等干扰同等阻抗。SPI、I2C的时钟线要尽量远离噪声等干扰。

        9、建议设计PCB时同一模块的线尽量同时走,方便查看,减少干扰。