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))的主要内容,如果未能解决你的问题,请参考以下文章