首页 > 代码库 > STM32下调试CAN通信

STM32下调试CAN通信

基本流程:
1、初始化CAN模块:

    启用CAN时钟

    配置CAN功能寄存器(包括位定时,分频等等)

    配置CAN过滤器

    打开中断

2、初始化I/O口

    启用GPIO时钟

    打开CAN对应的GPIO引脚

    配置重映射(根据实际情况)

3、定义CAN发送结构体,接收结构体

4、开始发送并准备接收总线上信号

5、检查接收邮箱收的数据是否正确

 1 void    CAN_Config()
 2 {
 3     CAN_InitTypeDef         CAN_InitStructure;
 4     CAN_FilterInitTypeDef     CAN_FilterInitStructure;
 5     GPIO_InitTypeDef         GPIO_InitStructure;
 6     RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1,ENABLE);
 7     /**Configure the PA11 PA12 to CAN1*/
 8     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12;
 9     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
10     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
11     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
12     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    
13     GPIO_Init(GPIOA,&GPIO_InitStructure);
14     GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_CAN1);
15     GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_CAN1);
16 
17     CAN_DeInit(CAN1);
18     CAN_InitStructure.CAN_ABOM = DISABLE;        //自动离线
19     CAN_InitStructure.CAN_AWUM = DISABLE;        //自动唤醒
20     CAN_InitStructure.CAN_TTCM = DISABLE;        //触发通讯模式
21     CAN_InitStructure.CAN_NART = ENABLE;        //禁止报文自动重传
22     CAN_InitStructure.CAN_RFLM = DISABLE;        //报文自动覆盖¨
23     CAN_InitStructure.CAN_TXFP = DISABLE;        //优先级判定
24     CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;    //工作模式
25     /**configure baudrate 1M */
26     CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;            
27     CAN_InitStructure.CAN_BS1 = CAN_BS1_6tq;
28     CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq;
29     CAN_InitStructure.CAN_Prescaler =20;
30     CAN_Init(CAN1, &CAN_InitStructure);
31     
32     CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;                //启用过滤
33     CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FilterFIFO0;    //过滤邮箱0
34     CAN_FilterInitStructure.CAN_FilterIdHigh= 0x0000;                    //过滤ID
35     CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
36     CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;                //过滤ID掩码
37     CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
38     CAN_FilterInitStructure.CAN_FilterMode =CAN_FilterMode_IdMask;
39     CAN_FilterInitStructure.CAN_FilterNumber = 0;                    
40     CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
41     CAN_FilterInit(&CAN_FilterInitStructure);
42     
43     CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);
44 }

 

定义CAN结构体:

1 CanTxMsg msg;
2 CanRxMsg RxMsg;
3 
4     msg.StdId = 0x09;
5     msg.IDE = CAN_Id_Standard;
6 msg.Data[0]=0x01;
7     msg.DLC=1;
 1 void CAN1_RX0_IRQHandler(void)
 2 {
 3       if(CAN_MessagePending(CAN1,CAN_FIFO0) != RESET)
 4         {
 5             CAN_ClearITPendingBit(CAN1,CAN_IT_FMP0);
 6             CAN_Receive(CAN1,CAN_FIFO0,&RxMsg);
 7           msg.Data[0] = RxMsg.Data[2]+1;
 8             msg.DLC =1;
 9             msg.StdId = 0x02;
10             msg.IDE = CAN_Id_Standard;
11             if(RxMsg.Data[0] ==0x01)
12             {
13                 GPIO_ToggleBits(GPIOD,GPIO_Pin_14);
14             }
15             CAN_Transmit(CAN1,&msg);
16         }
17 }

经过实验,在通信波特率为20K下可以正常工作。建议在低速下测试,若通信正常,可以逐步提高通信速率。

 

STM32下调试CAN通信