你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于STM32F10x CAN不进入接收中断的问题

[复制链接]
stm1024 提问时间:2018-2-28 09:12 /
本帖最后由 stm1024 于 2018-2-28 09:30 编辑

手头有一块开发板,用的是STM32F103ZET6,确认使用的CAN1 RX和TX是标准的PA11和PA12,驱动电路为TJA1040。然后想学习一下CAN的发送和接收,以下是代码:

CAN函数
已经将其配置为环回模式,然后也在NVIC中打开了相应的中断。
  1. #include "XDCAN.h"

  2. void XDCAN_Config(void)
  3. {
  4.     XDCAN_GPIO_Config();
  5.     XDCAN_NVIC_config();
  6.    
  7.     XDCAN_Mode_Config();
  8.     XDCAN_Add_Filter(0x6666,14);
  9. }

  10. //config PA11 and PA12 for CAN1
  11. void XDCAN_GPIO_Config(void)
  12. {
  13.     GPIO_InitTypeDef GPIO_InitStruct;

  14.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);
  15.     //PA11 For CAN1-RX
  16.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
  17.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_11;
  18.     GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  19.         GPIO_Init(GPIOA, &GPIO_InitStruct);
  20.    
  21.     //PA12 For CAN1-TX
  22.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
  23.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12;
  24.         GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  25.         GPIO_Init(GPIOA, &GPIO_InitStruct);        
  26. }

  27. //config NVIC for CAN1
  28. void XDCAN_NVIC_config(void)
  29. {
  30.     NVIC_InitTypeDef NVIC_InitStruct;
  31.     //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  32.         NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
  33.         NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
  34.     NVIC_InitStruct.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
  35.     NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
  36.         NVIC_Init(&NVIC_InitStruct);
  37.    
  38.     //CAN interrupt sources
  39.     CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
  40.    
  41. }


  42. //Config CAN1 work mode, baudrate 250kbps
  43. void XDCAN_Mode_Config(void)
  44. {
  45.     CAN_InitTypeDef CAN_InitStruct;
  46.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
  47.     CAN_DeInit(CAN1);
  48.         CAN_StructInit(&CAN_InitStruct);
  49.     CAN_InitStruct.CAN_TTCM = DISABLE;
  50.         CAN_InitStruct.CAN_ABOM = DISABLE;
  51.         CAN_InitStruct.CAN_AWUM = DISABLE;
  52.         CAN_InitStruct.CAN_NART = DISABLE;
  53.         CAN_InitStruct.CAN_RFLM = DISABLE;
  54.         CAN_InitStruct.CAN_TXFP = DISABLE;
  55.         CAN_InitStruct.CAN_Mode = CAN_Mode_LoopBack;
  56.         CAN_InitStruct.CAN_SJW = CAN_SJW_1tq;
  57.    
  58.     /*
  59.         APB1 36MHz
  60.         36M/((1+3+2)*24)=250kbps
  61.     */
  62.     CAN_InitStruct.CAN_BS1 = CAN_BS1_3tq;
  63.         CAN_InitStruct.CAN_BS2 = CAN_BS2_2tq;
  64.         CAN_InitStruct.CAN_Prescaler = 24;
  65.         CAN_Init(CAN1, &CAN_InitStruct);
  66.    
  67. }

  68. //
  69. void XDCAN_Add_Filter(uint32_t id,uint8_t fn)
  70. {
  71.     CAN_FilterInitTypeDef CAN_FilterInitStruct;
  72.     CAN_FilterInitStruct.CAN_FilterNumber=fn;//filter number,can be 0-13
  73.     CAN_FilterInitStruct.CAN_FilterMode=CAN_FilterMode_IdMask;
  74.     CAN_FilterInitStruct.CAN_FilterScale=CAN_FilterScale_32bit;
  75.     CAN_FilterInitStruct.CAN_FilterIdHigh=0x0000;
  76.     CAN_FilterInitStruct.CAN_FilterIdLow=0x0000;
  77.     //do not Match
  78.     CAN_FilterInitStruct.CAN_FilterMaskIdHigh=0x0000;
  79.     CAN_FilterInitStruct.CAN_FilterMaskIdLow=0x0000;
  80.    
  81.     CAN_FilterInitStruct.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;   
  82.     CAN_FilterInitStruct.CAN_FilterActivation=ENABLE;
  83.    
  84.     CAN_FilterInit(&CAN_FilterInitStruct);
  85.     //CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE); //FIF0消息挂号中断允许
  86. }

  87. //Send a CAN Message, Extended Data Frame
  88. uint8_t XDCAN_SendMsg(uint32_t id, uint8_t len, uint8_t *dat)
  89. {
  90.         uint8_t i = 0,tm;
  91.         CanTxMsg TxMsg;
  92.     if(len > 8)
  93.         return 0xff;

  94.     TxMsg.ExtId=id;
  95.         TxMsg.RTR = CAN_RTR_DATA;
  96.     TxMsg.IDE = CAN_ID_EXT;   
  97.         TxMsg.DLC = len;

  98.         for(i=0; i<len; i++)                 
  99.         {
  100.                 TxMsg.Data[i] = *dat;
  101.                 dat++;        
  102.         }
  103.         tm=CAN_Transmit(CAN1, &TxMsg);
  104.     return tm;
  105. }
复制代码

main函数
  1. #include "stm32f10x.h"
  2. #include "XDUtility.h"//Delay_ms
  3. #include "led.h"
  4. #include "XDCAN.h"

  5. uint8_t MSGBUFF[8]="666";
  6. uint8_t rb[8];

  7. void USER_Config(void)
  8. {
  9.     //TO DO: Add User Configuration Here      
  10.     USART1_Config();
  11.     LED_GPIO_Config();
  12.     XDCAN_Config();
  13. }

  14. int main(void)
  15. {  
  16.     uint8_t ts,tmb,cnt=0,Status;
  17.     uint32_t can_id=0;
  18.     CanRxMsg RxMsg;
  19.     USER_Config();
  20.     LED_On();
  21.     //XD_Delay_ms(500);
  22.     LED_Off();
  23.     while (1)
  24.     {
  25.         LED_On();
  26.         tmb=XDCAN_SendMsg(can_id,3,MSGBUFF);
  27. XD_Delay_ms(100);  
  28.         LED_Off();
  29.         can_id++;
  30.         ts=CAN_TransmitStatus(CAN1,tmb);
  31.         if(ts==CAN_TxStatus_Ok)
  32.         {
  33.             cnt++;
  34.         }

  35. XD_Delay_ms(1000);   
  36.     } //while
  37. }
复制代码


stm32f10x_it.c中的中断函数
  1. void USB_LP_CAN1_RX0_IRQHandler(void)
  2. {
  3.     CanRxMsg RxMsg;
  4.     CAN_Receive(CAN1,CAN_FIFO0,&RxMsg);
  5.     CAN_ClearITPendingBit(CAN1, CAN_IT_FMP0);
  6.     XD_Delay_ms(500);
  7. }
复制代码
首先,调试可以发现发送是OK的:
1.png
然而,不管是用Simulator还是JLink调试,总是进不去中断,接收邮箱也一直是空的(见下图)不知道是怎么回事?

2.png
是否在环回模式下不支持这种功能?有碰到过类似问题并解决过的兄弟,能否讲解一下?

另外,我也试过在main函数中直接用polling的方式接收,然而发送完成之后使用CAN_MessagePending每次返回的结果都是0……


收藏 评论8 发布时间:2018-2-28 09:12

举报

8个回答
cuyebiren 回答时间:2018-2-28 10:47:27
1.PNG
把此处的 14 改为 0-13 的数试试。
2.PNG
此处有提到。
6.PNG
此处不应屏蔽,否则进不了中断。
3.PNG
参考手册上多次提到非互联型产品只有0-13个过滤器可用。
4.PNG
5.PNG
STM32F103ZET6是非互联型产品。

评分

参与人数 1蝴蝶豆 +4 收起 理由
zero99 + 4

查看全部评分

stm1024 回答时间:2018-2-28 11:39:38
本帖最后由 stm1024 于 2018-2-28 11:42 编辑
cuyebiren 发表于 2018-2-28 10:47
把此处的 14 改为 0-13 的数试试。

此处有提到。

感谢您的认真回复。
第一个地方,我确实是一开始使用的第0组过滤器,然而并不成功。
CAN_IT_Config那个,我把它放在了void XDCAN_NVIC_config(void)的最后一句中,然后我在调试的时候也检查过IER寄存器,FMPIE0是打开的: 2018-02-28_114010.png

另外,我不知道之前怎么鬼改改的,现在发送的状态都一直是CAN_TxStatus_Pending,这么看来发送都不成功了?

toofree 回答时间:2018-2-28 23:53:56
建议先把固件库中的CAN例子跑通,内回环模式和正常工作模式样例都有。
傲游截图20180228235027.jpg

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

mokart 回答时间:2019-8-6 15:12:30
我设置为回环模式,刚刚开始也是接收中断不进入,后来检查了半天是接收屏蔽的设置问题。
bird0123 回答时间:2019-8-7 09:23:34
学习了
generalcircuits 回答时间:2019-8-7 14:50:50
把此处的 14 改为 0-13 的数,还是没用吗?那问题出在哪里?
stm1024 回答时间:2019-8-10 08:08:28
generalcircuits 发表于 2019-8-7 14:50
把此处的 14 改为 0-13 的数,还是没用吗?那问题出在哪里?

老早就解决了,是供电问题,必须要用5V供电,我用的是3.3V
yyc123 回答时间:2019-8-23 10:19:02
mokart 发表于 2019-8-6 15:12
我设置为回环模式,刚刚开始也是接收中断不进入,后来检查了半天是接收屏蔽的设置问题。 ...

接收屏蔽怎么设置的,我的也是回环模式不能进入中断。发送完成中断和接收中断都不能进入,头都大了

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版