CAN调试总结(CSM300(A))

很简单的一个应用,就是终端来了数据通过CAN发出去,CAN来了数据给终端。在配置CSM300A时候,遇到问题,记录下,需要能都帮助大家吧。

一、CSM300A连线

参考电路:

 模式选择:

 二、配置说明:

1)默认配置

 

2) 配置参数说明

 

 

 

 

3)配置回应

 

 

4)配置注意

我安装上述配置信息,发送如下数据:

        0xF7,0xF8,
        0x01,
        0x3C,
        0x01,0x08,0x01,0x00,
        0x0C,//CAN速率
        0x00,0x00,0x00,//保留字节
        0x00,
        0x08,
        0xFF,0xFF,0xFF,0xFF,
        0x00,0x00,0x00,0x00,
        0x00,0x00,0x00,0x00,
        0xFF,0xFF,0xFF,0xFF,//保留字节
        0x00,0x00,0x00,0x00,
        0x00,0x00,0x00,0x00,
        0x00,0x00,0x00,0x00,
        0x00,0x00,0x00,0x00,
        0x01,//转换模式
        0x00,//转换方向
        0x02,
        0x00,
        0x00,
        0x00,//发送帧类型
        0x00,0x00,0x00,0x00,
        0x02,
        0x00,
        0x40,
        0x1A,
        0x0F,
        0x05,//*100ms
        0x01,
        0x01,
        0x62 //校验

计算异或:

    s_chCanCfg[sizeof(s_chCanCfg)-1] = s_chCanCfg[0];
    for(i=1;i<sizeof(s_chCanCfg)-1;i++){
        s_chCanCfg[sizeof(s_chCanCfg)-1] = s_chCanCfg[sizeof(s_chCanCfg)-1] ^ s_chCanCfg[i];
    }

结果私活收不到回应帧,用CAN调试工具,500K也不通,125K也可以通,说明修改配置失败。打印LOG,串口给SCAM300A发送数据没有问题,校验值也对,那就奇怪了,继续看手册。有如下说明:

 总结两点:

(1)配置波特率为9600;

(2)配置有时序要求;

配置函数:

#if CAN_MODULE
void can_cfg(uint8_t chRate)
{
    uint8_t i=0;
    static uint8_t s_chCanCfg[] = {
        0xF7,0xF8,
        0x01,
        0x3C,
        0x01,0x08,0x01,0x00,
        0x0C,//CAN速率
        0x00,0x00,0x00,//保留字节
        0x00,
        0x08,
        0xFF,0xFF,0xFF,0xFF,
        0x00,0x00,0x00,0x00,
        0x00,0x00,0x00,0x00,
        0xFF,0xFF,0xFF,0xFF,//保留字节
        0x00,0x00,0x00,0x00,
        0x00,0x00,0x00,0x00,
        0x00,0x00,0x00,0x00,
        0x00,0x00,0x00,0x00,
        0x01,//转换模式
        0x00,//转换方向
        0x02,
        0x00,
        0x00,
        0x00,//发送帧类型
        0x00,0x00,0x00,0x00,
        0x02,
        0x00,
        0x40,
        0x1A,
        0x0F,
        0x05,//*100ms
        0x01,
        0x01,
        0x62 //校验

//        0xF7,0xF8,0x01,0x3C,0x01,0x08,0x01,0x00,
//        0x0C,0x00,0x00,0x00,0x00,0x08,0xFF,0xFF,
//        0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
//        0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
//        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//        0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,
//        0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//        0x01,0x00,0x00,0x00,0x0F,0x05,0x01,0x01,
//        0x36 
    };

    GPIO_WrDataOut(GPIO_CAN_CFG,MODULE_GPIO_LOW);
    can_uart_init(9600);
    s_wCanCfg = 0;
    while(s_wCanCfg < 100){
        WDT_Restart();
    }
    GPIO_WrDataOut(GPIO_CAN_RST,MODULE_GPIO_LOW);
    s_wCanCfg = 0;
    while(s_wCanCfg < 100){
        WDT_Restart();
    }
    GPIO_WrDataOut(GPIO_CAN_RST,MODULE_GPIO_HIGH);
    s_wCanCfg = 0;
    while(s_wCanCfg < 100){
        WDT_Restart();
    }

    s_chCanCfg[sizeof(s_chCanCfg)-1] = s_chCanCfg[0];
    for(i=1;i<sizeof(s_chCanCfg)-1;i++){
        s_chCanCfg[sizeof(s_chCanCfg)-1] = s_chCanCfg[sizeof(s_chCanCfg)-1] ^ s_chCanCfg[i];
    }

    s_bCanCfg = true;
    s_wCanCfg = 0;

    GPIO_WrDataOut(GPIO_LED1, MODULE_GPIO_HIGH);

    UART_Printf(SGCC_UART0_P, "can cfg send:\n\r");
    WDT_Restart();
    log_hex(s_chCanCfg, sizeof(s_chCanCfg));
    WDT_Restart();
    __disable_irq();
    for(i= 0; i<sizeof(s_chCanCfg); i++)
    {
        WDT_Restart();
        UART_PutChar(SGCC_UART3_P, s_chCanCfg[i]);
    }
    __enable_irq();
    GPIO_WrDataOut(GPIO_LED1, MODULE_GPIO_LOW);
}
#endif

我为了偷懒,没有判定回复帧,用的超时:

#if CAN_MODULE
    if(s_wCanCfg >= 2000){
        if(s_bCanCfg){
            can_uart_init(115200);
            GPIO_WrDataOut(GPIO_CAN_CFG,MODULE_GPIO_HIGH);
//            s_wCanCfg = 0;
//            while(s_wCanCfg < 200){
//                WDT_Restart();
//            }
            GPIO_WrDataOut(GPIO_CAN_RST,MODULE_GPIO_LOW);
            s_wCanCfg = 0;
            while(s_wCanCfg < 100){
                WDT_Restart();
            }
            GPIO_WrDataOut(GPIO_CAN_RST,MODULE_GPIO_HIGH);
            s_wCanCfg = 0;
            while(s_wCanCfg < 100){
                WDT_Restart();
            }
            UART_Printf(SGCC_UART0_P, "can cfg ok\n\r");
            s_bCanCfg = false;
        }
    }
#endif

结果:

 

说下调试当中遇到的另外一个问题:

就是配置成功了,125K和250K都能通信,但是500K就是通不了,询问厂家说500K没有什么特殊限制,那就奇怪了?百度了下,说CAN要交120Ω电阻(第一次用,不知道),加了120Ω电阻后,没有问题了(这里也可以用示波器查看波形)。 

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值