在线时间907 小时
UID349725
注册时间2012-3-27
NXP金币1631
TA的每日心情 | 慵懒 2024-5-23 06:13 |
---|
签到天数: 1082 天 连续签到: 1 天 [LV.10]以坛为家III
金牌会员
 
- 积分
- 6164
- 最后登录
- 2025-7-26
|
本帖最后由 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收发:
pin_mux.c里面增加CAN0_TX CAN0_RX引脚功能的定义:
- /*
- * CAN TX : P1_10
- */
- const port_pin_config_t port1_10_pinC3_config = {/* Internal pull-up/down resistor is disabled */
- kPORT_PullDisable,
- /* Low internal pull resistor value is selected. */
- kPORT_LowPullResistor,
- /* Fast slew rate is configured */
- kPORT_FastSlewRate,
- /* Passive input filter is disabled */
- kPORT_PassiveFilterDisable,
- /* Open drain output is disabled */
- kPORT_OpenDrainEnable,
- /* Low drive strength is configured */
- kPORT_LowDriveStrength,
- /* Pin is configured as CAN0_TXD */
- kPORT_MuxAlt11,
- /* Digital input enabled */
- kPORT_InputBufferEnable,
- /* Digital input is not inverted */
- kPORT_InputNormal,
- /* Pin Control Register fields [15:0] are not locked */
- kPORT_UnlockRegister};
- /* PORT1_10 (pin C3) is configured as CAN0_TXD */
- PORT_SetPinConfig(PORT1, 10U, &port1_10_pinC3_config);
- /*
- * CAN RX : P1_11
- */
- const port_pin_config_t port1_11_pinD3_config = {/* Internal pull-up/down resistor is disabled */
- kPORT_PullDisable,
- /* Low internal pull resistor value is selected. */
- kPORT_LowPullResistor,
- /* Fast slew rate is configured */
- kPORT_FastSlewRate,
- /* Passive input filter is disabled */
- kPORT_PassiveFilterDisable,
- /* Open drain output is disabled */
- kPORT_OpenDrainEnable,
- /* Low drive strength is configured */
- kPORT_LowDriveStrength,
- /* Pin is configured as CAN0_RXD */
- kPORT_MuxAlt11,
- /* Digital input enabled */
- kPORT_InputBufferEnable,
- /* Digital input is not inverted */
- kPORT_InputNormal,
- /* Pin Control Register fields [15:0] are not locked */
- kPORT_UnlockRegister};
- /* PORT1_11 (pin D3) is configured as CAN0_RXD */
- PORT_SetPinConfig(PORT1, 11U, &port1_11_pinD3_config);
复制代码
相比于上一篇回环模式测试,这次需要在真实的CAN总线上收发报文,因此要注释掉下面这句:
- //flexcanConfig.enableLoopBack = true;
复制代码
报文接收过滤器设置为接收CAN id 0x125的报文:- /* Setup Rx Message Buffer. */
- mbConfig.format = kFLEXCAN_FrameFormatStandard;
- mbConfig.type = kFLEXCAN_FrameTypeData;
- mbConfig.id = FLEXCAN_ID_STD(0x125);
- #if (defined(USE_CANFD) && USE_CANFD)
- FLEXCAN_SetFDRxMbConfig(EXAMPLE_CAN, RX_MESSAGE_BUFFER_NUM, &mbConfig, true);
- #else
- FLEXCAN_SetRxMbConfig(EXAMPLE_CAN, RX_MESSAGE_BUFFER_NUM, &mbConfig, true);
- #endif
- /* Setup Tx Message Buffer. */
- #if (defined(USE_CANFD) && USE_CANFD)
- FLEXCAN_SetFDTxMbConfig(EXAMPLE_CAN, TX_MESSAGE_BUFFER_NUM, true);
- #else
- FLEXCAN_SetTxMbConfig(EXAMPLE_CAN, TX_MESSAGE_BUFFER_NUM, true);
- #endif
- /* Create FlexCAN handle structure and set call back function. */
- FLEXCAN_TransferCreateHandle(EXAMPLE_CAN, &flexcanHandle, flexcan_callback, NULL);
- /* Start receive data through Rx Message Buffer. */
- rxXfer.mbIdx = (uint8_t)RX_MESSAGE_BUFFER_NUM;
- #if (defined(USE_CANFD) && USE_CANFD)
- rxXfer.framefd = &rxFrame;
- (void)FLEXCAN_TransferFDReceiveNonBlocking(EXAMPLE_CAN, &flexcanHandle, &rxXfer);
- #else
- rxXfer.frame = &rxFrame;
- (void)FLEXCAN_TransferReceiveNonBlocking(EXAMPLE_CAN, &flexcanHandle, &rxXfer);
- #endif
复制代码
循环主体:
- while (true)
- {
- /* Delay 1000 ms */
- SysTick_DelayTicks(1000U);
- GPIO_PortToggle(BOARD_LED_GPIO, 1u << BOARD_LED_GPIO_PIN);
- if(mycnt%60 == 0){
- SEGGER_RTT_printf(0,"\r\nmycnt= %d\r\n", mycnt);
- txFrame.dataByte7 = mycnt/60;
- (void)FLEXCAN_TransferSendNonBlocking(EXAMPLE_CAN, &flexcanHandle, &txXfer);
-
- /* Waiting for Tx Message finish. */
- while (!txComplete)
- {
- };
- SEGGER_RTT_printf(0,"\r\n==FlexCAN Transfer Done -- Finish.==\r\n");
- }
- mycnt++;
-
- if(rxComplete){
- rxComplete = false;
- SEGGER_RTT_printf(0,"\r\n CAN Rx Done\r\n");
- SEGGER_RTT_printf(0,"\r\nReceived message from MB%d\r\n", RX_MESSAGE_BUFFER_NUM);
- //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);
- SEGGER_RTT_printf(0,"rx frame CanID = 0x%x\r\n", (rxFrame.id)>>18);
- SEGGER_RTT_printf(0,"rx word0 = 0x%x\r\n", rxFrame.dataWord0);
- SEGGER_RTT_printf(0,"rx word1 = 0x%x\r\n", rxFrame.dataWord1);
- SEGGER_RTT_printf(0,"\r\n==FlexCAN Receive Done -- Finish.==\r\n");
- (void)FLEXCAN_TransferReceiveNonBlocking(EXAMPLE_CAN, &flexcanHandle, &rxXfer);
- }
-
- }
复制代码
实物图:
上电复位后,先发送11 22 33 44 55 66 77 88,然后每隔1min发送一次。
在上位机发送CAN ID为0x125的报文,MCX-N可以正确接收:
|
|