From 1df8509e128d83485c0c6dd85cb7f4a1c2d58fbf Mon Sep 17 00:00:00 2001 From: byun Date: Thu, 30 Apr 2026 17:40:40 +0000 Subject: [PATCH] =?UTF-8?q?=EA=B8=B0=EB=B3=B8TEST=EB=AA=A9=EC=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MCP2518FD_RX_Test.ino | 97 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 MCP2518FD_RX_Test.ino diff --git a/MCP2518FD_RX_Test.ino b/MCP2518FD_RX_Test.ino new file mode 100644 index 0000000..88d9543 --- /dev/null +++ b/MCP2518FD_RX_Test.ino @@ -0,0 +1,97 @@ +#include +#include + +#define PIN_CAN_SCK 12 +#define PIN_CAN_MOSI 11 +#define PIN_CAN_MISO 13 +#define PIN_CAN_CS 10 +#define PIN_CAN_INT 255 + +#define LOOPBACK_TEST false + +SPIClass gSPI(HSPI); +ACAN2517FD gCAN(PIN_CAN_CS, gSPI, PIN_CAN_INT); + +uint32_t gTxCount = 0; +uint32_t gRxCount = 0; + +void setup() { + Serial.begin(115200); + delay(500); + + Serial.println("\n===================================="); + Serial.println(" MCP2518FD v3 - INT=255 NULL 콜백"); + Serial.println(LOOPBACK_TEST ? " [STEP1] InternalLoopBack" : " [STEP2] Normal20B 수신"); + Serial.println("===================================="); + + gSPI.begin(PIN_CAN_SCK, PIN_CAN_MISO, PIN_CAN_MOSI, PIN_CAN_CS); + gSPI.setFrequency(5000000); + + ACAN2517FDSettings settings( + ACAN2517FDSettings::OSC_20MHz, + 500UL * 1000UL, + DataBitRateFactor::x1 + ); + + settings.mRequestedMode = LOOPBACK_TEST + ? ACAN2517FDSettings::InternalLoopBack + : ACAN2517FDSettings::Normal20B; + + settings.mControllerReceiveFIFOSize = 16; + + Serial.printf("비트레이트: %lu bps\n", settings.actualArbitrationBitRate()); + + // INT=255 폴링모드는 반드시 NULL + const uint32_t err = gCAN.begin(settings, NULL); + + if (err == 0) { + Serial.println("[OK] 초기화 성공!"); + Serial.println(LOOPBACK_TEST + ? "1초마다 자동 송신 -> [LOOPBACK_OK] 뜨면 정상\n" + : "PC에서 500kbps CAN 프레임 보내세요.\n"); + } else { + Serial.printf("[ERROR] 0x%08X\n", err); + while (true) delay(1000); + } +} + +void loop() { + gCAN.isr(); // 폴링모드: 루프마다 직접 호출 + + if (LOOPBACK_TEST) { + static uint32_t lastTx = 0; + if (millis() - lastTx >= 1000) { + lastTx = millis(); + CANFDMessage txMsg; + txMsg.id = 0x123; + txMsg.len = 8; + for (uint8_t i = 0; i < 8; i++) txMsg.data[i] = i; + if (gCAN.tryToSend(txMsg)) { + gTxCount++; + Serial.printf("TX [%lu] ID:0x123\n", gTxCount); + } + } + } + + CANFDMessage msg; + while (gCAN.receive(msg)) { + gRxCount++; + if (LOOPBACK_TEST) { + Serial.printf("[LOOPBACK_OK] RX [%lu] ID:0x%03X DLC:%d Data:", + gRxCount, msg.id, msg.len); + } else { + Serial.printf("[%5lu] %s ID:0x%08X DLC:%d Data:", + gRxCount, msg.ext ? "EXT" : "STD", msg.id, msg.len); + } + for (uint8_t i = 0; i < msg.len; i++) Serial.printf(" %02X", msg.data[i]); + Serial.println(); + } + + static uint32_t lastSt = 0; + if (millis() - lastSt >= 5000) { + lastSt = millis(); + if (LOOPBACK_TEST && gRxCount == 0 && gTxCount >= 3) + Serial.println("!! RX=0 -> 여전히 문제"); + Serial.printf("-- TX=%lu RX=%lu\n", gTxCount, gRxCount); + } +} \ No newline at end of file