STM32F767用CUBE配置的CAN1能正常收发数据,CAN2和CAN3则不行
如题,我是想用CAN1,CAN2,CAN3分别独立收发数据,但现在只有CAN1能正常收发,CAN2,CAN3只能发,不能中断接收,代码配置如下,求大神们帮我看看:int CAN_Config(void)
{
CAN_FilterConfTypeDefsFilterConfig;
static CanTxMsgTypeDef TxMessage2;
static CanRxMsgTypeDef RxMessage2;
static CanTxMsgTypeDef TxMessage1;
static CanRxMsgTypeDef RxMessage1;
static CanTxMsgTypeDef TxMessage;
static CanRxMsgTypeDef RxMessage;
//CAN1初始化25MHz125kbps
CanHandleToBMS1.Instance = CAN1;
CanHandleToBMS1.pTxMsg = &TxMessage1;
CanHandleToBMS1.pRxMsg = &RxMessage1;
//CAN1工作模式及波特率配置
CanHandleToBMS1.Init.TTCM = DISABLE;
CanHandleToBMS1.Init.ABOM = ENABLE;
CanHandleToBMS1.Init.AWUM = DISABLE;
CanHandleToBMS1.Init.NART = DISABLE;
CanHandleToBMS1.Init.RFLM = ENABLE;
CanHandleToBMS1.Init.TXFP = DISABLE;
CanHandleToBMS1.Init.Mode =CAN_MODE_NORMAL;
CanHandleToBMS1.Init.SJW = CAN_SJW_1TQ;
CanHandleToBMS1.Init.BS1 = CAN_BS1_4TQ;
CanHandleToBMS1.Init.BS2 = CAN_BS2_5TQ;
CanHandleToBMS1.Init.Prescaler = 20;
if(HAL_CAN_Init(&CanHandleToBMS1)!=HAL_OK)
return 1;
//CAN1过滤器使能FIFO0
sFilterConfig.FilterNumber = 0;
sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
sFilterConfig.FilterIdHigh = 0x0000;
sFilterConfig.FilterIdLow = 0x0000;
sFilterConfig.FilterMaskIdHigh = 0x0000;
sFilterConfig.FilterMaskIdLow = 0x0000;
sFilterConfig.FilterFIFOAssignment = CAN_FIFO0;
sFilterConfig.FilterActivation = ENABLE;
sFilterConfig.BankNumber = 14;
if(HAL_CAN_ConfigFilter(&CanHandleToBMS1, &sFilterConfig)!=HAL_OK)
return 2;
//CAN2 初始化25MHz125kbps
CanHandleToBMS2.Instance = CAN2;
CanHandleToBMS2.pTxMsg = &TxMessage;
CanHandleToBMS2.pRxMsg = &RxMessage;
//CAN2工作模式及波特率配置
CanHandleToBMS2.Init.TTCM = DISABLE;
CanHandleToBMS2.Init.ABOM = ENABLE;
CanHandleToBMS2.Init.AWUM = DISABLE;
CanHandleToBMS2.Init.NART = DISABLE;
CanHandleToBMS2.Init.RFLM = ENABLE;
CanHandleToBMS2.Init.TXFP = DISABLE;
CanHandleToBMS2.Init.Mode = CAN_MODE_NORMAL;
CanHandleToBMS2.Init.SJW = CAN_SJW_1TQ;
CanHandleToBMS2.Init.BS1 = CAN_BS1_4TQ;
CanHandleToBMS2.Init.BS2 = CAN_BS2_5TQ;
CanHandleToBMS2.Init.Prescaler =20;
if(HAL_CAN_Init(&CanHandleToBMS2)!=HAL_OK)
return 3;
//CAN2过滤器使能FIFO1
sFilterConfig.FilterNumber = 14;//14;
sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
sFilterConfig.FilterIdHigh = 0x0000;
sFilterConfig.FilterIdLow = 0x0000;
sFilterConfig.FilterMaskIdHigh = 0x0000;
sFilterConfig.FilterMaskIdLow = 0x0000;
sFilterConfig.FilterFIFOAssignment = CAN_FIFO1;
sFilterConfig.FilterActivation = ENABLE;
sFilterConfig.BankNumber = 14;
if(HAL_CAN_ConfigFilter(&CanHandleToBMS2, &sFilterConfig)!=HAL_OK)
return 4;
//
/*##-CAN3初始化 #######################################*/
CanHandleToDC.Instance = CAN3;
CanHandleToDC.pTxMsg = &TxMessage2;
CanHandleToDC.pRxMsg = &RxMessage2;
//CAN3 初始化 25MHz 125kbps
CanHandleToDC.Init.TTCM = DISABLE;
CanHandleToDC.Init.ABOM = ENABLE;
CanHandleToDC.Init.AWUM = DISABLE;
CanHandleToDC.Init.NART = DISABLE;
CanHandleToDC.Init.RFLM = ENABLE;
CanHandleToDC.Init.TXFP = DISABLE;
CanHandleToDC.Init.Mode = CAN_MODE_NORMAL;
CanHandleToDC.Init.SJW = CAN_SJW_1TQ;
CanHandleToDC.Init.BS1 = CAN_BS1_4TQ;
CanHandleToDC.Init.BS2 = CAN_BS2_5TQ;
CanHandleToDC.Init.Prescaler = 20;
HAL_CAN_Init(&CanHandleToDC);
//CAN3过滤器使能FIFO0
sFilterConfig.FilterNumber = 14;
sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
sFilterConfig.FilterIdHigh = 0x0000;
sFilterConfig.FilterIdLow =0x0000;
sFilterConfig.FilterMaskIdHigh = 0x0000;//0xFFFF;
sFilterConfig.FilterMaskIdLow = 0x0000;//0xFF00;
sFilterConfig.FilterFIFOAssignment = CAN_FIFO0
sFilterConfig.FilterActivation = ENABLE;
sFilterConfig.BankNumber = 14;
HAL_CAN_ConfigFilter(&CanHandleToDC, &sFilterConfig);
return 0;
}
回调函数如下:
void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef *CanHandle)
{
uint8_t i;
if(CanHandle->pRxMsg->IDE == CAN_ID_EXT)
{
if(CanHandle->Instance == CAN1)
{
CANBMS.IDE = CanHandle->pRxMsg->ExtId;
CANBMS.DLC = CanHandle->pRxMsg->DLC;
for(i=0;i<8;i++)
{
CANBMS.Data = CanHandle->pRxMsg->Data;
}
LeftCANqueue_push(CANBMS);
HAL_CAN_Receive_IT(CanHandle, CAN_FIFO0);
__HAL_CAN_ENABLE_IT(&CanHandleToBMS1,CAN_IT_FMP0);//重新开启FIF00消息挂号中断
}
if(CanHandle->Instance == CAN2)
{
CANBMS.IDE = CanHandle->pRxMsg->ExtId;
CANBMS.DLC = CanHandle->pRxMsg->DLC;
for(i=0;i<8;i++)
{
CANBMS.Data = CanHandle->pRxMsg->Data;
}
RightCANqueue_push(CANBMS);
HAL_CAN_Receive_IT(CanHandle, CAN_FIFO1);
__HAL_CAN_ENABLE_IT(&CanHandleToBMS2,CAN_IT_FMP1);
}
if(CanHandle->Instance == CAN3)
{
CANBMS.IDE = CanHandle->pRxMsg->ExtId;
CANBMS.DLC = CanHandle->pRxMsg->DLC;
for(i=0;i<8;i++)
{
CANBMS.Data = CanHandle->pRxMsg->Data;
}
HAL_CAN_Receive_IT(CanHandle, CAN_FIFO0);
__HAL_CAN_ENABLE_IT(&CanHandleToDC,CAN_IT_FMP0);
}
}
}
看配置好像都几乎一样。。。。只能帮顶了!!!! MrJiu 发表于 2017-9-15 10:28
看配置好像都几乎一样。。。。只能帮顶了!!!!
是的,找不到问题出在哪,急死了! liqing666 发表于 2017-9-15 10:31
是的,找不到问题出在哪,急死了!
其实就是数据手册看少了,数据手册看明白了,然后库里面直接看寄存器。。。啥都OK。。。 MrJiu 发表于 2017-9-15 11:02
其实就是数据手册看少了,数据手册看明白了,然后库里面直接看寄存器。。。啥都OK。。。 ...
:L时间不等人呐
页:
[1]