嵌入式常用通信协议总结

1、UART串口通信

UART——通用异步收发传输器。UART作为异步串口通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输。

基于UART的数据传输是异步形式的串行数据传输。基于UART的串行数据传输不需要使用时钟信号来同步传输的发送端和接收端,而是依赖于发送设备和接收设备之间预定义的配置。

对于发送设备和接收设备来说,两者的串行通信配置(波特率、单位字的位数、奇偶校验、起始位数与结束位、流量控制)应该设置为完全相同。通过在数据流中插入特定的比特序列,可以指示通信的开始与结束。当发送一个字节数据的时候,需要在比特流的开头加上起始位,并在比特流的末尾加上结束位。数据字节的最低位紧接在起始位之后。

UART 串口的特点是将数据一位一位地顺序传送,只要2根传输线就可以实现双向通信,一根线发送数据的同时用另一根线接收数据。UART 串口通信有几个重要的参数,分别是波特率、起始位、数据位、停止位和奇偶检验位,对于两个使用UART串口通信的端口,这些参数必须匹配,否则通信出错。

起始位:表示数据传输的开始,电平逻辑为“0” ,位数为1位。

数据位:可以是5~8位的数据,先发低位,再发高位,一般取值为8,因为一个ASCII 字符值为8位。

奇偶校验位:用于接收方对接收到的数据进行校验,“1”的位数为偶数(偶校验) 或奇数(奇校验),以此来校验数据传送的正确性,使用时不需要此位也可以。

停止位:表示一帧数据的结束,电平逻辑为“1”,位数可以是1/1.5/2位。

波特率:串口通信时的速率,它用单位时间内传输的二进制代码的有效位(bit) 数来表示,其单位为每秒比特数bit/s(bps)。常见的波特率值有48009600115200 等,数值越大数据传输的越快,波特率为115200 表示每秒钟传输115200 位数据。

串口通信存在的问题

(1)UART只是对信号的时序进行了定义,而未定义接口的电气特性;

(2)UART通信时一般直接使用处理器使用的电平,即TTL电平,但不同的处理器使用的电平存在差异,所以不同的处理器使用UART通信时一般不能直接相连;

(3)UART没有规定不同器件连接时连接器的标准,所以不同器件之间通过UART通信时连接不方便。

(4)UART一般直接使用TTL信号来表示01,但TTL信号的抗干扰能力较差,数据在传输过程中很容易出错。

(5)由于TTL信号的抗干扰能力较差,所以其通信距离很短,一般只能用于一个电路板上的两个不同芯片之间的通信。

2、I2C通信

I2C是一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。每个连接到总线的设备都有一个独立的地址,主机可以通过该地址来访问不同设备。主机通过SDA线发送设备地址(SLAVE_ADDRESS)查找从机,SLAVE_ADDRESS可以是7位或10位,紧跟着SLAVE_ADDRESS的一个数据位用来表示数据传输方向,即第8位或11位。为0时表示写数据,为1时表示读数据。

I2C 总线由起始信号、停止信号、应答信号、非应答信号组成。起始信号SCL为高,SDA由高变低;停止信号SCL为高,SDA由低变高;应答信号第9个时钟周期,SDA为低;非应答信号第9个时钟周期,SDA为高;

开始位:当SCL为高电平时,SDA由高电平变为低电平的期间,这表示主机控制器要开始发起访问了。

地址位:接下来的7个时钟周期,主机控制器将会发送从机的7位地址(如果是10位地址需要分两次发送)

读写位:在第8个时钟周期,如果SDA位高电平则表示接下来要读取从机数据,如果是低电平则表示主机要写数据到从机。

应答位:在第9个时钟周期由从机进行应答,低电平为ACK,,高电平为NACK,如果从机响应,应该法ACK

数据位:在接下来的若干个周期内,主机可以持续读取数据(如果读写位为读),或写数据(如果读写位为写),每次数据传输完成,也要进行应答,是读则由主机控制器应答,是写则由从机应答,只是在主机读完最坏一个字节的数据后应该以NACK来应答。

停止位:当SCL位高电平时,SDA由低电平变为高电平期间,表示主机控制器结束了对从机的访问。

I2C的一大特点是可以在同一条总线上接多个主机。两个及以上的主机同时发起传输请求时,需要通过仲裁(Arbitration)确定哪个主机获得总线的使用权;另外,每个主机都独立产生时钟,时钟速率可能千差万别,这也需要时钟同步(Clock Synchronization)解决时钟速率不一致的问题。在单主机的I2C系统中,不需要时钟同步和仲裁。

时钟同步是通过I2C接口的线与逻辑实现的。SCL信号线由高变低时,所有连接在SCL上的主机都开始计数低电平的时间(低电平计数器复位),由前文对线与逻辑的介绍可知:只有当SCL总线上所有主机的时钟输出端都为高时,SCL总线才会由低变高。SCL的低电平时间由总线上低电平时间最长的主机决定。时钟端口先跳变为高的其它主机进入等待状态。这样所有主机的时钟输出和SCL线上的状态保持相同;当SCL由低变高后,所有主机(高电平计数器)开始计数SCL高电平的时间;最早由高跳变到低的主机再次将SCL拉低。通过这种方式产生的同步时钟:其低电平时间是所有主机时钟中最长的低电平时间,其高电平时间是所有主机时钟中最短的高电平时间。

当总线上有一个以上的主机时,协议通过仲裁的方法确定哪个主机获得总线的使用权。从机不参与仲裁的过程。当总线处于空闲状态(IDLE)时,在最小的保持时间内(tHD;STA),多个主机都可能发起开始条件(START)在总线上传输数据。仲裁用来判断哪个主机的传输可以正常进行。

仲裁是按位进行的。仲裁开始时,对于每一位数据,SCL为高时,每个主机都检测SDA上的数据是否和自己发送的数据相同。可能需要进行多个位(bit)的比较,主机才开始检测到SDA上数据和自己发送的不一致。实际上,只要SDA上的数据和主机发送的数据一致,这些主机就可以将数据一致发送下去。当主机发送为HIGH,检测SDA上电平却为LOW,那么该主机就在仲裁中失去主控权,并将其SDA输出关闭。余下的主机获得总线控制权并继续数据的传输。如图8,当主机1在检测到SDA数据和它自身的输出DATA1不一致时,将自动关闭DATA1的输出,停止向总线上发送数据。

I2C总线一般只有上拉电阻,总线电容是来自芯片管脚的容性负载,总线100k速率可以使用的容限在10pF-400pF之间,400k速率可以使用的总线容限10pF-200pF之间。控制总线电容主要是控制连接在同一总线的器件数量。

3、SPI通信

SPI是一种高速的,全双工,同步的通信总线。SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时)。也是所有基于SPI的设备共有的,它们是SDI(数据输入)SDO(数据输出)SCLK(时钟)CS(片选)

SPI主要用于EEPROMFlashRTC(实时时钟)、ADC(数模转换器)、DSP(数字信号处理器)以及数字信号解码器上。目前应用中的数据速率可达几MbpsSPI规定了两个SPI设备之间通信必须由主设备Master来控制从设备Slave。一个Master可以通过提供clock以及对Slave进行片选(Slave Select)来控制多个SlaveSPI协议还规定Slave设备的clockMaster通过SCK管脚提供给SlaveSlave本身不能产生或控制clock,没有clockSlave不能正常工作。

Master会根据将要交换的数据产生相应的时钟脉冲,组成时钟信号,时钟信号通过时钟极性(CPOL)和时钟相位(CPHA)控制两个SPI设备何时交换数据以及何时对接收数据进行采样,保证数据在两个设备之间是同步传输的。SPI设备间的数据传输被称为数据交换,因为SPI协议规定一个SPI设备不能在数据通信过程中仅仅充当一个发送者(Transmitter)或者接受者(Receiver)。在每个clock周期内,SPI设备都会发送并接收1 bit数据,相当于有1 bit数据被交换了。数据传输高位在前,低位在后(MSB first)。在数据传输过程中,每次接收到的数据必须在下一次数据传输之前被采样,如果之前接收到的数据没有被读取,那么这些已经接收完成的数据将有可能被丢弃,导致SPI物理模块最终失效。因此在程序中一般都会在SPI传输完数据后,读取SPI设备里的数据,即使这些数据在程序里是无效的。

时序很简单,在SCK的控制下,两个双向移位寄存器进行数据交换。寄存器中的内容全部移出时,相当于完成了两个寄存器内容的交换。SSPSR控制数据移入移出SSPBUFcontroller确定SPI总线的通信模式。SPI接口有四种不同的数据传输时序,取决于时钟极性(CPOL)和时钟相位(CPHA)的组合。时钟相位设置读取数据和发送数据的时钟沿。主机和从机发送数据是同时完成的,接收数据也是同时完成的。

优点:

·支持全双工,push-pull的驱动性能相比open-drain信号完整性更好;

·支持高速(100MHz以上);

·协议支持字长不限于8bits,可根据应用特点灵活选择消息字长;

·在点对点的通信中,SPI接口不需要进行寻址操作,且为全双工通信,显得简单高效。硬件连接简单;

缺点:

·相比IIC多两根线,没有寻址机制,只能靠片选选择不同设备;

·没有指定的流控制,没有应答机制(ACK)确认是否接收到数据,主设备对于发送成功与否不得而知;

·典型应用只支持单主控;

·在多个从器件的系统中,每个从器件需要独立的使能信号,硬件上比I2C系统要稍微复杂一些。

4、CAN通信

控制器局域网总线(Controller Area Network, CAN),是用双绞线传输的串行通讯协议总线,CAN 控制器根据两根线上的电位差来判断总线电平。总线电平分为显性电平和隐性电平,二者必居其一。发送方通过使总线电平发生变化,将消息发送给接收方。当CAN总线上的一个节点()发送数据时,它以报文形式广播给网络中所有节点。对每个节点来说,无论数据是否是发给自己的,都对其进行接收。每组报文开头的11位字符为标识符,定义了报文的优先级,这种报文格式称为面向内容的编址方案。在同一系统中标识符是唯一的,不可能有两个站发送具有相同标识符的报文。当几个站同时竞争总线读取时,这种配置十分重要。

从该特性可以看出,显性电平对应逻辑0CAN_HCAN_L之差为2.5V左右。而隐性电平对应逻辑1CAN_HCAN_L之差为0V。在总线上显性电平具有优先权,只要有一个单元输出显性电平,总线上即为显性电平。而隐形电平则具有包容的意味,只有所有的单元都输出隐性电平,总线上才为隐性电平(显性电平比隐性电平更强)。另外,在CAN总线的起止端都有一个120Ω的终端电阻,来做阻抗匹配,以减少回波反射。

       CAN协议是通过以下5种类型的帧进行的: 数据帧、遥控帧、错误帧、过载帧、间隔帧。数据帧和遥控帧有标准格式和扩展格式两种格式。标准格式有11个位的标识符(ID),扩展格式有29 个位的ID

CAN总线的端点没有地址(除非自己在帧里定义地址),CAN总线通信不用地址,用标识符,不是单独的谁发给谁,而是发送给整个网络。然后每个节点都有过滤器,对网络上的传播的帧的标识符进行过滤,自己想要什么样的帧,可以设置自己的过滤器,接收相关的帧信息。如果两个节点同时发送怎么办?这个不用我们担心,CAN控制器会自己仲裁,让高优先级的帧先发。

如上图所示,stm32有两个can控制器,can1(主),和can2(从),其中过滤器的设置是通过can1来设置,其他工作模式,波特率等,可以各自设置。每个控制器有三个发送邮箱,两个fifo,每个fifo有三个接收邮箱。

发送:选择一个空的发送邮箱,把帧信息写到该发送邮箱的寄存器里,请求发送,控制器就会根据标识符的优先级把帧先后发送出去。

接收:如果接收到的帧的标识符能过过滤表的一系列过滤,该帧信息就会保存在fifo接收邮箱的寄存器里。

过滤器:stm32f407共有28组过滤器,每组过滤器可以设置关联到fifo0或者fifo1,每组都包括两个32位存储器,可以配置成一个32位有位屏蔽功能的标识符过滤器,或者两个32位完全匹配的标识符过滤器,或者两个16位有位屏蔽功能的标识符过滤器,或者四个16位完全匹配的标识符过滤器。如下图所示:

上边说的完全匹配的意思是,接收到的帧的标识符每一位都要跟过滤器对应的位一样,才能过得了这个过滤器。有位屏蔽功能的意思是一个寄存器放标识符,一个放屏蔽掩码,屏蔽掩码为1的位对应的接收到的帧的标识符的位与对应的放标识符的寄存器的位一致,就能通过。

STM32互联型产品中,CAN1CAN2分享28个过滤器组,其它STM32F103xx系列产品中有14个过滤器组,用以对接收到的帧进行过滤。STM32在使用过滤器时,按以下顺序进行过滤:

(1) 位宽为32位的过滤器,优先级高于位宽为16位的过滤器。

(2) 对于位宽相同的过滤器,标识符列表模式的优先级高于屏蔽位模式。

(3) 位宽和模式都相同的过滤器,优先级由过滤器号决定,过滤器号小的优先级高。

发送的优先级确定方式:

(1)由标识符决定。当有超过1个发送邮箱在挂号时,发送顺序由邮箱中报文的标识符决定。根据CAN协议,标识符数值最低的报文具有最高的优先级。如果标识符的值相等,那么邮箱号小的报文先被发送。

(2)由发送请求次序决定。通过对CAN_MCR寄存器的TXFP位置’1’,可以把发送邮箱配置为发送FIFO。在该模式下,发送的优先级由发送请求次序决定。该模式对分段发送很有用。

CAN总线时序:

CAN总线上的每个位都划分成至少4个时间份额。时间份额逻辑上划分成四个组或段-

(1)同步段 (2)传播段 (3)相位段1 (4)相位段2

同步段始终是一个时间份额长,用于时钟同步。总线上的数据改变时,预计会出现一个位边沿。

传播段用来补偿总线线路中的延迟。如有必要,相位段可以缩短(相位段1)或延长(相位段2),以保持时钟同步。

在相位段1和相位段2之间的边沿上对总线电平进行采样。

由于CAN属于异步通讯,没有时钟信号线,连接在同一个总线网络中的各个节点会像串口异步通讯那样,节点间使用约定好的波特率进行通讯。

同时,CAN还使用位同步的方式来抗干扰、吸收误差,实现对总线电平信号进行正确的采样,确保通讯正常。

为了实现这个位同步,CAN协议将每个位的时序分解为四段:SS段、PTS段、PSB1段、PBS2段。同时定义最小的时间单位:Tq,四个段的长度用xTq表示,加起来就是一个位的时序。

用一个图来表示可能会形象一点,如图一个位的时序就是19Tq

STM32CAN外设位时序中只包含3段:同步段SYNC_SEG、位段BS1(合并了PTS段和PSB1)和位段BS2

其中SYNC_SEG的长度固定为1Tq,其它两段的长度可在CAN_BTR中设置。

CAN控制器的波特率是由APB时钟线和CAN位时序寄存器CAN_BTRTS2[30]TS1[2:0]BRP[90]确定的,其中,TS1[20]定义了时间段1占用多少个时间单元,TS2[30]定义了时间段2占用多少个时间单元,BRP[90]定义对APB1时钟的分频。

协议各个段组成:

(1)帧起始

帧起始是一个显示位电平,当总线空闲时,发送节点发送一个显性电平,所有的接收节点同步于该帧起始位。在CAN通讯中,低电平代表的是显性电平,高电平代表的是隐形电平,所以一个显性电平的发出也代表着一帧信号的开始。

(2)仲裁段

对于标准帧来说,仲裁段包含的部分是:IDRTR

对于扩展帧来说,仲裁段包含的部分是:IDSRRIDERTR

仲裁机制:决定哪条信号可以发,哪条可以不发,因为只有一条CAN总线,所以同一时刻只能发送一帧信息。

依据:根据信号的ID,总线会对ID进行逐位的比较

结果:显性电平胜出,隐形电平退出发送

注:CANID值越小,优先级越高,仲裁机制对于标准帧和扩展帧是一样的,仲裁段中的RTR是为了区分数据帧和远程帧,当RTR为显性电平时代表数据帧,当RTR为隐形电平时代表远程帧。

RTR也在仲裁段中,就会和信号的优先级有关系,如果在一帧消息中,ID是完全一样的,到了RTR位,数据帧是显性的,就优先于远程帧。

IDE既存在于标准帧的控制段又存在于扩展帧的仲裁段,在这两个帧的相对位置是一样的,都是第13位,所以在一个网络中既存在标准帧又存在扩展帧,并且这两个帧类型的ID是一致的,那么标准数据帧的优先级高于扩展数据帧,因为仲裁到第13位的时候,标准帧的IDE为显性电平,扩展帧的IDE为隐性电平。

SRR作用是在同样的位置替代远程请求帧的RTR。

(3)控制段

标准帧和扩展帧的控制段长度都是6位,在标准帧中的控制端包含IDE,保留位r0以及数据长度DLC

在扩展帧中的控制段包含保留位r0r1以及数据长度DLC

保留位暂时没有别的用途,一般都用于隐性位填充,DLC代表下一个部分数据段的长度,从编码规则上来说是BCD编码,可以表示的长度范围是0-8

(4)数据段

根据需要传输的数据长度传输相应的字节,每次传输最多只有8个字节,现在好像可以传输64个字节。

(5)CRC段

对这一帧信号中前面的部分进行校验,以保证数据传输的正确性,校验的部分包括:帧起始、仲裁段、控制段、数据段。

发送节点在发送数据时会把计算的校验值写到CRC段,接收节点在接收数据时,会在接收节点以同样的CRC校验方式进行计算,然后用自己的计算结果与接收到的计算结果进行对比,以判断数据在传输过程中是否出现了位丢失或者其他位错误的情况。

(6)ACK段

ACK段和CRC段是相关的,CRC校验结果没有问题的话,接收节点会在总线发送一个显性电平,最终总线的电平状态是显性电平。

(7)帧结束

和帧起始相呼应,帧结束是由七个连续的隐性电平组成,在各种类型的CAN帧中,不管是数据帧还是远程帧还是扩展帧,都包含相同的帧起始和帧结束。

注:百度收集汇总,并非原创

#通信硬件人笔面经互助##嵌入式软件技能##嵌入式#
嵌入式学习免费专栏 文章被收录于专栏

分享嵌入式软件开发相关资料,专栏永久免费,嵌入式学习技术交流

全部评论
写的好全哦
1 回复
分享
发布于 04-11 14:56 浙江
收下
点赞 回复
分享
发布于 04-12 11:56 湖北
滴滴
校招火热招聘中
官网直投

相关推荐

10 86 评论
分享
牛客网
牛客企业服务