88|0

2937

帖子

4

TA的资源

五彩晶圆(中级)

楼主
 

【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之类的应用。

 

 

此帖出自NXP MCU论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表