IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> CAN调试总结(CSM300(A)) -> 正文阅读

[嵌入式]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Ω电阻后,没有问题了(这里也可以用示波器查看波形)。?

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章           查看所有文章
加:2022-04-01 23:35:28  更:2022-04-01 23:37:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 4:52:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码