硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5046|回复: 6
收起左侧

[CAN/FDCAN] STM32H743 CAN2接收中断进不来

[复制链接]

1

主题

3

回帖

6

积分

新手上路

积分
6
发表于 2020-9-1 09:16:03 | 显示全部楼层 |阅读模式
请问各位大佬,有用过H743的CAN2吗?项目中需要使用两路CAN,配置成中断收发的工作方式,CAN1接收发送都没问题,CAN2发送正常,接收中断进不来。CAN1与CAN2同样的配置,请问可能是什么问题?查找论坛里的资料,采用了下述两种方法仍然不能调通。

1、调试使用芯片为Y版本,Y版本存在CPU不能同时使用两路的CAN的问题,CPU和两个CANFD同时访问MessageRAM的时候,同一时刻仅让一个CANFD访问即可解决。可单独配置使用CAN2仍然不能进入接收中断。

2、如果要配置CAN2,CAN2参数MessageRAMOffset就必须根据CAN1使用空间进行地址偏移,这样的话CAN1和CAN2才可以同时使用。CAN2配置时修改MessageRAMOffset偏移地址仍然不能进入接收中断。

板子硬件问题基本已排除,CAN芯片以及后端波形均正常。是否CAN2配置有什么不同的地方,需要特别注意下?


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107027
QQ
发表于 2020-9-1 09:17:13 | 显示全部楼层
帮顶,H7改成CAN FD后,一直没去研究。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107027
QQ
发表于 2020-9-1 09:18:28 | 显示全部楼层
请教他:

STM32H7 CAN1 CAN2 同时使用教程
http://www.armbbs.cn/forum.php?m ... 6228&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
发表于 2020-9-1 09:21:55 | 显示全部楼层
  1. static uint8_t MX_FDCAN_Init(FDCAN_HandleTypeDef *hfdcan)
  2. {
  3.     HAL_FDCAN_DeInit(hfdcan);                              //先清除以前的设置
  4.    
  5.     if(hfdcan == &fdcan1)
  6.     {
  7.     hfdcan->Instance=FDCAN1;
  8.         
  9.     hfdcan->Init.FrameFormat=FDCAN_FRAME_CLASSIC;            //传统模式
  10.     hfdcan->Init.Mode=FDCAN_MODE_NORMAL;
  11.     hfdcan->Init.AutoRetransmission=DISABLE;                 //关闭自动重传!传统模式下一定要关闭!!!
  12.     hfdcan->Init.TransmitPause=DISABLE;                      //关闭传输暂停
  13.     hfdcan->Init.ProtocolException=DISABLE;                  //关闭协议异常处理
  14.     hfdcan->Init.NominalPrescaler=presc;                     //分频系数
  15.     hfdcan->Init.NominalSyncJumpWidth=ntsjw;                 //重新同步跳跃宽度
  16.     hfdcan->Init.NominalTimeSeg1=ntsg1;                      //tsg1范围:2~256
  17.     hfdcan->Init.NominalTimeSeg2=ntsg2;                      //tsg2范围:2~128
  18.     hfdcan->Init.MessageRAMOffset=0;                         //信息RAM偏移
  19.     hfdcan->Init.StdFiltersNbr=0;                            //标准信息ID滤波器编号
  20.     hfdcan->Init.ExtFiltersNbr=0;                            //扩展信息ID滤波器编号
  21.     hfdcan->Init.RxFifo0ElmtsNbr=1;                          //接收FIFO0元素编号
  22.     hfdcan->Init.RxFifo0ElmtSize=FDCAN_DATA_BYTES_8;         //接收FIFO0元素大小:8字节
  23.     hfdcan->Init.RxBuffersNbr=0;                             //接收缓冲编号
  24.     hfdcan->Init.TxEventsNbr=0;                              //发送事件编号
  25.     hfdcan->Init.TxBuffersNbr=0;                             //发送缓冲编号
  26.     hfdcan->Init.TxFifoQueueElmtsNbr=1;                      //发送FIFO序列元素编号
  27.     hfdcan->Init.TxFifoQueueMode=FDCAN_TX_FIFO_OPERATION;    //发送FIFO序列模式
  28.     hfdcan->Init.TxElmtSize=FDCAN_DATA_BYTES_8;              //发送大小:8字节
  29.     if(HAL_FDCAN_Init(hfdcan)!=HAL_OK) return 1;           //初始化FDCAN
  30.    
  31.     FDCAN1_RXFilter.IdType=FDCAN_STANDARD_ID;                       //标准ID
  32.     FDCAN1_RXFilter.FilterIndex=14;                                  //滤波器索引
  33.     FDCAN1_RXFilter.FilterType=FDCAN_FILTER_MASK;                   //滤波器类型
  34.     FDCAN1_RXFilter.FilterConfig=FDCAN_FILTER_TO_RXFIFO0;           //过滤器0关联到FIFO0
  35.     FDCAN1_RXFilter.FilterID1=0x0000;                               //32位ID
  36.     FDCAN1_RXFilter.FilterID2=0x0000;                               //如果FDCAN配置为传统模式的话,这里是32位掩码
  37.     if(HAL_FDCAN_ConfigFilter(&fdcan1,&FDCAN1_RXFilter)!=HAL_OK) return 2;//滤波器初始化
  38. //    HAL_FDCAN_ConfigGlobalFilter(hfdcan, FDCAN_ACCEPT_IN_RX_FIFO0, FDCAN_ACCEPT_IN_RX_FIFO0, ENABLE, ENABLE);
  39.     HAL_FDCAN_Start(&fdcan1);                               //开启FDCAN
  40.     HAL_FDCAN_ActivateNotification(&fdcan1,FDCAN_IT_RX_FIFO0_NEW_MESSAGE,0);
  41.     return 0;
  42.    
  43.     }
  44.    
  45.     else if(hfdcan == &fdcan2)
  46.     {
  47.     hfdcan->Instance=FDCAN2;

  48.     hfdcan->Init.FrameFormat=FDCAN_FRAME_CLASSIC;            //传统模式
  49.     hfdcan->Init.Mode=FDCAN_MODE_NORMAL;
  50.     hfdcan->Init.AutoRetransmission=DISABLE;                 //关闭自动重传!传统模式下一定要关闭!!!
  51.     hfdcan->Init.TransmitPause=DISABLE;                      //关闭传输暂停
  52.     hfdcan->Init.ProtocolException=DISABLE;                  //关闭协议异常处理
  53.     hfdcan->Init.NominalPrescaler=presc;                     //分频系数
  54.     hfdcan->Init.NominalSyncJumpWidth=ntsjw;                 //重新同步跳跃宽度
  55.     hfdcan->Init.NominalTimeSeg1=ntsg1;                      //tsg1范围:2~256
  56.     hfdcan->Init.NominalTimeSeg2=ntsg2;                      //tsg2范围:2~128
  57.     hfdcan->Init.MessageRAMOffset=0;                         //信息RAM偏移
  58.     hfdcan->Init.StdFiltersNbr=0;                            //标准信息ID滤波器编号
  59.     hfdcan->Init.ExtFiltersNbr=0;                            //扩展信息ID滤波器编号
  60.     hfdcan->Init.RxFifo0ElmtsNbr=1;                          //接收FIFO0元素编号
  61.     hfdcan->Init.RxFifo0ElmtSize=FDCAN_DATA_BYTES_8;         //接收FIFO0元素大小:8字节
  62.     hfdcan->Init.RxBuffersNbr=0;                             //接收缓冲编号
  63.     hfdcan->Init.TxEventsNbr=0;                              //发送事件编号
  64.     hfdcan->Init.TxBuffersNbr=0;                             //发送缓冲编号
  65.     hfdcan->Init.TxFifoQueueElmtsNbr=1;                      //发送FIFO序列元素编号
  66.     hfdcan->Init.TxFifoQueueMode=FDCAN_TX_FIFO_OPERATION;    //发送FIFO序列模式
  67.     hfdcan->Init.TxElmtSize=FDCAN_DATA_BYTES_8;              //发送大小:8字节
  68.     if(HAL_FDCAN_Init(hfdcan)!=HAL_OK) return 1;             //初始化FDCAN
  69.    
  70.     FDCAN2_RXFilter.IdType=FDCAN_STANDARD_ID;                       //标准ID
  71.     FDCAN2_RXFilter.FilterIndex=0;                                  //滤波器索引
  72.     FDCAN2_RXFilter.FilterType=FDCAN_FILTER_MASK;                   //滤波器类型
  73.     FDCAN2_RXFilter.FilterConfig=FDCAN_FILTER_TO_RXFIFO0;           //过滤器0关联到FIFO0
  74.     FDCAN2_RXFilter.FilterID1=0x0000;                               //32位ID
  75.     FDCAN2_RXFilter.FilterID2=0x0000;                               //如果FDCAN配置为传统模式的话,这里是32位掩码
  76.     if(HAL_FDCAN_ConfigFilter(&fdcan2,&FDCAN2_RXFilter)!=HAL_OK) return 2;//滤波器初始化
  77. //    HAL_FDCAN_ConfigGlobalFilter(hfdcan, FDCAN_ACCEPT_IN_RX_FIFO0, FDCAN_ACCEPT_IN_RX_FIFO0, ENABLE, ENABLE);
  78.     HAL_FDCAN_Start(&fdcan2);                               //开启FDCAN
  79.     HAL_FDCAN_ActivateNotification(&fdcan2,FDCAN_IT_RX_FIFO0_NEW_MESSAGE,0);
  80.    
  81.     return 0;   
  82.     }
  83.    
  84.     return 0;
  85. }
复制代码
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
 楼主| 发表于 2020-9-1 09:37:51 | 显示全部楼层
eric2013 发表于 2020-9-1 09:18
请教他:

STM32H7 CAN1 CAN2 同时使用教程

这个方法我尝试过,可还是不行,我去请教下
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
 楼主| 发表于 2020-9-1 09:43:47 | 显示全部楼层

大佬,你这个配置是可以的吗?我其它配置基本与你这个一致,就只是你这里CAN1滤波器索引设置为14,难道是这个问题?
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
发表于 2020-9-2 09:24:43 | 显示全部楼层
chongnew 发表于 2020-9-1 09:43
大佬,你这个配置是可以的吗?我其它配置基本与你这个一致,就只是你这里CAN1滤波器索引设置为14,难道是 ...

我这边是正常使用的,你先试试
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-14 12:58 , Processed in 0.188574 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表