配置接口
例程使用的是STM32F103C8T6
使用STM32CubeMX配置HAL的CAN
波特率的计算方式:
CAN波特率 = 总传输比特数 / 传输时间
CAN波特率 = CAN时钟 / ( (1 + CAN_BS1 + CAN_BS2) * CAN_Prescaler)
= 32M / ((1 + 1 + 2) * 8 ) = 1000000 bit / s
中断接收函数
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *h_can)
{
int i = 0;
uint8_t Data[8] = {0};
CAN_RxHeaderTypeDef RxMessage;
if (h_can == &hcan){
// 获得接收到的数据头和数据
if (HAL_CAN_GetRxMessage(&hcan, CAN_RX_FIFO0, &RxMessage, Data) == HAL_OK){
printf("\r\n################### CAN RECV ###################\r\n");
printf("STID:0x%X\r\n",RxMessage.StdId);
printf("EXID:0x%X\r\n",RxMessage.ExtId);
printf("DLC :%d\r\n", RxMessage.DLC);
// CAN_ID_STD 标准帧 或者 CAN_ID_EXT 扩展帧
printf("IDE :%d %d %d\r\n", RxMessage.IDE, CAN_ID_STD, CAN_ID_EXT);
// CAN_RTR_DATA 数据帧 或者 CAN_RTR_REMOTE 远程帧
printf("RTR :%d %d %d\r\n", RxMessage.RTR, CAN_RTR_DATA, CAN_RTR_REMOTE);
printf("DATA:");
for(i = 0; i < RxMessage.DLC; i++){
printf("0x%02X ", Data[i]);
}
printf("\r\n");
}
}
}
发送函数
// 透传数据格式
typedef struct _DataFormat{
uint8_t m_Mode; // 数据模式 (0:远程帧 1:数据帧)
uint8_t m_Type; // 帧类型 (0:标准数据帧 1:扩展数据帧)
uint32_t m_STID; // 标准数据帧 ID 范围 (0x0000 - 0x07FF)
uint32_t m_EXID; // 扩展数据帧 ID 范围 (0x0000_0000 - 0x1FFF_FFFF)
}DataFormat;
/**
* @brief CAN 发送数据
*
* @param m_DataFormat
* @param buff
* @param len
*/
void BatCanTxData(DataFormat m_DataFormat,uint8_t buff[], uint8_t len)
{
uint32_t TxMailbox;
CAN_TxHeaderTypeDef TxHeader;
// 标准数据帧 ID 范围 (0x0000 - 0x07FF) (要转为10进制)
TxHeader.StdId = m_DataFormat.m_STID;
// 扩展数据帧 ID 范围 (0x0000_0000 - 0x1FFF_FFFF) (要转为10进制)
TxHeader.ExtId = m_DataFormat.m_EXID;
// 帧类型 (0:标准数据帧 1:扩展数据帧)
if(m_DataFormat.m_Type == 0)
TxHeader.IDE = CAN_ID_STD; // 标准帧
else
TxHeader.IDE = CAN_ID_EXT; // 扩展帧
// 数据模式 (0:远程帧 1:数据帧)
if(m_DataFormat.m_Mode == 1)
TxHeader.RTR = CAN_RTR_DATA; // 数据帧
else
TxHeader.RTR = CAN_RTR_REMOTE; // 远程帧
TxHeader.DLC = len; // 帧长
TxHeader.TransmitGlobalTime = DISABLE;
HAL_StatusTypeDef state = HAL_CAN_AddTxMessage(
&hcan,
&TxHeader,
buff,
&TxMailbox
);
if(state != HAL_OK){
printf("[%s]:> Can1 Tx ERROR<%02X>!\r\n", __func__, state);
}
}