百合图库总站: GD32E103CBT6 CAN0发送问题

永利游戏开户直营
118|9
楼主
本帖最后由 --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
        
}

沙发
| 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]);        
板凳
 楼主 | 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欧姆用上了




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

XIN_E103_USB.pdf

132.41 KB, 下载次数: 3

6
| 2019-10-30 08:53 | 只看该作者
如果需要PCB图也可以上传,百合图库总站:有需求吗?
7
| 2019-10-30 08:55 | 只看该作者
还有我写的USB转CANFD成品,ISP装载文件也可上传
8
 楼主 | 2019-10-30 13:05 | 只看该作者
问题解决了,我can0通道用的引脚是PA11和PA12

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

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

9
 楼主 | 2019-10-30 13:09 | 只看该作者
感谢上面两位了,我刚接触can通讯,这方面了解的太少,还需要学习学习
10
| 2019-10-30 17:18 | 只看该作者
不知楼主使用CAN时,使用哪种应用层协议,还是裸奔,我现在在支持TTCANopen协议,这个直接支持CANFD,
推荐给楼主。
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

永利游戏开户直营 快速回复 返回顶部 返回列表
ag电子游戏导航 澳门50年登入 菲律宾申博太阳城手机安卓版游戏网上娱乐场 索罗门娱乐CQ9电子 乐虎国际娱乐官网登录
申博太阳城138代理登入 第三吧娱乐城电子游戏 mg功夫小胖猪登入 博狗网站开户 mg地狱阿嬷
申博管理平台登入 经纬娱乐平台测速 马会仙人掌论坛 网上电子赌场平台 澳洲国际幸运农场彩票官网
新葡京官方直营网站 威趣游戏 www.11sbc.com 澳门新葡京网址打不开 一号站平台