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

想要达到的目的:使用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中开启了自动重发功能,都与示例中的相同)

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[i]);
                         }
                         printf("\n");
                       
       LED0_TOGGLE();
                         delay_ms(500);
                       
    }
}

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^