mcp2515 8mhz, websocket 500ms,

This commit is contained in:
2026-01-24 17:35:28 +00:00
parent 95e182d68e
commit b1ed03cf56

View File

@@ -230,14 +230,14 @@ SPIClass hspi(HSPI);
// - 하드웨어에 16MHz 크리스탈 장착 시: MCP_16MHZ // - 하드웨어에 16MHz 크리스탈 장착 시: MCP_16MHZ
// - 하드웨어에 8MHz 크리스탈 장착 시: MCP_8MHZ // - 하드웨어에 8MHz 크리스탈 장착 시: MCP_8MHZ
// //
#define MCP_CRYSTAL MCP_16MHZ // ⭐ 16MHz 크리스탈 (1 Mbps 권장) //#define MCP_CRYSTAL MCP_16MHZ // ⭐ 16MHz 크리스탈 (1 Mbps 권장)
// #define MCP_CRYSTAL MCP_8MHZ // 8MHz 크리스탈 (500 Kbps까지) #define MCP_CRYSTAL MCP_8MHZ // 8MHz 크리스탈 (500 Kbps까지)
// SPI 속도: 20MHz (MCP2515 최대 속도와 균형) // SPI 속도: 20MHz (MCP2515 최대 속도와 균형)
// 10MHz: 안정적이지만 느림 // 10MHz: 안정적이지만 느림
// 20MHz: 권장 (고속 + 안정성) // 20MHz: 권장 (고속 + 안정성)
// 25MHz: 불안정할 수 있음 // 25MHz: 불안정할 수 있음
MCP2515 mcp2515(HSPI_CS, 20000000, &hspi); MCP2515 mcp2515(HSPI_CS, 40000000, &hspi);
HardwareSerial SerialComm(1); // UART1 HardwareSerial SerialComm(1); // UART1
HardwareSerial Serial2Comm(2); // ⭐ UART2 추가 HardwareSerial Serial2Comm(2); // ⭐ UART2 추가
WebServer server(80); WebServer server(80);
@@ -391,15 +391,15 @@ void resetMCP2515() {
delay(10); delay(10);
// 6. 필터/마스크 설정 (모든 메시지 수신) // 6. 필터/마스크 설정 (모든 메시지 수신)
Serial.println(" 4. 필터 설정 (모든 메시지 수신)..."); Serial.println(" 4. 필터 설정 (Standard + Extended ID 모두 수신)...");
mcp2515.setFilterMask(MCP2515::MASK0, false, 0x000); mcp2515.setFilterMask(MCP2515::MASK0, true, 0x00000000); // ⭐ false → true (Extended ID 지원)
mcp2515.setFilterMask(MCP2515::MASK1, false, 0x000); mcp2515.setFilterMask(MCP2515::MASK1, true, 0x00000000); // ⭐ false → true
mcp2515.setFilter(MCP2515::RXF0, false, 0x000); mcp2515.setFilter(MCP2515::RXF0, true, 0x00000000); // ⭐ false → true
mcp2515.setFilter(MCP2515::RXF1, false, 0x000); mcp2515.setFilter(MCP2515::RXF1, true, 0x00000000); // ⭐ false → true
mcp2515.setFilter(MCP2515::RXF2, false, 0x000); mcp2515.setFilter(MCP2515::RXF2, true, 0x00000000); // ⭐ false → true
mcp2515.setFilter(MCP2515::RXF3, false, 0x000); mcp2515.setFilter(MCP2515::RXF3, true, 0x00000000); // ⭐ false → true
mcp2515.setFilter(MCP2515::RXF4, false, 0x000); mcp2515.setFilter(MCP2515::RXF4, true, 0x00000000); // ⭐ false → true
mcp2515.setFilter(MCP2515::RXF5, false, 0x000); mcp2515.setFilter(MCP2515::RXF5, true, 0x00000000); // ⭐ false → true
delay(10); delay(10);
// 7. 모드 설정 (마지막에!) // 7. 모드 설정 (마지막에!)
@@ -2885,7 +2885,7 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t *payload, size_t length)
// Web Update Task // Web Update Task
// ======================================== // ========================================
void webUpdateTask(void *parameter) { void webUpdateTask(void *parameter) {
const TickType_t xDelay = pdMS_TO_TICKS(100); // ⭐ 200ms → 100ms (더 빠른 업데이트) const TickType_t xDelay = pdMS_TO_TICKS(500); // ⭐ 100ms → 500ms (CPU 부하 감소)
// 🆕 초기화 대기 단축 (부팅 직후 안정화) // 🆕 초기화 대기 단축 (부팅 직후 안정화)
vTaskDelay(pdMS_TO_TICKS(500)); // ⭐ 2000ms → 500ms (빠른 연결) vTaskDelay(pdMS_TO_TICKS(500)); // ⭐ 2000ms → 500ms (빠른 연결)
@@ -3238,15 +3238,15 @@ void setup() {
delay(10); delay(10);
// 5. 필터/마스크 설정 (모든 메시지 수신) // 5. 필터/마스크 설정 (모든 메시지 수신)
Serial.println(" 4. 필터 설정 (모든 메시지 수신)..."); Serial.println(" 4. 필터 설정 (Standard + Extended ID 모두 수신)...");
mcp2515.setFilterMask(MCP2515::MASK0, false, 0x000); mcp2515.setFilterMask(MCP2515::MASK0, true, 0x00000000); // ⭐ false → true (Extended ID 지원)
mcp2515.setFilterMask(MCP2515::MASK1, false, 0x000); mcp2515.setFilterMask(MCP2515::MASK1, true, 0x00000000); // ⭐ false → true
mcp2515.setFilter(MCP2515::RXF0, false, 0x000); mcp2515.setFilter(MCP2515::RXF0, true, 0x00000000); // ⭐ false → true
mcp2515.setFilter(MCP2515::RXF1, false, 0x000); mcp2515.setFilter(MCP2515::RXF1, true, 0x00000000); // ⭐ false → true
mcp2515.setFilter(MCP2515::RXF2, false, 0x000); mcp2515.setFilter(MCP2515::RXF2, true, 0x00000000); // ⭐ false → true
mcp2515.setFilter(MCP2515::RXF3, false, 0x000); mcp2515.setFilter(MCP2515::RXF3, true, 0x00000000); // ⭐ false → true
mcp2515.setFilter(MCP2515::RXF4, false, 0x000); mcp2515.setFilter(MCP2515::RXF4, true, 0x00000000); // ⭐ false → true
mcp2515.setFilter(MCP2515::RXF5, false, 0x000); mcp2515.setFilter(MCP2515::RXF5, true, 0x00000000); // ⭐ false → true
delay(10); delay(10);
// 6. 수신 버퍼 비우기 (Configuration 모드에서) // 6. 수신 버퍼 비우기 (Configuration 모드에서)
@@ -3695,7 +3695,7 @@ void setup() {
// - SEQ: 시퀀스 재생 // - SEQ: 시퀀스 재생
// - MONITOR: 상태 모니터링 // - MONITOR: 상태 모니터링
xTaskCreatePinnedToCore(canRxTask, "CAN_RX", 12288, NULL, 20, &canRxTaskHandle, 1); // ⭐ 8KB → 12KB, Pri 24 (최고) xTaskCreatePinnedToCore(canRxTask, "CAN_RX", 12288, NULL, 20, &canRxTaskHandle, 1); // ⭐ 8KB → 12KB, Pri 24 (최고)
xTaskCreatePinnedToCore(webUpdateTask, "WEB_UPDATE", 12288, NULL, 16, &webTaskHandle, 1); // ⭐ Core 0 → 1, Pri 4 (SD와 분리) xTaskCreatePinnedToCore(webUpdateTask, "WEB_UPDATE", 12288, NULL, 4, &webTaskHandle, 1); // ⭐ Core 0 → 1, Pri 4 (SD와 분리)
xTaskCreatePinnedToCore(txTask, "TX", 4096, NULL, 3, NULL, 1); // Pri 3 xTaskCreatePinnedToCore(txTask, "TX", 4096, NULL, 3, NULL, 1); // Pri 3
xTaskCreatePinnedToCore(sequenceTask, "SEQ", 4096, NULL, 2, NULL, 1); // Pri 2 xTaskCreatePinnedToCore(sequenceTask, "SEQ", 4096, NULL, 2, NULL, 1); // Pri 2
xTaskCreatePinnedToCore(sdMonitorTask, "SD_MONITOR", 4096, NULL, 1, NULL, 1); // Pri 1 xTaskCreatePinnedToCore(sdMonitorTask, "SD_MONITOR", 4096, NULL, 1, NULL, 1); // Pri 1