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 波特率计算,如下图所示