本帖最后由 jundao721 于 2021-12-3 16:25 编辑
继上次测试完CAN以后,总觉得移植测试CANFD稍复杂点。没想到比我想的要简单的多,所以说测试新功能还是要有信心的。 测试目标还是2S发送数据,中断接收。由于CANFD的测试盒比较贵,暂时只能使用Loopback模式,连接方式如图1所示:
两种mode,external loopback和internal oopback。这里选external loopback,和CAN硬件有关系。 移植过程中需要增加systick的2S延时,上一篇已经说过了。需要有几个地方注意,第一个如下代码: - if (MCAN_FDCalculateImprovedTimingValues(mcanConfig.baudRateA, mcanConfig.baudRateD, MCAN_CLK_FREQ, &timing_config))
- {
- /* Update the improved timing configuration*/
- memcpy(&(mcanConfig.timingConfig), &timing_config, sizeof(mcan_timing_config_t));
- }
复制代码CANFD有两个波特率,一个是仲裁波特率,就是Arbitration,也有翻译成控制波特率,这个最大到1Mbps,这里设置成500kbps。另一个是数据波特率,根据datasheet说明,受外部收发器的影响。这里设置成1Mbps。 第二个是发送的数据,CANFD一次可发送64个字节的数据,这个在测试中会展示。
第三个就是要使能外部loopback模式,如代码所示: - mcanConfig.enableLoopBackExt = true;//使能loopbackext模式
复制代码发送配置如下: - for (cnt = 0; cnt < CAN_DATASIZE; cnt++)
- {
- tx_data[cnt] = cnt;
- }
- txFrame.xtd = kMCAN_FrameIDStandard;
- txFrame.rtr = kMCAN_FrameTypeData;
- txFrame.fdf = 0;
- txFrame.brs = 0;
- txFrame.dlc = 8U;
- txFrame.id = 0x123U << STDID_OFFSET;
- txFrame.data = tx_data;
- txFrame.size = CAN_DATASIZE;
- #if (defined(USE_CANFD) && USE_CANFD)
- txFrame.fdf = 1;
- txFrame.brs = 1;
- txFrame.dlc = DLC;
- #endif
- MCAN_TransferSendBlocking(EXAMPLE_MCAN, 0, &txFrame);
- SysTick_DelayTicks(2000U);
复制代码
接收处理如下: - memset(rx_data, 0, sizeof(uint8_t) * CAN_DATASIZE); //rx_data 清零
- //SysTick_DelayTicks(500U);
-
- while (!rxComplete)
- {
- }
- rxFrame.size = CAN_DATASIZE;
- memcpy(rx_data, rxFrame.data, rxFrame.size);
-
- }
复制代码
测试结果如图2所示。
|