FDCAN初始化:
HAL_RCC_FDCAN_CLK_ENABLE(); //使能 FDCAN 时钟
HAL_RCC_GPIOB_CLK_ENABLE(); //开启 GPIOB 时钟
//FDCAN1 时钟源配置为 PLL1Q
FDCAN1_PeriphClk.PeriphClockSelection = RCC_PERIPHCLK_FDCAN;
FDCAN1_PeriphClk.FdcanClockSelection = RCC_FDCANCLKSOURCE_PLL;
HAL_RCCEx_PeriphCLKConfig(&FDCAN1_PeriphClk);
GPIO_Initure.Pin = GPIO_PIN_8|GPIO_PIN_9; //PB8,9
GPIO_Initure.Mode = GPIO_MODE_AF_PP; //推挽复用
GPIO_Initure.Pull = GPIO_PULLUP; //上拉
GPIO_Initure.Speed = GPIO_SPEED_FREQ_HIGH; //高速
GPIO_Initure.Alternate = GPIO_AF9_FDCAN1; //复用为 CAN1
HAL_GPIO_Init(GPIOB, &GPIO_Initure); //初始化
HAL_FDCAN_DeInit(&FDCAN1_Handler); //先清除以前的设置
FDCAN1_Handler.Instance = FDCAN1;
FDCAN1_Handler.Init.FrameFormat = FDCAN_FRAME_CLASSIC; //传统模式
FDCAN1_Handler.Init.Mode = FDCAN_MODE_NORMAL; //正常模式
FDCAN1_Handler.Init.AutoRetransmission = DISABLE; //关闭自动重传!
FDCAN1_Handler.Init.TransmitPause = DISABLE; //关闭传输暂停
FDCAN1_Handler.Init.ProtocolException = DISABLE; //关闭协议异常处理
FDCAN1_Handler.Init.NominalPrescaler = FDCAN_CLOCK_DIV1; //分频系数
if(1000 == rate)//1M波特率
{
FDCAN1_Handler.Init.NominalSyncJumpWidth= 0x08; //重新同步跳跃宽度
FDCAN1_Handler.Init.NominalTimeSeg1 = 0x1f; //tsg1 范围:2~256
FDCAN1_Handler.Init.NominalTimeSeg2 = 0x08; //tsg2 范围:2~128
}
// FDCAN1_Handler.Init.DataPrescaler = 0x1;
// FDCAN1_Handler.Init.DataSyncJumpWidth = 0x4;
// FDCAN1_Handler.Init.DataTimeSeg1 = 0x5; / DataTimeSeg1 = Propagation_segment + Phase_segment_1 /
// FDCAN1_Handler.Init.DataTimeSeg2 = 0x4;
FDCAN1_Handler.Init.MessageRAMOffset = 0; //信息 RAM 偏移
FDCAN1_Handler.Init.StdFiltersNbr = 1; //标准信息 ID 滤波器编号
FDCAN1_Handler.Init.ExtFiltersNbr = 0; //扩展信息 ID 滤波器编号
FDCAN1_Handler.Init.RxFifo0ElmtsNbr = 1; //接收 FIFO0 元素编号
FDCAN1_Handler.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8; //接收 FIFO0 8 字节
FDCAN1_Handler.Init.RxBuffersNbr = 0; //接收缓冲编号
FDCAN1_Handler.Init.TxEventsNbr = 0; //发送事件编号
FDCAN1_Handler.Init.TxBuffersNbr = 1; //发送缓冲编号
FDCAN1_Handler.Init.TxFifoQueueElmtsNbr = 0; //发送 FIFO 序列元素编号
FDCAN1_Handler.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
FDCAN1_Handler.Init.TxElmtSize = FDCAN_DATA_BYTES_8; //发送大小:8 字节
if(HAL_FDCAN_Init(&FDCAN1_Handler) != HAL_OK) //初始化 FDCAN
{
while(1);
}
//设置滤波器
FDCAN1_RXFilter.IdType = FDCAN_EXTENDED_ID; //扩展 ID
FDCAN1_RXFilter.FilterIndex = 0; //滤波器索引
FDCAN1_RXFilter.FilterType = FDCAN_FILTER_MASK; //滤波器类型
FDCAN1_RXFilter.FilterConfig= FDCAN_FILTER_TO_RXFIFO0; //过滤器 0 关联到 FIFO0
FDCAN1_RXFilter.FilterID1 = 0x0000; //32 位 ID
FDCAN1_RXFilter.FilterID2 = 0x0000; //传统模式的话,这里是 32 位掩码
HAL_FDCAN_ConfigFilter(&FDCAN1_Handler,&FDCAN1_RXFilter); //滤波器初始化
//HAL_FDCAN_ActivateNotification(&FDCAN1_Handler,FDCAN_IT_RX_FIFO0_NEW_MESSAGE,0);
HAL_FDCAN_Start(&FDCAN1_Handler); //开启 FDCAN
// HAL_NVIC_SetPriority(FDCAN1_IT0_IRQn,1,2);
// HAL_NVIC_EnableIRQ(FDCAN1_IT0_IRQn);
发送函数:
FDCAN_TxHeader.Identifier = msg->ID; //32 位 ID
FDCAN_TxHeader.IdType = FDCAN_EXTENDED_ID; //扩展 ID
FDCAN_TxHeader.TxFrameType = FDCAN_DATA_FRAME; //数据帧
FDCAN_TxHeader.DataLength = FDCAN_DLC_BYTES_8; //数据长度
FDCAN_TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
FDCAN_TxHeader.BitRateSwitch = FDCAN_BRS_OFF; //关闭速率切换
FDCAN_TxHeader.FDFormat = FDCAN_CLASSIC_CAN; //传统的 CAN 模式
FDCAN_TxHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS; //无发送事件
FDCAN_TxHeader.MessageMarker = 0;
HAL_FDCAN_AddMessageToTxBuffer(&FDCAN1_Handler, &FDCAN_TxHeader, TxData, FDCAN_TX_BUFFER0);
/ Send calibration confirmation message /
HAL_FDCAN_EnableTxBufferRequest(&FDCAN1_Handler, FDCAN_TX_BUFFER0); |