基于STM32的HAL库学习(3)CAN 是Controller Area Network控制局域网-TJA1050

1 .波特率计算方法:

BaudRate=APB1CLK/分频系数/(1+BS1+BS2).
此处:36M/12/(1+3+2)=500k.
基于STM32的HAL库学习(3)CAN 是Controller Area Network控制局域网-TJA1050_第1张图片

2. MCU Specific Package 单片机的具体方案,常见的MSP是指和MCU相关的初始化。

3.CAN标准标识符 0到0x7FF,扩展标识符0到0x3FFFF.CAN 控制器根据两根线上的电位差来判断总线电平。总线电平分为显性电平和隐性电平,显性为0,隐性为1,总线是:与的关系,所以显性具有优先性,显性强于隐性。发送方通过使总线电平发生变化,将消息发送给接收方。

4.FIFO存储器,一种先进先出的双口数据缓存器,其中一个输入口,另一个口是输出口。First In First Out,相比于普通存储器优点是没有外部读写地址线,使用简单;缺点是只能顺序写入,顺序读出。其数据地址由内部读写指针自动加1完成,并非普通存储器那样由地址线决定读取或写入某个指定的地址。

5.CAN总线的协议、帧的结构、相关的时序即差分信号的仲裁//CAN mode:CAN_Mode_Normal,普通模式;CAN_Mode_LoopBack,回环模式;

6.CAN特点:

6.1) 多主控制。在总线空闲时,所有单元都可以发送消息(多主控制),而两个以上的单元同时开始发送消息时,根据标识符(Identifier 以下称为 ID)决定优先级。ID 并不是表示发送的目的地址,而是表示访问总线的消息的优先级。两个以上的单元同时开始发送消息时,对各消息 ID 的每个位进行逐个仲裁比较。仲裁获胜(被判定为优先级最高)的单元可继续发送消息,仲裁失利的单元则立刻停止发送而进行接收工作。

6.2) 系统的柔软性。与总线相连的单元没有类似于“地址”的信息。因此在总线上增加单元时,连接在总线上的其它单元的软硬件及应用层都不需要改变。

6.3) 通信速度较快,通信距离远。最高 1Mbps(距离小于 40M),最远可达 10KM(速率低于 5Kbps)。

6.4) 具有错误检测、错误通知和错误恢复功能。所有单元都可以检测错误(错误检测功能),检测出错误的单元会立即同时通知其他所有单元(错误通知功能),正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送此消息直到成功发送为止(错误恢复功能)。

6.5) 故障封闭功能。CAN 可以判断出错误的类型是总线上暂时的数据错误(如外部噪声等)还是持续的数据错误(如单元内部故障、驱动器故障、断线等)。由此功能,当总线上发生持续数据错误时,可将引起此故障的单元从总线上隔离出去。

6.6) 连接节点多。CAN 总线是可同时连接多个单元的总线。可连接的单元总数理论上是没有限制的。但实际上可连接的单元数受总线上的时间延迟及电气负载的限制。降低通信速度,可连接的单元数增加;提高通信速度,则可连接的单元数减少。正是因为 CAN 协议的这些特点,使得 CAN 特别适合工业过程监控设备的互连,因此,越来越受到工业界的重视,并已公认为最有前途的现场总线之一。

6.7)CAN 协议经过 ISO 标准化后有两个标准:ISO11898 标准和 ISO11519-2 标准。其中 ISO11898是针对通信速率为 125Kbps~1Mbps 的高速通信标准,而 ISO11519-2 是针对通信速率为 125Kbps

7.CAN常见的数据帧

7.1数据帧、遥控帧、错误帧、过载帧、帧间隔,数据帧和遥控帧有标准格式和扩展格式两种格式。标准格式有 11 个位的标识符(ID),扩展格式有 29 个位的 ID。

| 帧类型| 帧用途|

| 数据帧 | 用于发送单元向接收单元传送数据的帧|
| 遥控帧 | 用于接收单元向具有相同 ID 的发送单元请求数据的帧|
| 错误帧 | 用于当检测出错误时向其它单元通知错误的帧|
| 过载帧 | 用于接收单元通知其尚未做好接收准备的帧|
| 间隔帧 | 用于将数据帧及遥控帧与前面的帧分离开来的帧|

7.2主要介绍数据帧:

(1) 帧起始。表示数据帧开始的段。
(2) 仲裁段。表示该帧优先级的段。
(3) 控制段。表示数据的字节数及保留位的段。
(4) 数据段。数据的内容,一帧可发送 0~8 个字节的数据。
(5) CRC 段。检查帧的传输错误的段。
(6) ACK 段。表示确认正常接收的段。
(7) 帧结束。表示数据帧结束的段。
图中 D 表示显性电平,R 表示隐形电平(下同)。

7.3帧起始,这个比较简单,标准帧和扩展帧都是由 1 个位的显性电平表示帧起始。仲裁段,表示数据优先级的段,标准帧和扩展帧格式在本段有所区别

基于STM32的HAL库学习(3)CAN 是Controller Area Network控制局域网-TJA1050_第2张图片

标准格式的 ID 有 11 个位。从 ID28 到 ID18 被依次发送。禁止高 7 位都为隐性(禁止设定:ID=1111111XXXX)。扩展格式的 ID 有 29 个位。基本 ID 从 ID28 到 ID18,扩展 ID 由ID17 到 ID0 表示。基本 ID 和标准格式的 ID 相同。禁止高 7 位都为隐性(禁止设定:基本ID=1111111XXXX)。其中 RTR 位用于标识是否是远程帧(0,数据帧;1,远程帧),IDE 位为标识符选择位(0,使用标准标识符;1,使用扩展标识符),SRR 位为代替远程请求位,为隐性位,它代替了标准帧中的 RTR 位。

7.4控制段,由 6 个位构成,表示数据段的字节数。标准帧和扩展帧的控制段稍有不同

基于STM32的HAL库学习(3)CAN 是Controller Area Network控制局域网-TJA1050_第3张图片

上图中,r0 和 r1 为保留位,必须全部以显性电平发送,但是接收端可以接收显性、隐性及任意组合的电平。DLC 段为数据长度表示段,高位在前,DLC 段有效值为 0~8,但是接收方接收到 9~15 的时候并不认为是错误。数据段,该段可包含 0~8 个字节的数据。从最高位(MSB)开始输出,标准帧和扩展帧在这个段的定义都是一样的。

基于STM32的HAL库学习(3)CAN 是Controller Area Network控制局域网-TJA1050_第4张图片

CRC 段,该段用于检查帧传输错误。由 15 个位的 CRC 顺序和 1 个位的 CRC 界定符(用于分隔的位)组成,标准帧和扩展帧在这个段的格式也是相同的。

基于STM32的HAL库学习(3)CAN 是Controller Area Network控制局域网-TJA1050_第5张图片

此段 CRC 的值计算范围包括:帧起始、仲裁段、控制段、数据段。接收方以同样的算法计算 CRC 值并进行比较,不一致时会通报错误。ACK 段,此段用来确认是否正常接收。由 ACK 槽(ACK Slot)和 ACK 界定符 2 个位组成。标准帧和扩展帧在这个段的格式也是相同的。

基于STM32的HAL库学习(3)CAN 是Controller Area Network控制局域网-TJA1050_第6张图片

发送单元的 ACK,发送 2 个位的隐性位,而接收到正确消息的单元在 ACK 槽(ACK Slot)发送显性位,通知发送单元正常接收结束,这个过程叫发送 ACK/返回 ACK。发送 ACK 的是在既不处于总线关闭态也不处于休眠态的所有接收单元中,接收到正常消息的单元(发送单元不发送 ACK)。所谓正常消息是指不含填充错误、格式错误、CRC 错误的消息。

帧结束,这个段也比较简单,标准帧和扩展帧在这个段格式一样,由 7 个位的隐性位组成。

8.由发送单元在非同步的情况下发送的每秒钟的位数称为位速率。一个位可分为 4 段。

同步段(SS)

传播时间段(PTS)

相位缓冲段 1(PBS1)

相位缓冲段 2(PBS2)

这些段又由可称为 Time Quantum(以下称为 Tq)的最小时间单位构成。1 位分为 4 个段,每个段又由若干个 Tq 构成,这称为位时序。1 位由多少个 Tq 构成、每个段又由多少个 Tq 构成等,可以任意设定位时序。通过设定位时序,多个单元可同时采样,也可任意设定采样点。

9 STM32 自带的是 bxCAN,即基本扩展 CAN。它支持 CAN 协议 2.0A 和 2.0B。它的设计目标是,以最小的 CPU 负荷来高效处理大量收到的报文。它也支持报文发送的优先级要求(优先级特性可软件配置)。

STM32 的 bxCAN 的主要特点有:
 支持 CAN 协议 2.0A 和 2.0B 主动模式
 波特率最高达 1Mbps
 支持时间触发通信
 具有 3 个发送邮箱
 具有 3 级深度的 2 个接收 FIFO
 可变的过滤器组(最多 28 个)

10CAN 发送流程为:程序选择 1 个空置的邮箱(TME=1)设置标识符(ID),数据长度和发送数据设置 CAN_TIxR 的 TXRQ 位为 1,请求发送邮箱挂号(等待成为最高优先级)预定发送(等待总线空闲)发送邮箱空置。

11.CAN 接收流程为:FIFO 空收到有效报文挂号_1(存入 FIFO 的一个邮箱,这个由硬件控制,我们不需要理会)收到有效报文挂号_2收到有效报文挂号_3收到有效报文溢出。

void MX_CAN_Init(void)
{

  hcan.Instance = CAN1;//CAN1
	/****************************
	   BaudRate=APB1CLK/分频系数/(1+BS1+BS2).
     此处:36M/12/(1+3+2)=500k.
	*****************************/
  hcan.Init.Prescaler = 12;//预分频器,指定时间长度在1~1024之间
  hcan.Init.Mode = CAN_MODE_NORMAL;//正常模式
  hcan.Init.SyncJumpWidth = CAN_SJW_1TQ;//重新同步跳跃宽度为个时间单位
  hcan.Init.TimeSeg1 = CAN_BS1_3TQ;//时间段 1 占用 3 个时间单位
  hcan.Init.TimeSeg2 = CAN_BS2_2TQ;//时间段 2 占用 2 个时间单位
  hcan.Init.TimeTriggeredMode = DISABLE;//禁用时间触发通信模式
  hcan.Init.AutoBusOff = DISABLE;//禁用总线自动关闭
  hcan.Init.AutoWakeUp = DISABLE;//禁用自动唤醒
  hcan.Init.AutoRetransmission = DISABLE;//禁用自动重传
  hcan.Init.ReceiveFifoLocked = DISABLE;//禁用接收自动锁定
  hcan.Init.TransmitFifoPriority = DISABLE;//禁用传输FIFO优先级
  if (HAL_CAN_Init(&hcan) != HAL_OK)
  {
    Error_Handler();
  }

}
void CAN1_Config(void)
{
	CAN_FilterTypeDef CAN_FilterType;
	CAN_FilterType.FilterBank=0;//设置过滤器0
	CAN_FilterType.FilterIdHigh = 0x0000;//32位ID高位,CAN_FilterIdHigh和CAN_FilterIdLow组合成一个32位寄存器,用来存储将要过滤的ID
	CAN_FilterType.FilterIdLow = 0x0000;//32位ID 地位
	CAN_FilterType.FilterMaskIdHigh= 0x0000;//32位MASK高位,CAN_FilterMaskIdHigh和CAN_FilterMaskIdLow组合成一个32位寄存器,用来表示这个ID的哪些位
	CAN_FilterType.FilterMaskIdLow = 0x0000;//32位MASK低位
	CAN_FilterType.FilterFIFOAssignment = CAN_RX_FIFO0;//FIFO0
	CAN_FilterType.FilterMode=CAN_FILTERMODE_IDMASK;///标识符屏蔽模式
	CAN_FilterType.FilterActivation = ENABLE;//激活过滤器0
	CAN_FilterType.FilterScale = CAN_FILTERSCALE_32BIT;//32位过滤器
	CAN_FilterType.SlaveStartFilterBank =14;//单CAN设置无用
	if(HAL_CAN_ConfigFilter(&hcan,&CAN_FilterType)!=HAL_OK)
	{
		Error_Handler();
	}
	if(HAL_CAN_ActivateNotification(&hcan,CAN_IT_RX_FIFO0_MSG_PENDING)!=HAL_OK)
	{
		Error_Handler();
	}
	if(HAL_CAN_Start(&hcan)!=HAL_OK)
	{
		Error_Handler();
	}
}

你可能感兴趣的:(电子相关,嵌入式软件)