Initial SPI integration. Known issue: RC522 reports invalid version id.

This commit is contained in:
2024-05-16 21:44:29 +02:00
parent 32c0865e32
commit 8ac8726904

View File

@@ -45,12 +45,35 @@
#include "driver_mfrc522_interface.h" #include "driver_mfrc522_interface.h"
#define MFRC522_CFG_RST_GPIO 9 #define MFRC522_CFG_RST_GPIO 9
#define MFRC522_CFG_SPI_INSTANCE spi1
#define MFRC522_CFG_SPI_MISO_GPIO 12 #define MFRC522_CFG_SPI_MISO_GPIO 12
#define MFRC522_CFG_SPI_MOSI_GPIO 11 #define MFRC522_CFG_SPI_MOSI_GPIO 11
#define MFRC522_CFG_SPI_CLK_GPIO 10 #define MFRC522_CFG_SPI_CLK_GPIO 10
#define MFRC522_CFG_SPI_SS_GPIO 13 #define MFRC522_CFG_SPI_SS_GPIO 13
#define MFRC522_CFG_SPI_SPEED_MHZ (1000 * 1000) #define MFRC522_CFG_SPI_SPEED_MHZ (1000 * 1000)
/**
* @brief Helper function to pull the CS line low
*
* Taken from pico-examples, bme280_spi.c
*/
static inline void cs_select() {
asm volatile("nop \n nop \n nop");
gpio_put(MFRC522_CFG_SPI_SS_GPIO, 0); // Active low
asm volatile("nop \n nop \n nop");
}
/**
* @brief Helper function to release the CS line low
*
* Taken from pico-examples, bme280_spi.c
*/
static inline void cs_deselect() {
asm volatile("nop \n nop \n nop");
gpio_put(MFRC522_CFG_SPI_SS_GPIO, 1);
asm volatile("nop \n nop \n nop");
}
/** /**
* @brief interface reset gpio init * @brief interface reset gpio init
* @return status code * @return status code
@@ -164,14 +187,19 @@ uint8_t mfrc522_interface_spi_init(void)
gpio_set_function(MFRC522_CFG_SPI_MISO_GPIO, GPIO_FUNC_SPI); gpio_set_function(MFRC522_CFG_SPI_MISO_GPIO, GPIO_FUNC_SPI);
gpio_set_function(MFRC522_CFG_SPI_MOSI_GPIO, GPIO_FUNC_SPI); gpio_set_function(MFRC522_CFG_SPI_MOSI_GPIO, GPIO_FUNC_SPI);
gpio_set_function(MFRC522_CFG_SPI_CLK_GPIO, GPIO_FUNC_SPI); gpio_set_function(MFRC522_CFG_SPI_CLK_GPIO, GPIO_FUNC_SPI);
gpio_set_function(MFRC522_CFG_SPI_SS_GPIO, GPIO_FUNC_SPI); //gpio_set_function(MFRC522_CFG_SPI_SS_GPIO, GPIO_FUNC_SPI);
//gpio_set_dir(MFRC522_CFG_SPI_CLK_GPIO, GPIO_OUT);
gpio_init(MFRC522_CFG_SPI_SS_GPIO);
gpio_set_dir(MFRC522_CFG_SPI_SS_GPIO, GPIO_OUT);
gpio_put(MFRC522_CFG_SPI_SS_GPIO, 1);
/* /*
* From the manual: * From the manual:
* "There is no guarantee that the baudrate requested can be achieved exactly; * "There is no guarantee that the baudrate requested can be achieved exactly;
* the nearest will be chosen and returned" * the nearest will be chosen and returned"
*/ */
return !spi_init(spi0, MFRC522_CFG_SPI_SPEED_MHZ); return !spi_init(MFRC522_CFG_SPI_INSTANCE, MFRC522_CFG_SPI_SPEED_MHZ);
} }
/** /**
@@ -183,6 +211,7 @@ uint8_t mfrc522_interface_spi_init(void)
*/ */
uint8_t mfrc522_interface_spi_deinit(void) uint8_t mfrc522_interface_spi_deinit(void)
{ {
mfrc522_interface_debug_print("WARN: %s not implemented!\n", __FUNCTION__);
return 0; return 0;
} }
@@ -198,7 +227,10 @@ uint8_t mfrc522_interface_spi_deinit(void)
*/ */
uint8_t mfrc522_interface_spi_read(uint8_t reg, uint8_t *buf, uint16_t len) uint8_t mfrc522_interface_spi_read(uint8_t reg, uint8_t *buf, uint16_t len)
{ {
return 0; cs_select();
uint16_t n_bytes_read = spi_read_blocking(MFRC522_CFG_SPI_INSTANCE, reg, buf, len);
cs_deselect();
return (uint8_t) (n_bytes_read == len) ? 0 : 1;
} }
/** /**
@@ -213,7 +245,10 @@ uint8_t mfrc522_interface_spi_read(uint8_t reg, uint8_t *buf, uint16_t len)
*/ */
uint8_t mfrc522_interface_spi_write(uint8_t reg, uint8_t *buf, uint16_t len) uint8_t mfrc522_interface_spi_write(uint8_t reg, uint8_t *buf, uint16_t len)
{ {
return 0; cs_select();
uint16_t n_bytes_written = spi_write_blocking(MFRC522_CFG_SPI_INSTANCE, buf, len);
cs_deselect();
return (uint8_t) (n_bytes_written == len) ? 0 : 1;
} }
/** /**