警告

This document is not updated for ESP32C5 yet, so some of the content may not be correct.

This warning was automatically inserted due to the source file being in the add_warnings_pages list.

# ESP SPI 从机 HD（半双工）模式协议

[English]

## 乐鑫芯片的 SPI 从机功能支持概况

| ESP32 | ESP32-S2 | ESP32-C3 | ESP32-S3 | ESP32-C2 | ESP32-C6 | ESP32-H2 | ESP32-P4
SPI 从机 HD | N | Y (v2) | Y (v2) | Y (v2) | Y (v2) | Y (v2) | Y (v2) | Y (v2)
Tohost intr |  | N | N | N | N | N | N | N
Frhost intr |  | 2 * | 2 * | 2 * | 2 * | 2 * | 2 * | 2 *
TX DMA |  | Y | Y | Y | Y | Y | Y | Y
RX DMA |  | Y | Y | Y | Y | Y | Y | Y
共享寄存器 |  | 72 | 64 | 64 | 64 | 64 | 64 | 64

## 概述

在半双工模式下，主机须使用从机定义的协议与从机通信。每个传输事务按顺序可能包括以下阶段：

- 命令阶段：8 位，主机到从机

  > 此阶段决定事务的其它阶段。参见 支持的命令。

- 地址阶段：8 位，主机到从机，可选

  > 对于某些命令（如 WRBUF、RDBUF），此阶段指定要写入/读取的共享寄存器地址。对于其他包括此阶段的命令，这没有实际意义，但仍必须存在于事务中。

- Dummy 阶段：8 位，浮动，可选

  > 此阶段是主机和从机在总线上的周转时间，并为从机向主机发送数据提供了充分的准备时间。

- 数据阶段：长度可变，方向由命令确定。

  > 这一阶段可以输出数据（OUT，方向为由从机向主机），或者输入数据（IN，方向为由主机向从机）。

方向 是指哪一方（主机或从机）控制 MOSI、MISO、WP 和 HD 管脚。

## 数据 IO 模式

在某些 IO 模式下，可以使用更多数据线来发送数据。因此，与 1 位模式相比，发送相同数据量所需的 SPI 时钟周期更少。例如，在 QIO 模式下，地址和数据（IN 和 OUT）应发送到全部 4 条数据线上（MOSI、MISO、WP 和 HD）。下表展示了 ESP32-S2 SPI 从机支持的模式，以及相应模式下使用的数据线数量。

Mode | 命令线数 | 地址线数 | dummy 线数 | 数据线数
1-bit | 1 | 1 | 1 | 1
DOUT | 1 | 1 | 4 | 2
DIO | 1 | 2 | 4 | 2
QOUT | 1 | 1 | 4 | 4
QIO | 1 | 4 | 4 | 4
QPI | 4 | 4 | 4 | 4

除 QPI 模式外，使用哪种模式通常取决于主机发送的命令（请参考 支持的命令）。

### QPI 模式

QPI 模式是 SPI 从机的一种特殊状态。主机可发送 ENQPI 命令，使从机进入 QPI 模式。在 QPI 模式下，命令以 4 位形式发送，因此与其他正常模式不兼容。只有在从机处于 QPI 模式时，主机才能发送 QPI 命令。主机可发送 EXQPI 命令退出 QPI 模式。

## 支持的命令

备注

命令名称是从主机视角确定的。例如，WRBUF 表示由主机向从机的缓冲区写入。

名称 | 描述 | 命令 | 地址 | 数据
WRBUF | 写入缓冲区 | 0x01 | Buf addr | 主到从，不超过缓冲区大小
RDBUF | 读取缓冲区 | 0x02 | Buf addr | 从到主，不超过缓冲区大小
WRDMA | 写入 DMA | 0x03 | 8 位 | 主到从，不超过从机提供的长度
RDDMA | 读取 DMA | 0x04 | 8 位 | 从到主，不超过从机提供的长度
SEG_DONE | 段完成 | 0x05 |  |
ENQPI | 进入 QPI 模式 | 0x06 |  |
WR_DONE | 写入段完成 | 0x07 |  |
CMD8 | 中断 | 0x08 |  |
CMD9 | 中断 | 0x09 |  |
CMDA | 中断 | 0x0A |  |
EXQPI | 退出 QPI 模式 | 0xDD |  |

此外，WRBUF、RDBUF、WRDMA 和 RDDMA 命令都有 2 位和 4 位版本。要在 2 位或 4 位模式下操作，请用下表中的对应命令掩码与原始命令按位或 (bit OR) 后发送。例如，命令 0xA1 表示 QIO 模式下的 WRBUF。

模式 | 掩码
1-bit | 0x00
DOUT | 0x10
DIO | 0x50
QOUT | 0x20
QIO | 0xA0
QPI | 0xA0

## 段事务模式

目前，SPI 从机 HD 驱动程序仅支持段事务模式。在此模式下，对于从机加载到 DMA 的事务，主机可以分段读取或写入。这样，主机就无需准备与从机数据大小相同的大缓冲区。主机在一个缓冲区的读取/写入完成后，须向从机发送相应的终止命令作为同步信号。在从机收到终止命令后，从机驱动程序会将新数据（如有）更新到 DMA 上。

WRDMA 的终止命令是 WR_DONE (0x07)，RDDMA 的终止命令是 CMD8 (0x08)。

以下是主机自从机 DMA 读取数据的流程示例：

1. 从机将 4092 字节数据加载到 RDDMA。

2. 主机进行七次 RDDMA 事务，每个事务长 512 字节，并自从机读取前 3584 字节。

3. 主机进行最后一次 RDDMA 事务，长度为 512 字节（长度可以与从机相同、更长或更短）。前 508 字节是从机发送的有效数据，最后 4 字节无意义。

4. 主机向从机发送 CMD8。

5. 从机将其他的 4092 字节数据加载到 RDDMA。

6. 主机发送 CMD8 后，可以开始新的读取事务。

提供有关此文档的反馈