打印

GD32E103CBT6 CAN0发送问题

[复制链接]
5405|30
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
--hyk|  楼主 | 2019-10-28 16:46 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 --hyk 于 2019-10-28 16:46 编辑

只使用了can0通道,在正常工作模式下,接收正常,发送一直发不出去,显示“显性位错误”,回环模式可以正常工作。下面是初始化程序:

void can_config(void)
{
        can_parameter_struct can_parameter={0};
        can_filter_parameter_struct can_filterInit={0};
        /* initialize CAN register */
        
        can_deinit(CAN0);
        
        can_struct_para_init(CAN_INIT_STRUCT,&can_parameter);
        
        can_debug_freeze_disable(CAN0);
        
        can_parameter.auto_bus_off_recovery = ENABLE;
        can_parameter.auto_retrans = DISABLE;
        can_parameter.auto_wake_up = ENABLE;
        can_parameter.rec_fifo_overwrite = DISABLE;
        can_parameter.trans_fifo_order = DISABLE;
        can_parameter.working_mode = CAN_NORMAL_MODE;
        can_parameter.resync_jump_width = CAN_BT_SJW_1TQ;
        can_parameter.prescaler = 20;
        can_parameter.time_segment_1 = CAN_BT_BS1_2TQ;
        can_parameter.time_segment_2 = CAN_BT_BS2_3TQ;
        can_init(CAN0,&can_parameter);
        
        can_filterInit.filter_number = 0;
        can_filterInit.filter_mode = CAN_FILTERMODE_MASK;
        can_filterInit.filter_bits = CAN_FILTERBITS_32BIT;
        can_filterInit.filter_list_high =0x0000;
        can_filterInit.filter_list_low = 0x0000;
        can_filterInit.filter_mask_high = 0x0000;
        can_filterInit.filter_mask_low = 0x0000;
        can_filterInit.filter_fifo_number = CAN_FIFO0;
        can_filterInit.filter_enable = ENABLE;
        can_filter_init(&can_filterInit);
        
        g_transmit_message.tx_efid = 0x01;
        g_transmit_message.tx_sfid = CAN0_ID;
        g_transmit_message.tx_dlen = 4;
        g_transmit_message.tx_ff = CAN_FF_STANDARD;
        g_transmit_message.tx_ft = CAN_FT_DATA;
}
        


/*        监测寄存器        */
uint32_t can_ctl,can_stat,can_tstat,tmi0,tmi1,tmi2,tmp0,tmp1,tmp2,data0,data1,can_err,mailbox_num,bt;        
uint32_t num=0;

void can_test(void)
{
        uint8_t transmit_mailbox=0;
        uint32_t timeout = 0xffff;
        num++;
        
        g_transmit_message.tx_data[0] = 0x1;
        g_transmit_message.tx_data[1] = 0x2;
        g_transmit_message.tx_data[2] = 0x3;
        g_transmit_message.tx_data[3] = 0x4;
        
        /* transmit message */
        transmit_mailbox=can_message_transmit(CAN0, &g_transmit_message);
        
        while((CAN_TRANSMIT_OK != can_transmit_states(CAN0, transmit_mailbox)) && (0 != timeout)){
                        timeout--;
        }
        timeout = 0xFFFF;
        while((can_receive_message_length_get(CAN0, CAN_FIFO0) < 1) && (0 != timeout)){
        timeout--;
  }
        
  can_message_receive(CAN0, CAN_FIFO0, &g_receive_message);
        
        printf("times:%d \n",num);
        printf("theTXmsg:%x ",g_transmit_message.tx_data[0]);
        printf("theTXmsg:%x ",g_transmit_message.tx_data[1]);
        printf("theTXmsg:%x ",g_transmit_message.tx_data[2]);
        printf("theTXmsg:%x ",g_transmit_message.tx_data[3]);
        
        printf("\nCAN_ID:%x ",g_receive_message.rx_sfid);
        printf("theRXmsg:%x ",g_receive_message.rx_data[0]);
        printf("theRXmsg:%x ",g_receive_message.rx_data[1]);
        printf("theRXmsg:%x ",g_receive_message.rx_data[2]);
        printf("theRXmsg:%x ",g_receive_message.rx_data[3]);
        printf("\n\n");
        
#ifdef ENABLE_MONITOR     

        mailbox_num=transmit_mailbox;
        can_ctl=CAN_CTL(CAN0);
        can_stat=CAN_STAT(CAN0);
        can_tstat=CAN_TSTAT(CAN0);
        can_err=CAN_ERR(CAN0);
        
        tmi0=CAN_TMI0(CAN0);
        tmi1=CAN_TMI1(CAN0);
        tmi2=CAN_TMI2(CAN0);
        
        tmp0=CAN_TMP0(CAN0);
        tmp1=CAN_TMP1(CAN0);
        tmp2=CAN_TMP2(CAN0);

        bt=        CAN_BT(CAN0);
#endif
        
}

使用特权

评论回复
沙发
lvben5d| | 2019-10-29 07:50 | 只看该作者
本帖最后由 lvben5d 于 2019-10-29 07:51 编辑

楼主,我用过GD32E103 的CAN1 , 你按照库文件里的EXZAMPLE去看发送,我试过可以发送和接收的。(接收端的CAN波特率要配置一致,前期先不要设置过滤ID号  避免被硬件过滤)。  
E系列库函数做的比较好的就是,你的CAN波特率不像F系列哪样,需要自己计算ts1 ts2.   直接调用一个函数
void CAN_Configuration(void)
{
        can_parameter_struct can_parameter;  
        //can_filter_parameter_struct can_filter;        
        can_struct_para_init(CAN_INIT_STRUCT, &can_parameter);
        can_deinit(CAN1);
        
  /* initialize CAN parameters */
    can_parameter.time_triggered        = DISABLE;
    can_parameter.auto_bus_off_recovery = DISABLE;
    can_parameter.auto_wake_up          = DISABLE;
    can_parameter.auto_retrans          = DISABLE; //数值虽然是DISABLE 但是功能是打开的!!
    can_parameter.rec_fifo_overwrite    = DISABLE;
    can_parameter.trans_fifo_order      = DISABLE;
    can_parameter.working_mode          = CAN_NORMAL_MODE;
        /* initialize CAN */
    can_init(CAN1, &can_parameter);
    /* config CAN1 baud rate */
        if(Sysinfo.Can_baudrate==0)   Sysinfo.Can_baudrate = 250000;
    can_frequency_set(CAN1, Sysinfo.Can_baudrate);  //CAN1 APB1 Fmax=60M  
        
        /* initialize filter */
    can1_filter_start_bank(14);
    can_filter_mask_mode_init(0x00000000, 0x00, CAN_EXTENDED_FIFO1, 15);
  
    can_interrupt_enable(CAN1, CAN_INT_RFNE1);        
}
ps: 注意  CAN0 CAN1共享filter bank  我用的是CAN1 所以从14开始  下面是我自己做的结构体来封装发送包的信息,你可以忽视我的user_usb_info.can2user_msg[user_usb_info.can2user_msg_empty_index],  看后面成员变量。
            user_usb_info.can2user_msg[user_usb_info.can2user_msg_empty_index].id.efid = 0x7777777;
            user_usb_info.can2user_msg[user_usb_info.can2user_msg_empty_index].ft   = CAN_FT_DATA;
            user_usb_info.can2user_msg[user_usb_info.can2user_msg_empty_index].ff   = CAN_FF_EXTENDED;
            user_usb_info.can2user_msg[user_usb_info.can2user_msg_empty_index].dlen = 4;
            user_usb_info.can2user_msg[user_usb_info.can2user_msg_empty_index].data[0] = 0xaa;
            user_usb_info.can2user_msg[user_usb_info.can2user_msg_empty_index].data[1] = 0xbb;
            user_usb_info.can2user_msg[user_usb_info.can2user_msg_empty_index].data[2] = 0xcc;
            user_usb_info.can2user_msg[user_usb_info.can2user_msg_empty_index].data[3] = 0xdd;
            my_can_message_transmit(CAN1, &user_usb_info.can2user_msg[user_usb_info.can2user_msg_empty_index]);        

使用特权

评论回复
板凳
--hyk|  楼主 | 2019-10-29 14:20 | 只看该作者
lvben5d 发表于 2019-10-29 07:50
楼主,我用过GD32E103 的CAN1 , 你按照库文件里的EXZAMPLE去看发送,我试过可以发送和接收的。(接收端的C ...

是不是CAN0还有这么要注意的地方,我按照你的驱动程序思路去修改,还是只能收不能发,显示显性位错误,下面是修改后的程序:can_parameter_struct can_parameter;
        //can_filter_parameter_struct can_filterInit={0};
        /* initialize CAN register */
       
        can_struct_para_init(CAN_INIT_STRUCT,&can_parameter);

        can_deinit(CAN0);
       
        can_debug_freeze_disable(CAN0);
       
        can_parameter.time_triggered = DISABLE;
        can_parameter.auto_bus_off_recovery = ENABLE;
        can_parameter.auto_retrans = DISABLE;
        can_parameter.auto_wake_up = ENABLE;
        can_parameter.rec_fifo_overwrite = DISABLE;
        can_parameter.trans_fifo_order = DISABLE;
        can_parameter.working_mode = CAN_NORMAL_MODE;
       
        can_init(CAN0,&can_parameter);
       
        can_frequency_set(CAN0,DEV_CAN_BAUD_RATE);
       
        can1_filter_start_bank(1);
        can_filter_mask_mode_init(0x00,0x00,CAN_STANDARD_FIFO0,0);
       
         can_interrupt_enable(CAN0, CAN_INT_RFNE0);   
       
        g_transmit_message.tx_sfid = CAN0_ID;
        g_transmit_message.tx_dlen = 8;
        g_transmit_message.tx_ff = CAN_FF_STANDARD;
        g_transmit_message.tx_ft = CAN_FT_DATA;



        g_transmit_message.tx_data[0] = 0x1;
        g_transmit_message.tx_data[1] = 0x2;
        g_transmit_message.tx_data[2] = 0x3;
        g_transmit_message.tx_data[3] = 0x4;
        g_transmit_message.tx_data[4] = 0x1;
        g_transmit_message.tx_data[5] = 0x2;
        g_transmit_message.tx_data[6] = 0x3;
        g_transmit_message.tx_data[7] = 0x4;
        /* transmit message */
        transmit_mailbox=can_message_transmit(CAN0, &g_transmit_message);



TX端和rx端是直接连芯片的,左边我现在已经把电阻和电感去掉了,现象还是和没去掉一样。终端电阻120欧姆用上了




使用特权

评论回复
地板
dxfshsh| | 2019-10-29 21:48 | 只看该作者
我好像很幸运,直接用例程,改了改就是通的,做了一个USB转CANFD,本想把电路图发上了,可不会发,不知怎么粘贴

使用特权

评论回复
5
dxfshsh| | 2019-10-29 21:53 | 只看该作者
图在附近中,

XIN_E103_USB.pdf

132.41 KB

使用特权

评论回复
6
dxfshsh| | 2019-10-30 08:53 | 只看该作者
如果需要PCB图也可以上传,有需求吗?

使用特权

评论回复
7
dxfshsh| | 2019-10-30 08:55 | 只看该作者
还有我写的USB转CANFD成品,ISP装载文件也可上传

使用特权

评论回复
8
--hyk|  楼主 | 2019-10-30 13:05 | 只看该作者
问题解决了,我can0通道用的引脚是PA11和PA12

在数据手册上写的使用PA11和PA12时CAN0_REMAP=00,之前我理解为使用PA11和PA12时不开启重映射,在官方库里面液只有部分重映射和完全重映射两个选项,
没有第一个选项

红色标记的是我自己加上的,然后gpio_pin_remap_config(GPIO_CAN0_NO_REMAP,ENABLE);这句一加,开启复用后就可以正常发送了
这个库有点意思的,有些选项没有,还是需要多看看芯片手册。

使用特权

评论回复
评论
Brian0502 2019-11-19 13:34 回复TA
不需要了,已经自己搞定了。感谢楼主启发。 
Brian0502 2019-11-18 10:15 回复TA
楼主CAN程序可否提供下。。。,我按照你说的这样配置了,CAN还是发送不出去。。。 
9
--hyk|  楼主 | 2019-10-30 13:09 | 只看该作者
感谢上面两位了,我刚接触can通讯,这方面了解的太少,还需要学习学习

使用特权

评论回复
10
dxfshsh| | 2019-10-30 17:18 | 只看该作者
不知楼主使用CAN时,使用哪种应用层协议,还是裸奔,我现在在支持TTCANopen协议,这个直接支持CANFD,
推荐给楼主。

使用特权

评论回复
11
zljiu| | 2019-11-12 16:13 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
12
Brian0502| | 2019-11-15 11:29 | 只看该作者
lvben5d 发表于 2019-10-29 07:50
楼主,我用过GD32E103 的CAN1 , 你按照库文件里的EXZAMPLE去看发送,我试过可以发送和接收的。(接收端的C ...

大兄弟,你这个例程在哪里找的啊!!我咋没找到
跪求GD32E103例程一份啊。。。。

使用特权

评论回复
13
xiaoliquan| | 2020-5-9 15:08 | 只看该作者
感谢楼主    虽然我的问题和楼主不一样     我问问题是f103的can发送接收都不同      后来通过楼主的讨论之后发现我的复用引脚的映射方式选错      应该选部分映射         我用的是PB9和PB8,感觉一豁然开朗     感谢楼主

使用特权

评论回复
14
yqdeso| | 2020-5-11 10:41 | 只看该作者
--hyk 发表于 2019-10-30 13:05
问题解决了,我can0通道用的引脚是PA11和PA12

在数据手册上写的使用PA11和PA12时CAN0_REMAP=00,之前我理 ...

可以不修改库文件的,加下面这句就可以。
gpio_pin_remap_config(GPIO_CAN_PARTIAL_REMAP,DISABLE);

使用特权

评论回复
15
Jerry.huang| | 2020-5-15 18:49 | 只看该作者

使用特权

评论回复
16
wufei9601114| | 2020-7-14 19:03 | 只看该作者
--hyk 发表于 2019-10-30 13:05
问题解决了,我can0通道用的引脚是PA11和PA12

在数据手册上写的使用PA11和PA12时CAN0_REMAP=00,之前我理 ...

不用改啊,默认是00

使用特权

评论回复
17
luobo007| | 2021-3-24 16:13 | 只看该作者
lvben5d 发表于 2019-10-29 07:50
楼主,我用过GD32E103 的CAN1 , 你按照库文件里的EXZAMPLE去看发送,我试过可以发送和接收的。(接收端的C ...

你好,我再使用E103的can总线功能时遇到些问题,您这边CAN总线功能使用正常吗?希望您能请教一些问题

使用特权

评论回复
18
lvben5d| | 2021-3-25 11:29 | 只看该作者
luobo007 发表于 2021-3-24 16:13
你好,我再使用E103的can总线功能时遇到些问题,您这边CAN总线功能使用正常吗?希望您能请教一些问题
...

按照例程先调通硬件,其他才是应用上的 软件问题。

使用特权

评论回复
19
luobo007| | 2021-3-26 10:22 | 只看该作者
lvben5d 发表于 2021-3-25 11:29
按照例程先调通硬件,其他才是应用上的 软件问题。

检查了硬件,是CAN收发器的问题,有个奇怪的现象,systick里的 delay_1ms实际延迟时间是3ms

使用特权

评论回复
20
lvben5d| | 2021-3-29 15:19 | 只看该作者
luobo007 发表于 2021-3-26 10:22
检查了硬件,是CAN收发器的问题,有个奇怪的现象,systick里的 delay_1ms实际延迟时间是3ms
...

这个 跟实际运行的主频 有关系吧。

使用特权

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

本版积分规则

1

主题

4

帖子

0

粉丝