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

关于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,这么看来发送都不成功了?

七哥 回答时间: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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版