|
发表于 2024-4-22 19:35:28
|
显示全部楼层
void CAN1_Init(uint8_t *Rx_Buff, u8 Mode, uint32_t tsjw, uint32_t d_tbs1, uint32_t d_tbs2, uint16_t d_brp,uint32_t n_tbs1, uint32_t n_tbs2,uint16_t n_brp,u8 ReSend,u8 cfg_class_canFD_1)
{
HAL_FDCAN_DeInit(&Can1Handle);
FDCAN_ClkCalUnitTypeDef FDCAN1_ClkCalUnit;
//CAN1_RxMsg.data = Rx_Buff;
Can1Handle.Instance = FDCAN1;
Can1Handle.State = HAL_FDCAN_STATE_RESET;
if(cfg_class_canFD_1==1) //CANFD
{
Can1Handle.Init.FrameFormat =FDCAN_FRAME_FD_NO_BRS; //CANFD
HAL_FDCAN_DisableTxDelayCompensation(&Can1Handle);
}
else if(cfg_class_canFD_1==2) //CANFD加速
{
Can1Handle.Init.FrameFormat =FDCAN_FRAME_FD_BRS; //CANFD加速
}
else if(cfg_class_canFD_1==3) //CAN2.0
{
Can1Handle.Init.FrameFormat =FDCAN_FRAME_CLASSIC; //传统模式
HAL_FDCAN_DisableTxDelayCompensation(&Can1Handle);
}
if(Mode==0x00)
Can1Handle.Init.Mode = FDCAN_MODE_NORMAL;
else if(Mode==0x01)
Can1Handle.Init.Mode = FDCAN_MODE_BUS_MONITORING;
if(ReSend==0)
Can1Handle.Init.AutoRetransmission = DISABLE ;//ENABLE; //关闭自动重传!传统模式下一定要关闭!!!
else if(ReSend==1)
Can1Handle.Init.AutoRetransmission = ENABLE ;//ENABLE; //关闭自动重传!传统模式下一定要关闭!!!
Can1Handle.Init.TransmitPause = DISABLE; //关闭传输暂停
Can1Handle.Init.ProtocolException = ENABLE; //关闭协议异常处理
Can1Handle.Init.NominalPrescaler = n_brp; //分频系数
Can1Handle.Init.NominalSyncJumpWidth = n_tbs2; // tsjw; //重新同步跳跃宽度
Can1Handle.Init.NominalTimeSeg1 = n_tbs1; //tsg1范围:2~256
Can1Handle.Init.NominalTimeSeg2 = n_tbs2; //tsg2范围:2~128
Can1Handle.Init.DataPrescaler = d_brp;
Can1Handle.Init.DataSyncJumpWidth =d_tbs2 ;//0x4;
Can1Handle.Init.DataTimeSeg1 = d_tbs1; /* DataTimeSeg1 = Propagation_segment + Phase_segment_1 */ //0x05
Can1Handle.Init.DataTimeSeg2 = d_tbs2; //0x04
Can1Handle.Init.MessageRAMOffset = 0; //信息RAM偏移
Can1Handle.Init.StdFiltersNbr = 1; //标准信息ID滤波器编号 原来=1
Can1Handle.Init.ExtFiltersNbr = 1; //扩展信息ID滤波器编号 原来=1
Can1Handle.Init.RxFifo0ElmtsNbr = 12; //接收FIFO0元素编号 原来=12
Can1Handle.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_64; //接收FIFO0元素大小:8字节
Can1Handle.Init.RxFifo1ElmtsNbr = 0; //接收FIFO1元素编号 2
Can1Handle.Init.RxBuffersNbr = 0;
Can1Handle.Init.RxBufferSize=FDCAN_DATA_BYTES_64;
Can1Handle.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_64;
Can1Handle.Init.TxEventsNbr = 0; //发送事件编号
Can1Handle.Init.TxBuffersNbr = 0; //发送缓冲编号
Can1Handle.Init.TxFifoQueueElmtsNbr =16; //发送FIFO序列元素编号 正确的=16
Can1Handle.Init.TxFifoQueueMode =FDCAN_TX_FIFO_OPERATION ;// FDCAN_TX_QUEUE_OPERATION ;//FDCAN_TX_FIFO_OPERATION; //发送FIFO序列模式
Can1Handle.Init.TxElmtSize = FDCAN_DATA_BYTES_64; //发送大小:8字节
HAL_FDCAN_Init(&Can1Handle);
//配置CAN滤波器
sFilterConfig11.IdType = FDCAN_STANDARD_ID; //标准ID ; FDCAN_STANDARD_ID;
sFilterConfig11.FilterIndex = 0; //滤波器索引 0
sFilterConfig11.FilterType = FDCAN_FILTER_RANGE; //FDCAN_FILTER_DUAL; FDCAN_FILTER_MASK; //滤波器类型
sFilterConfig11.FilterConfig = FDCAN_FILTER_TO_RXFIFO0; //过滤器0关联到FIFO0
sFilterConfig11.FilterID1 = 0x000;
sFilterConfig11.FilterID2 = 0x7FF; /* For acceptance, MessageID and FilterID1 must match exactly */
HAL_FDCAN_ConfigFilter(&Can1Handle, &sFilterConfig11);
//------------------------------------------------
sFilterConfig12.IdType = FDCAN_EXTENDED_ID; //扩展帧
sFilterConfig12.FilterIndex = 0;
sFilterConfig12.FilterType = FDCAN_FILTER_RANGE; //FDCAN_FILTER_DUAL; FDCAN_FILTER_MASK; //滤波器类型
sFilterConfig12.FilterConfig = FDCAN_FILTER_TO_RXFIFO0; //过滤器0关联到FIFO0
sFilterConfig12.FilterID1 = 0x00000000;
sFilterConfig12.FilterID2 = 0x1FFFFFFF; /* For acceptance, MessageID and FilterID1 must match exactly */
HAL_FDCAN_ConfigFilter(&Can1Handle, &sFilterConfig12);
//-----------------------------------------------
FDCAN1_ClkCalUnit.ClockCalibration=DISABLE; //?????????
FDCAN1_ClkCalUnit.ClockDivider=FDCAN_CLOCK_DIV1; //4??,??50Mhz?fdca_tq_ck
HAL_FDCAN_ConfigClockCalibration(&Can1Handle,&FDCAN1_ClkCalUnit); //????
HAL_FDCAN_ActivateNotification(&Can1Handle,FDCAN_IT_RX_FIFO0_NEW_MESSAGE,0);
if(cfg_class_canFD_1==2) //CANFD加速
{
HAL_FDCAN_ConfigTxDelayCompensation(&Can1Handle, Can1Handle.Init.DataPrescaler * Can1Handle.Init.DataTimeSeg1 ,0);
HAL_FDCAN_EnableTxDelayCompensation(&Can1Handle);
}
//启动FDCAN模块
HAL_FDCAN_Start(&Can1Handle);
} |
|