2024-02-28 9:21 AM - last edited on 2024-02-29 1:42 AM by Peter BENSCH
HI,
I'm working with a micro from the H7 family (H723).
I have to implement CAN communication on two distinct peripherals (FDCAN1 and FDCAN2) in interrupt mode but the system doesn't work.
Below are the settings I use in my project:
void MX_FDCAN2_Init(void)
{
  /*USER CODE BEGIN FDCAN2_Init 0 */
  /*USER CODE END FDCAN2_Init 0 */
  /*USER CODE BEGIN FDCAN2_Init 1 */
  /*USER CODE END FDCAN2_Init 1 */
  hfdcan2.Instance = FDCAN2;
  hfdcan2.Init.FrameFormat = FDCAN_FRAME_CLASSIC;
  hfdcan2.Init.Mode = FDCAN_MODE_NORMAL;
  hfdcan2.Init.AutoRetransmission = DISABLE;
  hfdcan2.Init.TransmitPause = ENABLE;
  hfdcan2.Init.ProtocolException = DISABLE;
  hfdcan2.Init.NominalPrescaler = CAN_PRES;
  hfdcan2.Init.NominalSyncJumpWidth = CAN_SJW;
  hfdcan2.Init.NominalTimeSeg1 = CAN_T1;
  hfdcan2.Init.NominalTimeSeg2 = CAN_T2;
  hfdcan2.Init.DataPrescaler = CAN_DATA_PRES;
  hfdcan2.Init.DataSyncJumpWidth = CAN_DATA_SJW;
  hfdcan2.Init.DataTimeSeg1 = CAN_DATA_T1;
  hfdcan2.Init.DataTimeSeg2 = CAN_DATA_T2;
  hfdcan2.Init.MessageRAMOffset = 0;
  hfdcan2.Init.StdFiltersNbr = 1;
  hfdcan2.Init.ExtFiltersNbr = 0;
  hfdcan2.Init.RxFifo0ElmtsNbr = 5;
  hfdcan2.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8;
  hfdcan2.Init.RxFifo1ElmtsNbr = 2;
  hfdcan2.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_8;
  hfdcan2.Init.RxBuffersNbr = 0;
  hfdcan2.Init.RxBufferSize = FDCAN_DATA_BYTES_8;
  hfdcan2.Init.TxEventsNbr = 0;
  hfdcan2.Init.TxBuffersNbr = 0;
  hfdcan2.Init.TxFifoQueueElmtsNbr = 32;
  hfdcan2.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
  hfdcan2.Init.TxElmtSize = FDCAN_DATA_BYTES_8;
  if (HAL_FDCAN_Init(&hfdcan2) != HAL_OK) {
    Error_Handler();
  }
  void MX_FDCAN1_Init(void)
  {
    /*USER CODE BEGIN FDCAN1_Init 0 */
    /*USER CODE END FDCAN1_Init 0 */
    /*USER CODE BEGIN FDCAN1_Init 1 */
    /*USER CODE END FDCAN1_Init 1 */
    hfdcan1.Instance = FDCAN1;
    hfdcan1.Init.FrameFormat = FDCAN_FRAME_CLASSIC;
    hfdcan1.Init.Mode = FDCAN_MODE_NORMAL;
    hfdcan1.Init.AutoRetransmission = DISABLE;
    hfdcan1.Init.TransmitPause = ENABLE;
    hfdcan1.Init.ProtocolException = DISABLE;
    hfdcan1.Init.NominalPrescaler = CAN_PRES;
    hfdcan1.Init.NominalSyncJumpWidth = CAN_SJW;
    hfdcan1.Init.NominalTimeSeg1 = CAN_T1;
    hfdcan1.Init.NominalTimeSeg2 = CAN_T2;
    hfdcan1.Init.DataPrescaler = CAN_DATA_PRES;
    hfdcan1.Init.DataSyncJumpWidth = CAN_DATA_SJW;
    hfdcan1.Init.DataTimeSeg1 = CAN_DATA_T1;
    hfdcan1.Init.DataTimeSeg2 = CAN_DATA_T2;
    hfdcan1.Init.MessageRAMOffset = 0;
    hfdcan1.Init.StdFiltersNbr = 1;
    hfdcan1.Init.ExtFiltersNbr = 0;
    hfdcan1.Init.RxFifo0ElmtsNbr = 5;
    hfdcan1.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8;
    hfdcan1.Init.RxFifo1ElmtsNbr = 0;
    hfdcan1.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_8;
    hfdcan1.Init.RxBuffersNbr = 0;
    hfdcan1.Init.RxBufferSize = FDCAN_DATA_BYTES_8;
    hfdcan1.Init.TxEventsNbr = 0;
    hfdcan1.Init.TxBuffersNbr = 0;
    hfdcan1.Init.TxFifoQueueElmtsNbr = 32;
    hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
    hfdcan1.Init.TxElmtSize = FDCAN_DATA_BYTES_8;
    if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK) {
      Error_Handler();
    }
    void FDCAN_Config(FDCAN_HandleTypeDef * hfdcan)
    {
      FDCAN_FilterTypeDef sFilterConfig;
      /*Configure Rx filter */
      sFilterConfig.IdType = FDCAN_STANDARD_ID;
      sFilterConfig.FilterIndex = 0;
      sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
      sFilterConfig.FilterType = FDCAN_FILTER_RANGE;
      // sFilterConfig.FilterID1 = 0x83;
      // sFilterConfig.FilterID2 = 0x83;
      sFilterConfig.FilterID1 = 0x01;
      sFilterConfig.FilterID2 = 0x770;
      while (HAL_FDCAN_ConfigFilter(hfdcan, &sFilterConfig) != HAL_OK) { }
      /*Configure global filter:
      Filter all remote frames with STD and EXT ID
      Reject non matching frames with STD ID and EXT ID */
      while (HAL_FDCAN_ConfigGlobalFilter(hfdcan, FDCAN_REJECT, FDCAN_REJECT,
                 FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE)
          != HAL_OK) { }
      /*Start the FDCAN module */
      while (HAL_FDCAN_Start(hfdcan) != HAL_OK) { }
      while (HAL_FDCAN_ActivateNotification(
                 hfdcan, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0)
          != HAL_OK) { }
    }2024-02-28 9:33 AM
Use the </> tool to paste code, you can also edit posts. Perhaps add the whole project as a .ZIP or on GitHub?
>>..but the system doesn't work.
That's not a helpful description of the problem. You're going to need to refine that a little.
You'll need to review the circuit, how the peripherals configured/behaving at the register level in the debugger. The interrupt handlers and call backs are not shown.
Make each work independently first, perhaps in Loop Back mode.
2024-02-29 1:50 AM
@UVagl.1 I've had the inserted code prettied up by a C Beautifier - it looks much more readable, doesn't it?
