Edit online

寄存器描述

0x000 SPIE_CTL

默认值:0x00000000

控制寄存器 (Control Register)

位域

类型

默认值

描述

31:18 - - -
17 R/W 0x0

WORK_MODE

工作模式选择

0: SPI bus encrypt

SPI 总线在线加解密工作模式

1: Independent work mode

独立算法运算工作模式

16

R/W

0x0

XIP_EN

SPI XIP 的总线数据加密使能

使能后,硬件自动连接 SPI 控制器。

15:14

-

-

-

13:12

R/W

0x0

SPI_SEL

SPI 控制器选择

选择连接的总线,加密器对所选总线上的数据进行加解密。
  • 0x0:BYPASS,不连接任何总线
  • 0x1:连接 SPI0
  • 0x2:连接 SPI1

XIP_EN 时,本字段设置无效。

11:1

-

-

-

0

R/W

0x0

KEY_START

开始计算分组密钥

数据加解密开始之前或者同时,必须先计算分组密钥,否则加解密单元会一直等待密钥生成,导致传输失败。传输完成,需要清零以停止密钥计算。
  • 0:停止计算分组密钥
  • 1:开始计算分组密钥

XIP_EN 时,本字段设置无效。

0x004 SPIE_ICR

默认值:0x00000000

中断控制寄存器 (Interrupt Control Register)

位域

类型

默认值

描述

31:19 - - -
18 R/W 0x0

ALG_CALC_ERR_EN

运算出错中断使能

17 R/W 0x0

CFG_ERR_EN

配置错误中断使能

16 R/W 0x0

ALG_FINISH_EN

运算完成中断使能

15:6 - - -

5

R/W

0x0

KEY_OVF

分组密钥 FIFO 上溢中断使能

4

R/W

0x0

KEY_UDF

分组密钥 FIFO 下溢中断使能

3

R/W

0x0

READ_HALF_EMPTY

读过半空数据中断使能

2

R/W

0x0

READ_EMPTY_DATA

读空数据中断使能

1

R/W

0x0

ENC_DEC_FINISHED

加解密完成中断使能

0

R/W

0x0

KEY_GEN

第一组分组密钥生成中断使能

0x008 SPIE_ISR

默认值:0x00000000

中断状态寄存器 (Interrupt Status Register)

位域

类型

默认值

描述

31:19 - - -
18 R/W 0x0

ALG_CALC_ERR

运算出错中断

17 R/W 0x0

CFG_ERR

配置错误中断

16 R/W 0x0

ALG_FINISH

运算完成中断

15:6 - - -

5

W1C

0x0

KEY_OVF
分组密钥 FIFO Overflow 中断状态。
  • 0:分组密钥 FIFO 未发生上溢
  • 1:分组密钥 FIFO 发生上溢

4

W1C

0x0

KEY_UDF
分组密钥 FIFO Underflow 中断状态。
  • 0:分组密钥 FIFO 未发生上溢
  • 1:分组密钥 FIFO 发生上溢

3

W1C

0x0

READ_HALF_EMPTY
读过半空数据中断,即读取的密文位置的数据,过半都是 0xFF。
  • 0:中断未发生
  • 1:当前读取的密文数据,超过一半都是 0xFF

2

W1C

0x0

READ_EMPTY_DATA
读空数据中断,即读取的密文位置的数据全部为 0xFF,即 Flash 擦除后的状态。
  • 0:中断未发生
  • 1:当前读取的密文数据,全部为 0xFF

软件可以根据该中断判断当前读取的 Page,是否为擦除后的数据。

1

W1C

0x0

ENC_DEC_FINISHED
加解密完成中断。
  • 0:中断未发生
  • 1:对密文位置的数据加密或者解密完成

若当前传输的密文长度为 0 时,该中断不会产生。

0

W1C

0x0

KEY_GEN
第一组分组密钥生成的中断状态。
  • 0:中断未发生
  • 1:第一组分组密钥已经产生 SPI 控制器可以开始传输数据。

在数据传输前,应确保该中断状态位为 1。

由于 ENC 模块产生密钥的速度比 SPI 数据传输的速度快,因此可以保证传输过程中,密钥总是能跟上数据传输的速度。

0x00C SPIE_KCNT

默认值:0x00000000

密钥计数寄存器 (Key Counter Register)

位域

类型

默认值

描述

31:0

RO

0x0

KEY_CNTSPI ENC 输出对应密文区域的分组密钥个数,单位为字节。

0x010 SPIE_OCNT

默认值:0x00000000

输出计数寄存器 (Output Counter Register)

位域

类型

默认值

描述

31:0

RO

0x0

OUTPUT_CNT

SPI ENC 输出的分组密钥个数,以字节为单位计数。

SPI ENC 为每一个传输的 SPI 数据输出分组密钥,但是如果对应输出的位置是明文,SPI ENC 输出的分组密钥为 0。所以此处计数是输出的 0 的个数和密文对应的分组密钥个数之和。

0x014 SPIE_ADDR

默认值:0x00000000

数据地址寄存器 (Data Address Register)

位域

类型

默认值

描述

31:0

R/W

0x0

DATA_ADDR

本次访问的 Flash 数据地址。从 0 开始,是相对 Flash 开始位置的访问偏移值,单位为字节。

该地址信息有两个用途:
  1. 计算数据分组对应的 Counter 值
  2. 输出分组密钥数据

XIP_EN 时,本字段设置无效。

0x018 SPIE_TWEAK

默认值:0x00000000

计数调整寄存器 (Tweak Register)

位域

类型

默认值

描述

31:0

R/W

0x0

CTR_TWEAK

用于产生数据分组的 Counter 值。数据分组的 Counter 值由 eFuse 中的 SPI_ENC_NONCE、SPIE_ADDR 以及 TWEAK 值共同产生,其中 NONCE 与数据的分组地址是固定的,TWEAK 值软件可调。

通过配置 TWEAK 值,软件可以根据实际情况调整 Counter 值,以免每次产生的分组密钥相同。

0x01C SPIE_CPOS

默认值:0x00000000

密文位置寄存器 (Ciphertext Position Register)

位域

类型

默认值

描述

31:0

R/W

0x0

CIPHERTEXT_POS

本次传输的密文数据开始位置

用于指示本次传输的数据中密文数据所在的偏移位置。如果当前传输包含了发送和接收,则位置总是从发送开始计算。

值 M:表示本次传输的数据,从第 M 个字节开始是密文

XIP_EN 时,本字段设置无效。

0x020 SPIE_CLEN

默认值:0x00000000

密文长度寄存器 (Ciphertext Length Register)

位域

类型

默认值

描述

31:0

R/W

0x0

CIPHERTEXT _LEN

本次传输的密文数据长度。

值 N:表示本次传输的密文数据为 N 字节

XIP_EN 时,本字段设置无效。

0x100 ALG_CTL

默认值:0x00000000

算法控制寄存器(Algorithm Control Register)

位域

类型

默认值

描述

31:3 - - -
2 R/W 0x0

KEY_SEL

算法运算的密钥选择

0: eFuse 密钥,固定使用 eFuse SSK 的值作为运算密钥

当选择 AES-128-CTR 算法时,可以选择使用 eFuse SSK;当选择 HMAC-SHA256 算法时,选择 eFuse SSK 无效。

1: 使用 ALG_KEY_ADDR 所提供的值作为运算密钥

当选择 HMAC-SHA256 算法时,只能使用外部配置的密钥。

1 R/W 0x0

ALG_SELECT

算法类型选择。

0: AES-128-CTR

使用该算法时,需要通过 ALG_IV_ADDR 提供 128 位的 IV 值。

当 KEY_SEL=0 时,算法密钥从 eFuse SSK 读取;

当 KEY_SEL=1 时,算法密钥从 ALG_KEY_ADDR 读取;

1: HMAC-SHA256

仅支持一次对全部数据计算 HMAC-SHA256,不支持分段计算。

使用该算法时,需要通过 ALG_KEY_ADDR 提供 64 字节的密钥值

0 R/W 0x0

ALG_START

0: 算法执行单元空闲

1:算法执行单元开始工作,完成后自动清零

注意,本寄存器仅在 SPIE_CTL.WORK_MODE=1 的情况下才有效。

0x104 ALG_KEY_ADDR

默认值:0x00000000

密钥地址寄存器 (Key Address Register)

位域

类型

默认值

描述

31:0

R/W

0x0

KEY ADDRESS

要求地址 4 字节对齐。

当选择 AES-128-CTR 算法时,需要提供 128bit 的密钥;当选择 HMAC-SHA256 算法时,需要提供 512bit 的密钥。

0x108 ALG_AHM_CTL

默认值:0x00000003

AHB Master 寄存器(AHB Master Register)

位域

类型

默认值

描述

31:5

R/W

0x0

-
4 R/W 0x0 AHM_BUFFERABLE_AUTO

自动 bufferable 使能。

0: 禁用

1: 使能

使能后最后一笔数据不使用 bufferable,其它数据使用 bufferable。

3 R/W 0x0 HPROT[3] Cacheable

0: Non-cacheable

1: Cacheable

2 R/W 0x0 HPROT[2] Bufferable

0: Non-bufferable

1: Bufferable

使能后全部写数据使用 bufferable。注意,本寄存器仅在 AHM_BUFFERABLE_AUTO=0 的情况下才有效。

1 R/W 0x1 HPROT[1] Privileged

0: User access

1: Privileged access

0 R/W 0x1 HPROT[0] Data/Opcode

0: Opcode fetch

1: Data access

0x10C ALG_DI_ADDR

默认值:0x00000000

输入数据地址寄存器 (Data Input Address Register)

位域

类型

默认值

描述

31:0

R/W

0x0

输入数据地址

要求地址 4 字节对齐

0x110 ALG_DI_LEN

默认值:0x00000000

输入数据长度寄存器 (Data Input Length Register)

位域

类型

默认值

描述

31:0

R/W

0x0

输入数据长度

对于 AES-128-CTR 算法,要求长度 4 字节对齐

对于 HMAC-SHA256 算法,要求长度大于 64 字节。

0x114 ALG_DO_ADDR

默认值:0x00000000

输出数据地址寄存器 (Data Output Address Register)

位域

类型

默认值

描述

31:0

R/W

0x0

输出数据地址

要求地址 4 字节对齐

0x118 ALG_DO_LEN

默认值:0x00000000

输出数据长度寄存器 (Data Output Length Register)

位域

类型

默认值

描述

31:0

R

0x0

输出数据长度

0x120 ALG_IV_DATA0

默认值:0x00000000

输入 IV 数据寄存器 0(IV Data Input Register 0)

位域

类型

默认值

描述

31:0

R/W

0x0

IV_DATA0

IV 寄存器。

四个寄存器的值组成 128-bit IV 密钥,比特位分布为 IV_DATAn << (n * 32)。

0x124 ALG_IV_DATA1

默认值:0x00000000

输入 IV 数据寄存器 1(IV Data Input Register 1)

位域

类型

默认值

描述

31:0

R/W

0x0

IV_DATA1

IV 寄存器。

四个寄存器的值组成 128-bit IV 密钥,比特位分布为 IV_DATAn << (n * 32)。

0x128 ALG_IV_DATA2

默认值:0x00000000

输入 IV 数据寄存器 2(IV Data Input Register 2)

位域

类型

默认值

描述

31:0

R/W

0x0

IV_DATA2

IV 寄存器。

四个寄存器的值组成 128-bit IV 密钥,比特位分布为 IV_DATAn << (n * 32)。

0x12C ALG_IV_DATA3

默认值:0x00000000

输入 IV 数据寄存器 3(IV Data Input Register 3)

位域

类型

默认值

描述

31:0

R/W

0x0

IV_DATA3

IV 寄存器。

四个寄存器的值组成 128-bit IV 密钥,比特位分布为 IV_DATAn << (n * 32)。

0xFFC SPIE_VER

默认值:0x00000200

SPIENC 版本 (Version Register)

位域

类型

默认值

描述

31:0

RO

0x00000200 Version(模块版本号)

采用 BCD 码显示,V2.0