9 static const char *
const TAG =
"spi";
12 #ifdef USE_SPI_ARDUINO_BACKEND 14 this->
hw_spi_->endTransaction();
16 #endif // USE_SPI_ARDUINO_BACKEND 23 ESP_LOGCONFIG(TAG,
"Setting up SPI bus...");
27 #ifdef USE_SPI_ARDUINO_BACKEND 29 const bool has_miso = this->
miso_ !=
nullptr;
30 const bool has_mosi = this->
mosi_ !=
nullptr;
31 int8_t clk_pin = -1, miso_pin = -1, mosi_pin = -1;
44 if (clk_internal->is_inverted())
46 if (has_miso && miso_internal->is_inverted())
48 if (has_mosi && mosi_internal->is_inverted())
52 clk_pin = clk_internal->get_pin();
53 miso_pin = has_miso ? miso_internal->get_pin() : -1;
54 mosi_pin = has_mosi ? mosi_internal->get_pin() : -1;
58 if (!(clk_pin == 6 && miso_pin == 7 && mosi_pin == 8) &&
59 !(clk_pin == 14 && (!has_miso || miso_pin == 12) && (!has_mosi || mosi_pin == 13)))
64 this->
hw_spi_->pins(clk_pin, miso_pin, mosi_pin, 0);
70 static uint8_t spi_bus_num = 0;
71 if (spi_bus_num >= 2) {
76 if (spi_bus_num == 0) {
79 #if defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3) 80 this->
hw_spi_ =
new SPIClass(FSPI);
82 this->
hw_spi_ =
new SPIClass(HSPI);
83 #endif // USE_ESP32_VARIANT 86 this->
hw_spi_->begin(clk_pin, miso_pin, mosi_pin);
90 #endif // USE_SPI_ARDUINO_BACKEND 92 if (this->
miso_ !=
nullptr) {
95 if (this->
mosi_ !=
nullptr) {
101 ESP_LOGCONFIG(TAG,
"SPI bus:");
102 LOG_PIN(
" CLK Pin: ", this->
clk_);
103 LOG_PIN(
" MISO Pin: ", this->
miso_);
104 LOG_PIN(
" MOSI Pin: ", this->
mosi_);
105 #ifdef USE_SPI_ARDUINO_BACKEND 106 ESP_LOGCONFIG(TAG,
" Using HW SPI: %s", YESNO(this->
hw_spi_ !=
nullptr));
107 #endif // USE_SPI_ARDUINO_BACKEND 123 #pragma GCC optimize("unroll-loops") 125 #pragma GCC optimize("O2") 128 template<SPIBitOrder BIT_ORDER, SPIClockPolarity CLOCK_POLARITY, SPIClockPhase CLOCK_PHASE,
bool READ,
bool WRITE>
132 uint8_t out_data = 0;
134 for (uint8_t i = 0; i < 8; i++) {
193 template uint8_t SPIComponent::transfer_<BIT_ORDER_LSB_FIRST, CLOCK_POLARITY_LOW, CLOCK_PHASE_LEADING, false, true>(
195 template uint8_t SPIComponent::transfer_<BIT_ORDER_LSB_FIRST, CLOCK_POLARITY_LOW, CLOCK_PHASE_LEADING, true, false>(
197 template uint8_t SPIComponent::transfer_<BIT_ORDER_LSB_FIRST, CLOCK_POLARITY_LOW, CLOCK_PHASE_LEADING, true, true>(
199 template uint8_t SPIComponent::transfer_<BIT_ORDER_LSB_FIRST, CLOCK_POLARITY_LOW, CLOCK_PHASE_TRAILING, false, true>(
201 template uint8_t SPIComponent::transfer_<BIT_ORDER_LSB_FIRST, CLOCK_POLARITY_LOW, CLOCK_PHASE_TRAILING, true, false>(
203 template uint8_t SPIComponent::transfer_<BIT_ORDER_LSB_FIRST, CLOCK_POLARITY_LOW, CLOCK_PHASE_TRAILING, true, true>(
205 template uint8_t SPIComponent::transfer_<BIT_ORDER_LSB_FIRST, CLOCK_POLARITY_HIGH, CLOCK_PHASE_LEADING, false, true>(
207 template uint8_t SPIComponent::transfer_<BIT_ORDER_LSB_FIRST, CLOCK_POLARITY_HIGH, CLOCK_PHASE_LEADING, true, false>(
209 template uint8_t SPIComponent::transfer_<BIT_ORDER_LSB_FIRST, CLOCK_POLARITY_HIGH, CLOCK_PHASE_LEADING, true, true>(
211 template uint8_t SPIComponent::transfer_<BIT_ORDER_LSB_FIRST, CLOCK_POLARITY_HIGH, CLOCK_PHASE_TRAILING, false, true>(
213 template uint8_t SPIComponent::transfer_<BIT_ORDER_LSB_FIRST, CLOCK_POLARITY_HIGH, CLOCK_PHASE_TRAILING, true, false>(
215 template uint8_t SPIComponent::transfer_<BIT_ORDER_LSB_FIRST, CLOCK_POLARITY_HIGH, CLOCK_PHASE_TRAILING, true, true>(
217 template uint8_t SPIComponent::transfer_<BIT_ORDER_MSB_FIRST, CLOCK_POLARITY_LOW, CLOCK_PHASE_LEADING, false, true>(
219 template uint8_t SPIComponent::transfer_<BIT_ORDER_MSB_FIRST, CLOCK_POLARITY_LOW, CLOCK_PHASE_LEADING, true, false>(
221 template uint8_t SPIComponent::transfer_<BIT_ORDER_MSB_FIRST, CLOCK_POLARITY_LOW, CLOCK_PHASE_LEADING, true, true>(
223 template uint8_t SPIComponent::transfer_<BIT_ORDER_MSB_FIRST, CLOCK_POLARITY_LOW, CLOCK_PHASE_TRAILING, false, true>(
225 template uint8_t SPIComponent::transfer_<BIT_ORDER_MSB_FIRST, CLOCK_POLARITY_LOW, CLOCK_PHASE_TRAILING, true, false>(
227 template uint8_t SPIComponent::transfer_<BIT_ORDER_MSB_FIRST, CLOCK_POLARITY_LOW, CLOCK_PHASE_TRAILING, true, true>(
229 template uint8_t SPIComponent::transfer_<BIT_ORDER_MSB_FIRST, CLOCK_POLARITY_HIGH, CLOCK_PHASE_LEADING, false, true>(
231 template uint8_t SPIComponent::transfer_<BIT_ORDER_MSB_FIRST, CLOCK_POLARITY_HIGH, CLOCK_PHASE_LEADING, true, false>(
233 template uint8_t SPIComponent::transfer_<BIT_ORDER_MSB_FIRST, CLOCK_POLARITY_HIGH, CLOCK_PHASE_LEADING, true, true>(
235 template uint8_t SPIComponent::transfer_<BIT_ORDER_MSB_FIRST, CLOCK_POLARITY_HIGH, CLOCK_PHASE_TRAILING, false, true>(
237 template uint8_t SPIComponent::transfer_<BIT_ORDER_MSB_FIRST, CLOCK_POLARITY_HIGH, CLOCK_PHASE_TRAILING, true, false>(
239 template uint8_t SPIComponent::transfer_<BIT_ORDER_MSB_FIRST, CLOCK_POLARITY_HIGH, CLOCK_PHASE_TRAILING, true, true>(
virtual void digital_write(bool value)=0
void cycle_clock_(bool value)
The data is sampled on a leading clock edge. (CPHA=0)
The most significant bit is transmitted/received first.
void dump_config() override
const float BUS
For communication buses like i2c/spi.
virtual bool is_internal()
Application App
Global storage of Application pointer - only one Application can exist.
virtual bool digital_read()=0
uint8_t transfer_(uint8_t data)
uint32_t arch_get_cpu_cycle_count()
float get_setup_priority() const override