From ee3b31b062d1f4cc3a847c9022fb3ecd131e8d30 Mon Sep 17 00:00:00 2001 From: Johan Kanflo Date: Sat, 29 Mar 2025 09:39:54 +0100 Subject: [PATCH 1/3] Support for software contolled nCS pins --- include/driver/rc522_spi.h | 8 ++++++++ internal/rc522_driver_internal.h | 1 + internal/rc522_types_internal.h | 9 +++++++++ src/driver/rc522_spi.c | 25 +++++++++++++++++++++++++ src/rc522_driver.c | 18 ++++++++++++++++++ 5 files changed, 61 insertions(+) diff --git a/include/driver/rc522_spi.h b/include/driver/rc522_spi.h index fcac169..dd174e9 100644 --- a/include/driver/rc522_spi.h +++ b/include/driver/rc522_spi.h @@ -23,6 +23,14 @@ typedef struct * Set to -1 if the RST pin is not connected. */ gpio_num_t rst_io_num; + /** + * GPIO number of the RC522 nCS pin. + * This is used if you have more than 3 devices on your SPI bus (typically SPI3). + * If you wish to use this parameter, you must set `dev_config.spics_io_num` + * to -1. For backwards compatability, this parameter is ignored if you have set + * `dev_config.spics_io_num` to any other value than -1. + */ + gpio_num_t ncs_io_num; } rc522_spi_config_t; esp_err_t rc522_spi_create(const rc522_spi_config_t *config, rc522_driver_handle_t *driver); diff --git a/internal/rc522_driver_internal.h b/internal/rc522_driver_internal.h index e6a8927..78ba13b 100644 --- a/internal/rc522_driver_internal.h +++ b/internal/rc522_driver_internal.h @@ -2,6 +2,7 @@ #include "rc522_types_internal.h" #include "rc522_driver.h" +#define RC522_DRIVER_NCS_PIN_SELECT (0) #define RC522_DRIVER_HARD_RST_PIN_PWR_DOWN_LEVEL (0) #define RC522_DRIVER_HARD_RST_PULSE_DURATION_MS (15) diff --git a/internal/rc522_types_internal.h b/internal/rc522_types_internal.h index 1d20136..2b57c3f 100644 --- a/internal/rc522_types_internal.h +++ b/internal/rc522_types_internal.h @@ -68,6 +68,15 @@ typedef struct } \ while (0) +#define RC522_LOG_ON_ERROR(x) \ + do { \ + esp_err_t err_rc_ = (x); \ + if (unlikely(err_rc_ != ESP_OK)) { \ + ESP_LOGE(TAG, "%s(%d): %04" RC522_X "", __FUNCTION__, __LINE__, err_rc_); \ + } \ + } \ + while (0) + #define RC522_RETURN_ON_FALSE(a, err_code) ESP_RETURN_ON_FALSE(a, err_code, TAG, "") #define RC522_CHECK_WITH_MESSAGE(a, message) ESP_RETURN_ON_FALSE(!(a), ESP_ERR_INVALID_ARG, TAG, message) #define RC522_CHECK_AND_RETURN(a, ret_val) ESP_RETURN_ON_FALSE(!(a), ret_val, TAG, #a) diff --git a/src/driver/rc522_spi.c b/src/driver/rc522_spi.c index 41cce55..27e86c7 100644 --- a/src/driver/rc522_spi.c +++ b/src/driver/rc522_spi.c @@ -6,6 +6,10 @@ RC522_LOG_DEFINE_BASE(); +static void rc522_spi_transaction_pre_cb(spi_transaction_t *trans); +static void rc522_spi_transaction_post_cb(spi_transaction_t *trans); + + static esp_err_t rc522_spi_install(const rc522_driver_handle_t driver) { RC522_CHECK(driver == NULL); @@ -44,6 +48,13 @@ static esp_err_t rc522_spi_install(const rc522_driver_handle_t driver) conf->dev_config.dummy_bits = 1; // }} + if (conf->dev_config.spics_io_num == -1) { + RC522_CHECK(conf->ncs_io_num == -1); + conf->dev_config.spics_io_num = -1; + conf->dev_config.pre_cb = &rc522_spi_transaction_pre_cb; + conf->dev_config.post_cb = &rc522_spi_transaction_post_cb; + } + RC522_RETURN_ON_ERROR( spi_bus_add_device(conf->host_id, &conf->dev_config, (spi_device_handle_t *)(&driver->device))); @@ -66,6 +77,7 @@ static esp_err_t rc522_spi_send(const rc522_driver_handle_t driver, uint8_t addr .addr = address, .length = 8 * bytes->length, .tx_buffer = bytes->ptr, + .user = (void*) driver->config, }); return ret; @@ -87,6 +99,7 @@ static esp_err_t rc522_spi_receive(const rc522_driver_handle_t driver, uint8_t a .addr = address, .rxlength = 8, .rx_buffer = (bytes->ptr + i), + .user = (void*) driver->config, })); } @@ -147,3 +160,15 @@ esp_err_t rc522_spi_create(const rc522_spi_config_t *config, rc522_driver_handle return ESP_OK; } + +static void rc522_spi_transaction_pre_cb(spi_transaction_t *trans) +{ + rc522_spi_config_t *conf = (rc522_spi_config_t*) trans->user; + RC522_LOG_ON_ERROR(gpio_set_level(conf->ncs_io_num, RC522_DRIVER_NCS_PIN_SELECT)); +} + +static void rc522_spi_transaction_post_cb(spi_transaction_t *trans) +{ + rc522_spi_config_t *conf = (rc522_spi_config_t*) trans->user; + RC522_LOG_ON_ERROR(gpio_set_level(conf->ncs_io_num, !RC522_DRIVER_NCS_PIN_SELECT)); +} diff --git a/src/rc522_driver.c b/src/rc522_driver.c index 533a376..0c8b45b 100644 --- a/src/rc522_driver.c +++ b/src/rc522_driver.c @@ -5,6 +5,24 @@ RC522_LOG_DEFINE_BASE(); +esp_err_t rc522_driver_init_ncs_pin(gpio_num_t rst_io_num) +{ + RC522_CHECK(rst_io_num < 0); + + gpio_config_t io_conf = { + .intr_type = GPIO_INTR_DISABLE, + .mode = GPIO_MODE_OUTPUT, + .pin_bit_mask = (1ULL << rst_io_num), + .pull_down_en = GPIO_PULLDOWN_DISABLE, + .pull_up_en = GPIO_PULLUP_DISABLE, + }; + + RC522_RETURN_ON_ERROR(gpio_config(&io_conf)); + RC522_RETURN_ON_ERROR(gpio_set_level(rst_io_num, !RC522_DRIVER_NCS_PIN_SELECT)); + + return ESP_OK; +} + esp_err_t rc522_driver_init_rst_pin(gpio_num_t rst_io_num) { RC522_CHECK(rst_io_num < 0); From c06442a516b8fce373b09615ba0ddb3ab071580b Mon Sep 17 00:00:00 2001 From: Johan Kanflo Date: Tue, 24 Jun 2025 19:05:21 +0200 Subject: [PATCH 2/3] Fixed speling --- include/driver/rc522_spi.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/driver/rc522_spi.h b/include/driver/rc522_spi.h index dd174e9..c5baf10 100644 --- a/include/driver/rc522_spi.h +++ b/include/driver/rc522_spi.h @@ -27,7 +27,7 @@ typedef struct * GPIO number of the RC522 nCS pin. * This is used if you have more than 3 devices on your SPI bus (typically SPI3). * If you wish to use this parameter, you must set `dev_config.spics_io_num` - * to -1. For backwards compatability, this parameter is ignored if you have set + * to -1. For backwards compatibility, this parameter is ignored if you have set * `dev_config.spics_io_num` to any other value than -1. */ gpio_num_t ncs_io_num; From 09f41c3e2cdd73feda2dd65464629f7dec4c8821 Mon Sep 17 00:00:00 2001 From: Johan Kanflo Date: Tue, 24 Jun 2025 22:49:52 +0200 Subject: [PATCH 3/3] Formatted code --- internal/rc522_driver_internal.h | 2 +- src/driver/rc522_spi.c | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/internal/rc522_driver_internal.h b/internal/rc522_driver_internal.h index 78ba13b..18cafae 100644 --- a/internal/rc522_driver_internal.h +++ b/internal/rc522_driver_internal.h @@ -2,7 +2,7 @@ #include "rc522_types_internal.h" #include "rc522_driver.h" -#define RC522_DRIVER_NCS_PIN_SELECT (0) +#define RC522_DRIVER_NCS_PIN_SELECT (0) #define RC522_DRIVER_HARD_RST_PIN_PWR_DOWN_LEVEL (0) #define RC522_DRIVER_HARD_RST_PULSE_DURATION_MS (15) diff --git a/src/driver/rc522_spi.c b/src/driver/rc522_spi.c index 27e86c7..1492446 100644 --- a/src/driver/rc522_spi.c +++ b/src/driver/rc522_spi.c @@ -9,7 +9,6 @@ RC522_LOG_DEFINE_BASE(); static void rc522_spi_transaction_pre_cb(spi_transaction_t *trans); static void rc522_spi_transaction_post_cb(spi_transaction_t *trans); - static esp_err_t rc522_spi_install(const rc522_driver_handle_t driver) { RC522_CHECK(driver == NULL); @@ -77,7 +76,7 @@ static esp_err_t rc522_spi_send(const rc522_driver_handle_t driver, uint8_t addr .addr = address, .length = 8 * bytes->length, .tx_buffer = bytes->ptr, - .user = (void*) driver->config, + .user = (void *)driver->config, }); return ret; @@ -99,7 +98,7 @@ static esp_err_t rc522_spi_receive(const rc522_driver_handle_t driver, uint8_t a .addr = address, .rxlength = 8, .rx_buffer = (bytes->ptr + i), - .user = (void*) driver->config, + .user = (void *)driver->config, })); } @@ -163,12 +162,12 @@ esp_err_t rc522_spi_create(const rc522_spi_config_t *config, rc522_driver_handle static void rc522_spi_transaction_pre_cb(spi_transaction_t *trans) { - rc522_spi_config_t *conf = (rc522_spi_config_t*) trans->user; + rc522_spi_config_t *conf = (rc522_spi_config_t *)trans->user; RC522_LOG_ON_ERROR(gpio_set_level(conf->ncs_io_num, RC522_DRIVER_NCS_PIN_SELECT)); } static void rc522_spi_transaction_post_cb(spi_transaction_t *trans) { - rc522_spi_config_t *conf = (rc522_spi_config_t*) trans->user; + rc522_spi_config_t *conf = (rc522_spi_config_t *)trans->user; RC522_LOG_ON_ERROR(gpio_set_level(conf->ncs_io_num, !RC522_DRIVER_NCS_PIN_SELECT)); }