● 网络上任何一个节点在任何时候都可以发送数据;
● 多个节点发送数据,优先级低主动退出发送;
● 短帧结构,每帧数据信息为0~8字节(具体用户定义),对数据编码而不是地址编码;
● CAN每帧都有CRC校验和其他检验措施,严重错误的情况下具有自动关闭输出的功能。
● 数据帧:数据帧携带数据从发送器至接收器。
● 远程帧:总线单元发出远程帧,请求发送具有同一识别符的数据帧。
● 错误帧:任何单元检测到总线错误就发出错误帧。
● 帧间隔:数据帧(或远程帧)通过帧间空间与前述的各帧分开。
● 过载帧:过载帧用以在先行的和后续的数据帧(或远程帧)之间提供附加的延时。
//can滤波器配置函数
void CANFilter_Config(void)
{
CAN_FilterTypeDef sFilterConfig;
sFilterConfig.FilterBank = 0; //CAN过滤器编号,范围0-27
sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; //CAN过滤器模式,掩码模式或列表模式
sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; //CAN过滤器尺度,16位或32位
sFilterConfig.FilterIdHigh = 0x000 << 5; //32位下,存储要过滤ID的高16位
sFilterConfig.FilterIdLow = 0x0000; //32位下,存储要过滤ID的低16位
sFilterConfig.FilterMaskIdHigh = 0x0000; //掩码模式下,存储的是掩码
sFilterConfig.FilterMaskIdLow = 0x0000;
sFilterConfig.FilterFIFOAssignment = 0; //报文通过过滤器的匹配后,存储到哪个FIFO
sFilterConfig.FilterActivation = ENABLE; //激活过滤器
sFilterConfig.SlaveStartFilterBank = 0;
if (HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig) != HAL_OK)
{
Error_Handler();
}
}
编写接收中断函数和发送数据函数:
static CAN_TxHeaderTypeDef TxMessage; //CAN发送的消息的消息头
static CAN_RxHeaderTypeDef RxMessage; //CAN接收的消息的消息头
//can总线接收中断函数
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
uint8_t data[8]; //接收数据缓存
HAL_StatusTypeDef status;
if (hcan == &hcan1)
{
status = HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxMessage, data);
if (HAL_OK == status)
{
//数据处理。。。
}
}
}
//can发送数据函数
void CAN1_Send_Test()
{
uint8_t data[4] = {0x01, 0x02, 0x03, 0x04}; //需要发送的数据
TxMessage.IDE = CAN_ID_STD; //设置ID类型
TxMessage.StdId = 0x222; //设置ID号
TxMessage.RTR = CAN_RTR_DATA; //设置传送数据帧
TxMessage.DLC = 4; //设置数据长度
if (HAL_CAN_AddTxMessage(&hcan1, &TxMessage, data, (uint32_t*)CAN_TX_MAILBOX0) != HAL_OK)
{
Error_Handler();
}
}
在主函数中调用滤波器配置函数,启动CAN总线,使能接收中断,并循环发送测试数据:
CANFilter_Config();
HAL_CAN_Start(&hcan1);
HAL_CAN_ActivateNotification(&hcan1,CAN_IT_RX_FIFO0_MSG_PENDING);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
CAN1_Send_Test();
HAL_Delay(100);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
通过USB转CAN的工具可以在电脑端查看数据是否成功。可以看到,数据可以正常发送。