25 #include "driver/spi_master.h" 179 : bit_order_(bit_order), data_rate_(data_rate), mode_(mode), cs_pin_(cs_pin) {
180 if (this->cs_pin_ ==
nullptr)
182 this->cs_pin_->
setup();
183 this->cs_pin_->digital_write(
true);
195 virtual uint8_t transfer(uint8_t data) = 0;
201 for (
size_t i = 0; i !=
length; i++)
202 rxbuf[i] = this->transfer(txbuf[i]);
210 virtual void write(uint16_t data,
size_t num_bits) {
211 esph_log_e(
"spi_device",
"variable length write not implemented");
215 const uint8_t *data,
size_t length, uint8_t bus_width) {
216 esph_log_e(
"spi_device",
"write_cmd_addr_data not implemented");
222 buffer = (data >> 8) | (data << 8);
223 this->write_array(reinterpret_cast<const uint8_t *>(&buffer), 2);
225 this->write_array(reinterpret_cast<const uint8_t *>(&data), 2);
230 for (
size_t i = 0; i !=
length; i++) {
231 this->write16(data[i]);
237 for (
size_t i = 0; i !=
length; i++)
238 this->transfer(ptr[i]);
243 for (
size_t i = 0; i !=
length; i++)
244 ptr[i] = this->transfer(0);
248 virtual bool is_ready();
252 uint32_t data_rate_{1000000};
266 uint8_t
transfer(uint8_t data)
override {
return 0; }
269 void begin_transaction()
override;
280 :
SPIDelegate(clock, bit_order, mode, cs_pin), clk_pin_(clk_pin), sdo_pin_(sdo_pin), sdi_pin_(sdi_pin) {
287 uint8_t transfer(uint8_t data)
override;
289 void write(uint16_t data,
size_t num_bits)
override;
291 void write16(uint16_t data)
override { this->write(data, 16); };
297 uint32_t last_transition_{0};
305 this->last_transition_ += this->wait_cycle_;
307 uint16_t transfer_(uint16_t data,
size_t num_bits);
317 return new SPIDelegateBitBash(data_rate, bit_order, mode, cs_pin, this->clk_pin_, this->sdo_pin_, this->sdi_pin_);
320 virtual bool is_hw() {
return false; }
334 void unregister_device(
SPIClient *device);
341 void set_data_pins(std::vector<uint8_t> pins) { this->data_pins_ = std::move(pins); }
344 this->interface_ = interface;
345 this->using_hw_ =
true;
352 void setup()
override;
353 void dump_config()
override;
359 std::vector<uint8_t> data_pins_{};
362 bool using_hw_{
false};
363 const char *interface_name_{
nullptr};
368 const std::vector<uint8_t> &data_pins);
378 : bit_order_(bit_order), mode_(mode), data_rate_(data_rate) {}
381 esph_log_d(
"spi_device",
"mode %u, data_rate %ukHz", (
unsigned) this->mode_, (
unsigned) (this->data_rate_ / 1000));
382 this->delegate_ = this->parent_->register_device(
this, this->mode_, this->bit_order_, this->data_rate_, this->cs_);
386 this->parent_->unregister_device(
this);
395 uint32_t data_rate_{1000000};
409 template<SPIBitOrder BIT_ORDER, SPIClockPolarity CLOCK_POLARITY, SPIClockPhase CLOCK_PHASE, SPIDataRate DATA_RATE>
415 this->set_spi_parent(parent);
416 this->set_cs_pin(cs_pin);
433 uint8_t
read_byte() {
return this->delegate_->transfer(0); }
435 void read_array(uint8_t *data,
size_t length) {
return this->delegate_->read_array(data, length); }
442 void write(uint16_t data,
size_t num_bits) { this->delegate_->write(data, num_bits); };
455 size_t length, uint8_t bus_width = 1) {
456 this->delegate_->write_cmd_addr_data(cmd_bits, cmd, addr_bits, address, data, length, bus_width);
459 void write_byte(uint8_t data) { this->delegate_->write_array(&data, 1); }
468 uint8_t
transfer_byte(uint8_t data) {
return this->delegate_->transfer(data); }
482 void enable() { this->delegate_->begin_transaction(); }
484 void disable() { this->delegate_->end_transaction(); }
486 void write_array(
const uint8_t *data,
size_t length) { this->delegate_->write_array(data, length); }
void write_array16(const uint16_t *data, size_t length)
Write an array of data as 16 bit values, byte-swapping if required.
virtual void spi_teardown()
void transfer_array(uint8_t *data, size_t length)
Write the array data, replace with received data.
SPIClassRP2040 * SPIInterface
virtual void read_array(uint8_t *ptr, size_t length)
SPIClockPolarity clock_polarity_
SPIDataRate
The SPI clock signal frequency, which determines the transfer bit rate/second.
virtual void transfer(uint8_t *ptr, size_t length)
void spi_setup() override
The data is sampled on a leading clock edge. (CPHA=0)
void set_mosi(GPIOPin *sdo)
std::string dump_summary() const override
The clock signal idles on HIGH.
A pin to replace those that don't exist.
static SPIMode get_mode(SPIClockPolarity polarity, SPIClockPhase phase)
std::map< SPIClient *, SPIDelegate * > devices_
void pin_mode(gpio::Flags flags) override
SPIDelegateBitBash(uint32_t clock, SPIBitOrder bit_order, SPIMode mode, GPIOPin *cs_pin, GPIOPin *clk_pin, GPIOPin *sdo_pin, GPIOPin *sdi_pin)
The most significant bit is transmitted/received first.
virtual void write(uint16_t data, size_t num_bits)
write a variable length data item, up to 16 bits.
void set_cs_pin(GPIOPin *cs)
void end_transaction() override
uint8_t transfer_byte(uint8_t data)
The clock signal idles on LOW.
void write_array(const std::vector< uint8_t > &data)
void write_byte(uint8_t data)
void spi_teardown() override
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)
SPIClockPolarity
The SPI clock signal polarity,.
static int get_pin_no(GPIOPin *pin)
The SPIDevice is what components using the SPI will create.
bool digital_read() override
void write_array(const std::array< uint8_t, N > &data)
void read_array(uint8_t *data, size_t length)
const float BUS
For communication buses like i2c/spi.
The data is sampled on a trailing clock edge. (CPHA=1)
virtual bool is_internal()
void write(uint16_t data, size_t num_bits)
Write a single data item, up to 32 bits.
BedjetMode mode
BedJet operating mode.
virtual void transfer(const uint8_t *txbuf, uint8_t *rxbuf, size_t length)
SPIMode
Modes mapping to clock phase and polarity.
void set_mode(SPIMode mode)
uint32_t arch_get_cpu_freq_hz()
uint8_t transfer(uint8_t data) override
virtual void end_transaction()
void set_miso(GPIOPin *sdi)
Base class for SPIDevice, un-templated.
virtual void begin_transaction()
SPIClient(SPIBitOrder bit_order, SPIMode mode, uint32_t data_rate)
virtual void write16(uint16_t data)
void set_bit_order(SPIBitOrder order)
static SPIClockPolarity get_polarity(SPIMode mode)
static SPIDelegate *const NULL_DELEGATE
virtual SPIDelegate * get_delegate(uint32_t data_rate, SPIBitOrder bit_order, SPIMode mode, GPIOPin *cs_pin)
void set_data_pins(std::vector< uint8_t > pins)
SPIClockPhase clock_phase_
An implementation of SPI that relies only on software toggling of pins.
void transfer_array(std::array< uint8_t, N > &data)
SPIBitOrder
The bit-order for SPI devices. This defines how the data read from and written to the device is inter...
void set_interface(SPIInterface interface)
A dummy SPIDelegate that complains if it's used.
void write_array(const uint8_t *data, size_t length)
gpio::Flags get_flags() const override
SPIDelegate(uint32_t data_rate, SPIBitOrder bit_order, SPIMode mode, GPIOPin *cs_pin)
virtual void write_array(const uint8_t *ptr, size_t length)
Implementation of SPI Controller mode.
friend class SPIComponent
The least significant bit is transmitted/received first.
void set_spi_parent(SPIComponent *parent)
SPIClockPhase
The SPI clock signal phase.
SPIBus(GPIOPin *clk, GPIOPin *sdo, GPIOPin *sdi)
void set_interface_name(const char *name)
void write_byte16(uint16_t data)
Write 16 bit data.
void set_data_rate(uint32_t data_rate)
void digital_write(bool value) override
void set_clk(GPIOPin *clk)
static GPIOPin *const NULL_PIN
uint32_t arch_get_cpu_cycle_count()
void write16(uint16_t data) override
SPIDevice(SPIComponent *parent, GPIOPin *cs_pin)
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)
static SPIClockPhase get_phase(SPIMode mode)
virtual void write_array16(const uint16_t *data, size_t length)
float get_setup_priority() const override