FDCAN特点
支持CAN协议版本2.0,part A, part B和ISO 11898-1: 2015, -4;
最多支持64个数据字节;支持AUTOSAR和J1939;
1、FDCAN操作模式
1)、FDCAN_MODE_NORMAL:普通模式,对外通讯。
2)、FDCAN_MODE_RESTRICTED_OPERATION:受限操作模式
3)、FDCAN_MODE_BUS_MONITORING:总线监控模式。
4)、FDCAN_MODE_INTERNAL_LOOPBACK内部回环模式:
内部已经将FDCAN1_TX和FDCAN1_RX短接,但FDCAN_TX和FDCAN_RX均和外部断开,用来测试自发自收;
5)、FDCAN_MODE_EXTERNAL_LOOPBACK(外部回环模式):
内部已经将FDCAN1_TX和FDCAN1_RX短接,FDCAN_TX可以向外发送数据,但FDCAN_RX和外部断开,用来测试自发自收;
2、FDCAN过滤器
#define SRAMCAN_FLS_NBR (28U) //标准帧有28个过滤器
#define SRAMCAN_FLE_NBR ( 8U) //扩展帧有8个过滤器
#define SRAMCAN_RF0_NBR ( 3U) //"RX FIFO 0"有3个元素(Elements)
#define SRAMCAN_RF1_NBR ( 3U) //"RX FIFO 1"有3个元素(Elements)
#define SRAMCAN_TEF_NBR ( 3U) //"TX FIFO"有3个元素(Elements)
#define SRAMCAN_TFQ_NBR ( 3U) //"TX FIFO/Queue"有个元素(Elements)
1)、当接收标准帧时,则需要配置“标准帧过滤器”
2)、当接收扩展帧时,则需要配置“扩展帧过滤器”;
3)、FDCAN过滤器有4种过滤方式:
范围过滤器;
专用ID过滤器;
经典CAN位屏蔽过滤器;
无过滤器;
注意:对于“经典CAN位屏蔽过滤器”,FDCAD过滤器只对帧ID位起过滤作用,这一点和STM32F103不同。
3、Tx缓冲区元素(FDCAN Tx buffer element)
“发送FIFO”有3个元素(element),每个元素里都含有1个64字节的“数据存储区”;
T0数据bit31(ESI),ESI表示“错误状态指示器”
T0数据bit30(XTD),XTD=0表示“11位标准帧”;XTD=1表示“29位扩展帧”
T0数据bit29(RTR),RTR=0表示“数据帧”;RTR=1表示“遥控帧”
T0数据bit28:0(ID[28:0]),当XTD=0时,必须将“11位标准帧ID”写入ID[28:18];当XTD=1时,必须将“29位扩展帧ID”写入ID[28:0];
T1数据bit31:24(MM[7:0]),MM[7:0]表示“信息标记”
T1数据bit23(ETC),当ETC=0表示“不存储发送事件”;当ETC=1表示“存储发送事件”;
T1数据bit21(FDF),FDF=0时,发送的是“经典的CAN格式”;FDF=1时,发送的是“CAN FD格式”;
T1数据bit20(BRS),BRS=0表示“CAN FD帧发送时,没有比特率切换”;BRS=1表示“CAN FD帧发送时,支持比特率切换”;
T1数据bit19:16(DLC[3:0])
0<=DLC[3:0]<=8表示“经典的CAN”和“CAN FD”接收到的帧有0~8个字节;
9<=DLC[3:0]<=15表示“经典的CAN”接收到的帧有8个字节;
9<=DLC[3:0]<=15表示“CAN FD”接收到的帧有12/16/20/24/32/48/64个字节;
T2数据bit7:0(Data Byte 0);T2数据bit15:8(Data Byte 1);T2数据bit23:16(Data Byte 2);T2数据bit31:24(Data Byte 3);
T3数据bit7:0(Data Byte 4);T3数据bit15:8(Data Byte 5);T3数据bit23:16(Data Byte 6);T3数据bit31:24(Data Byte 7);
T4数据bit7:0(Data Byte 8);T4数据bit15:8(Data Byte 9);T4数据bit23:16(Data Byte 10);T4数据bit31:24(Data Byte 11);
T5数据bit7:0(Data Byte 12);T5数据bit15:8(Data Byte 13);T5数据bit23:16(Data Byte 14);T5数据bit31:24(Data Byte 15);
T6数据bit7:0(Data Byte 16);T6数据bit15:8(Data Byte 17);T6数据bit23:16(Data Byte 18);T6数据bit31:24(Data Byte 19);
T7数据bit7:0(Data Byte 20);T7数据bit15:8(Data Byte 21);T7数据bit23:16(Data Byte 22);T7数据bit31:24(Data Byte 23);
T8数据bit7:0(Data Byte 24);T8数据bit15:8(Data Byte 25);T8数据bit23:16(Data Byte 26);T8数据bit31:24(Data Byte 27);
T9数据bit7:0(Data Byte 28);T9数据bit15:8(Data Byte 29);T9数据bit23:16(Data Byte 30);T9数据bit31:24(Data Byte 31);
T10数据bit7:0(Data Byte 32);T10数据bit15:8(Data Byte 33);T10数据bit23:16(Data Byte 34);T10数据bit31:24(Data Byte 35);
T11数据bit7:0(Data Byte 36);T11数据bit15:8(Data Byte 37);T11数据bit23:16(Data Byte 38);T11数据bit31:24(Data Byte 39);
T12数据bit7:0(Data Byte 40);T12数据bit15:8(Data Byte 41);T12数据bit23:16(Data Byte 42);T12数据bit31:24(Data Byte 43);
T13数据bit7:0(Data Byte 44);T13数据bit15:8(Data Byte 45);T13数据bit23:16(Data Byte 46);T13数据bit31:24(Data Byte 47);
T14数据bit7:0(Data Byte 48);T14数据bit15:8(Data Byte 49);T14数据bit23:16(Data Byte 50);T14数据bit31:24(Data Byte 51);
T15数据bit7:0(Data Byte 52);T15数据bit15:8(Data Byte 53);T15数据bit23:16(Data Byte 54);T15数据bit31:24(Data Byte 55);
T16数据bit7:0(Data Byte 56);T16数据bit15:8(Data Byte 57);T16数据bit23:16(Data Byte 58);T16数据bit31:24(Data Byte 59);
T17数据bit7:0(Data Byte 60);T17数据bit15:8(Data Byte 61);T17数据bit23:16(Data Byte 62);T17数据bit31:24(Data Byte 63);
4、Rx FIFO元素(Rx FIFO element)
“接收FIFO”有2个,分别是“Rx FIFO 0”和“Rx FIFO 1”,每个“Rx FIFO x”均有3个元素(element),
每个元素里都含有1个64字节的“数据存储区”;
R0数据bit31(ESI),ESI表示“错误状态指示器”
R0数据bit30(XTD),XTD=0表示“11位标准帧”;XTD=1表示“29位扩展帧”
R0数据bit29(RTR),RTR=0表示接收到的帧是“数据帧”;RTR=1表示接收到的帧是“遥控帧”
R0数据bit28:0(ID[28:0]),当XTD=0时,接收到的“11位标准帧ID”保存到ID[28:18];当XTD=1时,接收到的“29位扩展帧ID”保存到ID[28:0];
R1数据bit31(ANMF),ANMF=0表示“接收到的帧匹配滤波器索引FIDX”;ANMF=1表示“接收到的帧不匹配任何接收滤波器”;
R1数据bit30:24(FIDX[6:0]),当ANMF=0时,FIDX[6:0]保存的是“帧匹配滤波器索引”;
R1数据bit21(FDF),FDF=0时,发送的是“经典的CAN格式”;FDF=1时,发送的是“CAN FD格式”;
R1数据bit20(BRS),BRS=0表示“CAN FD帧发送时,没有比特率切换”;BRS=1表示“CAN FD帧发送时,支持比特率切换”;
R1数据bit19:16(DLC[3:0])
0<=DLC[3:0]<=8表示“经典的CAN”和“CAN FD”接收到的帧有0~8个字节;
9<=DLC[3:0]<=15表示“经典的CAN”接收到的帧有8个字节;
9<=DLC[3:0]<=15表示“CAN FD”接收到的帧有12/16/20/24/32/48/64个字节;
R1数据bit15:0(RXTS[15:0]),RXTS[15:0]保存的是“接收到的时间戳”
R2数据bit7:0(Data Byte 0);R2数据bit15:8(Data Byte 1);R2数据bit23:16(Data Byte 2);R2数据bit31:24(Data Byte 3);
R3数据bit7:0(Data Byte 4);R3数据bit15:8(Data Byte 5);R3数据bit23:16(Data Byte 6);R3数据bit31:24(Data Byte 7);
R4数据bit7:0(Data Byte 8);R4数据bit15:8(Data Byte 9);R4数据bit23:16(Data Byte 10);R4数据bit31:24(Data Byte 11);
R5数据bit7:0(Data Byte 12);R5数据bit15:8(Data Byte 13);R5数据bit23:16(Data Byte 14);R5数据bit31:24(Data Byte 15);
R6数据bit7:0(Data Byte 16);R6数据bit15:8(Data Byte 17);R6数据bit23:16(Data Byte 18);R6数据bit31:24(Data Byte 19);
R7数据bit7:0(Data Byte 20);R7数据bit15:8(Data Byte 21);R7数据bit23:16(Data Byte 22);R7数据bit31:24(Data Byte 23);
R8数据bit7:0(Data Byte 24);R8数据bit15:8(Data Byte 25);R8数据bit23:16(Data Byte 26);R8数据bit31:24(Data Byte 27);
R9数据bit7:0(Data Byte 28);R9数据bit15:8(Data Byte 29);R9数据bit23:16(Data Byte 30);R9数据bit31:24(Data Byte 31);
R10数据bit7:0(Data Byte 32);R10数据bit15:8(Data Byte 33);R10数据bit23:16(Data Byte 34);R10数据bit31:24(Data Byte 35);
R11数据bit7:0(Data Byte 36);R11数据bit15:8(Data Byte 37);R11数据bit23:16(Data Byte 38);R11数据bit31:24(Data Byte 39);
R12数据bit7:0(Data Byte 40);R12数据bit15:8(Data Byte 41);R12数据bit23:16(Data Byte 42);R12数据bit31:24(Data Byte 43);
R13数据bit7:0(Data Byte 44);R13数据bit15:8(Data Byte 45);R13数据bit23:16(Data Byte 46);R13数据bit31:24(Data Byte 47);
R14数据bit7:0(Data Byte 48);R14数据bit15:8(Data Byte 49);R14数据bit23:16(Data Byte 50);R14数据bit31:24(Data Byte 51);
R15数据bit7:0(Data Byte 52);R15数据bit15:8(Data Byte 53);R15数据bit23:16(Data Byte 54);R15数据bit31:24(Data Byte 55);
R16数据bit7:0(Data Byte 56);R16数据bit15:8(Data Byte 57);R16数据bit23:16(Data Byte 58);R16数据bit31:24(Data Byte 59);
R17数据bit7:0(Data Byte 60);R17数据bit15:8(Data Byte 61);R17数据bit23:16(Data Byte 62);R17数据bit31:24(Data Byte 63);
5、Tx事件FIFO元素(FDCAN Tx event FIFO element)
E0数据bit31(ESI),ESI表示“错误状态指示器”
E0数据bit30(XTD),XTD=0表示“11位标准帧”;XTD=1表示“29位扩展帧”
E0数据bit29(RTR),RTR=0表示“数据帧”;RTR=1表示“遥控帧”
E0数据bit28:0(ID[28:0]),当XTD=0时,必须将“11位标准帧ID”写入ID[28:18];当XTD=1时,必须将“29位扩展帧ID”写入ID[28:0];
E1数据bit31:24(MM[7:0]),MM[7:0]表示“信息标记”
E1数据bit23:22(EFC[1:0])
EFC[1:0]=00b保留;EFC[1:0]=01b表示发送事件;EFC[1:0]=10b表示“尽管取消了,依旧传送”;EFC[1:0]=11b保留;
E1数据bit21(EDL),EDL=0时,发送的是“标准帧格式”;EDL=1时,发送的是“CAN FD帧格式”;
E1数据bit20(BRS),BRS=0表示“CAN FD帧发送时,没有比特率切换”;BRS=1表示“CAN FD帧发送时,支持比特率切换”;
E1数据bit19:16(DLC[3:0])
0<=DLC[3:0]<=8表示发送的帧有0~8个字节;
9<=DLC[3:0]<=15表示“CAN FD”发送的帧有12/16/20/24/32/48/64个字节;
E1数据bit15:0(TXTS[15:0]),TXTS[15:0]表示“发送时间戳”
6、标准帧和扩展帧自发自收测试程序
#include "FDCAN.h"
#include "stdio.h" //getchar(),putchar(),scanf(),printf(),puts(),gets(),sprintf()
#include "string.h" //使能strcpy(),strlen(),memset()
#include "delay.h"FDCAN_HandleTypeDef hfdcan1;uint8_t TxData0[] = {'1','2','3','4','5','6','7','\0'};
uint8_t TxData1[] = {'9','8','7','6','5','4','3','\0'};
uint8_t TxData2[] = {'E','F','1','2','3','4','5','\0'};
uint8_t RxData[8];void FDCAN1_Init(void);
void CAN1_Tx_Standard_Data_Frame(void);
void CAN1_Tx_Extended_Data_Frame(void);void FDCAN1_Init(void)
{RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};//用来初始化外设时钟GPIO_InitTypeDef GPIO_InitStruct = {0};FDCAN_FilterTypeDef sFilterConfig;PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_FDCAN;//初始化FDCAN时钟PeriphClkInit.FdcanClockSelection = RCC_FDCANCLKSOURCE_PCLK1;HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);__HAL_RCC_FDCAN_CLK_ENABLE();//使能FDCAN外设时钟__HAL_RCC_GPIOA_CLK_ENABLE();//使能GPIOA外设时钟//PA11 ------> FDCAN1_RX
//PA12 ------> FDCAN1_TXGPIO_InitStruct.Pin = GPIO_PIN_11; //选择引脚号码为11GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; //复用功能推挽模式GPIO_InitStruct.Pull = GPIO_NOPULL; //引脚上拉和下拉都没有被激活
// GPIO_InitStruct.Pull = GPIO_PULLUP; //设置上拉GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;//引脚的输出速度为120MHzGPIO_InitStruct.Alternate = GPIO_AF9_FDCAN1;//将PA11引脚复用为FDCAN1_RXHAL_GPIO_Init(GPIOA, &GPIO_InitStruct);GPIO_InitStruct.Pin = GPIO_PIN_12; //选择引脚号码为12GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; //复用功能推挽模式GPIO_InitStruct.Pull = GPIO_NOPULL; //引脚上拉和下拉都没有被激活
// GPIO_InitStruct.Pull = GPIO_PULLUP; //设置上拉GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;//引脚的输出速度为120MHzGPIO_InitStruct.Alternate = GPIO_AF9_FDCAN1;//将PA12引脚复用为FDCAN1_TXHAL_GPIO_Init(GPIOA, &GPIO_InitStruct);hfdcan1.Instance = FDCAN1;//选择FDCAN1外设hfdcan1.Init.ClockDivider = FDCAN_CLOCK_DIV1;//FDCAN_CKDIV寄存器bit3:0(PDIV[3:0])//PDIV[3:0]=0000b表示1分频;//PDIV[3:0]=0001b表示2分频;//PDIV[3:0]=0010b表示4分频;PDIV[3:0]=0011b表示6分频;PDIV[3:0]=1111b表示30分频;hfdcan1.Init.Mode = FDCAN_MODE_EXTERNAL_LOOPBACK;//告诉编译器设置FDCAN操作模式//FDCAN_MODE_NORMAL:普通模式//FDCAN_MODE_RESTRICTED_OPERATION:受限操作模式 //FDCAN_MODE_BUS_MONITORING:总线监控模式//FDCAN_MODE_INTERNAL_LOOPBACK:内部回环模式//FDCAN_MODE_EXTERNAL_LOOPBACK:外部回环模式hfdcan1.Init.FrameFormat = FDCAN_FRAME_FD_BRS;//FDCAN_CCCR寄存器bit9:8(BRSE:FDOE),BRSE=1使能传输波特率切换,FDOE=1使能FD操作hfdcan1.Init.AutoRetransmission = ENABLE;//FDCAN_CCCR寄存器bit6(DAR),DAR=1不使能“自动重传功能”hfdcan1.Init.TransmitPause = ENABLE;//FDCAN_CCCR寄存器bit14(TXP)//TXP=1表示FDCAN在成功传输一帧后开始下一次传输之前暂停两次CAN位。hfdcan1.Init.ProtocolException = DISABLE;//FDCAN_CCCR寄存器bit12(PXHD),PXHD=1“协议异常处理”不使能hfdcan1.Init.NominalPrescaler = 1;//FDCAN_NBTP寄存器bit24:16(NBRP[8:0])//NBRP[8:0]=1波特率分频器为1分频hfdcan1.Init.NominalSyncJumpWidth = 16;//FDCAN_NBTP寄存器bit31:25(NSJW[6:0]),NSJW[6:0]=16标称(重新)同步跳转宽度hfdcan1.Init.NominalTimeSeg1 = 63;//FDCAN_NBTP寄存器bit15:8(NTSEG1[7:0]),采样点前的标称时间段hfdcan1.Init.NominalTimeSeg2 = 16;//FDCAN_NBTP寄存器bit6:0(NTSEG2[6:0]),NTSEG2[6:0]=1采样点后的标称时间段hfdcan1.Init.DataPrescaler = 1;//FDCAN_DBTP寄存器bit20:16(DBRP[4:0]),DBRP[4:0]=1数字波特率分频器hfdcan1.Init.DataSyncJumpWidth = 4;//FDCAN_DBTP寄存器bit3:0(DSJW[3:0]),DSJW[3:0]=4同步跳转宽度hfdcan1.Init.DataTimeSeg1 = 5;//FDCAN_DBTP寄存器bit12:8(DTSEG1[4:0]),DTSEG1[4:0]=5采样点前的数据时间段hfdcan1.Init.DataTimeSeg2 = 4;//FDCAN_DBTP寄存器bit7:4(DTSEG2[3:0]),DTSEG2[3:0]=4采样点后的数据时间段hfdcan1.Init.StdFiltersNbr = 1;//FDCAN_RXGFC寄存器bit20:16(LSS[4:0]),LSS[4:0]=1,表示“标准帧ID过滤器元素”的数量为1hfdcan1.Init.ExtFiltersNbr = 1;//FDCAN_RXGFC寄存器bit27:24(LSE[3:0]),LSE[3:0]=1,表示“扩展帧ID过滤器元素”的数量为1hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;//FDCAN_TXBC寄存器bit24(TFQM),TFQM=0表示Tx FIFO操作HAL_FDCAN_Init(&hfdcan1);//FDCAN Standard message ID Filter0 element/sFilterConfig.IdType = FDCAN_STANDARD_ID; //告诉编译器,将要初始化“标准帧”sFilterConfig.FilterIndex = 0; //指定过滤器编号为0sFilterConfig.FilterType = FDCAN_FILTER_DUAL;//标准帧过滤器类型:S0寄存器bit31:30(SFT[1:0])//SFT[1:0]=00b,表示“范围过滤器(FDCAN_FILTER_RANGE)”,从SFID1[10:0]到SFID2[10:0]//SFT[1:0]=01b,表示“双ID过滤器(FDCAN_FILTER_DUAL)”,SFID1[10:0]或SFID2[10:0]//SFT[1:0]=10b,表示“经典CAN的过滤器(FDCAN_FILTER_MASK)”,SFID1[10:0] = filter, SFID2[10:0] = mask//SFT[1:0]=11b,表示“不使用过滤器(FDCAN_FILTER_RANGE_NO_EIDM)”sFilterConfig.FilterID1 = 0x444;//配置标准帧过滤器ID1:S0寄存器bit26:16(SFID1[10:0]),SFID1[10:0]=0x444//由于采用“双ID过滤器(FDCAN_FILTER_DUAL)”,所以ID为0x444的帧将被接收sFilterConfig.FilterID2 = 0x555;//配置标准帧过滤器ID2:S0寄存器bit10:0(SFID2[10:0]),SFID2[10:0]=0x555//由于采用“双ID过滤器(FDCAN_FILTER_DUAL)”,所以ID为0x555的帧将被接收sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;//标准帧过滤器配置:S0寄存器bit29:27(SFEC[2:0])//SFEC[2:0]=000b,表示“不使能过滤器元件”(FDCAN_FILTER_DISABLE)//SFEC[2:0]=001b,表示如果过滤器匹配,则存储在“FIFO接收缓冲区0”中(FDCAN_FILTER_TO_RXFIFO0)//SFEC[2:0]=010b,表示如果过滤器匹配,则存储在“FIFO接收缓冲区1”中(FDCAN_FILTER_TO_RXFIFO1)//SFEC[2:0]=011b,表示如果过滤器匹配,则拒绝这个ID的数据(FDCAN_FILTER_REJECT)//SFEC[2:0]=100b,表示如果过滤器匹配,则设置优先级(FDCAN_FILTER_HP)//SFEC[2:0]=101b,表示如果过滤器匹配,则设置优先级,并且存储在“FIFO接收缓冲区0”中(FDCAN_FILTER_TO_RXFIFO0_HP)//SFEC[2:0]=110b,表示如果过滤器匹配,则设置优先级,并且存储在“FIFO接收缓冲区1”中(FDCAN_FILTER_TO_RXFIFO1_HP)//SFEC[2:0]=111b,表示保留HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig);/Configure extended ID reception filter to Rx FIFO 1/
//FDCAN Extended message ID filter0 element/sFilterConfig.IdType = FDCAN_EXTENDED_ID;//告诉编译器,将要初始化“扩展帧”sFilterConfig.FilterIndex = 0; //指定过滤器编号为0sFilterConfig.FilterType = FDCAN_FILTER_MASK;//扩展帧过滤器类型:F1寄存器bit31:30(EFT[1:0])//EFT[1:0]=00b,表示“范围过滤器(FDCAN_FILTER_RANGE)”,从EFID1[28:0]到EFID2[28:0]//EFT[1:0]=01b,表示“双ID过滤器(FDCAN_FILTER_DUAL)”,EFID1[28:0]或EFID2[28:0]//EFT[1:0]=10b,表示“经典CAN的过滤器(FDCAN_FILTER_MASK)”,EFID1[28:0] = filter, EFID2[28:0] = mask//EFT[1:0]=11b,表示“范围过滤器(FDCAN_FILTER_RANGE_NO_EIDM)”,从EFID1[28:0]到EFID2[28:0],不使用XIDAM掩码sFilterConfig.FilterID1 = 0x123457F;//配置扩展帧过滤器ID1:F0寄存器bit28:0(EFID1[28:0])//由于采用“经典CAN的过滤器(FDCAN_FILTER_MASK)”,EFID1[28:0]是过滤器sFilterConfig.FilterID2 = 0xFFFFFF0;//帧ID之bit3:0不要求匹配,帧ID之bit28:4要求匹配//配置扩展帧过滤器ID2:F1寄存器bit28:0(EFID2[28:0])//由于采用“经典CAN的过滤器(FDCAN_FILTER_MASK)”,EFID2[28:0]是掩码器sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO1;//扩展帧过滤器配置:F0寄存器bit31:29(EFEC[2:0])//EFEC[2:0]=000b,表示“不使能过滤器元件”(FDCAN_FILTER_DISABLE)//EFEC[2:0]=001b,表示如果过滤器匹配,则存储在“FIFO接收缓冲区0”中(FDCAN_FILTER_TO_RXFIFO0)//EFEC[2:0]=010b,表示如果过滤器匹配,则存储在“FIFO接收缓冲区1”中(FDCAN_FILTER_TO_RXFIFO1)//EFEC[2:0]=011b,表示如果过滤器匹配,则拒绝这个ID的数据(FDCAN_FILTER_REJECT)//EFEC[2:0]=100b,表示如果过滤器匹配,则设置优先级(FDCAN_FILTER_HP)//EFEC[2:0]=101b,表示如果过滤器匹配,则设置优先级,并且存储在“FIFO接收缓冲区0”中(FDCAN_FILTER_TO_RXFIFO0_HP)//EFEC[2:0]=110b,表示如果过滤器匹配,则设置优先级,并且存储在“FIFO接收缓冲区1”中(FDCAN_FILTER_TO_RXFIFO1_HP)//EFEC[2:0]=111b,表示保留HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig);//配置全局过滤器(Configure global filter):
//使用STD_ID和EXT_ID过滤掉“不具有STD_ID和EXT_ID”的远程帧,Filter all remote frames with STD and EXT ID
//拒绝具有STD_ID和EXT_ID的非匹配帧,Reject non matching frames with STD ID and EXT IDHAL_FDCAN_ConfigGlobalFilter(&hfdcan1, FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE);HAL_FDCAN_Start(&hfdcan1);
}void CAN1_Tx_Standard_Data_Frame(void)
{FDCAN_TxHeaderTypeDef TxHeader;FDCAN_RxHeaderTypeDef RxHeader;发送标准帧数据TxHeader.IdType = FDCAN_STANDARD_ID;//设置“CAN标识符类型”IDE位,指定该帧的CAN标识符类型为“标准帧”;//T0数据bit30(XTD),FDCAN_STANDARD_ID令XTD=0表示“11位标准帧”;TxHeader.Identifier = 0x444;//设置“标识符ID”为0x444//T0数据bit28:0(ID[28:0]),由于XTD=0,将“11位标准帧ID”写入ID[28:18]TxHeader.TxFrameType = FDCAN_DATA_FRAME;//设置“远程发送请求”RTR位,指定该帧为“数据帧”;//T0数据bit29(RTR),FDCAN_DATA_FRAME令RTR=0表示“数据帧”;TxHeader.DataLength = FDCAN_DLC_BYTES_8;//设置“数据长度编码位”DLC位,最大数据长度为64;//T1数据bit19:16(DLC[3:0])//0<=DLC[3:0]<=8表示“经典的CAN”和“CAN FD”接收到的帧有0~8个字节;//9<=DLC[3:0]<=15表示“经典的CAN”接收到的帧有8个字节;//9<=DLC[3:0]<=15表示“CAN FD”接收到的帧有12/16/20/24/32/48/64个字节;/准备发送数据//TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;//T0数据bit31(ESI),ESI表示“错误状态指示器”TxHeader.BitRateSwitch = FDCAN_BRS_ON;//T1数据bit20(BRS),FDCAN_BRS_ON令BRS=1表示“CAN FD帧发送时,支持比特率切换”;TxHeader.FDFormat = FDCAN_FD_CAN;//T1数据bit21(FDF),FDCAN_FD_CAN令FDF=1时,发送的是“CAN FD格式”;TxHeader.TxEventFifoControl = FDCAN_STORE_TX_EVENTS;//T1数据bit23(ETC),FDCAN_STORE_TX_EVENTS令ETC=1表示“存储发送事件”;TxHeader.MessageMarker = 0x52;//T1数据bit31:24(MM[7:0]),MM[7:0]=0x52表示“信息标记”HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData0);//发送标准帧数据printf("TxData0=%s\r\n",TxData0);接收数据while ( HAL_FDCAN_GetTxFifoFreeLevel(&hfdcan1) != 3 ) //Wait transmissions complete{//读FDCAN_TXFQS寄存器bit2:0(TFFL[2:0]),TFFL[2:0]=3表示3个“Tx FIFO”均已发送。}/* Check one message is received in Rx FIFO 0 */if(HAL_FDCAN_GetRxFifoFillLevel(&hfdcan1, FDCAN_RX_FIFO0) == 1){//读FDCAN_RXF0S寄存器bit2:0(F0FL[3:0]),F0FL[3:0]=15表示“Rx FIFO 0”中有15条信息HAL_FDCAN_GetRxMessage(&hfdcan1, FDCAN_RX_FIFO0, &RxHeader, RxData);printf("RxData0=%s\r\n",RxData);}
}void CAN1_Tx_Extended_Data_Frame(void)
{FDCAN_TxHeaderTypeDef TxHeader;FDCAN_RxHeaderTypeDef RxHeader;发送扩展帧数据TxHeader.IdType = FDCAN_EXTENDED_ID;//ID类型为扩展帧//T0数据bit30(XTD),FDCAN_EXTENDED_ID令XTD=1表示“29位扩展帧”TxHeader.Identifier = 0x1234574;//T0数据bit28:0(ID[28:0]),由于XTD=1,将“29位扩展帧ID”写入ID[28:0];TxHeader.TxFrameType = FDCAN_DATA_FRAME;//设置“远程发送请求”RTR位,指定该帧为“数据帧”;//T0数据bit29(RTR),FDCAN_DATA_FRAME令RTR=0表示“数据帧”;TxHeader.DataLength = FDCAN_DLC_BYTES_8;//T1数据bit19:16(DLC[3:0])//0<=DLC[3:0]<=8表示“经典的CAN”和“CAN FD”接收到的帧有0~8个字节;//9<=DLC[3:0]<=15表示“经典的CAN”接收到的帧有8个字节;//9<=DLC[3:0]<=15表示“CAN FD”接收到的帧有12/16/20/24/32/48/64个字节;TxHeader.ErrorStateIndicator = FDCAN_ESI_PASSIVE;//T0数据bit31(ESI),ESI表示“错误状态指示器”TxHeader.BitRateSwitch = FDCAN_BRS_ON;//T1数据bit20(BRS),FDCAN_BRS_ON令BRS=1表示“CAN FD帧发送时,支持比特率切换”;TxHeader.FDFormat = FDCAN_FD_CAN;//T1数据bit21(FDF),FDCAN_FD_CAN令FDF=1时,发送的是“CAN FD格式”;TxHeader.TxEventFifoControl = FDCAN_STORE_TX_EVENTS;//T1数据bit23(ETC),FDCAN_STORE_TX_EVENTS令ETC=1表示“存储发送事件”TxHeader.MessageMarker = 0xCC;//T1数据bit31:24(MM[7:0]),MM[7:0]=0xCC表示“信息标记”HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData1);//发送扩展帧数据TxHeader.IdType = FDCAN_EXTENDED_ID;//ID类型为扩展帧//T0数据bit30(XTD),FDCAN_EXTENDED_ID令XTD=1表示“29位扩展帧”TxHeader.Identifier = 0x123457F;//T0数据bit28:0(ID[28:0]),由于XTD=1,将“29位扩展帧ID”写入ID[28:0];TxHeader.TxFrameType = FDCAN_DATA_FRAME;//设置“远程发送请求”RTR位,指定该帧为“数据帧”;//T0数据bit29(RTR),FDCAN_DATA_FRAME令RTR=0表示“数据帧”;TxHeader.DataLength = FDCAN_DLC_BYTES_8;//T1数据bit19:16(DLC[3:0])//0<=DLC[3:0]<=8表示“经典的CAN”和“CAN FD”接收到的帧有0~8个字节;//9<=DLC[3:0]<=15表示“经典的CAN”接收到的帧有8个字节;//9<=DLC[3:0]<=15表示“CAN FD”接收到的帧有12/16/20/24/32/48/64个字节;TxHeader.ErrorStateIndicator = FDCAN_ESI_PASSIVE;//T0数据bit31(ESI),ESI表示“错误状态指示器”TxHeader.BitRateSwitch = FDCAN_BRS_OFF;//T1数据bit20(BRS),FDCAN_BRS_OFF令BRS=0表示“CAN FD帧发送时,不支持比特率切换”;TxHeader.FDFormat = FDCAN_FD_CAN;//T1数据bit21(FDF),FDCAN_FD_CAN令FDF=1时,发送的是“CAN FD格式”;TxHeader.TxEventFifoControl = FDCAN_STORE_TX_EVENTS;//T1数据bit23(ETC),FDCAN_STORE_TX_EVENTS令ETC=1表示“存储发送事件”TxHeader.MessageMarker = 0xDD;//T1数据bit31:24(MM[7:0]),MM[7:0]=0xDD表示“信息标记”HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData2);//发送扩展帧数据printf("TxData1=%s\r\n",TxData1);printf("TxData2=%s\r\n",TxData2);接收数据while ( HAL_FDCAN_GetTxFifoFreeLevel(&hfdcan1) != 3 ) //Wait transmissions complete{//读FDCAN_TXFQS寄存器bit2:0(TFFL[2:0]),TFFL[2:0]=3表示3个“Tx FIFO”均已发送。}/* Check two messages are received in Rx FIFO 1 */if(HAL_FDCAN_GetRxFifoFillLevel(&hfdcan1, FDCAN_RX_FIFO1) == 2){//读FDCAN_RXF1S寄存器bit2:0(F1FL[3:0]),F1FL[3:0]=15表示“Rx FIFO 1”中有15条信息HAL_FDCAN_GetRxMessage(&hfdcan1, FDCAN_RX_FIFO1, &RxHeader, RxData);printf("RxData1=%s\r\n",RxData);HAL_FDCAN_GetRxMessage(&hfdcan1, FDCAN_RX_FIFO1, &RxHeader, RxData);printf("RxData2=%s\r\n",RxData);}
}
7、测试结果