STM32标准帧和扩展帧的发送

说明

CAN2.0A是标准协议,而CAN2.0B是扩展协议(针对扩展帧)。标准帧的ID为11位,扩展帧的ID为11+18=29位。它们之间最大的区别就是帧ID变长了。

疑问

在stm32中标准帧和扩展帧是怎么发送的?它们之间是怎么判断区分的呢?

发送过程分析

can的发送数据一般设置如下:

CanTxMsg TxMessage;

TxMessage.StdId=StdId; // 保存标准帧ID

TxMessage.ExtId=ExtId; // 保存扩展帧ID

TxMessage.IDE=CAN_ID_EXT; // 判断标准帧/扩展帧标识

TxMessage.RTR=0; // 无关紧要

TxMessage.DLC=len; // 数据长度

在库函数中:

uint8_t CAN_Transmit(CAN_TypeDef* CANx, CanTxMsg* TxMessage)
{
	...
 /* Set up the Id */
 	if (TxMessage->IDE == CAN_Id_Standard)
 	{
		 assert_param(IS_CAN_STDID(TxMessage->StdId)); 	
		 CANx->sTxMailBox[transmit_mailbox].TIR |= ((TxMessage->StdId << 21) | \	
		 TxMessage->RTR);	
	 }	
	 else
	 {	
		 assert_param(IS_CAN_EXTID(TxMessage->ExtId));		
		 CANx->sTxMailBox[transmit_mailbox].TIR |= ((TxMessage->ExtId << 3) | \		
		 TxMessage->IDE | \		
		 TxMessage->RTR);	
	 }
}

从代码中可以看到是通过TxMessage->IDE == CAN_Id_Standard来判断发送标准帧呢还是扩展帧呢?

它们的定义如下:

#define CAN_Id_Standard             ((uint32_t)0x00000000)  /*!< Standard Id */

#define CAN_Id_Extended             ((uint32_t)0x00000004)  /*!< Extended Id */

所以如果想要发送标准帧TxMessage.IDE=CAN_Id_Standard;如果是想要发送扩展帧TxMessage.IDE=CAN_ID_EXT。