收到板卡,先点个灯,没什么问题就进入正式测试阶段。仔细阅读H533的Datasheet,是一款资源很丰富的MCU,发现其有两个FDCAN接口,这样就丰富了板卡通讯。这种总线通信方式当前使用的比较多,就先测试下这个外设功能。
首先搭建测试硬件条件,使用板卡上的PB12和PB13作为通讯接口,连接到TJA1044 驱动芯片板卡上,按照datasheet对应上即可。如图1所示:
图1
图2
然后是使用Cubemx软件对MCU的时钟,外设等进行配置,并生成所需要的项目框架。时钟配置如图3所示:
图3
FDCAN的时钟使用24M,不倍频,波特率为1Mbps,数据波特率为2Mbps,外设的配置如图4所示:
图4
使用板载的LED作为接收数据的指示灯,可在图上进行配置,如图5所示:
图5
这样配置完后,生成所需要的项目框架。编写接收和发送数据的初始化函数,如下所示:
- /* Prepare Tx message Header */
- txHeader.Identifier = Tx_ID;
- txHeader.IdType = FDCAN_STANDARD_ID;
- txHeader.TxFrameType = FDCAN_DATA_FRAME;
- txHeader.DataLength = FDCAN_DLC_BYTES_64;
- txHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
- txHeader.BitRateSwitch = FDCAN_BRS_ON;
- txHeader.FDFormat = FDCAN_FD_CAN;
- txHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
- txHeader.MessageMarker = 0U;
- /**
- * Configure and enable Tx Delay Compensation, required for BRS mode.
- * TdcOffset default recommended value: DataTimeSeg1 * DataPrescaler
- * TdcFilter default recommended value: 0
- */
- if (HAL_FDCAN_ConfigTxDelayCompensation(&hfdcan2,
- (hfdcan2.Init.DataPrescaler * hfdcan2.Init.DataTimeSeg1), 0U) != HAL_OK)
- {
- Error_Handler();
- }
- if (HAL_FDCAN_EnableTxDelayCompensation(&hfdcan2) != HAL_OK)
- {
- Error_Handler();
- }
- /* Start FDCAN controller */
- if (HAL_FDCAN_Start(&hfdcan2) != HAL_OK)
- {
- Error_Handler();
- }
复制代码- void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)
- {
- if ((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != 0U)
- {
- /* Retrieve Rx messages from RX FIFO0 */
- if (HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &rxHeader, rxData) != HAL_OK)
- {
- Error_Handler();
- }
- /* Compare received RX message to expected data. Ignore if not matching. */
- if ((rxHeader.Identifier == Rx_ID) &&
- (rxHeader.IdType == FDCAN_STANDARD_ID) &&
- (rxHeader.DataLength == FDCAN_DLC_BYTES_64))
- {
- HAL_GPIO_TogglePin (GPIOA,GPIO_PIN_5);
- }
- }
- }
复制代码- if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan2, &txHeader, txData) != HAL_OK)
- {
- Error_Handler();
- }
- /* Delay for simple button debounce */
- HAL_Delay(1000U);
复制代码 |