Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| weitere_hardware:nesso_n1_en [18.04.2026 19:25] – angelegt mellinux | weitere_hardware:nesso_n1_en [21.04.2026 14:58] (aktuell) – mellinux | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| **NOTE:** Currently in the testing phase! | **NOTE:** Currently in the testing phase! | ||
| + | |||
| + | **NOTE:** team-nessoN1-meshcore is taking a break for health reasons. If you’d like, you can contact him via email at --- // | ||
| ====== MeshCore — Arduino Nesso N1 (ESP32-C6) ====== | ====== MeshCore — Arduino Nesso N1 (ESP32-C6) ====== | ||
| - | **Author:** team-nessoN1-meshcore — team-nessoN1-meshcore@posteo.de | + | **Author:** team-nessoN1-meshcore — team-nessoN1-meshcore@posteo.de\\ |
| **Date:** April 2026 | **Date:** April 2026 | ||
| - | This directory contains | + | This page describes |
| - | **Arduino Nesso N1** as a MeshCore target platform. The board was co-developed | + | |
| - | by Arduino and M5Stack, combining an ESP32-C6 microcontroller with an SX1262 | + | |
| - | LoRa transceiver, | + | |
| - | in a compact, battery-powered enclosure. | + | |
| - | + | ||
| - | ---- | + | |
| ===== Hardware Overview ===== | ===== Hardware Overview ===== | ||
| - | | Component | + | ^ Component |
| - | |---|---| | + | |
| | MCU | Espressif ESP32-C6 (RISC-V, 160 MHz) | | | MCU | Espressif ESP32-C6 (RISC-V, 160 MHz) | | ||
| | Flash | 16 MB | | | Flash | 16 MB | | ||
| | RAM | 512 KB | | | RAM | 512 KB | | ||
| - | | LoRa | Semtech SX1262, 850\u2013960 | + | | LoRa | Semtech SX1262, 850–960 |
| - | | RF Switch / LNA | External, controlled via I\u00b2C | + | | RF Switch / LNA | External, controlled via I²C GPIO expander | |
| - | | I\u00b2C | + | | I²C GPIO Expander | PI4IOE5V6408 (2× instances, addresses 0x43 and 0x44) | |
| - | | Display | ST7789P3, 1.14\u2033, 240\u00d7135 | + | | Display | ST7789P3, 1.14″, 240×135 |
| | IMU | BMI270 (6-axis) | | | IMU | BMI270 (6-axis) | | ||
| | Battery | 250 mAh LiPo, USB-C charging | | | Battery | 250 mAh LiPo, USB-C charging | | ||
| | Connectivity | Wi-Fi 6, BT 5.3, Thread/ | | Connectivity | Wi-Fi 6, BT 5.3, Thread/ | ||
| - | |||
| - | ---- | ||
| ===== Key Porting Decisions ===== | ===== Key Porting Decisions ===== | ||
| - | ==== SX1262 Reset and RF Switch via I\u00b2C | + | ==== SX1262 Reset and RF Switch via I²C Expander ==== |
| - | Unlike most other MeshCore targets, the LoRa control lines on the Nesso N1 | + | Unlike most other MeshCore targets, the LoRa control lines on the Nesso N1 are not connected directly to ESP32-C6 GPIO pins. They are routed through a **PI4IOE5V6408 |
| - | are not connected directly to ESP32-C6 GPIO pins. They are routed through a | + | |
| - | **PI4IOE5V6408 | + | |
| - | | Signal | + | ^ Signal |
| - | |---|---|---| | + | |
| | SX_NRST | P7 | SX1262 hardware reset | | | SX_NRST | P7 | SX1262 hardware reset | | ||
| | SX_ANT_SW | P6 | Antenna RF switch | | | SX_ANT_SW | P6 | Antenna RF switch | | ||
| Zeile 47: | Zeile 37: | ||
| | KEY2 | P1 | Button B (input) | | | KEY2 | P1 | Button B (input) | | ||
| - | RadioLib' | + | RadioLib' |
| - | '' | + | |
| ==== Shared SPI Bus (SX1262 + ST7789) ==== | ==== Shared SPI Bus (SX1262 + ST7789) ==== | ||
| - | | Signal | + | ^ Signal |
| - | |---|---| | + | |
| | MOSI | G21 | | | MOSI | G21 | | ||
| | MISO | G22 | | | MISO | G22 | | ||
| Zeile 61: | Zeile 49: | ||
| | LCD DC | G16 | | | LCD DC | G16 | | ||
| - | '' | + | '' |
| - | a duplicate APB hardware CS-callback (see Fix 4). | + | |
| ==== FSPI instead of default SPI ==== | ==== FSPI instead of default SPI ==== | ||
| Zeile 70: | Zeile 57: | ||
| ==== USB-CDC and BLE are mutually exclusive ==== | ==== USB-CDC and BLE are mutually exclusive ==== | ||
| - | | Firmware | + | ^ Firmware |
| - | |---|---|---| | + | |
| | Repeater | '' | | Repeater | '' | ||
| | Companion BLE | '' | | Companion BLE | '' | ||
| | Companion WiFi | '' | | Companion WiFi | '' | ||
| - | |||
| - | ---- | ||
| ===== Display Architecture ===== | ===== Display Architecture ===== | ||
| Zeile 82: | Zeile 66: | ||
| ==== Resolution and UITask Layout Verification ==== | ==== Resolution and UITask Layout Verification ==== | ||
| - | The ST7789P3 has **240\u00d7135 | + | The ST7789P3 has **240×135 |
| - | All UITask default layouts fit without overflow: | + | |
| - | | Element | + | ^ Element |
| - | |---|---|---|---|---| | + | | MeshCore logo (64×36 |
| - | | MeshCore logo (64\u00d736 | + | | Version line (setTextSize 2) | 156 px | 42 | 198 | ✅ | |
| - | | Version line (setTextSize 2) | 156 px | 42 | 198 | \u2705 | + | | Node name " |
| - | | Node name \" | + | | Frequency line "869.6 SF8 BW62.5" |
| - | | Frequency line \"869.6 SF8 BW62.5\" | 204 px | 18 | 222 | \u2705 | + | |
| - | All four elements together occupy ~100 px of 135 px height | + | All four elements together occupy ~100 px of 135 px height |
| ==== Mandatory Initialisation Order ==== | ==== Mandatory Initialisation Order ==== | ||
| Zeile 100: | Zeile 82: | ||
| 1. board.begin() | 1. board.begin() | ||
| 2. board.onRfRx() | 2. board.onRfRx() | ||
| - | 3. radio.std_init(nullptr) RadioLib | + | 3. radio.std_init(nullptr) RadioLib |
| - | 4. display.begin() | + | 4. display.begin() |
| </ | </ | ||
| - | |||
| - | ---- | ||
| ===== Known Issues and Their Fixes ===== | ===== Known Issues and Their Fixes ===== | ||
| - | ==== Fix 1 \u2014 | + | ==== Fix 1 — Display Goes Black After a Few Seconds ==== |
| - | **Date:** April 2026 | + | **Date:** April 2026\\ |
| **Affected file:** '' | **Affected file:** '' | ||
| - | **Symptom: | + | **Symptom: |
| - | then stays permanently black. Button presses have no effect. | + | |
| - | **Root cause:** | + | **Root cause:** '' |
| - | '' | + | |
| - | '' | + | |
| - | '' | + | |
| - | a direct GPIO pin. On the Nesso N1, KEY1 and KEY2 are connected **via I\u00b2C | + | |
| - | expander 0** (address 0x43, pins P0/P1) and are **not direct GPIOs**. | + | |
| - | UITask therefore has **no wakeup path** | + | |
| - | display stays off permanently. | + | |
| **Fix:** | **Fix:** | ||
| - | <code>ini | + | <code ini> |
| - | ; platformio.ini | + | ; platformio.ini |
| -D SCREEN_TIMEOUT=0 | -D SCREEN_TIMEOUT=0 | ||
| -D DISPLAY_TIMEOUT=0 | -D DISPLAY_TIMEOUT=0 | ||
| </ | </ | ||
| - | Both flags set to 0 disable the automatic timeout entirely. | ||
| - | '' | ||
| - | **Note for battery operation: | + | Both flags set to 0 disable the automatic timeout entirely. '' |
| - | Button wakeup | + | |
| - | ---- | + | > **Note for battery operation: |
| + | |||
| + | ==== Fix 2 — Display in Portrait Mode (135×240 Instead of 240×135) ==== | ||
| + | |||
| + | **Date:** April 2026\\ | ||
| + | **Affected file:** '' | ||
| + | |||
| + | **Symptom: | ||
| + | |||
| + | **Root cause:** '' | ||
| + | |||
| + | **Fix in '' | ||
| + | <code cpp> | ||
| + | _gfx-> | ||
| + | Serial.printf(" | ||
| + | _gfx-> | ||
| + | </ | ||
| + | |||
| + | ==== Fix 3 — '' | ||
| + | |||
| + | **Date:** April 2026\\ | ||
| + | **Affected file:** '' | ||
| + | |||
| + | **Symptom: | ||
| + | |||
| + | **Root cause:** '' | ||
| + | |||
| + | **Fix in '' | ||
| + | <code cpp> | ||
| + | static bool s_boardBeginCalled = false; | ||
| + | if (s_boardBeginCalled) { | ||
| + | Serial.println(" | ||
| + | return; | ||
| + | } | ||
| + | s_boardBeginCalled = true; | ||
| + | </ | ||
| + | |||
| + | **Complete solution:** Remove '' | ||
| + | |||
| + | ==== Fix 4 — APB Callback Duplicate and Wire.setPins Warning ==== | ||
| + | |||
| + | **Date:** April 2026\\ | ||
| + | **Affected files:** '' | ||
| + | |||
| + | **Symptom: | ||
| + | < | ||
| + | [E][Wire.cpp: | ||
| + | [E][esp32-hal-cpu.c: | ||
| + | [E][esp32-hal-cpu.c: | ||
| + | </ | ||
| + | |||
| + | **Root cause:** '' | ||
| + | |||
| + | **Fix:** The board guard (Fix 3) prevents the second '' | ||
| + | |||
| + | ==== Fix 5 — BUSY Pulse Timing After loraReset() ==== | ||
| + | |||
| + | **Date:** April 2026\\ | ||
| + | **Affected file:** '' | ||
| + | |||
| + | **Symptom: | ||
| + | |||
| + | **Root cause:** '' | ||
| + | |||
| + | **Fix:** | ||
| + | <code cpp> | ||
| + | _exp0.digitalWrite(NESSO_EXP0_SX_NRST, | ||
| + | delay(2); | ||
| + | </ | ||
| + | |||
| + | Updated log message: | ||
| + | < | ||
| + | [loraReset] BUSY 2 ms after NRST HIGH: LOW (pulse complete — normal on Nesso N1) | ||
| + | </ | ||
| - | ==== Fix 7 \u2014 | + | ==== Fix 7 — Buttons Non-Functional in Repeater Display Mode ==== |
| - | **Date:** April 2026 | + | **Date:** April 2026\\ |
| - | **Affected files:** '' | + | **Affected files:** '' |
| - | '' | + | |
| - | **Symptom: | + | **Symptom: |
| - | '' | + | |
| - | **Root cause: | + | **Root cause:** '' |
| - | '' | + | |
| - | is already on. In '' | + | |
| - | **commented out**. Additionally, | + | |
| - | connection to '' | + | |
| - | **Fix \u2014 | + | **Fix — three levels:** |
| - | 1. **New interface '' | + | **1. New interface '' |
| - | <code>cpp | + | <code cpp> |
| class UIActions { | class UIActions { | ||
| public: | public: | ||
| Zeile 165: | Zeile 201: | ||
| </ | </ | ||
| - | 2. **'' | + | **2. '' |
| - | <code>cpp | + | <code cpp> |
| class MyMesh : public mesh::Mesh, public CommonCLICallbacks, | class MyMesh : public mesh::Mesh, public CommonCLICallbacks, | ||
| void uiGetNeighborList(char* buf, int bufSize) override { formatNeighborsReply(buf); | void uiGetNeighborList(char* buf, int bufSize) override { formatNeighborsReply(buf); | ||
| Zeile 173: | Zeile 209: | ||
| </ | </ | ||
| - | 3. **'' | + | **3. '' |
| < | < | ||
| - | SCREEN_HOME | + | SCREEN_HOME |
| - | SCREEN_NEIGHBOURS | + | SCREEN_NEIGHBOURS |
| - | SCREEN_POLL_SENT | + | SCREEN_POLL_SENT |
| </ | </ | ||
| - | 4. **'' | + | **4. '' |
| - | <code>cpp | + | <code cpp> |
| if (btn == -1) ui_task.nextScreen(); | if (btn == -1) ui_task.nextScreen(); | ||
| if (btn == -2) ui_task.prevScreen(); | if (btn == -2) ui_task.prevScreen(); | ||
| Zeile 188: | Zeile 224: | ||
| **Button behaviour after patch:** | **Button behaviour after patch:** | ||
| - | | Button | + | ^ Button |
| - | |--------|-------------|-------------------|-------------------------| | + | | KEY1 | Wakeup | → Neighbours screen | → Send poll | |
| - | | KEY1 | Wakeup | \u2192 | + | | KEY2 | Wakeup | stays Home | → Home screen | |
| - | | KEY2 | Wakeup | stays Home | \u2192 | + | |
| - | After sending a poll, the screen shows "Poll sent" for 2 seconds, | + | After sending a poll, the screen shows "Poll sent" for 2 seconds, then automatically returns to the refreshed neighbour list. |
| - | then automatically returns to the (refreshed) neighbour list. | + | |
| - | ---- | + | ==== Fix 8 — Buttons Not Recognised: Wire Conflict Between M5GFX and Expander Driver ==== |
| - | ==== Fix 8 \u2014 Buttons Not Recognised: Wire Conflict Between M5GFX and Expander Driver ==== | + | **Date:** April 2026\\ |
| - | + | ||
| - | **Date:** April 2026 | + | |
| **Affected files:** '' | **Affected files:** '' | ||
| - | **Symptom: | + | **Symptom: |
| - | and boot lock. Serial log shows: | + | |
| < | < | ||
| [E][Wire.cpp: | [E][Wire.cpp: | ||
| Zeile 210: | Zeile 241: | ||
| </ | </ | ||
| - | **Root cause: | + | **Root cause:** M5GFX initialises the I²C bus internally via '' |
| - | M5GFX initialises the I\u00b2C | + | |
| - | The custom '' | + | |
| - | Both access the **same bus** (SDA=GPIO10, | + | |
| - | causing bus collisions and unstable expander reads. Documented in the Arduino Forum | + | |
| - | (November 2025): | + | |
| - | **Fix: | + | **Fix:** '' |
| - | '' | + | |
| - | '' | + | |
| - | no more Wire conflict. | + | |
| - | <code>cpp | + | <code cpp> |
| - | // NessoDisplayDriver.cpp | + | // NessoDisplayDriver.cpp |
| M5.begin(cfg); | M5.begin(cfg); | ||
| _gfx = & | _gfx = & | ||
| Zeile 233: | Zeile 256: | ||
| </ | </ | ||
| - | <code>ini | + | <code ini> |
| - | ; platformio.ini | + | ; platformio.ini |
| lib_deps = | lib_deps = | ||
| m5stack/ | m5stack/ | ||
| Zeile 240: | Zeile 263: | ||
| </ | </ | ||
| - | Removed: '' | + | Removed: '' |
| - | is no longer needed; M5Unified handles edge detection internally. | + | |
| - | + | ||
| - | ---- | + | |
| - | + | ||
| - | ==== Fix 2 \u2014 Display in Portrait Mode (135\u00d7240 Instead of 240\u00d7135) ==== | + | |
| - | + | ||
| - | **Date:** April 2026 | + | |
| - | **Affected file:** '' | + | |
| - | + | ||
| - | **Symptom: | + | |
| - | UITask text is clipped with a negative x-offset and is not readable. | + | |
| - | + | ||
| - | **Root cause:** | + | |
| - | '' | + | |
| - | M5GFX swaps dimensions only after '' | + | |
| - | always returned 135\u00d7240. The problem also occurred when '' | + | |
| - | before '' | + | |
| - | '' | + | |
| - | + | ||
| - | **Fix in '' | + | |
| - | < | + | |
| - | _gfx-> | + | |
| - | Serial.printf(" | + | |
| - | _gfx-> | + | |
| - | </ | + | |
| - | + | ||
| - | ---- | + | |
| - | + | ||
| - | ==== Fix 3 \u2014 '' | + | |
| - | + | ||
| - | **Date:** April 2026 | + | |
| - | **Affected file:** '' | + | |
| - | + | ||
| - | **Symptom: | + | |
| - | + | ||
| - | **Root cause:** | + | |
| - | '' | + | |
| - | ''# | + | |
| - | '' | + | |
| - | '' | + | |
| - | boots again, BUSY HIGH again \u2014 '' | + | |
| - | \u2014 '' | + | |
| - | + | ||
| - | **Fix in '' | + | |
| - | < | + | |
| - | static bool s_boardBeginCalled = false; | + | |
| - | if (s_boardBeginCalled) { | + | |
| - | Serial.println(" | + | |
| - | return; | + | |
| - | } | + | |
| - | s_boardBeginCalled = true; | + | |
| - | </ | + | |
| - | + | ||
| - | **Complete solution:** Remove '' | + | |
| - | '' | + | |
| - | + | ||
| - | ---- | + | |
| - | + | ||
| - | ==== Fix 4 \u2014 APB Callback Duplicate and Wire.setPins Warning ==== | + | |
| - | + | ||
| - | **Date:** April 2026 | + | |
| - | **Affected files:** '' | + | |
| - | + | ||
| - | **Symptom: | + | |
| - | < | + | |
| - | [E][Wire.cpp: | + | |
| - | [E][esp32-hal-cpu.c: | + | |
| - | [E][esp32-hal-cpu.c: | + | |
| - | </ | + | |
| - | + | ||
| - | **Root cause:** | + | |
| - | '' | + | |
| - | on first '' | + | |
| - | '' | + | |
| - | runs afterwards, the ESP-IDF SPI driver tries to register the same APB | + | |
| - | callback again \u2192 '' | + | |
| - | + | ||
| - | **Fix:** The board guard (Fix 3) prevents the second '' | + | |
| - | The three '' | + | |
| - | '' | + | |
| - | + | ||
| - | ---- | + | |
| - | + | ||
| - | ==== Fix 5 \u2014 BUSY Pulse Timing After loraReset() ==== | + | |
| - | + | ||
| - | **Date:** April 2026 | + | |
| - | **Affected file:** '' | + | |
| - | + | ||
| - | **Symptom: | + | |
| - | even though '' | + | |
| - | + | ||
| - | **Root cause:** | + | |
| - | '' | + | |
| - | a BUSY-HIGH pulse of less than 1 ms after reset \u2014 already LOW by the time | + | |
| - | '' | + | |
| - | + | ||
| - | **Fix:** '' | + | |
| - | < | + | |
| - | [loraReset] BUSY 2 ms after NRST HIGH: LOW (pulse complete \u2014 normal on Nesso N1) | + | |
| - | </ | + | |
| - | + | ||
| - | ---- | + | |
| - | + | ||
| - | ===== Directory Structure ===== | + | |
| - | + | ||
| - | < | + | |
| - | variants/ | + | |
| - | \u251c\u2500\u2500 NessoN1Board.h | + | |
| - | \u251c\u2500\u2500 NessoN1Board.cpp | + | |
| - | \u251c\u2500\u2500 NessoDisplayDriver.h | + | |
| - | \u251c\u2500\u2500 NessoDisplayDriver.cpp | + | |
| - | \u251c\u2500\u2500 target.h | + | |
| - | \u251c\u2500\u2500 target.cpp | + | |
| - | \u251c\u2500\u2500 platformio.ini | + | |
| - | \u251c\u2500\u2500 credentials.ini.example | + | |
| - | \u2514\u2500\u2500 main_cpp_setup_hinweis.txt \u2014 correct main.cpp structure (Fix 3/4) | + | |
| - | </ | + | |
| - | + | ||
| - | ---- | + | |
| ===== Quick Start ===== | ===== Quick Start ===== | ||
| Zeile 365: | Zeile 269: | ||
| ==== 1. Prerequisites ==== | ==== 1. Prerequisites ==== | ||
| - | * [PlatformIO](https:// | + | * [[https:// |
| * Arduino Nesso N1 connected via USB-C | * Arduino Nesso N1 connected via USB-C | ||
| ==== 2. Set up credentials ==== | ==== 2. Set up credentials ==== | ||
| - | <code>bash | + | <code bash> |
| cd <project root> | cd <project root> | ||
| cp variants/ | cp variants/ | ||
| Zeile 376: | Zeile 280: | ||
| Edit '' | Edit '' | ||
| - | <code>ini | + | |
| + | <code ini> | ||
| [credentials] | [credentials] | ||
| build_flags_repeater = | build_flags_repeater = | ||
| -D ADMIN_PASSWORD='" | -D ADMIN_PASSWORD='" | ||
| + | |||
| build_flags_wifi = | build_flags_wifi = | ||
| -D WIFI_SSID='" | -D WIFI_SSID='" | ||
| -D WIFI_PWD='" | -D WIFI_PWD='" | ||
| </ | </ | ||
| + | |||
| + | > '' | ||
| ==== 3. Build and flash ==== | ==== 3. Build and flash ==== | ||
| - | <code>bash | + | **Repeater with display** (recommended starting point): |
| - | pio run -e NessoN1_repeater_display --target upload | + | <code bash> |
| + | pio run -e NessoN1_repeater_display --target upload | ||
| + | pio device monitor -b 115200 | ||
| + | </ | ||
| + | |||
| + | **Repeater without display: | ||
| + | <code bash> | ||
| + | pio run -e NessoN1_repeater --target upload | ||
| + | </ | ||
| + | |||
| + | **Companion Radio — BLE:** | ||
| + | <code bash> | ||
| + | pio run -e NessoN1_companion_ble --target upload | ||
| + | </ | ||
| + | |||
| + | **Companion Radio — WiFi/ | ||
| + | <code bash> | ||
| + | pio run -e NessoN1_companion_wifi --target upload | ||
| </ | </ | ||
| Zeile 395: | Zeile 320: | ||
| < | < | ||
| [loraReset] BUSY 2 ms after NRST HIGH: LOW (normal on Nesso N1) | [loraReset] BUSY 2 ms after NRST HIGH: LOW (normal on Nesso N1) | ||
| - | [loraReset] BUSY=LOW after 0 ms \u2014 | + | [loraReset] BUSY=LOW after 0 ms — SX1262 ready |
| [display] M5GFX ready: 240 x 135 px (after setRotation(1)) | [display] M5GFX ready: 240 x 135 px (after setRotation(1)) | ||
| [display] ST7789 ready, backlight on | [display] ST7789 ready, backlight on | ||
| - | [board] begin() already initialised | + | [board] begin() already initialised |
| [radio] std_init OK | [radio] std_init OK | ||
| - | [init] === radio_init() complete | + | [init] === radio_init() complete |
| </ | </ | ||
| - | |||
| - | ---- | ||
| ===== Pin Reference ===== | ===== Pin Reference ===== | ||
| Zeile 409: | Zeile 332: | ||
| ==== Direct ESP32-C6 GPIOs ==== | ==== Direct ESP32-C6 GPIOs ==== | ||
| - | | Function | + | ^ Function |
| - | |---|---| | + | | LoRa MOSI | G21 | |
| - | | LoRa MOSI | G21 | LoRa MISO | G22 | LoRa SCK | G20 | | + | | LoRa MISO | G22 | |
| - | | LoRa CS (NSS) | G23 | LoRa BUSY | G19 | LoRa IRQ (DIO1) | G15 | | + | | LoRa SCK | G20 | |
| - | | LCD CS | G17 | LCD DC | G16 | I\u00b2C | + | | LoRa CS (NSS) | G23 | |
| + | | LoRa BUSY | G19 | | ||
| + | | LoRa IRQ (DIO1) | G15 | | ||
| + | | LCD CS | G17 | | ||
| + | | LCD DC | G16 | | ||
| + | | I²C SDA | G10 | | ||
| + | | I²C SCL | G8 | | ||
| + | | Touch INT | G3 | | ||
| - | ==== Via I\u00b2C | + | ==== Via I²C Expander 0 (0x43) ==== |
| - | KEY1=P0, KEY2=P1, LNA Enable=P5, Antenna Switch=P6, LoRa Reset (NRST)=P7 | + | ^ Function ^ Expander Pin ^ |
| + | | Button A (KEY1) | P0 | | ||
| + | | Button B (KEY2) | P1 | | ||
| + | | LNA Enable | ||
| + | | Antenna Switch | ||
| + | | LoRa Reset (NRST) | ||
| - | ==== Via I\u00b2C | + | ==== Via I²C Expander 1 (0x44) ==== |
| - | LCD Reset=P1, LCD Backlight=P6 | + | ^ Function ^ Expander Pin ^ |
| - | + | | LCD Reset | P1 | | |
| - | ---- | + | | LCD Backlight |
| ===== RF Switch Logic ===== | ===== RF Switch Logic ===== | ||
| - | | Mode | ANT_SW | + | ^ Mode ^ ANT_SW |
| - | |---|---|---|---| | + | |
| | TX | HIGH | LOW | TX path active, LNA protected | | | TX | HIGH | LOW | TX path active, LNA protected | | ||
| | RX | HIGH | HIGH | RX path active with LNA | | | RX | HIGH | HIGH | RX path active with LNA | | ||
| | IDLE | LOW | LOW | RF path disconnected, | | IDLE | LOW | LOW | RF path disconnected, | ||
| - | ---- | + | ===== Architecture ===== |
| + | |||
| + | < | ||
| + | target.cpp | ||
| + | └─ radio_init() | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | |||
| + | NessoDisplayDriver | ||
| + | ├─ begin() | ||
| + | └─ checkButtons() | ||
| + | |||
| + | NessoN1Board (RfSwitchCallback) | ||
| + | ├─ begin() | ||
| + | ├─ onRfTx() | ||
| + | ├─ onRfRx() | ||
| + | └─ onRfIdle() | ||
| + | </ | ||
| + | |||
| + | ===== Directory Structure ===== | ||
| + | |||
| + | < | ||
| + | variants/ | ||
| + | ├── NessoN1Board.h | ||
| + | ├── NessoN1Board.cpp | ||
| + | ├── NessoDisplayDriver.h | ||
| + | ├── NessoDisplayDriver.cpp | ||
| + | ├── target.h | ||
| + | ├── target.cpp | ||
| + | ├── platformio.ini | ||
| + | ├── credentials.ini.example | ||
| + | └── main_cpp_setup_hinweis.txt — correct main.cpp structure (Fix 3/4) | ||
| + | |||
| + | src/ | ||
| + | └── DisplayDriver.h | ||
| + | |||
| + | src/ | ||
| + | ├── RfSwitchCallback.h | ||
| + | └── CustomSX1262Wrapper.h | ||
| + | </ | ||
| ===== Open Items ===== | ===== Open Items ===== | ||
| - | | # | Topic | Status | + | ^ # ^ Topic ^ Status |
| - | |---|---|---| | + | | 1 | Remove '' |
| - | | 1 | Remove '' | + | |
| | 2 | Hook KEY1/KEY2 into UITask screen wakeup | open | | | 2 | Hook KEY1/KEY2 into UITask screen wakeup | open | | ||
| - | | 3 | Touch FT6336U (I\u00b2C | + | | 3 | Touch FT6336U (I²C 0x38) | open | |
| - | | 4 | IMU BMI270 (I\u00b2C | + | | 4 | IMU BMI270 (I²C 0x68) for auto-rotation | open | |
| - | | 5 | Battery monitor (I\u00b2C | + | | 5 | Battery monitor (I²C 0x49) | open | |
| - | + | ||
| - | ---- | + | |
| ===== License ===== | ===== License ===== | ||