使用
STM32F103作为CAN从机发送和接收数据,从机是被动发送,在收到主机特定命令帧后才会发送数据,其余时候只接收:问题1:单个发送没有问题,多个CAN并在一起,其中某个会出现只能接收并未发送的情况(主机下发内容能收到,但主机无法收到该ID上的数据内容),不知道为什么会出现这样的问题?现在就想试一下,在这种情况下重新初始化CAN模块能不能恢复CAN正常
通信?我的想法是通过主机告知从机,让从机自己重新初始化CAN。
问题2:如果将主机挂在总线上,存在某些从机在重新上电后无法正常启动的情况,大多数都能正常运行。
请问有遇到类似情况的人能解答下没有?欢迎探讨!
附CAN通信配置:
void MX_CAN_Init(void)
{
CAN_FilterConfTypeDef sFilterConfig;
hcan.Instance = CAN1;
hcan.Init.Prescaler = 8;
hcan.Init.Mode = CAN_MODE_NORMAL;
hcan.Init.SJW = CAN_SJW_1TQ;
hcan.Init.BS1 = CAN_BS1_15TQ;
hcan.Init.BS2 = CAN_BS2_2TQ;
hcan.Init.TTCM = DISABLE; // ʱ¼ä´¥·¢Ä£Ê½
hcan.Init.ABOM = DISABLE; // ×Ô¶¯ÀëÏß¹ÜÀí
hcan.Init.AWUM = DISABLE; // ×Ô¶¯»½ÐÑģʽ
hcan.Init.NART = DISABLE; // ·Ç×Ô¶¯ÖØ´«Ä£Ê½
hcan.Init.RFLM = DISABLE; // ½ÓÊÕFIFOËø¶¨Ä£Ê½
hcan.Init.TXFP = DISABLE; // ·¢ËÍFIFOÓÅÏȼ¶
if (HAL_CAN_Init( hcan) != HAL_OK)
{
Error_Handler();
}
sFilterConfig.FilterNumber = 0; //
sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
sFilterConfig.FilterIdHigh = (((uint32_t)PS << 3) 0xFFFF0000) >> 16; // ¹ýÂËID¸ßλ
sFilterConfig.FilterIdLow = ((uint32_t)PS << 3) | CAN_RTR_DATA | CAN_ID_EXT; // ¹ýÂËIDµÍλ
sFilterConfig.FilterMaskIdHigh = 0x0000;
sFilterConfig.FilterMaskIdLow = 0x00FF; // ¹ýÂ˱êʶ·ûµÍλ
sFilterConfig.FilterFIFOAssignment = 0;
sFilterConfig.FilterAc
tivation = ENABLE;
sFilterConfig.BankNumber = 14;
if (HAL_CAN_ConfigFilter( hcan, sFilterConfig) != HAL_OK)
{
Error_Handler();
}
}