CAN通信入门-2
初始化代码调试
1、使用芯片为GD32F303C8T6芯片。
2、使用STM32CUBEMX进行代码生成的时候使用STM32F103系列生成代码。
3、代码生成后,需要修改HAL库代码用来适配GD32F303的芯片。参考:修改说明
测试代码
初始化代码(发送部分)
hcan.Instance = CAN1;
hcan.Init.Prescaler = 16;
hcan.Init.Mode = CAN_MODE_NORMAL;
hcan.Init.SyncJumpWidth = CAN_SJW_4TQ;
hcan.Init.TimeSeg1 = CAN_BS1_9TQ;
hcan.Init.TimeSeg2 = CAN_BS2_8TQ;
hcan.Init.TimeTriggeredMode = DISABLE;
hcan.Init.AutoBusOff = DISABLE;
hcan.Init.AutoWakeUp = DISABLE;
hcan.Init.AutoRetransmission = DISABLE;
hcan.Init.ReceiveFifoLocked = DISABLE;
hcan.Init.TransmitFifoPriority = DISABLE;
if (HAL_CAN_Init(&hcan) != HAL_OK)
{
Error_Handler();
}
HAL_CAN_Start(&hcan); //初始化完成后必须开启外设
发送代码
发送部分代码,一次只能发送8个字节的数据。
//can发送一组数据(固定格式:ID为0X12,标准帧,数据帧)
//len:数据长度(最大为8)
//msg:数据指针,最大为8个字节.
//返回值:0,成功;
// 其他,失败;
uint8_t CAN1_Send_Msg(uint8_t* msg,uint8_t len)
{
uint16_t i=0;
uint32_t mbox = 1;
CAN1_TxMsg.StdId = 0x123; //标准模式下的ID
CAN1_TxMsg.ExtId = 0x12; //扩展模式下的ID
CAN1_TxMsg.IDE = CAN_ID_STD; //设备处于标准模式
CAN1_TxMsg.RTR = CAN_RTR_DATA; //设备传输数据帧
CAN1_TxMsg.DLC = len; //要传输数据的长度
CAN1_TxMsg.TransmitGlobalTime = DISABLE;
HAL_CAN_AddTxMessage(&hcan,&CAN1_TxMsg,msg,&mbox);
return 0;
}
接收部分初始化
关于滤波标识符设置的说明
sFilterConfig.FilterBank = 0; //开启对应的滤波器编号
sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; //过滤模式,列表或者屏蔽模式
sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; //设置滤波器的位宽
sFilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO0; //设置对应的FIFO区域
sFilterConfig.FilterIdHigh = 0X0000; //需要过滤的ID号
sFilterConfig.FilterIdLow = 0X0066;
sFilterConfig.FilterMaskIdHigh = 0X0000; //先不要屏蔽的ID号
sFilterConfig.FilterMaskIdLow = 0X0000;
sFilterConfig.FilterActivation = ENABLE; //激活过滤器
sFilterConfig.SlaveStartFilterBank = 14; //
if (HAL_CAN_ConfigFilter(&hcan,&sFilterConfig) != HAL_OK)
{
Error_Handler();
}
接收部分代码
接收的部分代码单次能接收到8个字节的数据。
uint8_t CAN_DATA_GET(void)
{
CAN_RxHeaderTypeDef pHeader;
uint8_t data[64],i;
if(HAL_CAN_GetRxMessage(&hcan,CAN_FILTER_FIFO0,&pHeader,data) == HAL_OK)
{
for(i=0;i<pHeader.DLC;i++)
printf("%c",data[i]);
printf("\r\n");
}
}