24#include "driver/spi_master.h"
172class SPIDelegateDummy;
205 for (
size_t i = 0; i !=
length; i++)
206 rxbuf[i] = this->
transfer(txbuf[i]);
214 virtual void write(uint16_t data,
size_t num_bits) {
215 esph_log_e(
"spi_device",
"variable length write not implemented");
219 const uint8_t *data,
size_t length, uint8_t bus_width) {
220 esph_log_e(
"spi_device",
"write_cmd_addr_data not implemented");
226 buffer = (data >> 8) | (data << 8);
227 this->
write_array(
reinterpret_cast<const uint8_t *
>(&buffer), 2);
229 this->
write_array(
reinterpret_cast<const uint8_t *
>(&data), 2);
234 for (
size_t i = 0; i !=
length; i++) {
241 for (
size_t i = 0; i !=
length; i++)
247 for (
size_t i = 0; i !=
length; i++)
270 uint8_t
transfer(uint8_t data)
override {
return 0; }
291 uint8_t
transfer(uint8_t data)
override;
293 void write(uint16_t data,
size_t num_bits)
override;
311 uint16_t
transfer_(uint16_t data,
size_t num_bits);
324 virtual bool is_hw() {
return false; }
356 void setup()
override;
378 const std::vector<uint8_t> &data_pins);
392 esph_log_d(
"spi_device",
"mode %u, data_rate %ukHz", (
unsigned) this->
mode_, (
unsigned) (this->
data_rate_ / 1000));
420template<SPIBitOrder BIT_ORDER, SPIClockPolarity CLOCK_POLARITY, SPIClockPhase CLOCK_PHASE, SPIDataRate DATA_RATE>
466 size_t length, uint8_t bus_width = 1) {
BedjetMode mode
BedJet operating mode.
virtual void digital_write(bool value)=0
virtual bool is_internal()
A pin to replace those that don't exist.
std::string dump_summary() const override
gpio::Flags get_flags() const override
static GPIOPin *const NULL_PIN
bool digital_read() override
void pin_mode(gpio::Flags flags) override
void digital_write(bool value) override
virtual SPIDelegate * get_delegate(uint32_t data_rate, SPIBitOrder bit_order, SPIMode mode, GPIOPin *cs_pin)
SPIBus(GPIOPin *clk, GPIOPin *sdo, GPIOPin *sdi)
Base class for SPIDevice, un-templated.
virtual void spi_teardown()
SPIClient(SPIBitOrder bit_order, SPIMode mode, uint32_t data_rate)
size_t get_bus_width() const
void set_interface(SPIInterface interface)
void unregister_device(SPIClient *device)
static SPIBus * get_bus(SPIInterface interface, GPIOPin *clk, GPIOPin *sdo, GPIOPin *sdi, const std::vector< uint8_t > &data_pins)
std::map< SPIClient *, SPIDelegate * > devices_
float get_setup_priority() const override
void set_clk(GPIOPin *clk)
SPIDelegate * register_device(SPIClient *device, SPIMode mode, SPIBitOrder bit_order, uint32_t data_rate, GPIOPin *cs_pin)
void set_data_pins(std::vector< uint8_t > pins)
void dump_config() override
void set_miso(GPIOPin *sdi)
const char * interface_name_
void set_interface_name(const char *name)
void set_mosi(GPIOPin *sdo)
std::vector< uint8_t > data_pins_
An implementation of SPI that relies only on software toggling of pins.
uint8_t transfer(uint8_t data) override
SPIClockPolarity clock_polarity_
SPIDelegateBitBash(uint32_t clock, SPIBitOrder bit_order, SPIMode mode, GPIOPin *cs_pin, GPIOPin *clk_pin, GPIOPin *sdo_pin, GPIOPin *sdi_pin)
void write(uint16_t data, size_t num_bits) override
uint32_t last_transition_
SPIClockPhase clock_phase_
uint16_t transfer_(uint16_t data, size_t num_bits)
void write16(uint16_t data) override
A dummy SPIDelegate that complains if it's used.
uint8_t transfer(uint8_t data) override
void end_transaction() override
SPIDelegateDummy()=default
void begin_transaction() override
virtual uint8_t transfer(uint8_t data)=0
SPIDelegate(uint32_t data_rate, SPIBitOrder bit_order, SPIMode mode, GPIOPin *cs_pin)
virtual void end_transaction()
virtual void begin_transaction()
virtual void read_array(uint8_t *ptr, size_t length)
virtual void write(uint16_t data, size_t num_bits)
write a variable length data item, up to 16 bits.
virtual void transfer(uint8_t *ptr, size_t length)
virtual void write_array(const uint8_t *ptr, size_t length)
virtual void write_cmd_addr_data(size_t cmd_bits, uint32_t cmd, size_t addr_bits, uint32_t address, const uint8_t *data, size_t length, uint8_t bus_width)
virtual void write16(uint16_t data)
virtual void transfer(const uint8_t *txbuf, uint8_t *rxbuf, size_t length)
virtual void write_array16(const uint16_t *data, size_t length)
static SPIDelegate *const NULL_DELEGATE
The SPIDevice is what components using the SPI will create.
void set_data_rate(uint32_t data_rate)
void write_byte16(uint16_t data)
Write 16 bit data.
void write_array(const std::array< uint8_t, N > &data)
void spi_setup() override
void set_cs_pin(GPIOPin *cs)
void set_mode(SPIMode mode)
void transfer_array(uint8_t *data, size_t length)
Write the array data, replace with received data.
void set_bit_order(SPIBitOrder order)
void set_spi_parent(SPIComponent *parent)
void transfer_array(std::array< uint8_t, N > &data)
void write_byte(uint8_t data)
void write(uint16_t data, size_t num_bits)
Write a single data item, up to 32 bits.
void write_array16(const uint16_t *data, size_t length)
Write an array of data as 16 bit values, byte-swapping if required.
uint8_t transfer_byte(uint8_t data)
void write_array(const uint8_t *data, size_t length)
void write_array(const std::vector< uint8_t > &data)
void write_cmd_addr_data(size_t cmd_bits, uint32_t cmd, size_t addr_bits, uint32_t address, const uint8_t *data, size_t length, uint8_t bus_width=1)
SPIDevice(SPIComponent *parent, GPIOPin *cs_pin)
void spi_teardown() override
void read_array(uint8_t *data, size_t length)
static int get_pin_no(GPIOPin *pin)
static SPIClockPhase get_phase(SPIMode mode)
static SPIClockPolarity get_polarity(SPIMode mode)
static SPIMode get_mode(SPIClockPolarity polarity, SPIClockPhase phase)
const float BUS
For communication buses like i2c/spi.
SPIMode
Modes mapping to clock phase and polarity.
SPIDataRate
The SPI clock signal frequency, which determines the transfer bit rate/second.
SPIBitOrder
The bit-order for SPI devices. This defines how the data read from and written to the device is inter...
@ BIT_ORDER_LSB_FIRST
The least significant bit is transmitted/received first.
@ BIT_ORDER_MSB_FIRST
The most significant bit is transmitted/received first.
SPIClockPolarity
The SPI clock signal polarity,.
@ CLOCK_POLARITY_HIGH
The clock signal idles on HIGH.
@ CLOCK_POLARITY_LOW
The clock signal idles on LOW.
SPIClockPhase
The SPI clock signal phase.
@ CLOCK_PHASE_LEADING
The data is sampled on a leading clock edge. (CPHA=0)
@ CLOCK_PHASE_TRAILING
The data is sampled on a trailing clock edge. (CPHA=1)
Providing packet encoding functions for exchanging data with a remote host.
uint32_t arch_get_cpu_cycle_count()
uint32_t arch_get_cpu_freq_hz()
SPIClassRP2040 * SPIInterface