新手上路
- 积分
- 42
- 金钱
- 42
- 注册时间
- 2023-3-28
- 在线时间
- 11 小时
|
3金钱
本帖最后由 guliga 于 2023-4-8 22:01 编辑
想要达到的目的:使用STM32f103C8T6最小系统板连接TJA1050CAN收发芯片与电脑或另一块STM32进行CAN通信。
出现问题的过程:
使用环回模式证明CAN相关寄存器初始化正常,但是改为正常模式后发现无法与电脑或其它单片机通信,发送函数卡在检测发送邮箱是否为空的函数里无法退出。后来通过开启自动收发功能解决了该问题(在电脑CAN调试助手中看到了单片机发送的数据)。解决了CAN信息发送问题之后,开启静默模式测试单片机是否能正常接收数据,但是通过多次修改之后发现无法接收其它单片机和电脑发来的信息,已确认各模块的发送没有问题。
目前已采用的检测方法:
1、将两块STM32分别接CAN收发芯片并连接,STM32都为普通模式,一块只发数据(经检测数据能够正常发送),一块只收数据,接收到数据会翻转LED灯状态,但测试过程中接收数据的STM32无法翻转LED灯状态(发送、接收函数都在主函数中编写)。
2、将STM32接CAN收发芯片通过USB-CAN模块与电脑相连,电脑通过CAN调试助手发送数据给STN32,若接收到数据会翻转LED状态,但测试过程中接收数据的STM32无法翻转LED灯状态。
3、将一块STM32的CANRX和CANTX引脚相连,开启接收中断,在环回模式下收发正常,但是开启普通模式后可以发信但无法接收数据。(开不开启中断都无法接收到数据)
猜测原因:
1、CAN的引脚相关设置有问题(本来感觉是最有可能的原因,但是使用的是STM32战舰的初始化代码,多次读该部分代码也未发现有异常)
2、硬件问题(目前手里的两块最小系统板都出现同样的问题,没有示波器,无法确认是否是硬件问题)
3、没有正确使用接收函数(但是我的主函数是仿照示例里写的,没有发现任何问题)
求助各位大佬!!!!万分感谢!!!!!
主函数代码(其它代码除了只有CAN.C中开启了自动重发功能,都与示例中的相同)
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/CAN/can.h"
#include "./BSP/ADC/adc.h"
#include "./BSP/BDS/bds.h"
int main(void)
{
uint8_t canbuf[8]={0x02,0x01,0x0C,0x00,0x00,0x00,0x00,0x00};
uint8_t rcanbuf[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
uint8_t r=0;
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
delay_init(72); /* 延时初始化 */
usart_init(115200); /* 串口初始化为115200 */
led_init(); /* 初始化LED */
can_init(CAN_SJW_1TQ, CAN_BS2_8TQ, CAN_BS1_9TQ, 4, CAN_MODE_NORMAL); /* CAN初始化, 回环模式, 波特率500Kbps */
while (1)
{
can_send_msg(0x7DF,canbuf,8);//发送函数
delay_us(100);
r=can_receive_msg(0x7DF,rcanbuf);//接收函数
if(r!=0)
{
LED0_TOGGLE();
delay_ms(500);
}
for(uint16_t i=0;i<8;i++)
{
printf("%d ",rcanbuf);
}
printf("\n");
LED0_TOGGLE();
delay_ms(500);
}
}
问题已解决,经检查单片机最小系统板的各个引脚及其余硬件均正常,USB-CAN模块正常,上位机正常,CAN网络波特率设置正常,初始化代码正常,TJA1050应该是肯定有问题的,但是用示波器一测波形好像又啥都正常。最后忍痛买了一块精英板,代码一烧进去就一切都解决了。。。不知道咋回事。。。
|
最佳答案
查看完整内容[请看2#楼]
你是最小系统板连的 TJA1050芯片,那周围的电路是否是正常的?
can总线发送的数据,你说在电脑的CAN上位机上能正常收到数据,那么问题可能就是接收方面的了,正点原子的CAN接收直接在while中接收是没有问题的(你可以看看你这部分的和例程有啥区别),另外就是硬件电路方面了,猜测可能是这方面的问题了,可以自己排查下
|