嵌入式单片机各种通信(UART/RS232/RS485/I2C/CAN/ SPI)
一、UART串口
USART(同步/异步收发器)和UART(异步收发器)。
空闲时,数据线为高电平。
发生的数据格式一般为:
第一位起始位(低电平开始)-> 中间8位数据位-> 第十位终止位(高电平结束)
PS:发送每一位都会停留一个固定的时间长度。

串行通信:
数据传输方式为逐位传输,传输线少,成本低,但数据的传输控制较复杂。按照实现数据同步的方式,可以分为同步串行和异步串行两种。
并行通信:
多位数据同时传输,传输控制简单,传输速度快,但是在长距离传输时硬件成本较高。
同/异步:
同步总线:指互联的部件或设备均通过统一的时钟进行同步,即所有的互联的部件或设备都必须使用同一个时钟(同步时钟),在规定的时钟节拍内进行规定的总线操作,来完成部件或设备之间的信息交换。
异步总线:指没有统一的时钟而依靠各部件或设备内部定时操作,所有部件或设备是以信号握手的方式进行,即发送设备和接受设备互用请求(request)和确认(acknowledgement)信号来协调动作,总线操作时序不是固定的。因此,异步总线能兼容多种不同的设备,而且不必担心时钟变形或同步问题使得总线长度不受限制。
单工、半双工、全双工:
单工:一方发送一方接收,只有一条传输线。
半双工:两方都能收发,只有一条传输线,不能一起发送接收。
全双工:两方都能进行收发,并且能一同发送接收,有两条传输线;UART为全双工。
波特率:
串口异步通讯中由于没有时钟信号,所以两个通讯设备之间需要约定好波特率,即每个码元的长度,以便对信号进行解码。
波特率是指每秒钟传送二进制数码的位数,以bit/s(bps)为单位。
常用的波特率有: 9600、 19200、 38400、 57600和115200;
波特率为115200, 表示每秒传输115200位,且每一位数据在数
据线上持续时间为Tbit = 1/115200 ≈ 8.68us。
二、RS232/RS485
为了提高串口通信的稳定性和距离,制定了RS232标准。
在串口通信的基础上增加电平转换芯片,如MAX232,就可以把TTL电平转为RS232电平,通信距离一般可达到15米。
RS232为负逻辑电平,逻辑1为-3V ~ -15V,逻辑0为3V ~ 15V。
RS232为单端(非平衡)点对点的通信,传输速率一般在20Kbit/s,工作模式为全双工串行通信。
RS485是在串行通信的基础上增加了485转换芯片,将输入的串口信号转为差分信号;通信距离一般可达到1000米。
RS485为差分(平衡),1发32收,传输速率为10Mbit/s,多点对多点,2线制半双工通信。
RS485为正逻辑电平,逻辑1两线电压差为2~6V,逻辑0两线电压差为-2V ~ -6V。
485转换芯片引脚与单片机相接一般有4个,分为RE(接收允许)、DE(发送允许)、RO(接收器输出)和DI(发送器输入 一般来自MCU)。
电路上一般会接入120欧的终端电阻和3.9K欧的偏置电阻,确保静默下为高电平。

三、Modbus通讯协议
Modbus是一种一主多从的通信协议,基于RS485定制的应用层通信协议。
基于Modbus链路的通信协议有Modbus-RTU和Modbus-ASCII。
在Modbus协议中,主设备向从设备发送报文有两种形式
1.单播模式:主设备向一个从设备发送报文,从设备接收报文并处理完毕后向主机返回响应报文
2.广播模式:主设备向所以网络上的从设备发送报文,从设备接收处理后不要求返回响应;广播模式发送地址为0.
在Modbus协议中,主设备没有地址,从设备有且只有一个地址(1~127)。
如果从设备响应错误时,功能码则返回给主设备的功能码最高位置一。
Modbus-RTU消息帧格式
起始位 -> 地址(8位)-> 功能码(8位) -> 数据(n个8位) -> CRC校验(16位) -> 结束符
Modbus寄存器
Modbus寄存器用于存放数据

Modbus常用功能码响应

四、I2C(集成电路互相通信总线)
原理
有主从设备之分,主设备通过从设备的设备地址进行数据的收发;与从设备有同一个时钟线进行调整与从设备的通信速度。
I2C通信时,主机发送(写)由主机操作SDA,接收时(读)由从机操作SDA。
主设备主导通信,能主动读取从设备的数据,而从设备只能等待主机的读写操作,从设备不能自己独立操作总线。
主设备向从设备发送8位数据后,从设备如果成功接收,则会向主设备回应一个应答信号(低电平),此时SDA由从设备操作,因为外接上拉电阻,所以默认状态下是高电平,所以应答信号是低电平;如果没有回应,则表示接收有误。
主设备 <------------------------8位数据-------------------- 从设备
-------------第九位应答位---------------------- >
同理,从主设备向从设备写也是一样。
I2C通信如何判断起始位停止位
起始位:在SCL的工作期间,当SDA从1变0(下降沿)表示起始位,代表SCL接下来的第一个工作期间是第一个工作期间(这里有点绕)。
停止位:通信结束后再用SCL的一个工作期间让SDA从0变1(上升沿)。
I2C通信的数据帧格式
起始位(下降沿)-> 8位数据 -> 应答位 -> 停止位(上升沿)
主机发送过程:
起始位->数据位->从机应答->数据位->从机应答..........
从设备向主设备发送数据过程:
起始位->数据位->主机应答->数据位->主机应答->.....->主机发送停止位
从设备如何判断是写/读操作
I2C通信规定,第一组数据8位的最低位为1时是读操作,为0时是写操作。
从设备如何判断读/写那个寄存器
I2C通信规定,第二组数据8位当作指针来使用(确定读写哪一个寄存器),如果是第四个寄存器,则第二组数据为0000 0100(十进制4转为二进制)。
第一组8位数据,左边7位为从设备地址,表示要操作的从设备地址。
ps:方便阅读,现在规定S为起始位、A为应答位、P为停止位;
主机向从机写数据:
S->0001 0100(设备地址和写操作)->A->(具体操作的寄存器)->A->DATA*8->A->P
主机向从机读数据(要先发一个写操作):
S->0001 0100->A->(具体操作的寄存器)->A->S->0001 0101->A->DATA*8->A->P
五、SPI
SPI与I2C一样是板级总线,有主从设备之分,但没有采用地址的概念,而是由硬件选择总线上的设备(所以占用的IO口多);工作模式为全双工。
SPI通信的硬件引脚
CE:收发使能引脚
CSN:SPI片选
SCK:时钟线
MOSI:SPI主机输出,从机输入
MISO:SPI主机输入,从机输出
SPI通信格式
SPI通信中,在SCK的上升沿或者下降沿(具体看从机的协议)时数据才有效,有多少个上升/下降沿就有多少个信号。
一般写指令为:
起始位->操作码->寄存器地址->数据
一般读指令为:
起始位->操作码->寄存器地址
SPI和I2C异同
同:
1.都是串行、同步的方式
2.采用TTL电平
3.有主从设备之分
异:
1.I2C为半双工,SPI为全双工
2.I2C有应答机制,SPI没有
3.I2C通过总线广播来寻址,SPI通过使能引脚来寻址。
六、CAN总线
CAN总线分为ISO 11898(高速CAN)和ISO 11519(低速CAN)标准,高速CAN通信传输速率为125kbit/s~1Mbit/s,低速CAN传输速率为125kbit/s以下;通信模式为半双工,可挂载多设备,多设备同时发送数据时通过仲裁判断先后顺序;主要用于多主机互相通信。
数据分为11位标准格式和29位扩展格式的报文ID,用于区分消息功能,同时确定优先级,一般ID小的先发。
通信分为广播式(全部设备都会接收)和请求式(只有收到接收方发的请求,发送方才会发送)
CAN电路图

高速CAN电平逻辑
逻辑1:2线均为2.5V,电压差为0(隐性电平)
逻辑0:CAN_H = 3.5V,CAN_L = 1.5V,两线电压差为2V(显性电平)
低速CAN电平逻辑
逻辑1:CAN_H = 1.75V,CAN_L = 3.25V,两线电压差为-1.5V(隐性电平)
逻辑0:CAN_L = 4V,CAN_L = 1V,两线电压差为1V(显性电平)

应用场景
高速CAN总线网络被应用于汽车动力与传动系统,是闭环网络,总线最大长度为40米,两端各有120欧的终端电阻;低速CAN总线网络被应用于汽车车身系统,2根总线是独立的,开环网络,两根总线各串联一个2.2k欧电阻。
CAN控制器和收发器
CAN节点硬件构成有两种,一种是由MCU和控制器收发器组成;一种是集成了CAN控制器的MCU和CAN收发器组成(STM32F1自带控制器)。
CAN控制器:
一种实现“报文”和符合CAN规范的“通行帧”之间互相转换的器件与CAN收发器相连。
STM32F1内部集成的控制器叫BxCAN。
控制器内部原理:

BxCAN三种工作模式:初始化、正常、睡眠。
CAN收发器:是控制器与CAN物理总线的接口,将控制器的逻辑电平转为差分电平并发送。

