3 #include "HardwareSPI.h"
4 #include "pico/stdlib.h"
5 #include "hardware/spi.h"
6 #include "hardware/irq.h"
33 begin(
false, -1,-1,-1,-1);
45 virtual void begin(
bool slave,
int pinRx=-1,
int pinTx=-1,
int pinCS=-1,
int pinSCK=-1) {
48 setupPins(pinRx, pinTx, pinCS, pinSCK);
67 Logger.debug(
"beginTransaction");
68 is_transaction =
true;
72 Logger.info(
"spi_init");
73 spi_init (spi, settings.getClockFreq() );
77 spi_set_slave(spi, is_slave);
84 if (last_settings != settings){
85 SPIMode mode = settings.getDataMode();
86 Logger.info(
"spi_set_baudrate", Logger.toStr(settings.getClockFreq()));
87 spi_set_baudrate(spi, settings.getClockFreq());
91 Logger.info(
"mode",
"MODE0");
92 cpol=SPI_CPOL_0;cpha=SPI_CPHA_0;
95 Logger.info(
"mode",
"MODE0");
96 cpol=SPI_CPOL_0;cpha=SPI_CPHA_1;
99 Logger.info(
"mode",
"MODE0");
100 cpol=SPI_CPOL_1;cpha=SPI_CPHA_0;
103 Logger.info(
"mode",
"MODE0");
104 cpol=SPI_CPOL_1;cpha=SPI_CPHA_1;
107 Logger.error(
"Invalid Mode");
112 BitOrder order_arduino = settings.getBitOrder();
113 order = (order_arduino == LSBFIRST ) ? SPI_LSB_FIRST : SPI_MSB_FIRST;
115 last_settings = settings;
118 if (using_interrupt_no!=0) {
119 Logger.info(
"irq_set_enabled false");
120 irq_set_enabled(using_interrupt_no,
false);
129 Logger.debug(
"endTransaction");
130 is_transaction =
false;
132 if (using_interrupt_no!=0) {
133 Logger.info(
"irq_set_enabled true");
134 irq_set_enabled(using_interrupt_no,
true);
145 Logger.debug(
"transfer");
147 uint8_t array[1]={data};
148 uint8_t arrayResult[1] = {0};
149 spi_write_read_blocking(spi, array, arrayResult, 1);
150 return arrayResult[0];
160 Logger.debug(
"transfer16");
163 spi_write16_read16_blocking(spi, &data, &result, 1);
175 Logger.debug(
"transfer (array)");
177 spi_write_read_blocking(spi, (
const uint8_t*) array, (uint8_t*) array, len);
188 Logger.info(
"usingInterrupt", Logger.toStr(interruptNumber));
189 using_interrupt_no = interruptNumber;
194 Logger.info(
"notUsingInterrupt",Logger.toStr(interruptNumber));
195 irq_set_enabled(interruptNumber,
true);
196 using_interrupt_no = 0;
201 Logger.info(
"attachInterrupt");
202 int interrupt = getStandardInterrupt();
204 irq_set_enabled(interrupt,
true);
210 Logger.info(
"detachInterrupt");
211 int interrupt = getStandardInterrupt();
213 irq_set_enabled(interrupt,
false);
224 int using_interrupt_no;
225 bool is_init =
false;
230 int getStandardInterrupt(){
234 }
else if (spi == spi0){
241 void setDataWidth(
int bits){
242 if (data_bits != bits){
249 Logger.info(
"spi_set_format");
250 spi_set_format(spi, data_bits, cpol, cpha, order);
253 void setupPins(
int pinRx=-1,
int pinTx=-1,
int pinCS=-1,
int pinSCK=-1){
255 Logger.info(
"setupPins for spi0");
268 }
else if (spi == spi1){
269 Logger.info(
"setupPins for spi1");
284 Logger.error(
"Invalid SPI device");
287 gpio_set_function(pinRx, GPIO_FUNC_SPI);
288 gpio_set_function(pinSCK, GPIO_FUNC_SPI);
289 gpio_set_function(pinTx, GPIO_FUNC_SPI);
293 gpio_set_dir(pinCS, GPIO_OUT);
297 if (Logger.isLogging()) {
298 Logger.info(
"pinRx is ", Logger.toStr(pinRx));
299 Logger.info(
"pinTx is ", Logger.toStr(pinTx));
300 Logger.info(
"pinSCK is ", Logger.toStr(pinSCK));
301 Logger.info(
"pinCS is ", Logger.toStr(pinCS));
Arduino HardwareSPI interface using the Pico API. We use the following default pins spi0: pinRx = 16;...
Definition: PicoHardwareSPI.h:18
virtual void end()
Disables the SPI bus (leaving pin modes unchanged).
Definition: PicoHardwareSPI.h:55
virtual void attachInterrupt()
Enable the SPI interrupt: SPI0_IRQ = 18, SPI1_IRQ = 19.
Definition: PicoHardwareSPI.h:200
virtual void begin(bool slave, int pinRx=-1, int pinTx=-1, int pinCS=-1, int pinSCK=-1)
Initializes the SPI bus by setting SCK, MOSI, and SS to outputs, pulling SCK and MOSI low,...
Definition: PicoHardwareSPI.h:45
virtual void transfer(void *array, size_t len)
SPI transfer is based on a simultaneous send and receive of len bytes.
Definition: PicoHardwareSPI.h:174
virtual uint8_t transfer(uint8_t data)
SPI transfer is based on a simultaneous send and receive of 1 byte.
Definition: PicoHardwareSPI.h:144
virtual void detachInterrupt()
Turns off the given interrupt: SPI0_IRQ = 18, SPI1_IRQ = 19.
Definition: PicoHardwareSPI.h:209
virtual void usingInterrupt(int interruptNumber)
If your program will perform SPI transactions within an interrupt, call this function to register the...
Definition: PicoHardwareSPI.h:187
virtual void beginTransaction(SPISettings settings)
Initializes the SPI bus using the defined SPISettings.
Definition: PicoHardwareSPI.h:66
virtual void notUsingInterrupt(int interruptNumber)
If your program will perform SPI transactions within an interrupt, call this function to de-register ...
Definition: PicoHardwareSPI.h:193
virtual void begin()
Initializes the SPI bus by setting SCK, MOSI, and SS to outputs, pulling SCK and MOSI low,...
Definition: PicoHardwareSPI.h:32
virtual uint16_t transfer16(uint16_t data)
SPI transfer is based on a simultaneous send and receive of 2 bytes.
Definition: PicoHardwareSPI.h:159
virtual void endTransaction(void)
Stop using the SPI bus. Normally this is called after de-asserting the chip select,...
Definition: PicoHardwareSPI.h:128
Definition: HardwareSPI.h:105
Definition: HardwareSPI.h:37