rfid: add boot-time MFRC522 VersionReg probe over SPI3 to definitively diagnose MISO/power vs reset-path
This commit is contained in:
@@ -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)
|
esp_err_t rfid_manager_init(void)
|
||||||
{
|
{
|
||||||
/* Dedicated SPI3_HOST (HSPI) bus for the reader - independent controller
|
/* Dedicated SPI3_HOST (HSPI) bus for the reader - independent controller
|
||||||
* so the display (SPI2_HOST) and the RFID never share bus timing. The
|
* so the display (SPI2_HOST) and the RFID never share bus timing. We
|
||||||
* rc522 driver will call spi_bus_initialize() itself on this host with
|
* initialize SPI3 here (with a real MISO) and hand the already-initialized
|
||||||
* this bus config (MISO=13 is a real pin and is used for reads). */
|
* bus to the rc522 driver via bus_config=NULL so it only adds its device. */
|
||||||
static spi_bus_config_t rfid_bus_cfg = {
|
static spi_bus_config_t rfid_bus_cfg = {
|
||||||
.sclk_io_num = HW_RFID_SCK_GPIO,
|
.sclk_io_num = HW_RFID_SCK_GPIO,
|
||||||
.mosi_io_num = HW_RFID_MOSI_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)",
|
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);
|
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 = {
|
rc522_spi_config_t driver_config = {
|
||||||
.host_id = HW_RFID_SPI_HOST,
|
.host_id = HW_RFID_SPI_HOST,
|
||||||
.bus_config = &rfid_bus_cfg,
|
.bus_config = NULL, /* SPI3 already initialized above */
|
||||||
.dev_config = {
|
.dev_config = {
|
||||||
.spics_io_num = HW_RC522_CS_GPIO,
|
.spics_io_num = HW_RC522_CS_GPIO,
|
||||||
.clock_speed_hz = RC522_SPI_CLK_HZ,
|
.clock_speed_hz = RC522_SPI_CLK_HZ,
|
||||||
@@ -102,15 +145,14 @@ esp_err_t rfid_manager_init(void)
|
|||||||
.rst_io_num = -1,
|
.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) {
|
if (ret != ESP_OK) {
|
||||||
ESP_LOGE(TAG, "rc522_spi_create failed: %s", esp_err_to_name(ret));
|
ESP_LOGE(TAG, "rc522_spi_create failed: %s", esp_err_to_name(ret));
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
ret = rc522_driver_install(s_driver);
|
ret = rc522_driver_install(s_driver);
|
||||||
if (ret != ESP_OK) {
|
if (ret != ESP_OK) {
|
||||||
/* Includes the SPI3 bus initialization; never abort boot here. */
|
ESP_LOGE(TAG, "rc522 driver install failed: %s", esp_err_to_name(ret));
|
||||||
ESP_LOGE(TAG, "rc522 driver install (incl. SPI3 bus init) failed: %s", esp_err_to_name(ret));
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user