打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
STM32的CAN slave mode与master mode的区别是什么?
 本帖最后由 奏奏奏 于 2017-1-2 23:14 编辑

用的芯片是STM32F107
因为它有两个CAN口
做CAN的中继来用
问题是将CAN1口的接收数据用CAN2口发出是正常的
但是反过来将CAN2口的接收数据用CAN1口发出就出问题了
所以就在考虑是否关系到这个问题:CAN1口是master mode,而CAN2口是slave mode,是否CAN2口的接收中断用法与CAN1口的不一样
贴一下代码:

  1. void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef* hcan)
  2. {
  3.         if(hcan == &hcan1)
  4.         {
  5.                 printf("\r\n CAN        receive ID=%x",hcan->pRxMsg->StdId);
  6.                 printf("\r\n CAN        receive length=%d        \r\n CAN        receive data:\r\n",hcan->pRxMsg->DLC);
  7.                 uint8_t j=hcan->pRxMsg->DLC;
  8.                 for(uint8_t i=0;i<j;i++)
  9.                 {
  10.                         printf(" %x        ",hcan->pRxMsg->Data);
  11.                 }
  12.                 printf("\r\n");
  13.                
  14.                 //转发到CAN2端口
  15.                
  16.         //
  17.                 /*##-1- Configure CAN2 Transmission Massage #####################################*/
  18.                 hcan2.pTxMsg->StdId = hcan->pRxMsg->StdId;
  19.                 hcan2.pTxMsg->RTR = CAN_RTR_DATA;
  20.                 hcan2.pTxMsg->IDE = CAN_ID_STD;
  21.                 hcan2.pTxMsg->DLC = hcan->pRxMsg->DLC;

  22.                 uint8_t j2=hcan->pRxMsg->DLC;
  23.                 for(uint8_t i=0;i<j2;i++)
  24.                 {

  25.                         hcan2.pTxMsg->Data =hcan->pRxMsg->Data;
  26.                 }

  27.                 HAL_CAN_Transmit(&hcan2, 10);
  28.         //        
  29.                
  30.                 __HAL_CAN_ENABLE_IT(hcan,CAN_IT_FMP0);//重新开启FIF00消息挂号中断                                
  31.         }


  32.         if(hcan == &hcan2)
  33.         {
  34.                 printf("\r\n CAN        receive ID=%x",hcan->pRxMsg->StdId);
  35.                 printf("\r\n CAN        receive length=%d        \r\n CAN        receive data:\r\n",hcan->pRxMsg->DLC);
  36.                 uint8_t j=hcan->pRxMsg->DLC;
  37.                 for(uint8_t i=0;i<j;i++)
  38.                 {
  39.                         printf(" %x        ",hcan->pRxMsg->Data);
  40.                 }
  41.                 printf("\r\n");
  42.                
  43.                 //转发到CAN1端口
  44.                
  45.         //
  46.                 /*##-1- Configure CAN2 Transmission Massage #####################################*/
  47.                 hcan1.pTxMsg->StdId = hcan->pRxMsg->StdId;
  48.                 hcan1.pTxMsg->RTR = CAN_RTR_DATA;
  49.                 hcan1.pTxMsg->IDE = CAN_ID_STD;
  50.                 hcan1.pTxMsg->DLC = hcan->pRxMsg->DLC;

  51.                 uint8_t j2=hcan->pRxMsg->DLC;
  52.                 for(uint8_t i=0;i<j2;i++)
  53.                 {

  54.                         hcan1.pTxMsg->Data =hcan->pRxMsg->Data;
  55.                 }

  56.                 HAL_CAN_Transmit_IT(&hcan1);
  57.         //        
  58.                
  59.                 __HAL_CAN_ENABLE_IT(hcan,CAN_IT_FMP0);//重新开启FIF00消息挂号中断                                
  60.         }
  61. }
复制代码


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
STM32学习笔记---CAN实验
stm32 usart 串口功能 库函数 详解和DMA 串口高级运用
C语言之如何输出uint32_t和uint64_t和16进制
如何移植使用W5500官方提供的最新Socket库
stm32f103 uart+DMA发送接收
UINT8_T UINT16_T UINT32_T UINT64_T 是什么数据类型
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服