本帖最后由 奏奏奏 于 2017-1-2 23:14 编辑
用的芯片是STM32F107
因为它有两个CAN口
做CAN的中继来用
问题是将CAN1口的接收数据用CAN2口发出是正常的
但是反过来将CAN2口的接收数据用CAN1口发出就出问题了
所以就在考虑是否关系到这个问题:CAN1口是master mode,而CAN2口是slave mode,是否CAN2口的接收中断用法与CAN1口的不一样
贴一下代码:
- void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef* hcan)
- {
- if(hcan == &hcan1)
- {
- printf("\r\n CAN receive ID=%x",hcan->pRxMsg->StdId);
- printf("\r\n CAN receive length=%d \r\n CAN receive data:\r\n",hcan->pRxMsg->DLC);
- uint8_t j=hcan->pRxMsg->DLC;
- for(uint8_t i=0;i<j;i++)
- {
- printf(" %x ",hcan->pRxMsg->Data);
- }
- printf("\r\n");
-
- //转发到CAN2端口
-
- //
- /*##-1- Configure CAN2 Transmission Massage #####################################*/
- hcan2.pTxMsg->StdId = hcan->pRxMsg->StdId;
- hcan2.pTxMsg->RTR = CAN_RTR_DATA;
- hcan2.pTxMsg->IDE = CAN_ID_STD;
- hcan2.pTxMsg->DLC = hcan->pRxMsg->DLC;
- uint8_t j2=hcan->pRxMsg->DLC;
- for(uint8_t i=0;i<j2;i++)
- {
- hcan2.pTxMsg->Data =hcan->pRxMsg->Data;
- }
- HAL_CAN_Transmit(&hcan2, 10);
- //
-
- __HAL_CAN_ENABLE_IT(hcan,CAN_IT_FMP0);//重新开启FIF00消息挂号中断
- }
- if(hcan == &hcan2)
- {
- printf("\r\n CAN receive ID=%x",hcan->pRxMsg->StdId);
- printf("\r\n CAN receive length=%d \r\n CAN receive data:\r\n",hcan->pRxMsg->DLC);
- uint8_t j=hcan->pRxMsg->DLC;
- for(uint8_t i=0;i<j;i++)
- {
- printf(" %x ",hcan->pRxMsg->Data);
- }
- printf("\r\n");
-
- //转发到CAN1端口
-
- //
- /*##-1- Configure CAN2 Transmission Massage #####################################*/
- hcan1.pTxMsg->StdId = hcan->pRxMsg->StdId;
- hcan1.pTxMsg->RTR = CAN_RTR_DATA;
- hcan1.pTxMsg->IDE = CAN_ID_STD;
- hcan1.pTxMsg->DLC = hcan->pRxMsg->DLC;
- uint8_t j2=hcan->pRxMsg->DLC;
- for(uint8_t i=0;i<j2;i++)
- {
- hcan1.pTxMsg->Data =hcan->pRxMsg->Data;
- }
- HAL_CAN_Transmit_IT(&hcan1);
- //
-
- __HAL_CAN_ENABLE_IT(hcan,CAN_IT_FMP0);//重新开启FIF00消息挂号中断
- }
- }
复制代码
|
上面的代码中
将
sFilterConfig.FilterNumber = 0;
修改为:
sFilterConfig.FilterNumber = 14;
就可以解决了。
评分
查看全部评分
跟这个SLAVEMODE是没有关系的,这个只是说CAN2是没有自己的过滤器,而是共享了CAN1的过滤器组,所以CAN2就叫SLAVE了。
你的问题可以这样排查:
CAN2能接收到数据吗?
CAN2单独能发送数据吗?
评分
查看全部评分
好的,谢谢!我按这个思路查一遍
排查过了。
CAN2不能接收到数据!问题在这里
CAN2单独发送数据正常。
附上main.c的代码:
评分
查看全部评分