1.标识符列表模式 ,32位模式下
void MX_CAN_Init(void)
{
//这里是实现了两个地址的接收 一个是用来接收广播信息 一个用来接收私有地址
//如果想实现多个地址可以添加多个过滤器组
//stm32103 有0-13 共14个过滤器 在32位模式下可以过滤14个地址
//16为模式下可以过滤28个地址
// 如果需要更多 那就要用屏蔽位模式,用屏蔽位模式就需要通过软件来判断一下地址
CAN_FilterTypeDef sFilterConfig_boarcast;c//广播
CAN_FilterTypeDef sFilterConfig_pravite;//私有
uint32_t boardcast_addr =0x00000012&0x07ffffff;//can广播接收地址
uint32_t private_addr =0x00000013&0x07ffffff;//can私有地址
hcan.Instance = CAN;
hcan.Init.Prescaler = 8;
hcan.Init.Mode = CAN_MODE_NORMAL;
hcan.Init.SyncJumpWidth = CAN_SJW_1TQ;
hcan.Init.TimeSeg1 = CAN_BS1_6TQ;
hcan.Init.TimeSeg2 = CAN_BS2_2TQ;
hcan.Init.TimeTriggeredMode = DISABLE;
hcan.Init.AutoBusOff = DISABLE;
hcan.Init.AutoWakeUp = DISABLE;
hcan.Init.AutoRetransmission = DISABLE;
hcan.Init.ReceiveFifoLocked = ENABLE;
hcan.Init.TransmitFifoPriority = ENABLE;
if (HAL_CAN_Init(&hcan) != HAL_OK)
{
//Error_Handler();
rt_kprintf("can init error\r\n");
}
/* Configure the CAN Filter */
sFilterConfig_boarcast.FilterBank = 0;//过滤器0
sFilterConfig_boarcast.FilterMode = CAN_FILTERMODE_IDLIST;
sFilterConfig_boarcast.FilterScale = CAN_FILTERSCALE_32BIT;
sFilterConfig_boarcast.FilterIdHigh =
((boardcast_addr<<21)&0xffff0000)>>16;//can广播地址
sFilterConfig_boarcast.FilterIdLow = 0x00000000;
sFilterConfig_boarcast.FilterMaskIdHigh = ((boardcast_addr<<21)&0xffff0000)>>16;
sFilterConfig_boarcast.FilterMaskIdLow = 0x00000000;
sFilterConfig_boarcast.FilterFIFOAssignment = CAN_RX_FIFO0;
sFilterConfig_boarcast.FilterActivation = ENABLE;
sFilterConfig_boarcast.SlaveStartFilterBank = 14;
sFilterConfig_pravite=sFilterConfig_boarcast;
sFilterConfig_pravite.FilterBank = 1;//过滤器1
sFilterConfig_pravite.FilterIdHigh = ((private_addr<<21)&0xffff0000)>>16;//can私有地址
sFilterConfig_pravite.FilterIdLow = 0x00000000;
sFilterConfig_pravite.FilterMaskIdHigh = ((private_addr<<21)&0xffff0000)>>16;
sFilterConfig_pravite.FilterMaskIdLow = 0x00000000;
if (HAL_CAN_ConfigFilter(&hcan, &sFilterConfig_boarcast) != HAL_OK)
{
rt_kprintf("can filter boarcast init error\r\n");
}
if (HAL_CAN_ConfigFilter(&hcan, &sFilterConfig_pravite) != HAL_OK)
{
rt_kprintf("can filter pravite init error\r\n");
}
/* Start the CAN peripheral */
if (HAL_CAN_Start(&hcan) != HAL_OK)
{
rt_kprintf("can start error\r\n");
}
/* Activate CAN RX notification */
if (HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK)
{
rt_kprintf("can notification rx error\r\n");
}
}
2.1.标识符列表模式 ,16位模式下
void MX_CAN_Init(void)
{
//这里是实现了8个地址的接收
CAN_FilterTypeDef sFilterConfig;
CAN_FilterTypeDef sFilterConfig1;
hcan.Instance = CAN;
hcan.Init.Prescaler = 8;
hcan.Init.Mode = CAN_MODE_NORMAL;
hcan.Init.SyncJumpWidth = CAN_SJW_1TQ;
hcan.Init.TimeSeg1 = CAN_BS1_6TQ;
hcan.Init.TimeSeg2 = CAN_BS2_2TQ;
hcan.Init.TimeTriggeredMode = DISABLE;
hcan.Init.AutoBusOff = DISABLE;
hcan.Init.AutoWakeUp = DISABLE;
hcan.Init.AutoRetransmission = DISABLE;
hcan.Init.ReceiveFifoLocked = ENABLE;
hcan.Init.TransmitFifoPriority = ENABLE;
if (HAL_CAN_Init(&hcan) != HAL_OK)
{
//Error_Handler();
rt_kprintf("can init error\r\n");
}
/* Configure the CAN Filter */
sFilterConfig_boarcast.FilterBank = 0;
sFilterConfig_boarcast.FilterMode = CAN_FILTERMODE_IDLIST;
sFilterConfig_boarcast.FilterScale = CAN_FILTERSCALE_16BIT;
/* Configure the CAN Filter */
sFilterConfig.FilterBank = 0;//过滤器0
sFilterConfig.FilterMode = CAN_FILTERMODE_IDLIST;
sFilterConfig.FilterScale = CAN_FILTERSCALE_16BIT;
sFilterConfig.FilterIdHigh = (((uint32_t)0x07A0<<21)&0xffff0000)>>16;//地址1
sFilterConfig.FilterIdLow = (((uint32_t)0x07B0<<21)&0xffff0000)>>16;//地址2
sFilterConfig.FilterMaskIdHigh = (((uint32_t)0x07C0<<21)&0xffff0000)>>16;//地址3
sFilterConfig.FilterMaskIdLow = (((uint32_t)0x07D0<<21)&0xffff0000)>>16;//地址4
sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;
sFilterConfig.FilterActivation = ENABLE;
sFilterConfig.SlaveStartFilterBank = 14;
sFilterConfig1=sFilterConfig;
sFilterConfig.FilterBank = 1;//过滤器1
sFilterConfig.FilterIdHigh = (((uint32_t)0x07A1<<21)&0xffff0000)>>16;//地址5
sFilterConfig.FilterIdLow = (((uint32_t)0x07B1<<21)&0xffff0000)>>16;//地址6
sFilterConfig.FilterMaskIdHigh = (((uint32_t)0x07C1<<21)&0xffff0000)>>16;//地址7
sFilterConfig.FilterMaskIdLow = (((uint32_t)0x07D1<<21)&0xffff0000)>>16;//地址8
if (HAL_CAN_ConfigFilter(&hcan, &sFilterConfig) != HAL_OK)
{
/* Filter configuration Error */
//Error_Handler();
rt_kprintf("can filter init error\r\n");
}
if (HAL_CAN_ConfigFilter(&hcan, &sFilterConfig1) != HAL_OK)
{
/* Filter configuration Error */
//Error_Handler();
rt_rt_kprintf("can filter init error\r\n");
}
}