OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6571|回复: 9

使用STM32进行CAN通信时,使用环回模式收发正常,正常模式、静默模式无法收到数据

[复制链接]

2

主题

7

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2023-3-28
在线时间
11 小时
发表于 2023-4-2 00:49:10 | 显示全部楼层 |阅读模式
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中接收是没有问题的(你可以看看你这部分的和例程有啥区别),另外就是硬件电路方面了,猜测可能是这方面的问题了,可以自己排查下
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

41

主题

278

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2357
金钱
2357
注册时间
2019-10-29
在线时间
380 小时
发表于 2023-4-2 00:49:11 | 显示全部楼层
你是最小系统板连的 TJA1050芯片,那周围的电路是否是正常的?
can总线发送的数据,你说在电脑的CAN上位机上能正常收到数据,那么问题可能就是接收方面的了,正点原子的CAN接收直接在while中接收是没有问题的(你可以看看你这部分的和例程有啥区别),另外就是硬件电路方面了,猜测可能是这方面的问题了,可以自己排查下

Snipaste_2023-04-03_17-04-38.png
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2023-4-3
在线时间
0 小时
发表于 2023-4-3 15:24:43 来自手机 | 显示全部楼层
波特率匹配了吗
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2023-3-28
在线时间
11 小时
 楼主| 发表于 2023-4-4 14:15:22 | 显示全部楼层

您好,我刚刚重新检查了一遍,我这边波特率都是匹配的,都是统一的500k
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2023-3-28
在线时间
11 小时
 楼主| 发表于 2023-4-4 14:25:27 | 显示全部楼层
chenyuan 发表于 2023-4-3 17:04
你是最小系统板连的 TJA1050芯片,那周围的电路是否是正常的?
can总线发送的数据,你说在电脑的CAN上位 ...

您好,我这边使用的收发芯片的原理图与原子哥板子上集成好的电路是几乎一样的,但是还没有用示波器测过,待会我去试一试。
程序方面的话我使用的方法就是和示例中一样,都是在while中调用接收函数并判断返回值确认是否接收到数据,这部分应该可以确认没有问题。
在硬件电路方面,因为在环回模式下单片机能正常自发自收,但是我使用普通模式并且把CANTX和CANRX连在一起测试的时候单片机就无法收到数据了,所以我怀疑可能是CANRX的引脚硬件部分出现了问题。
感谢您提供的排查思路!
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2023-4-5 11:14:59 | 显示全部楼层
上传代码吧 可以帮你测试下  排除代码问题
最可能的问题大概是 STM32f103C8T6最小系统板连接TJA1050CAN   TJA1050供电你用的3.3v吧 必须5v供电

回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2023-3-28
在线时间
11 小时
 楼主| 发表于 2023-4-5 16:31:32 | 显示全部楼层
本帖最后由 guliga 于 2023-4-5 16:38 编辑
nashui_sx 发表于 2023-4-5 11:14
上传代码吧 可以帮你测试下  排除代码问题
最可能的问题大概是 STM32f103C8T6最小系统板连接TJA1050CAN    ...

您好,以下是我使用的主函数代码,头文件里的函数都和原子哥例程里的相同,如果正常的话实验现象应该是收到一次CAN信号LED0将会翻转一次,如果方便的话烦请您帮测试一下,感谢!


main.c:

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/CAN/can.h"



int main(void)
{
                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);                                                        /* 延时初始化 */
    led_init();
    can_init(CAN_SJW_1TQ, CAN_BS2_8TQ, CAN_BS1_9TQ, 4, CAN_MODE_NORMAL); /* CAN初始化, 普通模式, 波特率500Kbps */
                while (1)
    {
                        r=can_receive_msg(rcanbuf);
                         if(r)
                         {
                                                LED0_TOGGLE();
                         }
     }

}
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2023-4-6 09:03:19 | 显示全部楼层
guliga 发表于 2023-4-5 16:31
您好,以下是我使用的主函数代码,头文件里的函数都和原子哥例程里的相同,如果正常的话实验现象应该是收 ...

哈哈 当我没说
回复

使用道具 举报

4

主题

11

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2022-8-15
在线时间
12 小时
发表于 2023-9-26 10:33:03 | 显示全部楼层
can_receive_msg(0x7DF,rcanbuf);//接收函数
can_send_msg(0x7DF,canbuf,8);//发送函数
大佬问一下为什么我的原子哥例程里接收和发送函数和你的不一样,我的函数名没有改变id这个选项,是这种
u8 Can_Receive_Msg(u8 *buf)//接收函数
u8 CAN_Send_Msg(u8* msg,u8 len)//发送函数,所以请问您是在哪找的原子哥例程啊can跟我的不一样呢
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2023-3-28
在线时间
11 小时
 楼主| 发表于 2023-10-8 09:13:38 | 显示全部楼层
wxy919552050 发表于 2023-9-26 10:33
can_receive_msg(0x7DF,rcanbuf);//接收函数
can_send_msg(0x7DF,canbuf,8);//发送函数
大佬问一下为什 ...

我之前用的老版本HAL库的函数和你的是一样的,可能原子哥例程用的HAL库是新版本的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-24 15:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表