diff --git a/main/rfid_manager.c b/main/rfid_manager.c index d6e7a00..2a35f4d 100644 --- a/main/rfid_manager.c +++ b/main/rfid_manager.c @@ -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; }