【FRDM-MCXN947测评】CAN FD通讯测试
[复制链接]
本帖最后由 bigbat 于 2025-1-23 11:40 编辑
1、测试介绍
MCXN947VDF MCU具有CAN FD外设。本次测试CAN 通讯测试。测试需要两块具有CAN FD通讯的设备。我这里使用一块FRM-MCXA156开发板作为从机进行通讯。两块开发板通过 CAN 总线连接。当用户在终端输入要发送的 CAN 消息数量时,端点 A(开发板 A)会向端点 B(开发板 B)发送 CAN/CANFD 消息。端点 B 使用两个接收队列轮流接收消息,并且在任意一个队列满时,将消息内容和接收队列编号打印到终端。
测试硬件:
FRDM-MCXN947 开发板一块
FRDM-MCXA156 开发板 一块
PC计算机一台
USB type-c电缆线两条
杜邦连接一组
软件:
GCC ARM Embedded 13.2.1编译器
PUTTY串口终端
2、测试配置与程序
将引脚引脚·P1_10和·P1_11引脚设置为CAN FD功能。
cAN通讯程序较为复杂,直接构建较为麻烦,所以通常使用工具自动生成程序。
if ((node_type == 'A') || (node_type == 'a'))
{
uint8_t index = 0;
uint32_t times = 0;
LOG_INFO("Please input the number of CAN/CANFD messages to be send and end with enter.\r\n");
while (index != 0x0D)
{
index = GETCHAR();
if ((index >= '0') && (index <= '9'))
{
(void)PUTCHAR(index);
times = times * 10 + (index - 0x30U);
}
}
LOG_INFO("\r\n");
txFrame.id = FLEXCAN_ID_STD(TX_MB_ID);
txFrame.format = (uint8_t)kFLEXCAN_FrameFormatStandard;
txFrame.type = (uint8_t)kFLEXCAN_FrameTypeData;
txFrame.length = (uint8_t)DLC;
#if (defined(USE_CANFD) && USE_CANFD)
txFrame.brs = 1U;
txFrame.edl = 1U;
#endif
for (i = 1; i <= times; i++)
{
#if (defined(USE_CANFD) && USE_CANFD)
(void)FLEXCAN_TransferFDSendBlocking(EXAMPLE_CAN, TX_MESSAGE_BUFFER_NUM, &txFrame);
#else
(void)FLEXCAN_TransferSendBlocking(EXAMPLE_CAN, TX_MESSAGE_BUFFER_NUM, &txFrame);
#endif
/* Wait for 200ms after every 2 RX_QUEUE_BUFFER_SIZE transmissions. */
if ((TxCount % (RX_QUEUE_BUFFER_SIZE * 2U)) == 0U)
SDK_DelayAtLeastUs(200000U, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
txFrame.dataByte0++;
TxCount++;
}
LOG_INFO("Transmission done.\r\n\r\n");
}
else
{
/* Wait until Rx queue 1 full. */
while (rxQueue1Flag != 1U)
{
};
rxQueue1Flag = 0;
LOG_INFO("Read Rx MB from Queue 1.\r\n");
for (i = 0; i < RX_QUEUE_BUFFER_SIZE; i++)
{
LOG_INFO("Rx MB ID: 0x%3x, Rx MB data: 0x%x, Time stamp: %d\r\n", rxFrame[i].id >> CAN_ID_STD_SHIFT,
rxFrame[i].dataByte0, rxFrame[i].timestamp);
}
/* Wait until Rx queue 2 full. */
while (rxQueue2Flag != 1U)
{
};
rxQueue2Flag = 0;
LOG_INFO("Read Rx MB from Queue 2.\r\n");
for (; i < (RX_QUEUE_BUFFER_SIZE * 2U); i++)
{
LOG_INFO("Rx MB ID: 0x%3x, Rx MB data: 0x%x, Time stamp: %d\r\n", rxFrame[i].id >> CAN_ID_STD_SHIFT,
rxFrame[i].dataByte0, rxFrame[i].timestamp);
}
if (rxStatus == kStatus_FLEXCAN_RxOverflow)
{
rxStatus = 0;
LOG_INFO("The data in the last MB %d in the queue 2 is overwritten\r\n", RX_QUEUE_BUFFER_END_2);
}
LOG_INFO("Wait Node A to trigger the next 8 messages!\r\n\r\n");
}
主要思路为设置一个贞缓冲,使用FLEXCAN_TransferSendBlocking进行数据发送。接收数据使用中断进行接收数据。将接受数据放置到接收缓冲当中。
void EXAMPLE_FLEXCAN_IRQHandler(void)
{
User_TransferHandleIRQ(EXAMPLE_CAN);
SDK_ISR_EXIT_BARRIER;
}
3、测试过程
将两个开发板使用杜邦线相连。将开发板FRDM-MCXA156 USB线缆插入PC主机。
打开Putty中断,将开发板设置为节点NODE B
将FRDM-MCXN947 USB线缆插入PC,打开终端软件,将开发板设置为NODE A
在终端中输入数据缓冲大小,可以发现由NODE A向NODE B发送的测试数据。
4、总结
从程序的编写角度来看,CAN的通讯较为复杂,调用的API也较多。虽然NXP对SDK进行了较大的简化,但是在复杂的应用中还是较为困难。如果业界推出一些较为程式化的封装库,则可以大大简化编程。就如iwIP之类的应用。
|