Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

SPI Slave HD (Half Duplex) Protocol

ESP32 does not support this feature.

SPI Slave Capabilities of Espressif Chips

ESP Target ChipTohost intrFrhost intrTX DMARX DMAShared registers
ESP32-S2N2YY72
ESP32-C3N2YY64
ESP32-S3N2YY64
ESP32-C2N2YY64
ESP32-C6N2YY64
ESP32-H2N2YY64
ESP32-P4N2YY64
ESP32-C5N2YY64
ESP32-C61N2YY64
ESP32-H21N2YY64

Introduction

In the half duplex mode, the master has to use the protocol defined by the slave to communicate with the slave. Each transaction may consist of the following phases (listed by the order they should exist):

  • Command: 8-bit, master to slave

    This phase determines the rest phases of the transactions. See the supported commands.

  • Address: 8-bit, master to slave, optional

    For some commands (WRBUF, RDBUF), this phase specifies the address of the shared register to write to/read from.

    For other commands with this phase, they are meaningless but still have to exist in the transaction.

  • Dummy: 8-bit floating, optional

    This phase is the turnaround time between the master and the slave on the bus, and also provides enough time for the slave to prepare the data to send to the master.

  • Data: variable length, the direction is also determined by the command.

    This may be a data OUT phase, in which the direction is slave to master, or a data IN phase, in which the direction is master to slave.

The direction means which side (master or slave) controls the MOSI, MISO, WP, and HD pins.

Data IO Modes

In some IO modes, more data wires can be used to send the data. As a result, the SPI clock cycles required for the same amount of data will be less than in the 1-bit mode. For example, in QIO mode, address and data (IN and OUT) should be sent on all 4 data wires (MOSI, MISO, WP, and HD). Here are the modes supported by the ESP32-S2 SPI slave and the wire number (WN) used in corresponding modes.

ModeCommand WNAddress WNDummy cyclesData WN
1-bit1111
DOUT1142
DIO1242
QOUT1144
QIO1444
QPI4444

Normally, which mode is used is determined by the command sent by the master (See the Supported Commands), except the QPI mode.

QPI Mode

The QPI mode is a special state of the SPI Slave. The master can send the ENQPI command to put the slave into the QPI mode state. In the QPI mode, the command is also sent in 4-bit, thus it is not compatible with the normal modes. The master should only send QPI commands when the slave is in QPI mode. To exit from the QPI mode, master can send the EXQPI command.

Supported Commands

The command name is in a master-oriented direction. For example, WRBUF means master writes the buffer of slave.
NameDescriptionCommandAddressData
WRBUFWrite buffer0x01Buf addrmaster to slave, no longer than buffer size
RDBUFRead buffer0x02Buf addrslave to master, no longer than buffer size
WRDMAWrite DMA0x038 bitsmaster to slave, no longer than length provided by slave
RDDMARead DMA0x048 bitsslave to master, no longer than length provided by slave
SEG_DONESegments done0x05
ENQPIEnter QPI mode0x06
WR_DONEWrite segments done0x07
CMD8Interrupt0x08
CMD9Interrupt0x09
CMDAInterrupt0x0A
EXQPIExit QPI mode0xDD

Moreover, WRBUF, RDBUF, WRDMA, and RDDMA commands have their 2-bit and 4-bit version. To do transactions in 2-bit or 4-bit mode, send the original command ORed by the corresponding command mask below. For example, command 0xA1 means WRBUF in QIO mode.

ModeMask
1-bit0x00
DOUT0x10
DIO0x50
QOUT0x20
QIO0xA0
QPI0xA0

Segment Transaction Mode

Segment transaction mode is the only mode supported by the SPI Slave HD driver for now. In this mode, for a transaction the slave loads onto the DMA, the master is allowed to read or write in segments. In this way, the master does not have to prepare a large buffer as the size of data provided by the slave. After the master finishes reading/writing a buffer, it has to send the corresponding termination command to the slave as a synchronization signal. The slave driver will update new data (if exist) onto the DMA upon seeing the termination command.

The termination command is WR_DONE (0x07) for WRDMA and CMD8 (0x08) for RDDMA.

Here is an example for the flow the master read data from the slave DMA:

  1. The slave loads 4092 bytes of data onto the RDDMA.
  2. The master do seven RDDMA transactions, each of them is 512 bytes long, and reads the first 3584 bytes from the slave.
  3. The master do the last RDDMA transaction of 512 bytes (equal, longer, or shorter than the total length loaded by the slave are all allowed). The first 508 bytes are valid data from the slave, while the last 4 bytes are meaningless bytes.
  4. The master sends CMD8 to the slave.
  5. The slave loads another 4092 bytes of data onto the RDDMA.
  6. The master can start new reading transactions after it sends the CMD8.