说明
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。