Updated Drivers

This commit is contained in:
Kevin Thomas
2026-03-23 09:33:04 -04:00
parent 6ee30d0520
commit 91faba6800
31 changed files with 827 additions and 337 deletions
+32 -14
View File
@@ -50,23 +50,41 @@
#define PIN_SCK 18
#define PIN_MOSI 19
/**
* @brief Perform one SPI loopback transfer and print the result
*
* Asserts chip-select, transfers the buffer, deasserts chip-select,
* prints TX and RX data over UART, then clears the receive buffer.
*
* @param tx_buf Transmit buffer
* @param rx_buf Receive buffer (cleared after printing)
* @param len Number of bytes to transfer
*/
static void _loopback_transfer(const uint8_t *tx_buf, uint8_t *rx_buf, size_t len) {
spi_driver_cs_select(PIN_CS);
spi_driver_transfer(SPI_PORT, tx_buf, rx_buf, len);
spi_driver_cs_deselect(PIN_CS);
printf("TX: %s\r\n", tx_buf);
printf("RX: %s\r\n\r\n", rx_buf);
memset(rx_buf, 0, len);
sleep_ms(1000);
}
/**
* @brief Application entry point for the SPI loopback demo
*
* Initializes SPI0 in master mode and continuously performs
* full-duplex transfers with MOSI wired to MISO for loopback.
*
* @return int Does not return
*/
int main(void) {
stdio_init_all();
spi_driver_init(SPI_PORT, PIN_MOSI, PIN_MISO, PIN_SCK, PIN_CS, SPI_BAUD_HZ);
const uint8_t tx_buf[] = "SPI loopback OK";
uint8_t rx_buf[sizeof(tx_buf)] = {0};
while (true) {
spi_driver_cs_select(PIN_CS);
spi_driver_transfer(SPI_PORT, tx_buf, rx_buf, sizeof(tx_buf));
spi_driver_cs_deselect(PIN_CS);
printf("TX: %s\r\n", tx_buf);
printf("RX: %s\r\n\r\n", rx_buf);
memset(rx_buf, 0, sizeof(rx_buf));
sleep_ms(1000);
}
while (true)
_loopback_transfer(tx_buf, rx_buf, sizeof(tx_buf));
}
+26 -6
View File
@@ -31,34 +31,54 @@
#include "pico/stdlib.h"
#include "hardware/spi.h"
static spi_inst_t *get_spi_inst(uint8_t port) {
/**
* @brief Map an SPI port number to its hardware instance pointer
*
* @param port SPI port number (0 for spi0, 1 for spi1)
* @return spi_inst_t* Pointer to the corresponding SPI hardware instance
*/
static spi_inst_t *_get_spi_inst(uint8_t port) {
return port == 0 ? spi0 : spi1;
}
void spi_driver_init(uint8_t port, uint32_t mosi, uint32_t miso,
uint32_t sck, uint32_t cs, uint32_t baud_hz) {
spi_inst_t *spi = get_spi_inst(port);
spi_init(spi, baud_hz);
/**
* @brief Assign GPIO alternate functions for the SPI data and clock pins
*
* @param mosi GPIO pin for MOSI
* @param miso GPIO pin for MISO
* @param sck GPIO pin for SCK
*/
static void _setup_spi_pins(uint32_t mosi, uint32_t miso, uint32_t sck) {
gpio_set_function(mosi, GPIO_FUNC_SPI);
gpio_set_function(miso, GPIO_FUNC_SPI);
gpio_set_function(sck, GPIO_FUNC_SPI);
}
void spi_driver_init(uint8_t port, uint32_t mosi, uint32_t miso,
uint32_t sck, uint32_t cs, uint32_t baud_hz) {
spi_inst_t *spi = _get_spi_inst(port);
spi_init(spi, baud_hz);
_setup_spi_pins(mosi, miso, sck);
gpio_init(cs);
gpio_set_dir(cs, GPIO_OUT);
gpio_put(cs, 1);
}
void spi_driver_cs_select(uint32_t cs) {
gpio_put(cs, 0);
}
void spi_driver_cs_deselect(uint32_t cs) {
gpio_put(cs, 1);
}
void spi_driver_transfer(uint8_t port, const uint8_t *tx, uint8_t *rx,
uint32_t len) {
spi_inst_t *spi = get_spi_inst(port);
spi_inst_t *spi = _get_spi_inst(port);
spi_write_read_blocking(spi, tx, rx, (size_t)len);
}