(本文来源于网络整理)
串口通信基本原理
1. 处理器与外部设置通信的基本方式
- 并行通信:数据各个位同时传输
- 串行通信:数据按位顺序传输
解释:1. 串行通信(Serial Communication): 串行通信是一种逐位传输数据的通信方式,数据按照顺序一个一个的传输。在串行通信中,数据位通过同一个信道传输,因此只需要一对传输线(通常为发送线和接收线)。由于数据是逐位传输的,串行通信相对较慢,但它具有传输距离较远、传输线较少的优点。常见的串行通信协议有UART(通用异步收发传输)、USB(通用串行总线)等。(只能一个发一个收)。
串行通信示意图:
1 0 1 0 1 1 0 0
^ ^ ^ ^ ^ ^ ^ ^ ^
| | | | | | | | |
| | | | | | | | --- Start Bit (起始位)
| | | | | | | ------- Data Bits (数据位)
| | | | | ----------- Parity Bit (奇偶校验位,可选)
| | | | ------------- Stop Bit (停止位)
| | ----------------- Space (空闲状态)
| ------------------- Space (空闲状态)
--------------------- Space (空闲状态)
2. 并行通信(Parallel Communication): 并行通信是一种同时传输多个数据位的通信方式。在并行通信中,每个数据位都通过一个独立的信道进行传输,因此需要多对传输线。由于数据同时传输,因此并行通信速度相对较快,但随着数据位数增加,所需的传输线也会相应增多,增加了复杂性和成本。
并行通信示意图:
Data bit 1: 1 0 1 0
Data bit 2: 0 1 1 0
Data bit 3: 1 0 0 1
Data bit 4: 0 1 0 1
^ ^ ^ ^
| | | |
| | | --- Data Bits (数据位)
| | ------- Data Bits (数据位)
| --------- Data Bits (数据位)
------------- Data Bits (数据位)
在串行通信中,按照数据的传输方向,又分为:
单工:数据传输只支持在一个方向传输
半双工:允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信
全双工:允许数据在俩个方向上传输,因此,全双工是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力
2、串行通信的通信方式
- 同步通信:带时钟同步信号传输
SPI、IIC通信 - 异步通信:不带时钟同步信号
UART(通用异步收发器)、单总线 - USART:通用同步异步收发器
3、常见串行通信接口
STM32串口常用寄存器和库函数
1、常用的串口相关寄存器
- USART_SR:状态寄存器
- USART_DR:数据寄存器
- USART_BRR:波特率寄存器
2、波特率计算方法
iic通信基本原理
I2C总线介绍
I2C(Inter-Integrated Circuit)总线(也称IIC或I2C)是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备,是微电子通信控制领域广泛采用的一种总线标准。它是同步通信的一种特殊形式,具有接口线少,控制方式简单,期间封装形式少,通信速率高等优点。
I2C总线特征
两条总线线路:一条串行数据SDA,一条串行时钟线SCL来完成数据的传输及外围器件的扩展
I2C总线上的每一个设备都可以作为主设备或者从设备,而且每一个设备都会对应一个唯一的地址
I2C总线数据传输速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下
可达3.4Mbit/s。一般通过I2C总线接口可编程时钟来实现传输速率的调整,同时也跟所接的上拉电阻的阻值有关。
I2C总线上的主设备与从设备之间以字节(8位)为单位进行单双工的数据传输
I2C总线物理·拓扑结构
I2C 总线在物理连接上分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成。通信原理是通过对SCL和SDA线高低电平时序的控制,来产生I2C总线协议所需要的信号进行数据的传递。在总线空闲状态时,这两根线一般被上面所接的上拉电阻拉高,保持着高电平。
补充这儿插入一句
一根线上的信号形式共计四种0、1、下降沿、上升沿。(这里面是开漏模式,接上拉电阻,开漏就是高电平1,如果不明白可以忽略括号里面的内容),因此两根信号线之间共有4*4=16种表达方式。
通信协议
我们需要的就是这16个不同的形式来规定IIC通信协议。
简单来说,一个通信协议,最基本也要包括以下几个基础的内容:
空闲状态
起始信号和停止信号
应答信号
数据的有效性(如何确保信号正确)
数据传输
1、空闲、起始、停止
空闲: 当SCL和SDA均为高电平时候,表示为空闲。意义为:当前设备均为空闲状态,允许你开始传输数据,只有空闲时,起始信号才会被读取。
起始信号: SCL仍表达为高电平,突然,SDA变为0,产生了一个下降沿,此时就表示产生起始信号。意义为:主机要开始发送信息,所有从机做好准备(有些从机空闲时待机模式,所以来个起始信号提醒一下(暂且这么理解))。
停止信号: 数据传输结束,需要告诉从机,“要停止传输数据了”。这时,SCL设置为高电平、SDA设置为低电平,在SCL保持为高电平时间,SDA跳变为高,产生一个上升沿,此时就表示停止信号。意义为:信息传输结束,大家休息。
一旦起始条件产生,就进入了数据传输部分。数据传输时,数据传输和有效性如下图所示:
切记:数据传输过程是在起始信号后、停止信号前。因此,下表的电平信号需要在这二者中间才有效。
数据传输的基本规则:
1、时钟线SCL不断产生高低电平,从而产生通信时钟
2、数据线负责传输数据(也就是传输不同的高低电平信号)
明显的,从机想要收到信号,第一、从机需要记录一个一个电平信号;第二、需要给SDA时间去变换电平信号去表达正确的需要传输的电平信号。
数据传输
数据传输以字节为单位 , 主设备在SCL线上产生每个时钟脉冲的过程中将在SDA线上传输一个数据位,数据在时钟的高电平被采样,一个字节按数据位从高位到低位的顺序进行传输
主设备在传输有效数据之前 要先指定从设备的地址,一般为7位,然后再发生数据传输的方向位, 0表示主设备向从设备写数据,1表示主设备向从设备读数据
应答信号
接收数据的器件在接收到 8bit 数据后,向发送数据的器件发出低电平的应答信号,表示已收到数据。这个信号可以是主控器件发出,也可以是从动器件发出。总之,由接收数据的器件发出。
解释:IIC的应答信号:主机发送数据是以字节为单位发送的,也就8b。每当一个字节发送结束后,主机会释放控制权,让从机获得控制权,从机发送一个符号来表示应答ok。然后,从机释放控制权,主机继续发送下一字节的内容。
插入一句,什么叫控制权。IIC一共就两根线,SCL、SDA。其中从机是没有办法产生时钟信号的,因此控制权就只能通过SDA线交接。意思就是,谁使用SDA线传输数据,谁就有控制权。因此上面一句话,翻译过来就是:
每当一个字节发送结束后,主机会释放控制权(主机将SDA变为空闲,SDA设置为1就是空闲),让从机获得控制权(让从机可以在SDA线上输出电平),从机发送一个符号(发送一个低电平(因为主机释放后SDA是1,只能由从机变成0来表示从机收到信号))来表示应答ok。
工作原理:
- 传输开始(Start):主机发出开始信号来启动I2C传输。在传输开始之前,SCL(时钟线)和SDA(数据线)都应为高电平。当主机需要与从机通信时,它会将SDA从高电平拉低,同时保持SCL为高电平,从而产生一个开始信号。
- 从机地址传输:主机在传输开始后,发送从机的7位地址(第8位用于指示读写操作)到SDA线上。在发送地址期间,SCL线保持高电平,从机会在自己的地址匹配后,拉低SDA线的ACK(应答)位,表示地址接收成功。
- 数据传输:主机在发送从机地址后,继续发送数据帧到SDA线上,从机会拉低SDA线的ACK位来确认数据接收成功。在每传输一个数据字节后,主机会等待从机的ACK信号。
- 应答信号(ACK/NACK):在接收到主机发送的地址或数据后,从机必须发送一个ACK信号或NACK信号。ACK(应答)表示从机接收数据成功,而NACK(非应答)表示从机无法接收或接收错误。ACK由从机将SDA线拉低来表示,NACK则是将SDA线保持高电平。
- 传输结束(Stop):主机在完成数据传输后,发送停止信号来结束I2C传输。在传输结束之后,SCL和SDA都会被拉高,准备进行下一次通信。
应答信号对I2C通信的正确性非常重要。如果从机不能正确地发送ACK信号,主机就会知道有问题发生,并且可能中止数据传输。因此,I2C从机必须在接收地址或数据后及时产生正确的ACK信号,以确保通信的顺利进行。
在STM32微控制器中,软件I2C和硬件I2C是两种不同的实现方式
1.软件I2C: 软件I2C是通过GPIO引脚模拟I2C协议的实现方式。在软件I2C中,使用GPIO引脚模拟I2C的时序和协议,通过对引脚的读写操作来实现I2C的通信。由于软件I2C是通过软件实现的,因此它的时序可能受到处理器的影响,通信速率相对较低,但在某些情况下可能更加灵活和适应性强。窗体底端
2.硬件I2C: 硬件I2C是通过专门的硬件模块实现的,通常由I2C控制器和相关的引脚组成。硬件I2C具有专门的时序生成和处理机制,因此通信速率相对较快,并且对处理器的影响较小。硬件I2C通常具有更高的稳定性和可靠性,适用于高速数据传输和对时序要求严格的应用场景。
SPI通信原理
1、什么是SPI
SPI 协议是由摩托罗拉公司提出的通讯协议(Serial Peripheral Interface),即串行外围设备接口,是一种高速全双工的通信总线。它被广泛地使用在 ADC、LCD 等设备与 MCU 间, 要求通讯速率较高的场合。SPI接口是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省了空间,提供方便,主要应用在EEPROM,FLASH.实时时钟,AD转换器还有数字信号处理直接。此接口可以被配置成主模式,并为外部从设备提供通信时钟(SCK)。接口还能以多主配置方式工作。 它可用于多种用途,包括使用一条双向数据线的双线单工同步传输,还可使用CRC校验的可靠通信。
SPI 协议的物理层及协议层
SPI接口通讯一般使用 3 条总线及片选线,3 条总线分别为 SCK(时钟信号)、MOSI(主设备输出/从设备输入引脚)、MISO(主设备输入/从设备输出引脚),及CS(从设备片选信号)。
MISO: 主设备输入/从设备输出引脚。该引脚在从模式下发送数据,在主模式下接收数据。
MOSI: 主设备输出/从设备输入引脚。该引脚在主模式下发送数据,在从模式下接收数据。
SCLK:串行时钟信号,用于通讯数据同步,由主设备产生,用于同步主设备和从设备的数据传输速率。
CS/SS:从设备片选信号,由主设备控制。它的功能是用来作为“片选引脚”,也就是选择指定的从设备,让主设备可以单独地与特定从设备通讯,避免数据线上的冲突。 (SPI内部结构简明图)
2、SPI工作原理
1、原理
SPI是通信协议,意味着总线中的只有一支中心设备能发起通信。当SPI主设备想读/写[从设备]时,它首先拉低[从设备]对应的SS线(SS是低电平有效),接着开始发送工作脉冲到时钟线上,在相应的脉冲时间上,[主设备]把信号发到MOSI实现“写”,同时可对MISO采样而实现“读”。
工作原理
拉低对应SS信号线,表示与该设备进行通信
主机通过发送SCLK时钟信号,来告诉从机写数据或者读数据,这里的SCLK时钟信号可以高电平有效也可以低电平有效,SPI组成有四种模式。(时钟的极性与相位)
主机(Master)将要发送的数据写到发送数据缓存区(Menory),缓存区经过移位寄存器(0~7),串行移位寄存器通过MOSI信号线将字节一位一位的移出去传送给从机,同时MISO接口接收到的数据经过移位寄存器一位一位的移到接收缓存区。
从机(Slave)也将自己的串行移位寄存器(0~7)中的内容通过MISO信号线返回给主机。同时通过MOSI信号线接收主机发送的数据,这样,两个移位寄存器中的内容就被交换。
外设的读写操作同步完成,只进行写操作,则忽略读操作;主机只进行从机的读操作,则主机须发送一个空字节给从机引发传输。
2、从设备引脚管理(NSS)
①软件模式:
可以设置SPI_CR1寄存器的SSM位来使能这种模式,在这种模式下NSS引脚可以用作它用,而内部NSS信号电平可以通过写SPI_CR1的SSI位来驱动。
②硬件模式:
第一种情况:NSS输出使能,当STM32工作为SPI模式的时,NSS输出已经通过 SPI_CR2寄存器的SSOE位使能,这时NSS引脚被拉低,所有NSS引脚与这个主SPI的 NSS引脚相连并配置为硬件NSS的SPI设备,将自动变成从的SPI设备。
第二种情况:NSS输出被关闭:允许操作于多主环境。
3、时钟信号的极性和相位
SPI_CR寄存器的CPOL位(时钟极性)和CPHA位(时钟相位)
SPI通信有能够组合成4种可能的时序关系,不同的从设备可能在出厂是就是配置为某种模式,这是不能改变的;但我们的通信双方必须是工作在同一模式下,所以我们可以对我们的主设备的SPI模式进行配置,通过CPOL(时钟极性)和CPHA(时钟相位)来控制我们主设备的通信模式,具体如下:
时钟极性(CPOL)定义了时钟空闲状态电平,时钟相位(CPHA)定义数据的采集时间。
(CPOL=1,SCLK=0有效SCLK=1为空闲,当CPOL=0,SCLK=1有效SCLK=0为空闲)
CPHA=1,在时钟的第二个跳变沿(上升沿或下降沿)进行数据采样,在第1个边沿发送数据CPHA=0,在时钟的第一个跳变沿(上升沿或下降沿)进行数据采样,在第2个边沿发送数据
所以当CPOL=1,表示当空闲状态SCLK=1时,它的有效状态就是SCLK处于低电平时,反之亦然。
而我们一般用的都是CPHA=1,CPOL=1时,此时空闲状态SCLK处于高电平,在第一个边沿触发(下降沿)时数据发送,在上升沿时进行数据采集。
解释:
SPI通信是基于时钟信号(SCLK)进行数据传输的同步通信协议。数据传输和采样是在SCLK的边沿上进行的。
在SPI通信中,时钟极性(CPOL)和时钟相位(CPHA)是用于控制SPI时钟信号的两个参数。它们决定了数据的传输时钟信号的起始状态和时钟沿的边沿触发时机。
- CPOL(Clock Polarity)时钟极性:
- 当CPOL=0时,SCLK空闲状态为低电平(SCLK=0)。
- 当CPOL=1时,SCLK空闲状态为高电平(SCLK=1)。
- CPHA(Clock Phase)时钟相位:
- 当CPHA=0时,数据在第一个时钟边沿(上升沿)之前被采样,数据传输在时钟信号的第一个边沿开始。
- 当CPHA=1时,数据在第一个时钟边沿(下降沿)之后被采样,数据传输在时钟信号的第二个边沿开始。
这些参数的不同组合产生四种SPI时序模式,通常用CPOL和CPHA的组合来标识时序模式。
下面来解释CPOL和CPHA对SPI时钟信号的影响:
- 当CPOL=0时(SCLK空闲状态为低电平):
- CPHA=0时:数据在SCLK上升沿(从低到高)时采样,数据传输在SCLK的下降沿(从高到低)开始。
- CPHA=1时:数据在SCLK下降沿(从高到低)时采样,数据传输在SCLK的上升沿(从低到高)开始。
- 当CPOL=1时(SCLK空闲状态为高电平):
- CPHA=0时:数据在SCLK下降沿(从高到低)时采样,数据传输在SCLK的上升沿(从低到高)开始。
- CPHA=1时:数据在SCLK上升沿(从低到高)时采样,数据传输在SCLK的下降沿(从高到低)开始。
选择正确的CPOL和CPHA组合很重要,以确保主设备和从设备之间的数据传输同步。通常,在通信时,主设备和从设备必须使用相同的CPOL和CPHA设置,以确保数据的正确传输。
例如,如果主设备使用CPOL=0,CPHA=0,则从设备也必须使用CPOL=0,CPHA=0才能正确地进行数据传输。不同的设置可能导致数据采样时机的不同,从而导致通信错误。
注意;UART发送数据是低位先发,I2C和SPI是高位先发。
SPI主机发送数据后无需应答,I2C是主机发送数据后等待应答才能进行下一步
SPI主机在SCL第一个下降沿或上升沿发数据,从机第二个上升沿或下降沿接收数据。
八个时钟周期(一个上升沿和一个下降沿为一周期)发送一位数据。
在I2C协议规定,空闲时候SCL和SDA处于高电平,发数据的时候SCL是低电平,接数据的时候SCL是高电平。
3、SPI通信的原理:
- 主设备通过产生SCLK时钟信号来控制通信的时序。通常在空闲状态下,SCLK为低电平。当通信开始时,主设备将SCLK设置为高电平,并开始传输数据。
- 主设备选择要与之通信的从设备,通过将SS/CS信号设置为低电平来选择特定的从设备。此时,该从设备会响应通信。
- 主设备通过MOSI线向从设备发送数据。每个时钟周期,主设备在上升沿或下降沿将一个位发送到MOSI线上。
- 从设备通过MISO线向主设备返回数据。同样,每个时钟周期,从设备在上升沿或下降沿将一个位发送到MISO线上。
- 通信完成后,主设备将SS/CS信号设置为高电平,表示通信结束,从设备进入空闲状态。
SPI通信是全双工的,意味着在同一时钟周期内,数据可以在MOSI和MISO线上传输。由于SPI使用同步时钟信号,通信速度较快,适用于高速数据传输和对时序要求严格的应用。SPI通信协议相对简单,易于实现,因此在许多嵌入式系统中被广泛使用。
CAN通信原理
1.CAN通信简介
CAN是Controller Area Network(控制器局域网络)的缩写,是ISO国际标准化组织的异步串行通信协议。由德国电气商博世公司在1986 年率先提出。此后,CAN 通过ISO11898 及ISO11519 进行了标准化。现在在欧洲已是汽车网络的标准协议。
CAN协议经过ISO标准化后有两个标准:ISO11898标准和ISO11519-2标准。其中ISO11898是针对通信速率为125Kbps~1Mbps的高速通信标准,而ISO11519-2是针对通信速率为125Kbps以下的低速通信标准。
ISO11519定义了通信速率为10~125Kbps的低速CAN通信标准,属于开环总线,传输速率为40Kbps时,总线长度可达1000米;
ISO11898定义了通信速率为125Kbps~1 Mbps的高速CAN通信标准,属于闭环总线,传输速率可达1Mbps,总线长度≤40米;
CAN具有很高的可靠性,广泛应用于:汽车电子、工业自动化、船舶、医疗设备、工业设备等方面。
低速CAN的拓扑结构图
低速CAN总线为开环,基于ISO11519标准的低速CAN,是一个“开环网络”,每根总线上个串联一个2.2KΩ的电阻;
高速CAN的拓扑结构图:基于ISO11898标准的高速CAN,是一个“闭环网络”,总线的两端各需串联一个120Ω的电阻用于阻抗匹配,以减少回波反射。
低速CAN总线为开环,高速CAN总线为闭环,总线由CAN_H和CAN_L两根线组成,总线上可以挂多个节点设备。每个节点设备由CAN控制器和CAN收发器组成,CAN控制器通常作为外设集成在MPU/MCU上,而CAN收发器则需要外围添加芯片电路。
类似RS485,CAN也使用差分信号传输数据。CAN总线使用CAN_H和CAN_L的电位差来表示数据电平。电位差分为显性电平和隐性电平,分别表示逻辑0和1
下面两图是低速CAN(ISO11519标准)的电平定义和高速CAN(ISO11898标准)的电平定义,两者物理层电气特性不一样,因此不能将它们连接在一起。可以看到当CAN_H和CAN_L电压相近,则表示隐性电平,对应逻辑1,当两个电压相差较大,表示显性电平,对应逻辑0。
CAN是一种基于消息广播模式的串行通信总线,即在同一时刻网络上所有节点监测到的数据是一致的,各节点根据报文ID来甄别是否是发给自己的报文。
CAN总线以“帧”(Frame)的形式进行通信。CAN 总线协议规定了5种帧,分别是数据帧、远程帧、错误帧、超载帧以及帧间隔,其中数据帧最常用,下表是各个帧的用途。
- 数据帧(Data Frame):
- 含义:数据帧是CAN通信中用于传输实际数据的帧类型。数据帧由帧标识符、数据字段、控制字段和CRC校验组成。发送方节点将数据存储在数据字段中,并通过CAN总线发送给接收方节点。
- 原理:数据帧用于实际的数据传输,其中包含发送方节点要传输给接收方节点的有效信息。
- 远程帧(Remote Frame):
- 含义:远程帧用于请求其他节点发送数据,它类似于一种查询命令。远程帧不包含实际的数据,只包含一个标识符和远程帧标志位。接收方节点会根据标识符的匹配来发送相应的数据。
- 原理:远程帧是发送方节点向接收方节点发出的请求,接收方节点会以数据帧的形式回复相应的数据。
- 错误帧(Error Frame):
- 含义:错误帧用于表示在CAN通信中发生了错误。当CAN节点检测到错误时,会产生错误帧,从而通知其他节点发生了错误。
- 原理:错误帧通常由错误状态标志位和错误标识符组成,其中错误状态标志位用于指示错误的类型,例如位错误、帧错误等。
- 超载帧(Overload Frame):
- 含义:超载帧用于指示总线上出现了拥塞或超载的情况。当总线上的数据量过多或发生拥塞时,节点可以发送超载帧来通知其他节点需要降低发送速率。
- 原理:超载帧的发送是一种主动管理总线负载的方法,节点可以根据总线的状况来发送超载帧,从而避免数据碰撞和通信错误。
- 帧间隔(Interframe Space):
- 含义:帧间隔是两个连续帧之间的时间间隔。在CAN通信中,每个帧之间都有一段时间间隔,用于分隔不同的帧,以便接收方节点正确解析和处理每个帧。
这些帧类型在CAN通信中起着不同的作用,例如数据帧用于传输实际数据,远程帧用于请求数据,错误帧用于指示错误情况,超载帧用于管理总线负载,而帧间隔用于分隔不同的帧,保证通信的可靠性。在CAN通信协议中,它们相互协作,共同实现高效、可靠的数据通信。
数据帧解释:
数据帧以一个显性位(逻辑0)开始,以7个连续的隐性位(逻辑1)结束,之间分为仲裁段、控制段、数据段、CRC段和ACK段。
(1)起始段
标准帧和扩展帧都是由1个位的显性电平(CANH为高电平,CANL为低电平)表示帧起始。
(2)仲裁段
仲裁段的内容主要为本数据帧的ID信息。数据帧分为标准格式和扩展格式两种,区别就在于ID信息的长度,标准格式的ID为11位,扩展格式的ID为29位。
在CAN协议中,ID起着重要的作用,它决定者数据帧发送的优先级,也决定着其他设备是否会接收这个数据帧。CAN协议不对挂在它之上的设备分配优先级,对总线的占有权是由信息的重要性决定的,即对于重要的信息,我们会给它打包上一个优先级高的ID.使它能够及时地发送出去。也正因为它这样的优先级分配原则,使得CAN的扩展性大大加强,在总线上增加或减少节点并不影响其他设备。
报文的优先级,是通过对ID的仲裁确定的。前面对物理层的分析我们知道,如果总线上同时出现显性电平和隐性电平,总线的状态会被置为显性电平,优先级的仲裁就根据这个特性实现的。若两个节点同时竞争CAN总线的占有权,在它们发送报文时,若首先出现隐性电平,则会失去对总线的占有权,进入接收状态。
仲裁段ID的优先级也影响着接收设备对报文的反应。因为在CAN总线上数据是以广播的形式发送的,所有连接在CAN总线的节点都会收到所有其他节点发出的有效数据,因而我们的CAN控制器大多具有根据ID过滤报文的功能,即只接收某些ID的报文。
仲裁段除了报文ID外,还有RTR、IDE、SRR位。其中RTR (Remote Transmission Request)位是用于区分数据帧和遥控帧的,在数据帧里这一位为显性 (逻辑0)。IDE (Idenifier Extension)位是用于区分标准格式与扩展格式的,在标准格式中为显性,在扩展格式里为隐性。SRR (SubstituteRemote Request)位只存在于扩展格式,它用于替代标准格式中的RTR位。SRR位为隐性位,由于RTR在数据帧为显性位,所以在两个ID相同的标准格式报文与扩展格式报文中,标准格式的优先级较高。
(3)控制段
在控制段中的r1和0为保留位,默认设置为显性位。最主要的为DLC段,DLC段由4位组成,MSB先行,它的二进制编码用于表示本报文中的数据段含有多少个字节,DLC段表示的数字为0一8。(注:MSB先行指数据的最高有效位(即最高位)首先被传输,然后是次高位,依此类推,直到传输完所有数据位。)
(4)数据段
数据段为数据帧的核心内容,它由0~ 8个字节组成,MSB先行。
(5)CRC段
为了保证报文的正确传输,CAN的报文包含了一段15位的CRC校验码,一旦接收端计算出的CRC码跟接收到的CRC码不同,则会向发送端反馈出错信息以及重新发送。CRC部分的计算和出错处理L般由 CAN控制器硬件完成或由软件控制最大重发数。
在CRC校验码之后,有一个CRC界定符,它为隐性位,主要作用是把CRC校验码与后面的ACK段隔开。
(6) ACK段
ACK段包括一个ACK槽位和ACK界定符位。在ACK槽位中,发送端发送的为隐性位,而接收端在这一位中发送显性位以示应答。在ACK槽和帧结束之间由ACK界定符隔开。
(7)帧结束段
帧结束段由发送端发送7个隐性位表示结束。
6.仲裁过程
只要总线空闲,总线上任何节点都可以发送报文,如果有两个或两个以上的节点开始传送报文,那么就会存在总线访问冲突的可能。但是CAN使用了标识符的逐位仲裁方法可以解决这个问题。
CAN总线控制器在发送数据的同时监控总线电平,如果电平不同,则停止发送并做其他处理。如果该位位于仲裁段,则退出总线竞争;如果位于其他段,则产生错误事件。
帧ID越小,优先级越高。由于数据帧的RTR位为显性电平,远程帧为隐性电平,所以帧格式和帧ID相同的情况下,数据帧优先于远程帧;由于标准帧的IDE位为显性电平,扩展帧的IDE位为隐形电平,对于前11位ID相同的标准帧和扩展帧,标准帧优先级比扩展帧高。
2、位同步
由于CAN没有时钟信号线,而且它的报文中并没有包含用于同步的标志,所以要使用位同步的方式来确保通信时序,以及对总线的电平进行正确采样。
- 位时序分解
为了实现位同步,CAN协议把每位的时序分解成同步段(SS)、传播时间段(PTS)、相位缓冲段1(PBS1)和相位缓冲段(PBS2),这四段的长度加起来即为一个CAN数据位的长度;分解后最小的时间单位是Tq,1 位分为4 个段,每个段又由若干个Tq 构成,而一个完整的位由8 ~ 25个Tq组成。
每位中的各段作用如下:
1)ss段(SYNC SEG),译为同步段,若总线的跳变沿被包含在SS段的范围之内,则表示节点与总线的时序同步。节点与总线同步时,采样点采集到的总线电平即可被确定为该位的电平。如当总线上出现帧起始信号(SOF) 时,其他节点上的控制器根据总线上的这个下降沿,对自己的位时序进行调整,把该下降沿包含到ss段内,这样根据起始帧来进行同步的方式称为硬同步。其中SS段的大小为1Tq。
2)PTS段(PROPSEG),译为传播时间段,这个时间段用于补偿网络的物理延时时间,是总线上输入比较器延时和输出驱动器延时总和的两倍。PTS 段的大小为1一8Tq。
3)PBS1段(PHASE SEG1),译为相位缓冲段1,主要用来补偿边沿阶段的误差,它的时间长度在重新同步的时候可以加长。PBSI段的初始大小可以为1一8 Tq。
4)PBS2段(PHASE SEG2),这是相位缓冲段2,也是用来补偿边沿阶段误差的,它的时间长度在重新同步时可以缩短。PBS2段的初始大小可以为2~8Tq。
在重新同步的时候,PBS1和PBS2段的允许加长或缩短的时间长度定义为;重新同步补偿宽度(reSynchronization Jump Width, SJW)。
3、CAN发送流程
程序选择1个空置的邮箱(TME=1)→设置标识符(ID),数据长度和发送数据→设置CAN_TIxR的TXRQ位为1,请求发送→邮箱挂号(等待成为最高优先级)→预定发送(等待总线空闲)→发送→邮箱空置。
4、CAN接收流程
FIFO空→收到有效报文→挂号_1(存入FIFO的一个邮箱,这个由硬件控制,我们不需要理会)→收到有效报文→挂号_2→收到有效报文→挂号_3→收到有效报文→溢出。
注:报文FIFO具有锁定功能(由CAN_MCR,RFLM位控制),锁定后,新数据将丢弃,不锁定则新数据将替代老数据
7.CAN常用寄存器
(1)主控制寄存器(CAN_MCR)
(2)位时序寄存器(CAN_BTR)
(3)接收FIFO寄存器(CAN_RF0R/CAN_RF1R)
(4)发送邮箱标识符寄存器(CAN_TIxR)(x=0~2)
(5)发送邮箱数据长度和时间戳寄存器 (CAN_TDTxR)(x=0~2)
(6)发送邮箱数据寄存器(CAN_TDLxR/CAN_TDHxR)(x=0~2)
(7)接收FIFO邮箱标识符寄存器(CAN_RIxR)(x=0/1)
(8)接收FIFO邮箱数据长度和时间戳寄存器(CAN_RDTxR) (x=0/1)
(9)接收FIFO邮箱数据寄存器(CAN_RDLxR/CAN_RDHxR) (x=0/1)
(10)筛选器模式寄存器(CAN_FM1R)
(11)筛选器尺度寄存器(CAN_FS1R)
(12)筛选器FIFO关联寄存器(CAN_FFA1R)
(13)筛选器激活寄存器(CAN_FA1R)
(14)N筛选器组i寄存器x(CAN_FiRx)(i=0~27,x=1/2)
三、STM32CAN库函数配置
1.配置相关引脚的复用功能,使能CAN时钟。
要用CAN,先要使能CAN的时钟,CAN的时钟通过APB1ENR的第25位来设置。其次要设置CAN的相关引脚为复用输出,
2.设置CAN工作模式及波特率等。
通过先设置CAN_MCR寄存器的INRQ位,让CAN进入初始化模式,然后设置CAN_MCR的其他相关控制位。再通过CAN_BTR设置波特率和工作模式(正常模式/环回模式)等信息。 最后设置INRQ为0,退出初始化模式。
3.设置滤波器。
先设置CAN_FMR的FINIT位,进入初始化模式,然后设置筛选器组的工作模式以及标识符ID和屏蔽位。最后激活筛选器,并退出初始化模式。