|

楼主 |
发表于 2024-8-14 09:08:46
|
显示全部楼层
uint8_t fdcan_init(uint16_t presc, uint8_t tsjw, uint16_t ntsg1, uint8_t ntsg2, uint32_t mode)
{
FDCAN_FilterTypeDef fdcan_filterconfig;
HAL_FDCAN_DeInit(&g_fdcanx_handle); /* ÏÈÇå³ýÒÔǰµÄÉèÖà */
g_fdcanx_handle.Instance = FDCAN1;
g_fdcanx_handle.Init.FrameFormat = FDCAN_FRAME_FD_BRS; /* λËÙÂʱ任FDCANģʽ */
g_fdcanx_handle.Init.Mode = mode; /* ģʽÉèÖà */
g_fdcanx_handle.Init.AutoRetransmission = DISABLE; /* ʹÄÜ×Ô¶¯ÖØ´«£¡´«Í³Ä£Ê½ÏÂÒ»¶¨Òª¹Ø±Õ£¡£¡£¡ */
g_fdcanx_handle.Init.TransmitPause = DISABLE; /* ʹÄÜ´«ÊäÔÝÍ£ */
g_fdcanx_handle.Init.ProtocolException = DISABLE; /* ¹Ø±ÕЭÒéÒì³£´¦Àí */
/* FDCANÖÐÖٲöÎλËÙÂÊ×î¸ß1Mbit/s, Êý¾Ý¶ÎλËÙÂÊ×î¸ß8Mbit/s */
/* Êý¾Ý¶ÎͨÐÅËÙÂÊ£¨½öFDCANģʽÐèÅäÖã© = 20M / (1 + dseg1 + dseg2) = 20M / (2 + 1 + 1) = 5 Mbit/s */
g_fdcanx_handle.Init.DataPrescaler = presc;//10; /* Êý¾Ý¶Î·ÖƵϵÊý·¶Î§:1~32 */
g_fdcanx_handle.Init.DataSyncJumpWidth = 16; /* Êý¾Ý¶ÎÖØÐÂͬ²½ÌøÔ¾¿í¶È1~16 */
g_fdcanx_handle.Init.DataTimeSeg1 = 10;//2; /* Êý¾Ý¶Îdsg1·¶Î§:1~32 5 */
g_fdcanx_handle.Init.DataTimeSeg2 = 9;//1; /* Êý¾Ý¶Îdsg2·¶Î§:1~16 1 */
/* ÖٲöÎͨÐÅËÙÂÊ£¨FDCANÓ봫ͳCAN¾ùÐèÅäÖã© = 20M / (1 + ntsg1 + ntsg2) = 20M / (31 + 8 + 1) = 500Kbit/s */
g_fdcanx_handle.Init.NominalPrescaler = presc; /* ·ÖƵϵÊý */
g_fdcanx_handle.Init.NominalSyncJumpWidth = tsjw; /* ÖØÐÂͬ²½ÌøÔ¾¿í¶È */
g_fdcanx_handle.Init.NominalTimeSeg1 = ntsg1; /* tsg1·¶Î§£º2~256 */
g_fdcanx_handle.Init.NominalTimeSeg2 = ntsg2; /* tsg2·¶Î§£º2~128 */
g_fdcanx_handle.Init.MessageRAMOffset = 0; /* ÐÅÏ¢RAMÆ«ÒÆ */
g_fdcanx_handle.Init.StdFiltersNbr = 28; /* ±ê×¼ÐÅÏ¢IDÂ˲¨Æ÷±àºÅ */
g_fdcanx_handle.Init.ExtFiltersNbr = 8; /* À©Õ¹ÐÅÏ¢IDÂ˲¨Æ÷±àºÅ */
g_fdcanx_handle.Init.RxFifo0ElmtsNbr = 1; /* ½ÓÊÕFIFO0ÔªËØ±àºÅ */
g_fdcanx_handle.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8; /* ½ÓÊÕFIFO0ÔªËØ´óС£º8×Ö½Ú */
g_fdcanx_handle.Init.RxBuffersNbr = 0; /* ½ÓÊÕFIFO0ÔªËØ±àºÅ */
g_fdcanx_handle.Init.TxEventsNbr = 0; /* ·¢ËÍʼþ±àºÅ */
g_fdcanx_handle.Init.TxBuffersNbr = 0; /* ·¢ËÍ»º³å±àºÅ */
g_fdcanx_handle.Init.TxFifoQueueElmtsNbr = 1; /* ·¢ËÍFIFOÐòÁÐÔªËØ±àºÅ */
g_fdcanx_handle.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; /* ·¢ËÍFIFOÐòÁÐģʽ */
g_fdcanx_handle.Init.TxElmtSize = FDCAN_DATA_BYTES_8; /* ·¢ËÍ´óС:8×Ö½Ú */
if (HAL_FDCAN_Init(&g_fdcanx_handle) != HAL_OK)
{
return 1; /* ³õʼ»¯ */
}
/* ÅäÖÃCAN¹ýÂËÆ÷ */
fdcan_filterconfig.IdType = FDCAN_STANDARD_ID; /* ±ê×¼ID */
fdcan_filterconfig.FilterIndex = 0; /* Â˲¨Æ÷Ë÷Òý */
fdcan_filterconfig.FilterType = FDCAN_FILTER_MASK; /* Â˲¨Æ÷ÀàÐÍ */
fdcan_filterconfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0; /* ¹ýÂËÆ÷0¹ØÁªµ½FIFO0 */
fdcan_filterconfig.FilterID1 = 0x0000; /* 32λID */
fdcan_filterconfig.FilterID2 = 0x0000; /* Èç¹ûFDCANÅäÖÃΪ´«Í³Ä£Ê½µÄ»°£¬ÕâÀïÊÇ32λÑÚÂë */
/* ¹ýÂËÆ÷ÅäÖà */
if (HAL_FDCAN_ConfigFilter(&g_fdcanx_handle, &fdcan_filterconfig) != HAL_OK)
{
return 2; /* Â˲¨Æ÷³õʼ»¯ */
}
/* ÅäÖÃÈ«¾Ö¹ýÂËÆ÷,¾ÜÊÕËùÓв»Æ¥ÅäµÄ±ê×¼Ö¡»òÀ©Õ¹Ö¡ */
if (HAL_FDCAN_ConfigGlobalFilter(&g_fdcanx_handle, FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE) != HAL_OK)
{
return 3;
}
/* Æô¶¯CANÍâΧÉ豸 */
if (HAL_FDCAN_Start(&g_fdcanx_handle) != HAL_OK)
{
return 4;
}
HAL_FDCAN_ActivateNotification(&g_fdcanx_handle, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0);
return 0;
} |
|