打印

GD32105CAN 一步一个坎啊

[复制链接]
1482|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wufei9601114|  楼主 | 2020-7-12 17:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
CAN, TE, rc, pi, LTE
AD搞定了,CAN又卡住了,哪位大神帮看看
void rcuInit(void)  //设置系统时钟及外设时钟
{
        rcu_deinit();  //复位RCU
        rcu_system_clock_source_config(RCU_CKSYSSRC_PLL);  //系统时钟CK_SYS为PLL时钟 最高108M
        rcu_pll_config(RCU_PLLSRC_HXTAL,9);  //外部晶振作为PLL时钟,8倍频 12*8
        rcu_ahb_clock_config(RCU_AHB_CKSYS_DIV1); //系统时钟1分频作为AHB时钟
        rcu_apb2_clock_config(RCU_APB2_CKAHB_DIV1);  //AHB时钟1分频作为APB2时钟
        //rcu_apb1_clock_config(RCU_APB1_CKAHB_DIV1);  //AHB时钟1分频作为APB1时钟
        rcu_osci_on(RCU_HXTAL);  //打开振荡器--外部高速晶体
        rcu_osci_on(RCU_PLL_CK); //打开振荡器--锁相环
       
        rcu_periph_clock_enable(RCU_AF);  //使能复用功能时钟
        rcu_periph_clock_enable(RCU_GPIOE);  //使能GPIOE时钟
        rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV12);  //配置ADC时钟 最大14M  APB2时钟12分频为8M
        rcu_periph_clock_enable(RCU_ADC1);  //使能ADC1时钟
        rcu_periph_clock_enable(RCU_GPIOA);  //使能GPIOA时钟
        rcu_periph_clock_enable(RCU_CAN0);  //使能CAN0时钟
}

void gpioInit(void)
{
        gpio_init(GPIOE,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_3);  //GPIO参数初始化 PE3输出
        gpio_init(GPIOA,GPIO_MODE_AIN,GPIO_OSPEED_50MHZ,GPIO_PIN_2);  //PA2模拟输入
        gpio_init(GPIOA,GPIO_MODE_IPU,GPIO_OSPEED_50MHZ,GPIO_PIN_11);  //RD0上拉输入
        gpio_init(GPIOA,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_12);  //TD0为AFIO推挽输出
}

void canInit(can_parameter_struct can_parameter, can_filter_parameter_struct can_filter,uint CAN_BAUDRATE)
{  

        can_struct_para_init(CAN_INIT_STRUCT, &can_parameter);//CAN初始化参数结构体
    can_struct_para_init(CAN_FILTER_STRUCT, &can_filter);//CAN过滤器参数结构体
    can_struct_para_init(CAN_TX_MESSAGE_STRUCT, &transmit_message);     //CAN发送信息参数结构体
    can_deinit(CAN0);//复位CAN0外设
        while(!can_working_mode_set(CAN0,CAN_MODE_INITIALIZE));  //CAN工作模式设置   初始化模式

    /* 初始化CAN参数 */
    can_parameter.time_triggered = DISABLE;   //时间触发通信模式
    can_parameter.auto_bus_off_recovery = DISABLE;  //自动离线恢复
    can_parameter.auto_wake_up = DISABLE;  //自动唤醒使能
    can_parameter.no_auto_retrans = DISABLE; //自动重传
    can_parameter.rec_fifo_overwrite = DISABLE;  //接收FIFO满时覆盖
    can_parameter.trans_fifo_order = DISABLE;  //发送FIFO顺序
    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;  //位段1
    can_parameter.time_segment_2 = CAN_BT_BS2_3TQ;  //位段2
    can_parameter.prescaler = 24;
    /* 1MBps */
//#if CAN_BAUDRATE == 1000
//    can_parameter.prescaler = 6;
//    /* 500KBps */
//#elif CAN_BAUDRATE == 500
//    can_parameter.prescaler = 12;
//    /* 250KBps */
//#elif CAN_BAUDRATE == 250
//    can_parameter.prescaler = 24;
//    /* 125KBps */
//#elif CAN_BAUDRATE == 125
//    can_parameter.prescaler = 48;
//    /* 100KBps */
//#elif  CAN_BAUDRATE == 100
//    can_parameter.prescaler = 60;
//    /* 50KBps */
//#elif  CAN_BAUDRATE == 50
//    can_parameter.prescaler = 120;
//    /* 20KBps */
//#elif  CAN_BAUDRATE == 20
//    can_parameter.prescaler = 300;
//#else
//    can_parameter.prescaler = 24;
//#endif  

    while(!can_init(CAN0, &can_parameter)); //初始化外设CAN
   
    /* initialize filter */
    can_filter.filter_number=0;  //过滤器索引号
    can_filter.filter_mode = CAN_FILTERMODE_MASK; //过滤模式  掩码模式
    can_filter.filter_bits = CAN_FILTERBITS_32BIT;  //过滤器位宽
    can_filter.filter_list_high = 0x3000; //过滤器列表数高位
    can_filter.filter_list_low = 0x0000;  //过滤器列表数低位
    can_filter.filter_mask_high = 0x3000; //过滤器掩码数高位
    can_filter.filter_mask_low = 0x0000;  //过滤器掩码数低位
    can_filter.filter_fifo_number = CAN_FIFO0;  //接收FIFO编号
    can_filter.filter_enable = ENABLE;  //过滤器工作使能
   
    can_filter_init(&can_filter); //CAN过滤器初始化
        while(!can_working_mode_set(CAN0,CAN_MODE_NORMAL));  //CAN工作模式设置   正常模式  硬件自动唤醒
}

void cansend(void)
{
        uint m;
    transmit_message.tx_sfid = 0x300>>1;  //标准格式帧标识符
    transmit_message.tx_efid = 0x00;      //扩展格式帧标识符
    transmit_message.tx_ft = CAN_FT_DATA; //帧类型  数据帧(DATA)或远程帧(REMOTE)
    transmit_message.tx_ff = CAN_FF_EXTENDED;  //帧格式  标准(STANDARD)或扩展(EXTENDED)  
    transmit_message.tx_dlen = 2;  //数据长度
    transmit_message.tx_data[0] = 0x55;
    transmit_message.tx_data[1] = 0xAA;
    can_message_transmit(CAN0, &transmit_message);
    yscx(100);
}

也看不出还有什么问题了

使用特权

评论回复
沙发
wufei9601114|  楼主 | 2020-7-12 21:30 | 只看该作者
不准复制代码
这是两天的心血

使用特权

评论回复
板凳
xdqfc| | 2020-7-13 10:33 | 只看该作者
楼主请放一万个心,咱绝不复制,咱还是以官方的例程为标准。

使用特权

评论回复
地板
wufei9601114|  楼主 | 2020-7-13 11:57 | 只看该作者
xdqfc 发表于 2020-7-13 10:33
楼主请放一万个心,咱绝不复制,咱还是以官方的例程为标准。
...

解决问题啊

使用特权

评论回复
5
lvben5d| | 2020-7-22 09:26 | 只看该作者
这个 CAN 按照官网例子 学习就基本出来了, 还不知道楼主 中断接收处理的应用。 CAN卡住 是如何一种卡住? 收不到包? 还是。。。

使用特权

评论回复
6
zeshoufx| | 2020-7-23 10:50 | 只看该作者
lvben5d 发表于 2020-7-22 09:26
这个 CAN 按照官网例子 学习就基本出来了, 还不知道楼主 中断接收处理的应用。 CAN卡住 是如何一种卡住?  ...

是的,,它这个描述“卡住”不太清楚

使用特权

评论回复
7
a765025966| | 2021-3-3 17:39 | 只看该作者
楼主解决了么,我也是can一直发不了数据

使用特权

评论回复
8
里面有晴雨| | 2021-3-3 19:40 | 只看该作者
我感觉CAN总线是最不好调试的。

使用特权

评论回复
评论
a765025966 2021-3-3 19:45 回复TA
都是用他们的DEMO 都不行 
9
ipman| | 2021-3-4 16:22 | 只看该作者
一般都是一次成功啊,找个CAN分析器,断点一下不就好了

使用特权

评论回复
10
515192147| | 2021-3-5 22:56 | 只看该作者
推荐 用 成熟的 CAN 高层 协议,例如  CANWeb详细见:

https://bbs.21ic.com/icview-1945634-1-1.html



使用特权

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

本版积分规则

11

主题

23

帖子

0

粉丝