CAN调试总结(CSM300(A))

Posted 无痕幽雨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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Ω电阻后,没有问题了(这里也可以用示波器查看波形)。 

以上是关于CAN调试总结(CSM300(A))的主要内容,如果未能解决你的问题,请参考以下文章

关于串口数据用示波器分析的问题

CAN总线简易入门教程

CAN总线简易入门教程

请问CAN总线的速率为啥用波特率表示,而不用比特率表示?

UART波形分析

调试串口总结