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 后,可以开始新的读取事务。