STM32 CAN调试经验


STM32F103X CAN 开发调试过程

原理图如下所示

CAN1_RX = PA11

CAN1_TX = PA12

刚开始时:在看原理图的时候只看到了CAN1_TX, CAN1_RX了,从而忽略了PD0, PD1。以为 PA11, PA12, PD0, PD1都连着TJA1050的R,D脚。

因为不懂上面的原理图标记,而付出了2天的代价调通

阶段一:CAN 环回模式

GPIO 配置如下

         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;        //PA11        

         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;    //??????

//      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

         GPIO_Init(GPIOA, &GPIO_InitStructure);       

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;        //PA12        

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;         //??????

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;      //IO????50MHz

GPIO_Init(GPIOA, &GPIO_InitStructure);

程序功能:在CAN初始化后,不断循环发送数据

遇到问题:在JTA1050 的D脚死活测不出波形

在百度上查找了许久,得知CAN1功能有可能被重新映射了,再查找到芯片手册

最终使用了万用表对 P12-D, P11-R, PD1-D, PD0-R,4对线进行了连通性测量

发现P12-D, P11-R并没有连通,PD1-D, PD0-R这两对线是连通了的。

瞬时间明白了CAN1被重映射到了PD0,PD1了

解决方法:重新对CAN GPIO进行配置,如下所示

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOD, ENABLE);

         RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);

         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;   

         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;    

//      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

         GPIO_Init(GPIOD, &GPIO_InitStructure);      

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;         

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     

GPIO_Init(GPIOD, &GPIO_InitStructure);

GPIO_PinRemapConfig(GPIO_Remap2_CAN1 , ENABLE);

上面代码为典型的GPIO复用,重映射配置,有3点需要注意

1、 必需使能GPIO复用时钟, RCC_APB2Periph_AFIO

2、 必需使能GPIO时钟, RCC_APB2Periph_GPIOD

3、 使能GPIO重映射功能, GPIO_PinRemapConfig(GPIO_Remap2_CAN1 , ENABLE);

最后,终于出波形了

CAN 波特率计算,如下图所示

相关