3 #include "pins_arduino.h"
4 #include "HardwareSPI.h"
5 #include "pico/stdlib.h"
6 #include "hardware/spi.h"
7 #include "hardware/irq.h"
36 begin(
false, -1,-1,-1,-1);
48 virtual void begin(
bool slave,
int pinRx=-1,
int pinTx=-1,
int pinCS=-1,
int pinSCK=-1) {
51 setupPins(pinRx, pinTx, pinCS, pinSCK);
70 Logger.
debug(
"beginTransaction");
71 is_transaction =
true;
75 Logger.
info(
"spi_init");
76 spi_init (spi, settings.getClockFreq() );
80 spi_set_slave(spi, is_slave);
87 if (last_settings != settings){
88 SPIMode mode = settings.getDataMode();
89 Logger.
printf(PicoLogger::Debug,
"spi_set_baudrate %d\n", settings.getClockFreq());
90 spi_set_baudrate(spi, settings.getClockFreq());
94 Logger.
info(
"mode",
"MODE0");
95 cpol=SPI_CPOL_0;cpha=SPI_CPHA_0;
98 Logger.
info(
"mode",
"MODE0");
99 cpol=SPI_CPOL_0;cpha=SPI_CPHA_1;
102 Logger.
info(
"mode",
"MODE0");
103 cpol=SPI_CPOL_1;cpha=SPI_CPHA_0;
106 Logger.
info(
"mode",
"MODE0");
107 cpol=SPI_CPOL_1;cpha=SPI_CPHA_1;
110 Logger.
error(
"Invalid Mode");
115 BitOrder order_arduino = settings.getBitOrder();
116 order = (order_arduino == LSBFIRST ) ? SPI_LSB_FIRST : SPI_MSB_FIRST;
118 last_settings = settings;
121 if (using_interrupt_no!=0) {
122 Logger.
info(
"irq_set_enabled false");
123 irq_set_enabled(using_interrupt_no,
false);
132 Logger.
debug(
"endTransaction");
133 is_transaction =
false;
135 if (using_interrupt_no!=0) {
136 Logger.
info(
"irq_set_enabled true");
137 irq_set_enabled(using_interrupt_no,
true);
148 Logger.
debug(
"transfer");
150 uint8_t array[1]={data};
151 uint8_t arrayResult[1] = {0};
152 spi_write_read_blocking(spi, array, arrayResult, 1);
153 return arrayResult[0];
163 Logger.
debug(
"transfer16");
166 spi_write16_read16_blocking(spi, &data, &result, 1);
178 Logger.
debug(
"transfer (array)");
180 spi_write_read_blocking(spi, (
const uint8_t*) array, (uint8_t*) array, len);
191 Logger.
printf(PicoLogger::Info,
"usingInterrupt %d\n", interruptNumber);
192 using_interrupt_no = interruptNumber;
197 Logger.
printf(PicoLogger::Info,
"notUsingInterrupt %d\n",interruptNumber);
198 irq_set_enabled(interruptNumber,
true);
199 using_interrupt_no = 0;
204 Logger.
info(
"attachInterrupt");
205 int interrupt = getStandardInterrupt();
207 irq_set_enabled(interrupt,
true);
213 Logger.
info(
"detachInterrupt");
214 int interrupt = getStandardInterrupt();
216 irq_set_enabled(interrupt,
false);
227 int using_interrupt_no;
228 bool is_init =
false;
233 int getStandardInterrupt(){
237 }
else if (spi == spi0){
244 void setDataWidth(
int bits){
245 if (data_bits != bits){
252 Logger.
info(
"spi_set_format");
253 spi_set_format(spi, data_bits, cpol, cpha, order);
256 void setupPins(
int pinRx=-1,
int pinTx=-1,
int pinCS=-1,
int pinSCK=-1){
258 Logger.
info(
"setupPins for spi0");
271 }
else if (spi == spi1){
272 Logger.
info(
"setupPins for spi1");
287 Logger.
error(
"Invalid SPI device");
290 gpio_set_function(pinRx, GPIO_FUNC_SPI);
291 gpio_set_function(pinSCK, GPIO_FUNC_SPI);
292 gpio_set_function(pinTx, GPIO_FUNC_SPI);
296 gpio_set_dir(pinCS, GPIO_OUT);
301 Logger.
printf(PicoLogger::Info,
"pinRx is %d\n", pinRx);
302 Logger.
printf(PicoLogger::Info,
"pinTx is %d\n", pinTx);
303 Logger.
printf(PicoLogger::Info,
"pinSCK is %d\n",pinSCK);
304 Logger.
printf(PicoLogger::Info,
"pinCS is %d\n", pinCS);
Definition: HardwareSPI.h:105
Definition: HardwareSPI.h:37
Arduino HardwareSPI interface using the Pico API. We use the following default pins spi0: pinRx = 16;...
Definition: PicoHardwareSPI.h:21
virtual void begin()
Initializes the SPI bus by setting SCK, MOSI, and SS to outputs, pulling SCK and MOSI low,...
Definition: PicoHardwareSPI.h:35
virtual void detachInterrupt()
Turns off the given interrupt: SPI0_IRQ = 18, SPI1_IRQ = 19.
Definition: PicoHardwareSPI.h:212
virtual void usingInterrupt(int interruptNumber)
If your program will perform SPI transactions within an interrupt, call this function to register the...
Definition: PicoHardwareSPI.h:190
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:48
virtual void transfer(void *array, size_t len)
SPI transfer is based on a simultaneous send and receive of len bytes.
Definition: PicoHardwareSPI.h:177
virtual void beginTransaction(SPISettings settings)
Initializes the SPI bus using the defined SPISettings.
Definition: PicoHardwareSPI.h:69
virtual void notUsingInterrupt(int interruptNumber)
If your program will perform SPI transactions within an interrupt, call this function to de-register ...
Definition: PicoHardwareSPI.h:196
virtual uint16_t transfer16(uint16_t data)
SPI transfer is based on a simultaneous send and receive of 2 bytes.
Definition: PicoHardwareSPI.h:162
virtual uint8_t transfer(uint8_t data)
SPI transfer is based on a simultaneous send and receive of 1 byte.
Definition: PicoHardwareSPI.h:147
virtual void end()
Disables the SPI bus (leaving pin modes unchanged).
Definition: PicoHardwareSPI.h:58
virtual void attachInterrupt()
Enable the SPI interrupt: SPI0_IRQ = 18, SPI1_IRQ = 19.
Definition: PicoHardwareSPI.h:203
virtual void endTransaction(void)
Stop using the SPI bus. Normally this is called after de-asserting the chip select,...
Definition: PicoHardwareSPI.h:131
virtual int printf(LogLevel current_level, const char *fmt,...)
printf support
Definition: PicoLogger.h:65
virtual bool isLogging(LogLevel level=Info)
checks if the logging is active
Definition: PicoLogger.h:40
virtual void error(const char *str, const char *str1=nullptr, const char *str2=nullptr)
logs an error
Definition: PicoLogger.h:45
virtual void info(const char *str, const char *str1=nullptr, const char *str2=nullptr)
logs an info message
Definition: PicoLogger.h:50
virtual void debug(const char *str, const char *str1=nullptr, const char *str2=nullptr)
writes an debug message
Definition: PicoLogger.h:60
Pico Arduino Framework.
Definition: Arduino.cpp:26