刚开始学习CAN 不懂请教 | 已解决
刚开始学习CAN 没有屠龙刀使用自己做的学习板子。芯片STC32G128Kcan1P00P01
CAN2 P02P03
使用2个tja1050模块。两个模块的CANHCANL分别连接。
第一个模块的RX TX 分别接入P00 P01第二个模块的RXTX 分别接P02 P03
程序使用的是手册上的标准帧收发测试。
由于没有USB转CAN所以通过显示屏 显示接受的内容。现在是无论如何都无法接收到。
while(1)
{
if(!P32)
{P15 = !P15;
CANSEL = 0; //选择CAN1模块
CanSendMsg(CAN_ID,TX_BUF);
}
while(!P32);
if(B_200ms)
{
B_200ms = 0;
CANSEL = 1; //选择CAN2模块
CanReadFifo(buffer);
OLED_ShowNum_string(1,0,buffer,4,1);
OLED_ShowNum_string(6,0,buffer,4,1);
OLED_ShowNum_string(11,0,buffer,4,1);
OLED_ShowNum_string(1,2,buffer,4,1);
OLED_ShowNum_string(6,2,buffer,4,1);
OLED_ShowNum_string(11,2,buffer,4,1);
OLED_ShowNum_string(1,4,buffer,4,1);
OLED_ShowNum_string(6,4,buffer,4,1);
OLED_ShowNum_string(11,4,buffer,4,1);
OLED_ShowNum_string(1,6,buffer,4,1);
OLED_ShowNum_string(6,6,buffer,4,1);
OLED_ShowNum_string(11,6,buffer,4,1);
}
}
我的想法是按下P32第一个CAN模块发送一帧数据。CAN2 模块接受 。我读取内容显示到OLED上。
不知道出错到哪里。
首先,感谢您分享您的CAN总线学习经验。针对您的问题,我将从硬件连接、软件配置和调试方法三个方面进行分析,并提供一些建议。
1. 硬件连接检查
您提到使用了两个TJA1050模块,分别连接到STC32G128K的CAN1和CAN2接口。以下是需要检查的硬件连接点:
电源和地线:确保TJA1050模块的VCC和GND引脚正确连接到电源和地,且电源电压符合TJA1050的工作要求(通常为5V)。
CANH和CANL连接:两个TJA1050模块的CANH和CANL引脚需要正确连接,确保CAN总线网络的物理层通信正常。建议使用双绞线连接,并确保终端电阻(通常为120Ω)正确接入。
RX和TX引脚:确保TJA1050的RX和TX引脚分别与STC32G128K的P00/P01(CAN1)和P02/P03(CAN2)正确连接,且没有接反。
2. 软件配置检查
您的代码中涉及CAN模块的初始化和收发操作。以下是需要重点检查的软件配置点:
CAN模块初始化:确保CAN1和CAN2模块的初始化配置正确,包括波特率、工作模式(正常模式或回环模式)等。可以参考STC32G128K的手册,确保寄存器配置正确。
发送和接收函数:检查CanSendMsg和CanReadFifo函数的实现,确保发送和接收的数据格式符合CAN协议标准帧的要求。特别是ID、数据长度和数据内容的设置。
中断处理:如果使用中断方式接收数据,确保CAN接收中断的配置和中断服务程序(ISR)正确实现。
3. 调试方法建议
由于您没有USB转CAN工具,以下是一些调试建议:
回环模式测试:将CAN模块配置为回环模式(Loopback Mode),在该模式下,发送的数据会直接回环到接收端,无需外部硬件连接。通过这种方式可以验证CAN模块的发送和接收功能是否正常。
LED指示灯:在发送和接收数据时,通过LED指示灯或显示屏实时显示状态,帮助定位问题。例如,在发送数据时点亮LED,在接收到数据时熄灭LED。
逐步调试:将问题分解为多个小步骤,逐步验证每个步骤的正确性。例如,先验证CAN模块的初始化是否成功,再验证发送功能,最后验证接收功能。
4. 代码优化建议
您的代码中涉及CAN模块的选择和数据显示。以下是一些优化建议:
模块选择优化:在切换CAN模块时,确保切换操作不会影响其他模块的状态。可以在切换前保存当前模块的状态,切换后恢复。
数据显示优化:在OLED上显示接收到的数据时,建议将数据格式化为易读的格式,例如十六进制或ASCII码。同时,确保显示函数能够正确处理数据长度和显示位置。
5. 总结
通过以上硬件连接、软件配置和调试方法的检查与优化,您应该能够逐步定位并解决CAN通信问题。如果问题仍然存在,建议进一步查阅STC32G128K的手册,或参考相关CAN总线通信的示例代码和资料。
希望这些建议对您有所帮助,祝您在CAN总线学习中取得进展!
[本文内容由国芯人工智能辅助生成,仅供参考] 经过今天的学习 终于调试通了。对CAN数据格式基本了解了 发送can数据包的时候,需要等待can发送标志位,等待发送完成后再切换到另一个can外设进行接收
因为can的发送没有fifo,但是can的接收有fifo,可以自己缓存。
使用readfifo前,应该使用B_CanxRead(x=1或2)来先判断是否有接收数据 王昱顺 发表于 2025-4-14 09:47
发送can数据包的时候,需要等待can发送标志位,等待发送完成后再切换到另一个can外设进行接收
因为can的发 ...
谢谢回复。 发现连续发送多帧数据(标准帧)的时候。中间需要间隔500us以上才可以成功。如果两条发送命令之间不延时接受只有一个。
页:
[1]