很简单的一个应用,就是终端来了数据通过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Ω电阻后,没有问题了(这里也可以用示波器查看波形)。?
|