搜索
查看: 12717|回复: 8

[已解决] 关于STM32F10x CAN不进入接收中断的问题

[复制链接]
  • TA的每日心情
    奋斗
    2021-4-15 11:47
  • 签到天数: 537 天

    [LV.9]

    29

    主题

    2176

    帖子

    127

    蝴蝶豆

    论坛元老

    最后登录
    2024-4-24
    发表于 2018-2-28 09:12:19 | 显示全部楼层 |阅读模式
    本帖最后由 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……


    回复

    使用道具 举报

    该用户从未签到

    5

    主题

    146

    帖子

    4

    蝴蝶豆

    论坛元老

    最后登录
    2021-5-7
    发表于 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

    查看全部评分

    回复 支持 1 反对 0

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-4-15 11:47
  • 签到天数: 537 天

    [LV.9]

    29

    主题

    2176

    帖子

    127

    蝴蝶豆

    论坛元老

    最后登录
    2024-4-24
     楼主| 发表于 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,这么看来发送都不成功了?

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-12-6 11:47
  • 签到天数: 1 天

    [LV.1]初来乍到

    49

    主题

    3724

    帖子

    429

    蝴蝶豆

    论坛元老

    最后登录
    2021-8-7
    发表于 2018-2-28 23:53:56 | 显示全部楼层
    建议先把固件库中的CAN例子跑通,内回环模式和正常工作模式样例都有。
    傲游截图20180228235027.jpg

    评分

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

    查看全部评分

    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    1

    帖子

    0

    蝴蝶豆

    新手上路

    最后登录
    2019-12-12
    发表于 2019-8-6 15:12:30 | 显示全部楼层
    我设置为回环模式,刚刚开始也是接收中断不进入,后来检查了半天是接收屏蔽的设置问题。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    79

    帖子

    0

    蝴蝶豆

    初级会员

    最后登录
    2019-10-24
    发表于 2019-8-7 09:23:34 | 显示全部楼层
    学习了
    回复

    使用道具 举报

    该用户从未签到

    14

    主题

    256

    帖子

    2

    蝴蝶豆

    金牌会员

    最后登录
    2019-10-8
    发表于 2019-8-7 14:50:50 | 显示全部楼层
    把此处的 14 改为 0-13 的数,还是没用吗?那问题出在哪里?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-4-15 11:47
  • 签到天数: 537 天

    [LV.9]

    29

    主题

    2176

    帖子

    127

    蝴蝶豆

    论坛元老

    最后登录
    2024-4-24
     楼主| 发表于 2019-8-10 08:08:28 | 显示全部楼层
    generalcircuits 发表于 2019-8-7 14:50
    把此处的 14 改为 0-13 的数,还是没用吗?那问题出在哪里?

    老早就解决了,是供电问题,必须要用5V供电,我用的是3.3V
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    1

    帖子

    0

    蝴蝶豆

    初级会员

    最后登录
    2020-9-21
    发表于 2019-8-23 10:19:02 | 显示全部楼层
    mokart 发表于 2019-8-6 15:12
    我设置为回环模式,刚刚开始也是接收中断不进入,后来检查了半天是接收屏蔽的设置问题。 ...

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

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

    GMT+8, 2024-4-29 11:32 , Processed in 1.222147 second(s), 47 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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