查看: 1895|回复: 3

[原创] 【MCX-N947-BRK板卡试用】-2-CAN收发测试

[复制链接]
  • TA的每日心情
    慵懒
    2024-5-23 06:13
  • 签到天数: 1082 天

    连续签到: 1 天

    [LV.10]以坛为家III

    18

    主题

    1974

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    6164
    最后登录
    2025-7-26
    发表于 2024-4-1 20:14:45 | 显示全部楼层 |阅读模式
    本帖最后由 SensorYoung 于 2024-4-2 09:04 编辑

    上一篇:【MCX-N947-BRK板卡试用】-1-CAN回环模式测试

    https://www.nxpic.org.cn/module/forum/forum.php?mod=viewthread&tid=803085&fromuid=349725

    本次将配合TJA1050 CAN收发器,以及简易USB CAN来测试一下MCX-N947 BRK的CAN收发功能。
    根据Reference Manual,P1_10与P1_11的ALT11功能为CAN收发:
    1.jpg

    pin_mux.c里面增加CAN0_TX CAN0_RX引脚功能的定义:
    1. /*
    2.                  *                CAN TX :                P1_10                                                                                                                                                         
    3.                 */                                                                                                                                                                                                        
    4.     const port_pin_config_t port1_10_pinC3_config = {/* Internal pull-up/down resistor is disabled */
    5.                                                     kPORT_PullDisable,
    6.                                                     /* Low internal pull resistor value is selected. */
    7.                                                     kPORT_LowPullResistor,
    8.                                                     /* Fast slew rate is configured */
    9.                                                     kPORT_FastSlewRate,
    10.                                                     /* Passive input filter is disabled */
    11.                                                     kPORT_PassiveFilterDisable,
    12.                                                     /* Open drain output is disabled */
    13.                                                     kPORT_OpenDrainEnable,
    14.                                                     /* Low drive strength is configured */
    15.                                                     kPORT_LowDriveStrength,
    16.                                                     /* Pin is configured as CAN0_TXD */
    17.                                                     kPORT_MuxAlt11,
    18.                                                     /* Digital input enabled */
    19.                                                     kPORT_InputBufferEnable,
    20.                                                     /* Digital input is not inverted */
    21.                                                     kPORT_InputNormal,
    22.                                                     /* Pin Control Register fields [15:0] are not locked */
    23.                                                     kPORT_UnlockRegister};
    24.     /* PORT1_10 (pin C3) is configured as CAN0_TXD */
    25.     PORT_SetPinConfig(PORT1, 10U, &port1_10_pinC3_config);               

    26.                 /*
    27.                  *                CAN RX :                P1_11                                                                                                                                                         
    28.                 */                                                                                                                                                                                                               
    29.     const port_pin_config_t port1_11_pinD3_config = {/* Internal pull-up/down resistor is disabled */
    30.                                                     kPORT_PullDisable,
    31.                                                     /* Low internal pull resistor value is selected. */
    32.                                                     kPORT_LowPullResistor,
    33.                                                     /* Fast slew rate is configured */
    34.                                                     kPORT_FastSlewRate,
    35.                                                     /* Passive input filter is disabled */
    36.                                                     kPORT_PassiveFilterDisable,
    37.                                                     /* Open drain output is disabled */
    38.                                                     kPORT_OpenDrainEnable,
    39.                                                     /* Low drive strength is configured */
    40.                                                     kPORT_LowDriveStrength,
    41.                                                     /* Pin is configured as CAN0_RXD */
    42.                                                     kPORT_MuxAlt11,
    43.                                                     /* Digital input enabled */
    44.                                                     kPORT_InputBufferEnable,
    45.                                                     /* Digital input is not inverted */
    46.                                                     kPORT_InputNormal,
    47.                                                     /* Pin Control Register fields [15:0] are not locked */
    48.                                                     kPORT_UnlockRegister};
    49.     /* PORT1_11 (pin D3) is configured as CAN0_RXD */
    50.     PORT_SetPinConfig(PORT1, 11U, &port1_11_pinD3_config);                                       
    复制代码

    相比于上一篇回环模式测试,这次需要在真实的CAN总线上收发报文,因此要注释掉下面这句:
    1. //flexcanConfig.enableLoopBack = true;
    复制代码

    报文接收过滤器设置为接收CAN id 0x125的报文:
    1. /* Setup Rx Message Buffer. */
    2.     mbConfig.format = kFLEXCAN_FrameFormatStandard;
    3.     mbConfig.type   = kFLEXCAN_FrameTypeData;
    4.     mbConfig.id     = FLEXCAN_ID_STD(0x125);
    5. #if (defined(USE_CANFD) && USE_CANFD)
    6.     FLEXCAN_SetFDRxMbConfig(EXAMPLE_CAN, RX_MESSAGE_BUFFER_NUM, &mbConfig, true);
    7. #else
    8.     FLEXCAN_SetRxMbConfig(EXAMPLE_CAN, RX_MESSAGE_BUFFER_NUM, &mbConfig, true);
    9. #endif

    10. /* Setup Tx Message Buffer. */
    11. #if (defined(USE_CANFD) && USE_CANFD)
    12.     FLEXCAN_SetFDTxMbConfig(EXAMPLE_CAN, TX_MESSAGE_BUFFER_NUM, true);
    13. #else
    14.     FLEXCAN_SetTxMbConfig(EXAMPLE_CAN, TX_MESSAGE_BUFFER_NUM, true);
    15. #endif

    16.     /* Create FlexCAN handle structure and set call back function. */
    17.     FLEXCAN_TransferCreateHandle(EXAMPLE_CAN, &flexcanHandle, flexcan_callback, NULL);

    18.     /* Start receive data through Rx Message Buffer. */
    19.     rxXfer.mbIdx = (uint8_t)RX_MESSAGE_BUFFER_NUM;
    20. #if (defined(USE_CANFD) && USE_CANFD)
    21.     rxXfer.framefd = &rxFrame;
    22.     (void)FLEXCAN_TransferFDReceiveNonBlocking(EXAMPLE_CAN, &flexcanHandle, &rxXfer);
    23. #else
    24.     rxXfer.frame = &rxFrame;
    25.     (void)FLEXCAN_TransferReceiveNonBlocking(EXAMPLE_CAN, &flexcanHandle, &rxXfer);
    26. #endif
    复制代码




    循环主体:
    1. while (true)
    2.     {
    3.                         /* Delay 1000 ms */
    4.       SysTick_DelayTicks(1000U);
    5.       GPIO_PortToggle(BOARD_LED_GPIO, 1u << BOARD_LED_GPIO_PIN);
    6.                         if(mycnt%60 == 0){
    7.                                 SEGGER_RTT_printf(0,"\r\nmycnt= %d\r\n", mycnt);
    8.                                 txFrame.dataByte7 = mycnt/60;
    9.                                 (void)FLEXCAN_TransferSendNonBlocking(EXAMPLE_CAN, &flexcanHandle, &txXfer);
    10.                                 
    11.                                 /* Waiting for Tx Message finish. */
    12.                                 while (!txComplete)
    13.                                 {
    14.                                 };
    15.                                 SEGGER_RTT_printf(0,"\r\n==FlexCAN Transfer Done -- Finish.==\r\n");
    16.                         }
    17.                         mycnt++;
    18.                         
    19.                         if(rxComplete){
    20.                                 rxComplete = false;
    21.                                 SEGGER_RTT_printf(0,"\r\n CAN Rx Done\r\n");
    22.                                 SEGGER_RTT_printf(0,"\r\nReceived message from MB%d\r\n", RX_MESSAGE_BUFFER_NUM);

    23.                                 //SEGGER_RTT_printf(0,"EXAMPLE_CAN_CLK_FREQ = %u MHz, CAN BUS bitRate = %uk bps\r\n", EXAMPLE_CAN_CLK_FREQ/1000000, (flexcanConfig.bitRate)/1000);
    24.                                 SEGGER_RTT_printf(0,"rx frame CanID = 0x%x\r\n", (rxFrame.id)>>18);
    25.                                 SEGGER_RTT_printf(0,"rx word0 = 0x%x\r\n", rxFrame.dataWord0);
    26.                                 SEGGER_RTT_printf(0,"rx word1 = 0x%x\r\n", rxFrame.dataWord1);

    27.                                 SEGGER_RTT_printf(0,"\r\n==FlexCAN Receive Done -- Finish.==\r\n");
    28.                                 (void)FLEXCAN_TransferReceiveNonBlocking(EXAMPLE_CAN, &flexcanHandle, &rxXfer);
    29.                         }
    30.                                 
    31.     }
    复制代码

    实物图:
    4.jpg

    上电复位后,先发送11 22 33  44  55 66 77 88,然后每隔1min发送一次。
    2.jpg

    在上位机发送CAN ID为0x125的报文,MCX-N可以正确接收:

    3.jpg






    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-5-23 06:13
  • 签到天数: 1082 天

    连续签到: 1 天

    [LV.10]以坛为家III

    18

    主题

    1974

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    6164
    最后登录
    2025-7-26
     楼主| 发表于 2024-4-1 20:16:18 | 显示全部楼层
    本帖最后由 SensorYoung 于 2024-4-1 20:18 编辑

    论坛大佬TLLED已经发布了多篇CAN相关文章,感谢大佬的无私分享,下面贴几个链接,等自己有时间了好好学习。

    RT1052+8、CAN通信例程测试
    https://www.nxpic.org.cn/module/forum/forum.php?mod=viewthread&tid=615226&fromuid=349725
    【DIY-LPC553X】+ CAN通信测试
    https://www.nxpic.org.cn/module/forum/forum.php?mod=viewthread&tid=629223&fromuid=349725
    【LPC55S69】基于rt-thread模拟接口CAN通信测试
    https://www.nxpic.org.cn/module/forum/forum.php?mod=viewthread&tid=630431&fromuid=349725
    还有:S32K148----SDK笔记----CAN收发 https://blog.csdn.net/weifengdq/article/details/102729451
    MCUXpresso SDK API Reference Manualhttps://mcuxpresso.nxp.com/api_doc/dev/71/group__flexcan__driver.html
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-4-15 14:49
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    19

    主题

    132

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1237
    最后登录
    2025-7-11
    发表于 2024-4-2 09:51:34 | 显示全部楼层
    SensorYoung 发表于 2024-4-1 20:16
    论坛大佬TLLED已经发布了多篇CAN相关文章,感谢大佬的无私分享,下面贴几个链接,等自己有时间了好好学习。 ...

    基本都是官网的例子,怎么没弄个CANFD,及多重帧收发例子?
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-1-21 08:52
  • 签到天数: 861 天

    连续签到: 1 天

    [LV.10]以坛为家III

    75

    主题

    2523

    帖子

    24

    金牌会员

    Rank: 6Rank: 6

    积分
    5867
    最后登录
    2025-1-22
    发表于 2024-4-9 19:46:52 | 显示全部楼层
    谢谢分享,刚刚买了模块,跟着学习
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-27 12:28 , Processed in 0.090944 second(s), 23 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表