3 #include "pins_arduino.h"
4 #include "HardwareSPI.h"
5 #include "pico/stdlib.h"
6 #include "hardware/spi.h"
7 #include "hardware/irq.h"
34 begin(
false, -1,-1,-1,-1);
46 virtual void begin(
bool slave,
int pinRx=-1,
int pinTx=-1,
int pinCS=-1,
int pinSCK=-1) {
49 setupPins(pinRx, pinTx, pinCS, pinSCK);
68 Logger.debug(
"beginTransaction");
69 is_transaction =
true;
73 Logger.info(
"spi_init");
74 spi_init (spi, settings.getClockFreq() );
78 spi_set_slave(spi, is_slave);
85 if (last_settings != settings){
86 SPIMode mode = settings.getDataMode();
87 Logger.info(
"spi_set_baudrate", Logger.toStr(settings.getClockFreq()));
88 spi_set_baudrate(spi, settings.getClockFreq());
92 Logger.info(
"mode",
"MODE0");
93 cpol=SPI_CPOL_0;cpha=SPI_CPHA_0;
96 Logger.info(
"mode",
"MODE0");
97 cpol=SPI_CPOL_0;cpha=SPI_CPHA_1;
100 Logger.info(
"mode",
"MODE0");
101 cpol=SPI_CPOL_1;cpha=SPI_CPHA_0;
104 Logger.info(
"mode",
"MODE0");
105 cpol=SPI_CPOL_1;cpha=SPI_CPHA_1;
108 Logger.error(
"Invalid Mode");
113 BitOrder order_arduino = settings.getBitOrder();
114 order = (order_arduino == LSBFIRST ) ? SPI_LSB_FIRST : SPI_MSB_FIRST;
116 last_settings = settings;
119 if (using_interrupt_no!=0) {
120 Logger.info(
"irq_set_enabled false");
121 irq_set_enabled(using_interrupt_no,
false);
130 Logger.debug(
"endTransaction");
131 is_transaction =
false;
133 if (using_interrupt_no!=0) {
134 Logger.info(
"irq_set_enabled true");
135 irq_set_enabled(using_interrupt_no,
true);
146 Logger.debug(
"transfer");
148 uint8_t array[1]={data};
149 uint8_t arrayResult[1] = {0};
150 spi_write_read_blocking(spi, array, arrayResult, 1);
151 return arrayResult[0];
161 Logger.debug(
"transfer16");
164 spi_write16_read16_blocking(spi, &data, &result, 1);
176 Logger.debug(
"transfer (array)");
178 spi_write_read_blocking(spi, (
const uint8_t*) array, (uint8_t*) array, len);
189 Logger.info(
"usingInterrupt", Logger.toStr(interruptNumber));
190 using_interrupt_no = interruptNumber;
195 Logger.info(
"notUsingInterrupt",Logger.toStr(interruptNumber));
196 irq_set_enabled(interruptNumber,
true);
197 using_interrupt_no = 0;
202 Logger.info(
"attachInterrupt");
203 int interrupt = getStandardInterrupt();
205 irq_set_enabled(interrupt,
true);
211 Logger.info(
"detachInterrupt");
212 int interrupt = getStandardInterrupt();
214 irq_set_enabled(interrupt,
false);
225 int using_interrupt_no;
226 bool is_init =
false;
231 int getStandardInterrupt(){
235 }
else if (spi == spi0){
242 void setDataWidth(
int bits){
243 if (data_bits != bits){
250 Logger.info(
"spi_set_format");
251 spi_set_format(spi, data_bits, cpol, cpha, order);
254 void setupPins(
int pinRx=-1,
int pinTx=-1,
int pinCS=-1,
int pinSCK=-1){
256 Logger.info(
"setupPins for spi0");
269 }
else if (spi == spi1){
270 Logger.info(
"setupPins for spi1");
285 Logger.error(
"Invalid SPI device");
288 gpio_set_function(pinRx, GPIO_FUNC_SPI);
289 gpio_set_function(pinSCK, GPIO_FUNC_SPI);
290 gpio_set_function(pinTx, GPIO_FUNC_SPI);
294 gpio_set_dir(pinCS, GPIO_OUT);
298 if (Logger.isLogging()) {
299 Logger.info(
"pinRx is ", Logger.toStr(pinRx));
300 Logger.info(
"pinTx is ", Logger.toStr(pinTx));
301 Logger.info(
"pinSCK is ", Logger.toStr(pinSCK));
302 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:19
virtual void end()
Disables the SPI bus (leaving pin modes unchanged).
Definition: PicoHardwareSPI.h:56
virtual void attachInterrupt()
Enable the SPI interrupt: SPI0_IRQ = 18, SPI1_IRQ = 19.
Definition: PicoHardwareSPI.h:201
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:46
virtual void transfer(void *array, size_t len)
SPI transfer is based on a simultaneous send and receive of len bytes.
Definition: PicoHardwareSPI.h:175
virtual uint8_t transfer(uint8_t data)
SPI transfer is based on a simultaneous send and receive of 1 byte.
Definition: PicoHardwareSPI.h:145
virtual void detachInterrupt()
Turns off the given interrupt: SPI0_IRQ = 18, SPI1_IRQ = 19.
Definition: PicoHardwareSPI.h:210
virtual void usingInterrupt(int interruptNumber)
If your program will perform SPI transactions within an interrupt, call this function to register the...
Definition: PicoHardwareSPI.h:188
virtual void beginTransaction(SPISettings settings)
Initializes the SPI bus using the defined SPISettings.
Definition: PicoHardwareSPI.h:67
virtual void notUsingInterrupt(int interruptNumber)
If your program will perform SPI transactions within an interrupt, call this function to de-register ...
Definition: PicoHardwareSPI.h:194
virtual void begin()
Initializes the SPI bus by setting SCK, MOSI, and SS to outputs, pulling SCK and MOSI low,...
Definition: PicoHardwareSPI.h:33
virtual uint16_t transfer16(uint16_t data)
SPI transfer is based on a simultaneous send and receive of 2 bytes.
Definition: PicoHardwareSPI.h:160
virtual void endTransaction(void)
Stop using the SPI bus. Normally this is called after de-asserting the chip select,...
Definition: PicoHardwareSPI.h:129
Definition: HardwareSPI.h:105
Definition: HardwareSPI.h:37