打印
[研电赛技术支持]

GD32F103can接收数据不是当前数据

[复制链接]
1034|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ygding|  楼主 | 2022-3-15 08:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
GD32F103RBT6固件V2.22,2块相同线路板,一块发送,一块接收,can0 CAN_INT_RFNE0中断。中断后读取的数据不是当前发来的数据,而是上上次发来的数据。看资料,说can0 FIFO0有3个接收邮箱,分别是邮箱0,邮箱1,邮箱2,读出的总是邮箱0的数据,刚收到的数据放在邮箱2,那么问题来了,每次中断后读到的数据都不是当前收到的数据,我的问题有2个,1、怎么设置才能中断后读出数据是刚发来的数据。 2、FIFO0中数据帧个数函数,can_receive_message_length_get()返回值读到的总是0

使用特权

评论回复
沙发
ygding|  楼主 | 2022-3-15 08:42 | 只看该作者
补充测试情况   发送  0xAA  01       接收     中断后读出    XX  XX(随机)
                               0xAA 02                                       XX  XX  (随机)
                               0xAA  03                                      AA   01
                               0xAA  04                                      AA   02              收到的总是上上次的数据

使用特权

评论回复
板凳
ygding|  楼主 | 2022-3-15 13:22 | 只看该作者
再补充,资料上说 寄存器 CAN0_RFIFO0(地址 0x4000640c)的后2位 表示接收的can数据的帧数,可是读出来总为0。哎,这个bug难道大家都知道,就我这个初学者不知道?还是大家都不愿意教我?

使用特权

评论回复
地板
ygding|  楼主 | 2022-3-15 15:28 | 只看该作者
都没人知道吗?就这种芯片还取代STM 32  ?????

使用特权

评论回复
5
sagade| | 2022-3-16 16:59 | 只看该作者
难道开的是接收FIFO满的中断?可以贴出代码,让大佬们解答一下

使用特权

评论回复
6
ygding|  楼主 | 2022-3-17 09:16 | 只看该作者
贴出初始化代码,参照例程写的,大佬看看,可有问题?

void Can_Init(void)   //can0
{
     /* configure CAN0 GPIO */
    gpio_init(GPIOA,GPIO_MODE_IPU,GPIO_OSPEED_50MHZ,GPIO_PIN_11);   //can_rx
    gpio_init(GPIOA,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_12);  //can_tx
   
        //(can_parameter_struct can_parameter, can_filter_parameter_struct can_filter)
                can_parameter_struct can_parameter;
                can_filter_parameter_struct can_filter;
       
                can_struct_para_init(CAN_INIT_STRUCT, &can_parameter);
                can_struct_para_init(CAN_FILTER_STRUCT, &can_filter);
   
        /* initialize CAN register */
       
    can_deinit(CAN0);         //   rst CAN0
   
    /* initialize CAN parameters */
                can_parameter.time_triggered = DISABLE;          //   禁用时间触发通信
                can_parameter.auto_bus_off_recovery = DISABLE;   //软件离线恢复
                can_parameter.auto_wake_up = DISABLE;          // 软件唤醒
                can_parameter.no_auto_retrans = ENABLE;     //   禁止自动重发
                can_parameter.rec_fifo_overwrite = DISABLE;  // 使能接收满覆盖
                can_parameter.trans_fifo_order =  ENABLE;  //·按顺序发送
                can_parameter.working_mode = CAN_NORMAL_MODE;
                can_parameter.resync_jump_width = CAN_BT_SJW_1TQ;
                can_parameter.time_segment_1 = CAN_BT_BS1_5TQ;
                can_parameter.time_segment_2 = CAN_BT_BS2_3TQ;
                can_parameter.prescaler = 60;         //CAN_BAUDRATE == 100
                               
                /*-- CAN_BAUDRATE == 1000K can_parameter.prescaler = 6; ---*/
                /*-- CAN_BAUDRATE == 500K  can_parameter.prescaler = 12; --*/
                /*-- CAN_BAUDRATE == 250   can_parameter.prescaler = 24; --*/
                /*-- CAN_BAUDRATE == 125   can_parameter.prescaler = 48;---*/
                /*---CAN_BAUDRATE == 100   can_parameter.prescaler = 60; --*/
                /*---CAN_BAUDRATE == 50    can_parameter.prescaler = 120;--*/

    /* initialize CAN */
    can_init(CAN0, &can_parameter);
               
   /* initialize filter */
       
                can_filter.filter_number=0;   //指定过滤器0
                can_filter.filter_mode =CAN_FILTERMODE_LIST;  //  CAN_FILTERMODE_LIST; 列表
                can_filter.filter_bits = CAN_FILTERBITS_32BIT;
                can_filter.filter_list_high = 0x3000;    //31-21:SFID(10:0)   zkid=0x180 =384
                can_filter.filter_list_low = 0x0000;
                can_filter.filter_mask_high = 0x0000;
                can_filter.filter_mask_low = 0x0000;
                can_filter.filter_fifo_number = CAN_FIFO0;      //CAN_FIFO0;
                can_filter.filter_enable = ENABLE;
   
    can_filter_init(&can_filter);
               
        /* enable CAN0 receive FIFO0 not empty interrupt */
    can_interrupt_enable(CAN0, CAN_INT_RFNE0);
       
                  /* configure CAN0 NVIC */
    nvic_irq_enable(USBD_LP_CAN0_RX0_IRQn,1,1);
}

//中断后读取数据

void USBD_LP_CAN0_RX0_IRQHandler(void)
{
                   
                CAN_Rx_Flag=1;
                               
    /* check the receive message */
    can_message_receive(CAN0, CAN_FIFO0, &receive_message);
       
}

使用特权

评论回复
7
sagade| | 2022-3-17 14:02 | 只看该作者
帮顶

使用特权

评论回复
8
billzhang331| | 2022-3-17 19:24 | 只看该作者
本帖最后由 billzhang331 于 2022-3-17 19:25 编辑

请楼主报一下发送的间隔
还有接收时不要每次只读一个邮箱,应该一次把三个邮箱全部读完的当时,采用环形队列做接收缓存

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

6

帖子

0

粉丝