rfid: add boot-time MFRC522 VersionReg probe over SPI3 to definitively diagnose MISO/power vs reset-path

This commit is contained in:
2026-09-10 18:59:25 +02:00
parent a064c6b727
commit d2a10df6c6

View File

@@ -72,12 +72,47 @@ static void on_picc_state_changed(void *arg, esp_event_base_t base, int32_t even
}
}
/* Read the MFRC522 VersionReg (0x37) directly over SPI3 with a temporary
* hardware-CS device. Any plausible value (0x88/0x91/0x92) means the chip is
* alive and MISO works; 0x00/0xFF means MISO/power/wiring is dead. This is a
* pure diagnostic and does not depend on the rc522 driver's reset path. */
static void rfid_probe_version(void)
{
spi_device_handle_t probe = NULL;
spi_device_interface_config_t devcfg = {
.clock_speed_hz = RC522_SPI_CLK_HZ,
.mode = 0,
.spics_io_num = HW_RC522_CS_GPIO,
.queue_size = 1,
.command_bits = 1, /* read/write select bit */
.address_bits = 6, /* register address */
.dummy_bits = 1,
};
if (spi_bus_add_device(HW_RFID_SPI_HOST, &devcfg, &probe) != ESP_OK || probe == NULL) {
ESP_LOGW(TAG, "probe: could not add temp SPI device on SPI3");
return;
}
uint8_t version = 0;
spi_transaction_t t = {
.cmd = 1, /* read */
.addr = 0x37, /* VersionReg */
.rxlength = 8,
.rx_buffer = &version,
};
esp_err_t ret = spi_device_polling_transmit(probe, &t);
ESP_LOGI(TAG, "MFRC522 VersionReg=0x%02X (%s). 0x88/0x91/0x92=alive; 0x00/0xFF=MISO/power/wiring",
version, esp_err_to_name(ret));
spi_bus_remove_device(probe);
}
esp_err_t rfid_manager_init(void)
{
/* Dedicated SPI3_HOST (HSPI) bus for the reader - independent controller
* so the display (SPI2_HOST) and the RFID never share bus timing. The
* rc522 driver will call spi_bus_initialize() itself on this host with
* this bus config (MISO=13 is a real pin and is used for reads). */
* so the display (SPI2_HOST) and the RFID never share bus timing. We
* initialize SPI3 here (with a real MISO) and hand the already-initialized
* bus to the rc522 driver via bus_config=NULL so it only adds its device. */
static spi_bus_config_t rfid_bus_cfg = {
.sclk_io_num = HW_RFID_SCK_GPIO,
.mosi_io_num = HW_RFID_MOSI_GPIO,
@@ -88,9 +123,17 @@ esp_err_t rfid_manager_init(void)
ESP_LOGI(TAG, "initializing MFRC522 on SPI3_HOST (SCK=%d MOSI=%d MISO=%d CS=%d)",
HW_RFID_SCK_GPIO, HW_RFID_MOSI_GPIO, HW_RFID_MISO_GPIO, HW_RC522_CS_GPIO);
esp_err_t ret = spi_bus_initialize(HW_RFID_SPI_HOST, &rfid_bus_cfg, SPI_DMA_CH_AUTO);
if (ret != ESP_OK) {
ESP_LOGE(TAG, "spi_bus_initialize(SPI3) failed: %s", esp_err_to_name(ret));
return ret;
}
rfid_probe_version();
rc522_spi_config_t driver_config = {
.host_id = HW_RFID_SPI_HOST,
.bus_config = &rfid_bus_cfg,
.bus_config = NULL, /* SPI3 already initialized above */
.dev_config = {
.spics_io_num = HW_RC522_CS_GPIO,
.clock_speed_hz = RC522_SPI_CLK_HZ,
@@ -102,15 +145,14 @@ esp_err_t rfid_manager_init(void)
.rst_io_num = -1,
};
esp_err_t ret = rc522_spi_create(&driver_config, &s_driver);
ret = rc522_spi_create(&driver_config, &s_driver);
if (ret != ESP_OK) {
ESP_LOGE(TAG, "rc522_spi_create failed: %s", esp_err_to_name(ret));
return ret;
}
ret = rc522_driver_install(s_driver);
if (ret != ESP_OK) {
/* Includes the SPI3 bus initialization; never abort boot here. */
ESP_LOGE(TAG, "rc522 driver install (incl. SPI3 bus init) failed: %s", esp_err_to_name(ret));
ESP_LOGE(TAG, "rc522 driver install failed: %s", esp_err_to_name(ret));
return ret;
}