1313#include < M5UnitUnifiedNFC.h>
1414#include < M5Utility.h>
1515#include < Wire.h>
16- #include < M5HAL.hpp> // For NessoN1
1716#include < vector>
1817
1918// *************************************************************
20- // Choose one define symbol to match the unit you are using
19+ // Choose ONE define symbol to match the unit/board you are using
2120// *************************************************************
22- #if !defined(USING_UNIT_NFC) && !defined(USING_CAP_CC1101) && !defined(USING_UNIT_RFID2)
23- // For UnitNFC
21+ #if !defined(USING_UNIT_NFC) && !defined(USING_CAP_CC1101) && !defined(USING_UNIT_RFID2) && \
22+ !defined (USING_M5DIAL_BUILTIN_WS1850S )
23+ // For UnitNFC (ST25R3916, I2C)
2424// #define USING_UNIT_NFC
25- // For CapNFC
25+ // For CapCC1101NFC (ST25R3916, SPI)
2626// #define USING_CAP_CC1101
27- // For UnitRFID2
27+ // For UnitRFID2 (WS1850S external, I2C GROVE)
2828// #define USING_UNIT_RFID2
29+ // For M5Dial Builtin WS1850S (internal I2C)
30+ // #define USING_M5DIAL_BUILTIN_WS1850S
2931#endif
3032
31- #if defined(USING_UNIT_RFID2)
33+ #if defined(USING_UNIT_RFID2) || defined(USING_M5DIAL_BUILTIN_WS1850S)
3234#include < M5UnitUnifiedRFID.h>
3335#endif
3436
@@ -46,9 +48,12 @@ m5::unit::UnitNFC unit{}; // I2C
4648m5::unit::CapCC1101NFC unit{}; // CapCC1101 (SPI)
4749#elif defined(USING_UNIT_RFID2)
4850#pragma message "Choose UnitRFID2"
49- m5::unit::UnitRFID2 unit{}; // UnitRFID2 (M5Unit-RFID)
51+ m5::unit::UnitRFID2 unit{}; // UnitRFID2 external (M5Unit-RFID, GROVE)
52+ #elif defined(USING_M5DIAL_BUILTIN_WS1850S)
53+ #pragma message "Choose UnitRFID2 (M5Dial Builtin)"
54+ m5::unit::UnitRFID2 unit{}; // M5Dial builtin WS1850S (internal I2C)
5055#else
51- #error Choose unit please!
56+ #error Choose ONE: USING_UNIT_NFC / USING_CAP_CC1101 / USING_UNIT_RFID2 / USING_M5DIAL_BUILTIN_WS1850S
5257#endif
5358m5::nfc::NFCLayerA nfc_a{unit};
5459} // namespace
@@ -63,25 +68,26 @@ void setup()
6368 lcd.setRotation (1 );
6469 }
6570
66- #if defined(USING_UNIT_NFC) || defined(USING_UNIT_RFID2)
67- // NessoN1: Arduino Wire (I2C_NUM_0) cannot be used for GROVE port.
68- // Wire is used by M5Unified In_I2C for internal devices.
69- // Reconfiguring Wire to GROVE pins breaks In_I2C.
70- // Solution: Use SoftwareI2C via M5HAL (bit-banging) for the GROVE port.
71- // NanoC6: Wire.begin() on GROVE pins conflicts with Ex_I2C on the same I2C_NUM_0.
72- // Solution: Use M5.Ex_I2C directly instead of Arduino Wire.
73- auto board = M5 .getBoard ();
7471 bool unit_ready{};
72+
7573#if defined(USING_M5DIAL_BUILTIN_WS1850S)
74+ // M5Dial builtin WS1850S: small loop antenna; reduce RxGain to 33dB to mitigate
75+ // reflection interference (default 48dB causes unstable WUPA on Builtin).
76+ {
77+ auto cfg = unit.config ();
78+ cfg.receiver_gain = m5::unit::mfrc522::ReceiverGain::dB33;
79+ unit.config (cfg);
80+ }
7681 // M5Dial builtin WS1850S on In_I2C (G12/G11, shared with RTC8563)
7782 M5_LOGI (" Using M5.In_I2C for builtin WS1850S" );
7883 unit_ready = Units.add (unit, M5 .In_I2C ) && Units.begin ();
79- #else
80- // NessoN1: port_b (GROVE) uses SoftwareI2C (M5HAL Bus) which causes I2C register
81- // polling latency too high for MFRC522/WS1850S RF timing requirements.
82- // Use QWIIC (port_a) with Wire instead. (Requires QWIIC-GROVE conversion cable)
83- if (board == m5::board_t ::board_M5NanoC6) {
84- // NanoC6: Use M5.Ex_I2C (m5::I2C_Class, not Arduino Wire)
84+
85+ #elif defined(USING_UNIT_NFC) || defined(USING_UNIT_RFID2)
86+ // External I2C unit (GROVE port).
87+ // NessoN1: Arduino Wire (I2C_NUM_0) cannot be used for GROVE port (used by In_I2C internals).
88+ // Use QWIIC (port_a) with Wire. (Requires QWIIC-GROVE conversion cable)
89+ // NanoC6: Wire.begin() on GROVE pins conflicts with Ex_I2C on I2C_NUM_0; use M5.Ex_I2C directly.
90+ if (M5 .getBoard () == m5::board_t ::board_M5NanoC6) {
8591 M5_LOGI (" Using M5.Ex_I2C" );
8692 unit_ready = Units.add (unit, M5 .Ex_I2C ) && Units.begin ();
8793 } else {
@@ -92,14 +98,7 @@ void setup()
9298 Wire.begin (pin_num_sda, pin_num_scl, 400 * 1000U );
9399 unit_ready = Units.add (unit, Wire) && Units.begin ();
94100 }
95- #endif // USING_M5DIAL_BUILTIN_WS1850S
96- if (!unit_ready) {
97- M5_LOGE (" Failed to begin" );
98- lcd.fillScreen (TFT_RED );
99- while (true ) {
100- m5::utility::delay (10000 );
101- }
102- }
101+
103102#elif defined(USING_CAP_CC1101)
104103 if (!SPI .bus ()) {
105104 auto spi_sclk = M5 .getPin (m5::pin_name_t ::sd_spi_sclk);
@@ -108,16 +107,17 @@ void setup()
108107 M5_LOGI (" getPin: %d,%d,%d" , spi_sclk, spi_mosi, spi_miso);
109108 SPI .begin (spi_sclk, spi_miso, spi_mosi /* SS is shared SD, CC1101, ST25R3916 */ );
110109 }
111-
112110 SPISettings settings = {10000000 , MSBFIRST , SPI_MODE1 };
113- if (!Units.add (unit, SPI , settings) || !Units.begin ()) {
111+ unit_ready = Units.add (unit, SPI , settings) && Units.begin ();
112+ #endif
113+
114+ if (!unit_ready) {
114115 M5_LOGE (" Failed to begin" );
115116 lcd.fillScreen (TFT_RED );
116117 while (true ) {
117118 m5::utility::delay (10000 );
118119 }
119120 }
120- #endif
121121 M5_LOGI (" M5UnitUnified initialized" );
122122 M5_LOGI (" %s" , Units.debugInfo ().c_str ());
123123
0 commit comments