mirror of
https://github.com/mytechnotalent/Embedded-Hacking.git
synced 2026-08-16 08:00:26 +02:00
Updated Drivers
This commit is contained in:
+32
-14
@@ -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
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user