30 #include "driver/spi_master.h"
33 #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 4, 1)
41 _sizeStartFrame(4 * T_SPIBUS::ParallelBits),
42 _sizePixelData(pixelCount * elementSize + settingsSize),
43 _sizeEndFrame((pixelCount + 15) / 16 * T_SPIBUS::ParallelBits)
45 _spiBufferSize = _sizeStartFrame + _sizePixelData + _sizeEndFrame;
48 uint32_t alignment = _spiBufferSize % 4;
51 _spiBufferSize += 4 - alignment;
54 _data =
static_cast<uint8_t*
>(malloc(_spiBufferSize));
55 _dmadata =
static_cast<uint8_t*
>(heap_caps_malloc(_spiBufferSize, MALLOC_CAP_DMA));
71 esp_err_t ret = spi_bus_free(T_SPIBUS::SpiHostDevice);
75 heap_caps_free(_dmadata);
82 spi_transaction_t* tptr = &t;
84 esp_err_t ret = spi_device_get_trans_result(_spiHandle, &tptr, 0);
88 return (ret == ESP_OK || (ret == ESP_ERR_TIMEOUT && 0 == _spiTransaction.length));
91 void Initialize(int8_t sck, int8_t dat0, int8_t dat1, int8_t dat2, int8_t dat3, int8_t dat4, int8_t dat5, int8_t dat6, int8_t dat7, int8_t ss)
93 memset(_data, 0x00, _sizeStartFrame);
94 memset(_data + _sizeStartFrame + _sizePixelData, 0x00, _spiBufferSize - (_sizeStartFrame + _sizePixelData));
99 spi_bus_config_t buscfg = { 0 };
101 buscfg.sclk_io_num = sck;
102 buscfg.data0_io_num = dat0;
103 buscfg.data1_io_num = dat1;
104 buscfg.data2_io_num = dat2;
105 buscfg.data3_io_num = dat3;
106 buscfg.data4_io_num = dat4;
107 buscfg.data5_io_num = dat5;
108 buscfg.data6_io_num = dat6;
109 buscfg.data7_io_num = dat7;
110 buscfg.max_transfer_sz = _spiBufferSize;
111 if (T_SPIBUS::ParallelBits == 8)
113 buscfg.flags = SPICOMMON_BUSFLAG_OCTAL;
117 ret = spi_bus_initialize(T_SPIBUS::SpiHostDevice, &buscfg, SPI_DMA_CH_AUTO);
118 ESP_ERROR_CHECK(ret);
120 _spiTransaction = { 0 };
124 void Initialize(int8_t sck, int8_t dat0, int8_t dat1, int8_t dat2, int8_t dat3, int8_t ss)
126 Initialize(sck, dat0, dat1, dat2, dat3, -1, -1, -1, -1, ss);
129 void Initialize(int8_t sck, int8_t miso, int8_t mosi, int8_t ss)
137 #if !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32S3)
138 if (T_SPIBUS::SpiHostDevice == VSPI_HOST)
158 memcpy(_dmadata, _data, _spiBufferSize);
160 _spiTransaction = { 0 };
161 _spiTransaction.length = (_spiBufferSize) * 8;
163 if (T_SPIBUS::ParallelBits == 1)
165 _spiTransaction.flags = 0;
167 if (T_SPIBUS::ParallelBits == 2)
169 _spiTransaction.flags = SPI_TRANS_MODE_DIO;
171 if (T_SPIBUS::ParallelBits == 4)
173 _spiTransaction.flags = SPI_TRANS_MODE_QIO;
175 if (T_SPIBUS::ParallelBits == 8)
177 _spiTransaction.flags = SPI_TRANS_MODE_OCT;
179 _spiTransaction.tx_buffer = _dmadata;
181 esp_err_t ret = spi_device_queue_trans(_spiHandle, &_spiTransaction, 0);
182 ESP_ERROR_CHECK(ret);
193 return _data + _sizeStartFrame;
198 return _sizePixelData;
203 _speed.applySettings(settings);
214 spi_device_interface_config_t devcfg = {0};
216 devcfg.clock_speed_hz = _speed.Clock;
218 devcfg.spics_io_num = _ssPin;
219 devcfg.queue_size = 1;
220 if (T_SPIBUS::ParallelBits == 1)
224 if (T_SPIBUS::ParallelBits >= 2)
226 devcfg.flags = SPI_DEVICE_HALFDUPLEX;
230 esp_err_t ret = spi_bus_add_device(T_SPIBUS::SpiHostDevice, &devcfg, &_spiHandle);
231 ESP_ERROR_CHECK(ret);
234 void deinitSpiDevice()
237 esp_err_t ret = spi_bus_remove_device(_spiHandle);
238 ESP_ERROR_CHECK(ret);
241 const size_t _sizeStartFrame;
242 const size_t _sizePixelData;
243 const size_t _sizeEndFrame;
245 size_t _spiBufferSize;
248 spi_device_handle_t _spiHandle = NULL;
249 spi_transaction_t _spiTransaction;
270 template <spi_host_device_t bus, spi_bus_w
idth_t bits = WIDTH1>
280 #if defined(CONFIG_IDF_TARGET_ESP32)
294 #if SOC_SPI_SUPPORT_OCT
301 #if SOC_SPI_SUPPORT_OCT
307 #if (defined(CONFIG_IDF_TARGET_ESP32) || defined(CONFIG_IDF_TARGET_ESP32S3))
317 #if defined(CONFIG_IDF_TARGET_ESP32S2)
328 #if SOC_SPI_SUPPORT_OCT
329 typedef DotStarEsp32DmaSpi28BitMethod DotStarEsp32DmaSpi8BitMethod;
DotStarEsp32DmaSpiMethodBase< SpiSpeed10Mhz, Esp32Spi2Bus > DotStarEsp32DmaSpi2Method
Definition: DotStarEsp32DmaSpiMethod.h:298
DotStarEsp32DmaSpiMethodBase< SpiSpeed10Mhz, Esp32Spi24BitBus > DotStarEsp32DmaSpi24BitMethod
Definition: DotStarEsp32DmaSpiMethod.h:300
DotStarEsp32DmaSpi2Method DotStarEsp32DmaSpiMethod
Definition: DotStarEsp32DmaSpiMethod.h:325
spi_bus_width_t
Definition: DotStarEsp32DmaSpiMethod.h:263
@ WIDTH1
Definition: DotStarEsp32DmaSpiMethod.h:264
@ WIDTH8
Definition: DotStarEsp32DmaSpiMethod.h:267
@ WIDTH4
Definition: DotStarEsp32DmaSpiMethod.h:266
@ WIDTH2
Definition: DotStarEsp32DmaSpiMethod.h:265
DotStarEsp32DmaSpi24BitMethod DotStarEsp32DmaSpi4BitMethod
Definition: DotStarEsp32DmaSpiMethod.h:327
DotStarEsp32DmaSpi22BitMethod DotStarEsp32DmaSpi2BitMethod
Definition: DotStarEsp32DmaSpiMethod.h:326
Esp32SpiBus< SPI2_HOST, WIDTH4 > Esp32Spi24BitBus
Definition: DotStarEsp32DmaSpiMethod.h:293
Esp32SpiBus< SPI2_HOST, WIDTH1 > Esp32Spi2Bus
Definition: DotStarEsp32DmaSpiMethod.h:291
DotStarEsp32DmaSpiMethodBase< SpiSpeed10Mhz, Esp32Spi22BitBus > DotStarEsp32DmaSpi22BitMethod
Definition: DotStarEsp32DmaSpiMethod.h:299
Esp32SpiBus< SPI2_HOST, WIDTH2 > Esp32Spi22BitBus
Definition: DotStarEsp32DmaSpiMethod.h:292
Definition: DotStarEsp32DmaSpiMethod.h:36
bool IsReadyToUpdate() const
Definition: DotStarEsp32DmaSpiMethod.h:79
void Update(bool)
Definition: DotStarEsp32DmaSpiMethod.h:151
void Initialize(int8_t sck, int8_t dat0, int8_t dat1, int8_t dat2, int8_t dat3, int8_t ss)
Definition: DotStarEsp32DmaSpiMethod.h:124
bool AlwaysUpdate()
Definition: DotStarEsp32DmaSpiMethod.h:185
DotStarEsp32DmaSpiMethodBase(uint16_t pixelCount, size_t elementSize, size_t settingsSize)
Definition: DotStarEsp32DmaSpiMethod.h:40
uint8_t * getData() const
Definition: DotStarEsp32DmaSpiMethod.h:191
void applySettings([[maybe_unused]] const SettingsObject &settings)
Definition: DotStarEsp32DmaSpiMethod.h:201
void Initialize(int8_t sck, int8_t dat0, int8_t dat1, int8_t dat2, int8_t dat3, int8_t dat4, int8_t dat5, int8_t dat6, int8_t dat7, int8_t ss)
Definition: DotStarEsp32DmaSpiMethod.h:91
void Initialize()
Definition: DotStarEsp32DmaSpiMethod.h:135
void Initialize(int8_t sck, int8_t miso, int8_t mosi, int8_t ss)
Definition: DotStarEsp32DmaSpiMethod.h:129
size_t getDataSize() const
Definition: DotStarEsp32DmaSpiMethod.h:196
DotStarEsp32DmaSpiMethodBase(uint8_t, uint8_t, uint16_t pixelCount, size_t elementSize, size_t settingsSize)
Definition: DotStarEsp32DmaSpiMethod.h:61
~DotStarEsp32DmaSpiMethodBase()
Definition: DotStarEsp32DmaSpiMethod.h:66
T_SPISPEED::SettingsObject SettingsObject
Definition: DotStarEsp32DmaSpiMethod.h:38
Definition: DotStarEsp32DmaSpiMethod.h:272
static const int ParallelBits
Definition: DotStarEsp32DmaSpiMethod.h:274
static const spi_host_device_t SpiHostDevice
Definition: DotStarEsp32DmaSpiMethod.h:273