工具与软件:
您好!
我将尝试根据安全手册和 TRM (技术参考手册)中所述的配置实施 DCAN 内部模拟环回测试。
问题是、尽管 sl_SelfTest_CAN 可以执行模拟环回测试、但 SDL API 文档根本没有定义或提及环回模式。 此外、提供的文档编写不完善、没有全面介绍内部环回模式的配置过程、这在理解如何正确配置系统方面留下了许多空白。
根据文档、我知道 DCAN 需要处于测试模式、并且必须通过设置测试寄存器中的 LBack 位来激活内部环回模式。
但是、虽然我可以确认正在发送数据(我已经嗅探了 TX 线路)、但我遇到的问题是 Rx 缓冲区 即使 DCAN 配置为环回模式、也会保持为空。
下面是启用测试模式和内部环回后控制和测试寄存器的当前配置:
- DCAN2->Ctrl =
0x00032882
- DCAN2->Test =
0x00000090
- DCAN2->ErrStat =
0x00000008
- DCAN2->IoCtrlTx =
0x0004000F
- DCAN2->IoCtrlRx =
0x00040009
以下是我的测试函数:
SdlRun_retval_e SdlRun_can_init_loopback() { SdlRun_retval_e retVal = SDL_RUN_EINVAL; boolean status = FALSE; bool canStatus; const uint8_t txBuf[8u] = {0x00u, 0xFFu, 0x0Fu, 0xF0u, 0x33u, 0xCCu, 0x55u, 0xAAu}; uint8_t rxBuf[8u]; uint8_t rxLen; /* Enable CAN test mode */ canREG2->CTL |= (uint32_t)(1U << 7); /* Activate Loopback Mode */ canREG2->TEST |= (uint32)(1U << 4); /* Send CAN message */ canStatus = CAN_boWrite(CAN_HDL_LP_TX, txBuf); if(canStatus != TRUE) { retVal = SDL_RUN_EINTERNAL; } /* Send messages from TX buffer */ CAN_Tx_Job(); /* Periodic CAN read */ canStatus = FALSE; do { /* Receive CAN message */ canStatus = CAN_boRead(CAN_HDL_LP_RX, rxBuf, &rxLen); } while (canStatus != TRUE); /* Compare data */ status = memcmp((void*)txBuf, (void*)rxBuf, 8u); if (status != 0) { retVal = SDL_RUN_EDATA; // break; } /* Disable CAN test mode */ canREG2->CTL &= ~(uint32_t)(1U << 7); /* Deactivate Loopback Mode */ canREG2->TEST &= ~(uint32)(1U << 4); /* Test passed */ retVal = SDL_RUN_SUCCESS; return retVal; }
我是否针对内部环回模式正确配置了 DCAN?
为什么在环回模式下发送数据后 RX 缓冲区为空?
谢谢、此致、
Ilija