想要达到的目的:使用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);
}
}
不知道你这个问题是否已经解决, 如果还没有解决的话:注意:STM32嵌入式实现智能家居控制系统的完整工程(包含keil代码工程和proteus仿真工程)已经放在文章末尾,需要的可点击链接下载。
工程及源代码下载地址: