pw_spi_rp2040#

pw_spi_rp2040 implements the pw_spi interface using the Raspberry Pi Pico SDK.

The implementation is based on the SPI driver in pico_sdk. SPI transfers use the blocking driver API which uses busy waiting under the hood.

Note

There is currently no support for RP2040 hardware CSn pins. ~pw::spi::DigitalOutChipSelector~ is used instead.

Usage#

#include "hardware/spi.h"
#include "pw_digital_io/polarity.h"
#include "pw_digital_io_rp2040/digital_io.h"
#include "pw_spi/chip_selector_digital_out.h"
#include "pw_spi/device.h"
#include "pw_sync/borrow.h"
#include "pw_sync/mutex.h"

constexpr pw::spi::Config kSpiConfig8Bit{
    .polarity = pw::spi::ClockPolarity::kActiveHigh,
    .phase = pw::spi::ClockPhase::kFallingEdge,
    .bits_per_word = pw::spi::BitsPerWord(8),
    .bit_order = pw::spi::BitOrder::kMsbFirst,
};

pw::digital_io::Rp2040DigitalInOut display_cs_pin({
   .pin = 12,
   .polarity = pw::digital_io::Polarity::kActiveLow,
});
DigitalOutChipSelector spi_chip_selector(display_cs_pin);

Rp2040Initiator spi_initiator(spi0);
VirtualMutex spi_initiator_mutex;
Borrowable<Initiator> borrowable_spi_initiator(spi_initiator,
                                               spi_initiator_mutex);
pw::spi::Device spi_8_bit(borrowable_spi_initiator,
                          kSpiConfig8Bit,
                          spi_chip_selector);