|
|
@@ -7,7 +7,7 @@ Overview
|
|
|
The ESP32 has four SPI peripheral devices, called SPI0, SPI1, HSPI and VSPI. SPI0 is entirely dedicated to
|
|
|
the flash cache the ESP32 uses to map the SPI flash device it is connected to into memory. SPI1 is
|
|
|
connected to the same hardware lines as SPI0 and is used to write to the flash chip. HSPI and VSPI
|
|
|
-are free to use, and with the spi_slave driver, these can be used as a SPI slave, driven from a
|
|
|
+are free to use, and with the spi_slave driver, these can be used as a SPI slave, driven from a
|
|
|
connected SPI master.
|
|
|
|
|
|
The spi_slave driver
|
|
|
@@ -21,9 +21,9 @@ Terminology
|
|
|
|
|
|
The spi_slave driver uses the following terms:
|
|
|
|
|
|
-* Host: The SPI peripheral inside the ESP32 initiating the SPI transmissions. One of HSPI or VSPI.
|
|
|
+* Host: The SPI peripheral inside the ESP32 initiating the SPI transmissions. One of HSPI or VSPI.
|
|
|
* Bus: The SPI bus, common to all SPI devices connected to a master. In general the bus consists of the
|
|
|
- miso, mosi, sclk and optionally quadwp and quadhd signals. The SPI slaves are connected to these
|
|
|
+ miso, mosi, sclk and optionally quadwp and quadhd signals. The SPI slaves are connected to these
|
|
|
signals in parallel. Each SPI slave is also connected to one CS signal.
|
|
|
|
|
|
- miso - Also known as q, this is the output of the serial stream from the ESP32 to the SPI master
|
|
|
@@ -50,15 +50,15 @@ the master makes CS high again.
|
|
|
Using the spi_slave driver
|
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
|
|
-- Initialize a SPI peripheral as a slave by calling ``spi_slave_initialize``. Make sure to set the
|
|
|
+- Initialize a SPI peripheral as a slave by calling ``spi_slave_initialize``. Make sure to set the
|
|
|
correct IO pins in the ``bus_config`` struct. Take care to set signals that are not needed to -1.
|
|
|
A DMA channel (either 1 or 2) must be given if transactions will be larger than 32 bytes, if not
|
|
|
the dma_chan parameter may be 0.
|
|
|
|
|
|
-- To set up a transaction, fill one or more spi_transaction_t structure with any transaction
|
|
|
+- To set up a transaction, fill one or more spi_transaction_t structure with any transaction
|
|
|
parameters you need. Either queue all transactions by calling ``spi_slave_queue_trans``, later
|
|
|
quering the result using ``spi_slave_get_trans_result``, or handle all requests synchroneously
|
|
|
- by feeding them into ``spi_slave_transmit``. The latter two functions will block until the
|
|
|
+ by feeding them into ``spi_slave_transmit``. The latter two functions will block until the
|
|
|
master has initiated and finished a transaction, causing the queued data to be sent and received.
|
|
|
|
|
|
- Optional: to unload the SPI slave driver, call ``spi_slave_free``.
|
|
|
@@ -69,7 +69,7 @@ Transaction data and master/slave length mismatches
|
|
|
|
|
|
Normally, data to be transferred to or from a device will be read from or written to a chunk of memory
|
|
|
indicated by the ``rx_buffer`` and ``tx_buffer`` members of the transaction structure. The SPI driver
|
|
|
-may decide to use DMA for transfers, so these buffers should be allocated in DMA-capable memory using
|
|
|
+may decide to use DMA for transfers, so these buffers should be allocated in DMA-capable memory using
|
|
|
``pvPortMallocCaps(size, MALLOC_CAP_DMA)``.
|
|
|
|
|
|
The amount of data written to the buffers is limited by the ``length`` member of the transaction structure:
|
|
|
@@ -78,13 +78,23 @@ length of the SPI transaction; this is determined by the master as it drives the
|
|
|
transferred can be read from the ``trans_len`` member of the ``spi_slave_transaction_t`` structure after transaction.
|
|
|
In case the length of the transmission is larger than the buffer length, only the start of the transmission
|
|
|
will be sent and received, and the ``trans_len`` is set to ``length`` instead of the actual length. It's recommended to
|
|
|
-set ``length`` longer than the maximum length expected if the ``trans_len`` is required. In case the transmission
|
|
|
+set ``length`` longer than the maximum length expected if the ``trans_len`` is required. In case the transmission
|
|
|
length is shorter than the buffer length, only data up to the length of the buffer will be exchanged.
|
|
|
|
|
|
-Warning: Due to a design peculiarity in the ESP32, if the amount of bytes sent by the master or the length
|
|
|
-of the transmission queues in the slave driver, in bytes, is not both larger than eight and dividable by
|
|
|
+Warning: Due to a design peculiarity in the ESP32, if the amount of bytes sent by the master or the length
|
|
|
+of the transmission queues in the slave driver, in bytes, is not both larger than eight and dividable by
|
|
|
four, the SPI hardware can fail to write the last one to seven bytes to the receive buffer.
|
|
|
|
|
|
+Restrictions and Known issues
|
|
|
+-------------------------------
|
|
|
+
|
|
|
+1. If the DMA is enabled, the rx buffer should be WORD aligned, i.e. Start
|
|
|
+ from the boundary of 32-bit and have length of multiples of 4 bytes. Or the
|
|
|
+ DMA may write incorrectly or out of the boundary.The driver will check for
|
|
|
+ this.
|
|
|
+
|
|
|
+ Also, master should write lengths which are a multiple of 4 bytes. Data
|
|
|
+ longer than that will be discarded.
|
|
|
|
|
|
Application Example
|
|
|
-------------------
|