STM32标准帧和扩展帧的发送

STM32的CAN模块在发送标准帧和扩展帧时,通过设置TxMessage结构体的IDE字段来区分。当IDE设为CAN_Id_Standard时发送标准帧(11位ID),设为CAN_Id_Extended则发送扩展帧(29位ID)。在库函数CAN_Transmit中,根据IDE的值设置TIR寄存器,从而实现帧类型的判断和发送。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说明

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。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值