跳转至

外围设备

I2C

概述

I2C(Inter-Integrated Circuit)控制器为Master接口,完成CPU对I2C总线上连接的从设备的读写访问。

芯片共有3个I2C控制器。3个控制器的工作时钟由相应CRG寄存器的i2c_cksel选择。

功能描述

I2C控制器具有以下功能特点:

  • 芯片的I2C是Master接口,支持标准时序和非标准时序。
  • 支持多主设备时的总线仲裁。
  • 支持Clock synchronization和Bit and Byte waiting。
  • 支持标准地址(7bit)和扩展地址(10bit)。
  • 传输速率支持标准模式(100kbit/s)和快速模式(400kbit/s)。
  • 支持General Call和Start Byte功能。
  • 不支持CBUS器件。
  • 支持DMA操作。
  • 支持64 x 8bit的TX FIFO和64 x 8bit的RX FIFO。

功能框图

图 1 控制器的功能框图

时序描述原理

时序描述包括时序格式描述和时序数据准备两部分。时序格式描述通过配置I2C_TIMING_CMD、I2C_LOOP1、I2C_DST1、I2C_LOOP2、I2C_DST2、I2C_LOOP3、I2C_DST3实现,既能配置出标准时序也能配置出非标准时序。

  • 时序数据准备通过配置I2C_DEV_ADDR、I2C_DATA_BUF、I2C_PATTERN_DATA1、I2C_PATTERN_DATA2、I2C_TX_FIFO实现,配置的数值都是需要发送到从设备的。
  • 在时序格式描述时,I2C_TIMING_CMD配置的是时序命令信息,I2C_LOOP1、I2C_DST1、I2C_LOOP2、I2C_DST2、I2C_LOOP3、I2C_DST3配置的是跳转控制信息。I2C_TIMING_CMD可以配置的时序命令信息如表1所示。

    表 1 时序命令

    时序命令编号

    时序命令代号

    时序命令含义

    0x00

    EXIT

    结束,用于控制器退出

    0x01

    S

    总线START

    0x02

    SDA4

    发送dev_addr_byte4

    0x03

    SDA3

    发送dev_addr_byte3

    0x04

    SDA2

    发送dev_addr_byte2

    0x05

    SDA1

    发送dev_addr_byte1

    0x06

    SDB4

    发送data_buf_byte4

    0x07

    SDB3

    发送data_buf_byte3

    0x08

    SDB2

    发送data_buf_byte2

    0x09

    SDB1

    发送data_buf_byte1

    0x0A

    SPD8

    发送pattern_data_byte8

    0x0B

    SPD7

    发送pattern_data_byte7

    0x0C

    SPD6

    发送pattern_data_byte6

    0x0D

    SPD5

    发送pattern_data_byte5

    0x0E

    SPD4

    发送pattern_data_byte4

    0x0F

    SPD3

    发送pattern_data_byte3

    0x10

    SPD2

    发送pattern_data_byte2

    0x11

    SPD1

    发送pattern_data_byte1

    0x12

    RD

    接收1字节数据

    注意:执行RD命令时,若RX FIFO满了,则控制器会等待直到RX FIFO有空位;等待期间控制器不会改变I2C总线的状态。

    0x13

    RACK

    接收低电平应答

    0x14

    RNACK

    接收高电平非应答

    0x15

    RNC

    接收应答,高电平低电平都无所谓

    0x16

    SACK

    发送低电平应答

    0x17

    SNACK

    发送高电平非应答

    0x18

    JMPN1

    有限次数跳转,目的由DST1寄存器指出,次数由LOOP1寄存器指出

    0x19

    JMPN2

    有限次数跳转,目的由DST2寄存器指出,次数由LOOP2寄存器指出

    0x1A

    JMPN3

    有限次数跳转,目的由DST3寄存器指出,次数由LOOP3寄存器指出

    0x1B

    UNDEF

    未定义

    0x1C

    UNDEF

    未定义

    0x1D

    UDB1

    从TX FIFO 更新数据到 data_buf_byte1

    注意:执行UDB1命令时,若TX FIFO为空,则控制器会等待直到TX FIFO有数据;等待期间控制器不会改变I2C总线的状态。

    0x1E

    SR

    总线repeated START

    0x1F

    P

    总线STOP

  • 标准时序----7bit寻址,写操作

  • 标准时序----7bit寻址,直接读操作

  • 标准时序----10bit寻址,写操作

  • 标准时序----10bit寻址,组合读操作

  • 非标准时序举例

标准时序----7bit寻址,写操作

图 1 7bit寻址,写操作时序图

图1对应的时序描述配置如表1所示。

表 1 7bit寻址,写操作对应的时序描述配置

类型

寄存器

配置

时序格式描述

I2C_TIMING_CMD[0]

S

I2C_TIMING_CMD[1]

SDA1

I2C_TIMING_CMD[2]

RACK

I2C_TIMING_CMD[3]

UDB1

I2C_TIMING_CMD[4]

SDB1

I2C_TIMING_CMD[5]

RACK

I2C_TIMING_CMD[6]

JMPN1

I2C_TIMING_CMD[7]

P

I2C_TIMING_CMD[8]

EXIT

I2C_LOOP1

n

I2C_DST1

3

时序数据准备

I2C_DEV_ADDR

(Slave Address+‘0’)共8bit

I2C_TX_FIFO

TXD0、TXD1、…TXDn依次写入。

标准时序----7bit寻址,直接读操作

图 1 7bit寻址,直接读时序图

图1对应的时序描述配置如表1所示。

表 1 7bit寻址,直接读操作的时序描述配置

类型

寄存器

配置

时序格式描述

I2C_TIMING_CMD[0]

S

I2C_TIMING_CMD[1]

SDA1

I2C_TIMING_CMD[2]

RACK

I2C_TIMING_CMD[3]

RD

I2C_TIMING_CMD[4]

SACK

I2C_TIMING_CMD[5]

JMPN1

I2C_TIMING_CMD[6]

RD

I2C_TIMING_CMD[7]

SNACK

I2C_TIMING_CMD[8]

P

I2C_TIMING_CMD[9]

EXIT

I2C_LOOP1

n-1

I2C_DST1

3

时序数据准备

I2C_DEV_ADDR

(Slave Address+‘1’)共8bit

说明:

读回的数据RXD0、RXD1、…RXDn依次填入I2C_RX_FIFO。

标准时序----10bit寻址,写操作

图 1 10bit寻址,写操作时序图

图1对应的时序描述配置如表1所示。

表 1 10bit寻址,写操作对应的时序描述配置

类型

寄存器

配置

时序格式描述

I2C_TIMING_CMD[0]

S

I2C_TIMING_CMD[1]

SDA1

I2C_TIMING_CMD[2]

RACK

I2C_TIMING_CMD[3]

SDA2

I2C_TIMING_CMD[4]

RACK

I2C_TIMING_CMD[5]

UDB1

I2C_TIMING_CMD[6]

WDB1

I2C_TIMING_CMD[7]

RACK

I2C_TIMING_CMD[8]

JMPN1

I2C_TIMING_CMD[9]

P

I2C_TIMING_CMD[10]

EXIT

I2C_LOOP1

n

I2C_DST1

5

时序数据准备

I2C_DEV_ADDR

(Slave Address 1st 7Bits +‘0’) 共8bit写入dev_addr_byte1;

(Slave Address 2nd Byte) 写入dev_addr_byte2。

I2C_TX_FIFO

TXD0、TXD1、…TXDn依次写入。

标准时序----10bit寻址,组合读操作

图 1 10bit寻址,组合读时序图

图1对应的时序描述配置如表1所示。

表 1 10bit寻址,组合读对应的时序描述配置

类型

寄存器

配置

时序格式描述

I2C_TIMING_CMD[0]

S

I2C_TIMING_CMD[1]

SDA1

I2C_TIMING_CMD[2]

RACK

I2C_TIMING_CMD[3]

SDA2

I2C_TIMING_CMD[4]

RACK

I2C_TIMING_CMD[5]

UDB1

I2C_TIMING_CMD[6]

WDB1

I2C_TIMING_CMD[7]

RACK

I2C_TIMING_CMD[8]

JMPN1

I2C_TIMING_CMD[9]

SR

I2C_TIMING_CMD[10]

SDA3

I2C_TIMING_CMD[11]

RACK

I2C_TIMING_CMD[12]

RD

I2C_TIMING_CMD[13]

SACK

I2C_TIMING_CMD[14]

JMPN2

I2C_TIMING_CMD[15]

RD

I2C_TIMING_CMD[16]

SNACK

I2C_TIMING_CMD[17]

P

I2C_TIMING_CMD[18]

EXIT

I2C_LOOP1

n

I2C_DST1

5

I2C_LOOP2

m-1

I2C_DST2

12

时序数据准备

I2C_DEV_ADDR

(Slave Address 1st 7Bits +‘0’) 共8bit写入dev_addr_byte1;

(Slave Address 2nd Byte) 写入dev_addr_byte2;(Slave Address 1st 7Bits +‘1’) 共8bit写入dev_addr_byte3。

I2C_TX_FIFO

TXD0、TXD1、…TXDn依次写入。

说明:

读回的数据RXD0、RXD1、…RXDm依次填入I2C_RX_FIFO

非标准时序举例

非标准时序为非I2C标准协议,图1为一个非标准时序,此时序连续向从设备发送64Byte数据才接收一个应答。

图 1 非标准时序图

图1对应的时序描述配置如表1所示。

表 1 非标准时序对应时序描述配置

类型

寄存器

配置

时序格式描述

I2C_TIMING_CMD[0]

S

I2C_TIMING_CMD[1]

SDA1

I2C_TIMING_CMD[2]

RACK

I2C_TIMING_CMD[3]

UDB1

I2C_TIMING_CMD[4]

SDB1

I2C_TIMING_CMD[5]

JMPN1

I2C_TIMING_CMD[6]

RACK

I2C_TIMING_CMD[7]

P

I2C_TIMING_CMD[8]

EXIT

I2C_LOOP1

63

I2C_DST1

3

时序数据准备

I2C_DEV_ADDR

(Slave Address+‘0’)共8bit

I2C_TX_FIFO

TXD0、TXD1、…TXD63依次写入。

工作方式

非DMA方式下的数据传输(中断方式写操作)

请遵循以下步骤:

  1. 配置I2C_HCNT和I2C_LCNT,使控制器工作在正确的模式下。
  2. 配置I2C_TX_WATERMARK为0x20。
  3. 配置I2C_GLB,使能控制器。
  4. 根据实际时序,参考时序描述原理完成时序配置。
  5. 配置I2C_CTRL1为0x1,启动控制器。
  6. 配置I2C_INTR_EN为0x811。
  7. 在中断服务程序里,查询I2C_INTR_STAT,若arb_lost或ack_bit_unmatch为1,则认为是异常,否则,若tx_lt_watermark为1中断,此时可往TX FIFO里填入多达32个待写数据。

    • 如果还有待写数据,则配置I2C_INTR_RAW为0x10,清除触发本次中断处理的tx_lt_watermark中断,然后等待下一次中断服务程序被触发。
    • 如果已经没有待写数据,则配置I2C_INTR_EN为0x1801,然后等待all_cmd_done中断,收到all_cmd_done中断时,表示所有数据都已经写到从设备端。
  8. 配置I2C_INTR_EN为0x0,I2C_INTR_RAW为0x1fff,清除中断并且禁止中断上报,为不同工作方式之间的切换做好清理工作。

非DMA方式下的数据传输(查询方式写操作)

请遵循以下步骤:

  1. 配置I2C_HCNT和I2C_LCNT,使控制器工作在正确的模式下。
  2. 配置I2C_GLB,使能控制器。
  3. 根据实际时序,参考时序描述原理完成时序配置。
  4. 配置I2C_CTRL1为0x1,启动控制器。
  5. 不断查询I2C_FIFO_STAT [tx_fifo_not_full],查到为1后,将1Byte待写数据写入TX FIFO。当所有待写数据都写入TX FIFO后,执行下一步骤。
  6. 不断查询I2C_INTR_RAW,查到arb_lost_raw 或者ack_bit_unmatch_raw为1则认为是异常,查到all_cmd_done_raw为1则表示所有时序已经完成。
  7. 配置I2C_INTR_EN为0x0,I2C_INTR_RAW为0x1fff,清除中断并且禁止中断上报,为不同工作方式之间的切换做好清理工作。

非DMA方式下的数据传输(中断方式读操作)

请遵循以下步骤:

  1. 配置I2C_HCNT和I2C_LCNT,使控制器工作在正确的模式下。
  2. 配置I2C_RX_WATERMARK为0x20。
  3. 配置I2C_GLB,使能控制器。
  4. 根据实际时序,参考时序描述原理完成时序配置。
  5. 配置I2C_CTRL1为0x1,启动控制器。
  6. 配置I2C_INTR_EN为0x1805。
  7. 在中断服务程序里,查询I2C_INTR_STAT,当arb_lost 或ack_bit_unmatch为1则认为异常,如无异常,all_cmd_done为1说明所有数据都已经读回。如无异常同时all_cmd_done为0说明rx_gt_watermark中断,此时可以从RX FIFO里读出32个已读回的数据。读走32个数据后配置I2C_INTR_RAW为0x4,清除触发本次中断处理的rx_gt_watermark中断,然后等待下一次中断服务程序被触发。
  8. 配置I2C_INTR_EN为0x0,I2C_INTR_RAW为0x1fff,清除中断并且禁止中断上报,为不同工作方式之间的切换做好清理工作。

非DMA方式下的数据传输(查询方式读操作)

请遵循以下步骤:

  1. 配置I2C_HCNT和I2C_LCNT,使控制器工作在正确的模式下。
  2. 配置I2C_GLB,使能控制器。
  3. 根据实际时序,参考时序描述原理完成时序配置。
  4. 配置I2C_CTRL1为0x1,启动控制器。
  5. 不断查询I2C_FIFO_STAT [rx_fifo_not_empty],查到为1后,从RX FIFO中读出1Byte数据。当所有数据都已读回,执行下一步骤。
  6. 不断查询I2C_INTR_RAW,查到arb_lost_raw或者ack_bit_unmatch_raw为1则认为是异常,查到all_cmd_done_raw为1则表示所有时序已经完成。
  7. 配置I2C_INTR_EN为0x0,I2C_INTR_RAW为0x1fff,清除中断并且禁止中断上报,为不同工作方式之间的切换做好清理工作。

DMA方式下的数据传输(写操作)

请遵循以下步骤:

  1. 获取一个DMAC通道。
  2. 完成DMAC通道的设置并启动。
  3. 配置I2C_HCNT和I2C_LCNT,使控制器工作在正确的模式下。
  4. 配置I2C_TX_WATERMARK为0x10(该值仅为示例,具体配置值应根据实际使用决定)。
  5. 配置I2C_GLB,使能控制器。
  6. 根据实际时序,参考时序描述原理完成时序配置。
  7. 配置I2C_CTRL1为0x201,启动控制器。
  8. 等待DMAC完成中断。
  9. 不断查询I2C_INTR_RAW,查到arb_lost_raw或者ack_bit_unmatch_raw为1则认为是异常,查到all_cmd_done_raw为1则表示所有时序已经完成。
  10. 配置I2C_INTR_EN为0x0,I2C_INTR_RAW为0x1fff,清除中断并且禁止中断上报,为不同工作方式之间的切换做好清理工作。

DMA方式下的数据传输(读操作)

请遵循以下步骤:

  1. 获取一个DMAC通道。
  2. 完成DMAC通道的设置并启动。
  3. 配置I2C_HCNT和I2C_LCNT,使控制器工作在正确的模式下。
  4. 配置I2C_RX_WATERMARK为0x10(该值仅为示例,具体配置值应根据实际使用决定)。
  5. 配置I2C_GLB,使能控制器。
  6. 根据实际时序,参考时序描述原理完成时序配置。
  7. 配置I2C_CTRL1为0x301,启动控制器。
  8. 等待DMAC完成中断。
  9. 不断查询I2C_INTR_RAW,查到arb_lost_raw或者ack_bit_unmatch_raw为1则认为是异常,查到all_cmd_done_raw为1则表示所有时序已经完成。
  10. 配置I2C_INTR_EN为0x0,I2C_INTR_RAW为0x1fff,清除中断并且禁止中断上报,为不同工作方式之间的切换做好清理工作。

异常处理流程

请遵循以下步骤:

  1. 配置I2C_GLB [i2c_enable] 为0,禁用控制器。
  2. 配置I2C_INTR_EN为0x0,I2C_INTR_RAW为0x1fff,清除中断并且禁止中断上报,为不同工作方式之间的切换做好清理工作。

I2C寄存器概览

I2C基地址如下:

  • I2C0寄存器基地址:0x1106_0000
  • I2C1寄存器基地址:0x1106_1000
  • I2C2寄存器基地址:0x1106_2000

I2C寄存器偏移地址中变量的取值范围和含义如表1所示。

表 1 I2C寄存器偏移地址变量表

变量名称

取值范围

描述

n

0~31

I2C时序命令,最多支持32个时序命令。

表 2 I2C寄存器概览

偏移地址

名称

描述

0x0000

I2C_GLB

I2C全局配置寄存器

0x0004

I2C_HCNT

I2C高电平时长寄存器

0x0008

I2C_LCNT

I2C低电平时长寄存器

0x0010

I2C_DEV_ADDR

I2C器件地址寄存器

0x0014

I2C_DATA_BUF

I2C数据buf寄存器

0x0018

I2C_PATTERN_DATA1

I2C PATTERN数据1寄存器

0x001C

I2C_PATTERN_DATA2

I2C PATTERN数据2寄存器

0x0020

I2C_TX_FIFO

I2C TX FIFO数据寄存器

0x0024

I2C_RX_FIFO

I2C RX FIFO数据寄存器

0x0030+n x 4

I2C_TIMING_CMD

I2C时序命令寄存器

0x00B0

I2C_LOOP1

I2C循环次数1寄存器

0x00B4

I2C_DST1

I2C跳转目的1寄存器

0x00B8

I2C_LOOP2

I2C循环次数2寄存器

0x00BC

I2C_DST2

I2C跳转目的2寄存器

0x00C0

I2C_LOOP3

I2C循环次数3寄存器

0x00C4

I2C_DST3

I2C跳转目的3寄存器

0x00C8

I2C_TX_WATERMARK

I2C TX FIFO水线寄存器

0x00CC

I2C_RX_WATERMARK

I2C RX FIFO水线寄存器

0x00D0

I2C_CTRL1

I2C控制寄存器1

0x00D4

I2C_CTRL2

I2C控制寄存器2

0x00D8

I2C_FIFO_STAT

I2C FIFO状态寄存器

0x00E0

I2C_INTR_RAW

I2C原始中断寄存器

0x00E4

I2C_INTR_EN

I2C中断使能寄存器

0x00E8

I2C_INTR_STAT

I2C中断状态寄存器

I2C寄存器描述

I2C_GLB

I2C_GLB为I2C全局配置寄存器。

Offset Address: 0x0000 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:24]

-

reserved

保留。

0x00

[23:8]

RW

sda_hold_duration

SDA hold time时长。建议配置为0xa。

注意:只能控制从主机发往从设备的数据的hold time时长。

0x0000

[7:1]

-

reserved

保留。

0x00

[0]

RW

i2c_enable

I2C使能控制。

0:禁止;此时会清空TX FIFO和RX FIFO。

1:使能。

注意:若出现时序异常,请先禁止控制器,然后再使能,以防TX FIFO和RX FIFO有上次操作的残留数据。

0x0

I2C_HCNT

I2C_HCNT为I2C高电平时长寄存器。

Offset Address: 0x0004 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:16]

-

reserved

保留。

0x0000

[15:0]

RW

i2c_high_duration

SCL 高电平时长。

建议在标准模式下为SCL周期的1/2,快速模式下为SCL周期的0.36。

标准模式下:

i2c_high_duration = (FI2C_CLK/FSCL) x 0.5

快速模式下:

i2c_high_duration = (FI2C_CLK/FSCL) x 0.36 (FSCL为SCL总线的频率)

以参考时钟为50MHz且工作在快速模式下(FSCL = 400kHz)为例,i2c_high_duration =(50MHz / 400kHz) x 0.36=45。

0x0000

I2C_LCNT

I2C_LCNT为I2C低电平时长寄存器。

Offset Address: 0x0008 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:16]

-

reserved

保留。

0x0000

[15:0]

RW

i2c_low_duration

SCL低电平时长。

建议在标准模式下为SCL周期的1/2,快速模式下为SCL周期的0.64。

标准模式下:

i2c_low_duration = (FI2C_CLK/FSCL) x 0.5

快速模式下:

i2c_low_duration = (FI2C_CLK/FSCL) x 0.64 (FSCL为SCL总线的频率)

以参考时钟为50MHz且工作在快速模式下(FSCL = 400kHz)为例,i2c_low_duration=(50MHz / 400kHz) x 0.64=80。

0x0000

I2C_DEV_ADDR

I2C_DEV_ADDR为I2C器件地址寄存器。

Offset Address: 0x0010 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:24]

RW

dev_addr_byte4

器件地址字节4。

0x00

[23:16]

RW

dev_addr_byte3

器件地址字节3。

0x00

[15:8]

RW

dev_addr_byte2

器件地址字节2。

0x00

[7:0]

RW

dev_addr_byte1

器件地址字节1。

0x00

I2C_DATA_BUF

I2C_DATA_BUF为I2C数据buf寄存器。

Offset Address: 0x0014 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:24]

RW

data_buf_byte4

数据buf字节4。

0x00

[23:16]

RW

data_buf_byte3

数据buf字节3。

0x00

[15:8]

RW

data_buf_byte2

数据buf字节2。

0x00

[7:0]

RW

data_buf_byte1

数据buf字节1。

0x00

I2C_PATTERN_DATA1

I2C_PATTERN_DATA1为I2C PATTERN数据1寄存器。

Offset Address: 0x0018 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:24]

RW

pattern_data_byte4

PATTERN数据字节4。

0x00

[23:16]

RW

pattern_data_byte3

PATTERN数据字节3。

0x00

[15:8]

RW

pattern_data_byte2

PATTERN数据字节2。

0x00

[7:0]

RW

pattern_data_byte1

PATTERN数据字节1。

0x00

I2C_PATTERN_DATA2

I2C_PATTERN_DATA2为I2C PATTERN数据2寄存器。

Offset Address: 0x001C Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:24]

RW

pattern_data_byte8

PATTERN数据字节8。

0x00

[23:16]

RW

pattern_data_byte7

PATTERN数据字节7。

0x00

[15:8]

RW

pattern_data_byte6

PATTERN数据字节6。

0x00

[7:0]

RW

pattern_data_byte5

PATTERN数据字节5。

0x00

I2C_TX_FIFO

I2C_TX_FIFO为I2C TX FIFO数据寄存器。

Offset Address: 0x0020 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:8]

-

reserved

保留。

0x000000

[7:0]

WO

tx_fifo

TX FIFO入口。

写入的数据是待发送出去的数据。

0x00

I2C_RX_FIFO

I2C_RX_FIFO为I2C RX FIFO数据寄存器。

Offset Address: 0x0024 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:8]

-

reserved

保留。

0x000000

[7:0]

RO

rx_fifo

RX FIFO出口。

读出的数据是I2C总线上收到的数据。

0x00

I2C_TIMING_CMD

I2C_TIMING_CMD为I2C时序命令寄存器。

Offset Address: 0x0030+n x 4 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:5]

-

reserved

保留。

0x0000000

[4:0]

RW

timing_cmd

时序命令。n = 0,1,2,… 31.

0x00:EXIT(结束,用于逻辑退出);

0x01:S (总线START);

0x02:WDA4 (发送dev_addr_byte4);

0x03:WDA3 (发送dev_addr_byte3);

0x04:WDA2 (发送dev_addr_byte2);

0x05:WDA1 (发送dev_addr_byte1);

0x06:WDB4 (发送data_buf_byte4);

0x07:WDB3 (发送data_buf_byte3);

0x08:WDB2 (发送data_buf_byte2);

0x09:WDB1 (发送data_buf_byte1);

0x0A:WPD8 (发送pattern_data_byte8);

0x0B:WPD7 (发送pattern_data_byte7);

0x0C:WPD6 (发送pattern_data_byte6);

0x0D:WPD5 (发送pattern_data_byte5);

0x0E:WPD4 (发送pattern_data_byte4);

0x0F:WPD3 (发送pattern_data_byte3);

0x10:WPD2 (发送pattern_data_byte2);

0x11:WPD1 (发送pattern_data_byte1);

0x12:RD (接收1字节数据);

0x13:RACK (接收低电平应答);

0x14:RNACK (接收高电平非应答);

0x15:RNC (接收应答,高低电平都无所谓);

0x16:SACK (发送低电平应答);

0x17:SNACK (发送高电平非应答);

0x18:JMPN1(有限次数跳转,目的由DST1寄存器指出,次数由LOOP1寄存器指出);

0x19:JMPN2(有限次数跳转,目的由DST2寄存器指出,次数由LOOP2寄存器指出);

0x1A:JMPN3(有限次数跳转,目的由DST3寄存器指出,次数由LOOP3寄存器指出);

0x1B:UNDEF (未定义);

0x1C:UNDEF (未定义);

0x1D:UDB1 (从TX FIFO 更新数据到 data_buf_byte1);

0x1E:SR (总线repeated START);

0x1F:P(总线STOP)。

注意:

  • 执行UDB1命令时,若TX FIFO为空,则控制器会等待直到TX FIFO有数据;等待期间控制器不会改变I2C总线的状态。
  • 执行RD命令时,若RX FIFO满了,则控制器会等待直到RX FIFO有空位;等待期间控制器不会改变I2C总线的状态。

0x00

I2C_LOOP1

I2C_LOOP1为I2C循环次数1寄存器。

Offset Address: 0x00B0 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:0]

RW

loop_num1

指定循环次数。

0x00000000

I2C_DST1

I2C_DST1为I2C跳转目的1寄存器。

Offset Address: 0x00B4 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:5]

RW

reserved

保留。

0x0000000

[4:0]

RW

dst_timing_cmd1

指定跳转到哪个时序命令寄存器。

0x00

I2C_LOOP2

I2C_LOOP2为I2C循环次数2寄存器。

Offset Address: 0x00B8 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:0]

RW

loop_num2

指定循环次数。

0x00000000

I2C_DST2

I2C_DST2为I2C跳转目的2寄存器。

Offset Address: 0x00BC Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:5]

RW

reserved

保留。

0x0000000

[4:0]

RW

dst_timing_cmd2

指定跳转到哪个时序命令寄存器。

0x00

I2C_LOOP3

I2C_LOOP3为I2C循环次数3寄存器。

Offset Address: 0x00C0 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:0]

RW

loop_num3

指定循环次数。

0x00000000

I2C_DST3

I2C_DST3为I2C跳转目的3寄存器。

Offset Address: 0x00C4 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:5]

RW

reserved

保留。

0x0000000

[4:0]

RW

dst_timing_cmd3

指定跳转到哪个时序命令寄存器。

0x00

I2C_TX_WATERMARK

I2C_TX_WATERMARK为I2C TX FIFO水线寄存器。

Offset Address: 0x00C8 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:6]

RO

reserved

保留。

0x0000000

[5:0]

RW

tx_watermark

TX FIFO水线。当TX FIFO里的数据数目比tx_watermark小时,tx_lt_watermark_raw原始中断会被置1。

0x00

I2C_RX_WATERMARK

I2C_RX_WATERMARK为I2C RX FIFO水线寄存器。

Offset Address: 0x00CC Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:6]

-

reserved

保留。

0x0000000

[5:0]

RW

rx_watermark

RX FIFO水线。当RX FIFO里的数据数目比rx_watermark大时,rx_gt_watermark_raw原始中断会被置1。

0x00

I2C_CTRL1

I2C_CTRL1为I2C控制寄存器1。

Offset Address: 0x00D0 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:10]

-

reserved

保留。

0x000000

[9:8]

RW

dma_operation

DMA操作控制。

00:非DMA方式;

01:保留;

10:DMA写方式;

11:DMA读方式。

0x0

[7:1]

-

reserved

保留。

0x00

[0]

RW

start

启动控制。写1会启动控制器内部的状态机去执行时序命令序列,执行完毕或者异常后逻辑会反向把此位清0。

0:不启动;

1:启动。

0x0

I2C_CTRL2

I2C_CTRL2为I2C控制寄存器2。

Offset Address: 0x00D4 Total Reset Value: 0x1111_0011

Bits

Access

Name

Description

Reset

[31:29]

-

reserved

保留。

0x0

[28]

RO

i2c_scl_oen

监测内部I2C的SCL输出电平。

0:SCL输出低电平;

1:SCL输出高电平。

0x1

[27:25]

-

reserved

保留。

0x0

[24]

RO

i2c_sda_oen

监测内部I2C的SDA输出电平。

0:SDA输出低电平;

1:SDA输出高电平。

0x1

[23:21]

-

reserved

保留。

0x0

[20]

RO

i2c_scl_in

监测外部I2C总线SCL的电平。

0:总线上SCL为低电平;

1:总线上SCL为高电平。

0x1

[19:17]

-

reserved

保留。

0x0

[16]

RO

i2c_sda_in

监测外部I2C总线SDA的电平。

0:总线上SDA为低电平;

1:总线上SDA为高电平。

0x1

[15:9]

-

reserved

保留。

0x00

[8]

RW

gpio_mode

将I2C的SCL和SDA管脚配置成gpio模式,管脚电平由force_scl_oe_n和force_sda_oe_n决定。

0:禁止;

1:使能。

0x0

[7:5]

-

reserved

保留。

0x0

[4]

RW

force_scl_oen

在gpio_mode有效时控制SCL管脚电平。

0:SCL管脚为低电平;

1:SCL管脚为高电平。

0x1

[3:1]

-

reserved

保留。

0x0

[0]

RW

force_sda_oen

在gpio_mode有效时控制SDA管脚电平。

0:SDA管脚为低电平;

1:SDA管脚为高电平。

0x1

I2C_FIFO_STAT

I2C_FIFO_STAT为I2C FIFO状态寄存器。

Offset Address: 0x00D8 Total Reset Value: 0x000A_0000

Bits

Access

Name

Description

Reset

[31:20]

-

reserved

保留

0x000

[19]

RO

tx_fifo_not_full

TX FIFO非满指示。

0:满;

1:非满。

0x1

[18]

RO

tx_fifo_not_empty

TX FIFO非空指示。

0:空;

1:非空。

0x0

[17]

RO

rx_fifo_not_full

RX FIFO非满指示。

0:满;

1:非满。

0x1

[16]

RO

rx_fifo_not_empty

RX FIFO非空指示。

0:空;

1:非空。

0x0

[15]

-

reserved

保留。

0x0

[14:8]

RO

tx_fifo_vld_num

TX FIFO里的有效数目。

0x00

[7]

-

reserved

保留。

0x0

[6:0]

RO

rx_fifo_vld_num

RX FIFO里的有效数目。

0x00

I2C_INTR_RAW

I2C_INTR_RAW为I2C原始中断寄存器。

Offset Address: 0x00E0 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:13]

-

reserved

保留。

0x00000

[12]

RWC

all_cmd_done_raw

时序命令序列执行到EXIT命令时产生此中断。

0:无中断;

1:有中断。

0x0

[11]

RWC

arb_lost_raw

仲裁丢失。

0:无中断;

1:有中断。

0x0

[10]

RWC

start_det_raw

检测到START。

0:无中断;

1:有中断。

0x0

[9]

RWC

stop_det_raw

检测到STOP。

0:无中断;

1:有中断。

0x0

[8:5]

-

reserved

保留。

0x0

[4]

RWC

tx_lt_watermark_raw

发送数据时,TX FIFO里的数据数目低于水线。

0:无中断;

1:有中断。

0x0

[3]

-

reserved

保留。

0x0

[2]

RWC

rx_gt_watermark_raw

接收数据时,RX FIFO里的数据数目高于水线。

0:无中断;

1:有中断。

0x0

[1]

-

reserved

保留。

0x0

[0]

RWC

ack_bit_unmatch_raw

应答位不符合预期。

0:无中断;

1:有中断。

0x0

I2C_INTR_EN

I2C_INTR_EN为I2C中断使能寄存器。

Offset Address: 0x00E4 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:13]

-

reserved

保留。

0x00000

[12]

RW

all_cmd_done_en

all_cmd_done中断使能。

0:不使能;

1:使能。

0x0

[11]

RW

arb_lost_en

arb_lost中断使能。

0:不使能;

1:使能。

0x0

[10]

RW

start_det_en

start_det中断使能。

0:不使能;

1:使能。

0x0

[9]

RW

stop_det_en

stop_det中断使能。

0:不使能;

1:使能。

0x0

[8:5]

-

reserved

保留。

0x0

[4]

RW

tx_lt_watermark_en

tx_lt_watermark中断使能。

0:不使能;

1:使能。

0x0

[3]

-

reserved

保留。

0x0

[2]

RW

rx_gt_watermark_en

rx_gt_watermark中断使能。

0:不使能;

1:使能。

0x0

[1]

-

reserved

保留。

0x0

[0]

RW

ack_bit_unmatch_en

ack_bit_unmatch中断使能。

0:不使能;

1:使能。

0x0

I2C_INTR_STAT

I2C_INTR_STAT为I2C中断状态寄存器。

Offset Address: 0x00E8 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:13]

-

reserved

保留。

0x00000

[12]

RO

all_cmd_done

所有时序命令正常完成。

0:无中断;

1:有中断。

0x0

[11]

RO

arb_lost

仲裁丢失。

0:无中断;

1:有中断。

0x0

[10]

RO

start_det

检测到START。

0:无中断;

1:有中断。

0x0

[9]

RO

stop_det

检测到STOP。

0:无中断;

1:有中断。

0x0

[8:5]

-

reserved

保留。

0x0

[4]

RO

tx_lt_watermark

发送数据时,TX FIFO里的数据数目低于水线。

0:无中断;

1:有中断。

0x0

[3]

-

reserved

保留。

0x0

[2]

RO

rx_gt_watermark

接收数据时,RX FIFO里的数据数目高于水线。

0:无中断;

1:有中断。

0x0

[1]

-

reserved

保留。

0x0

[0]

RO

ack_bit_unmatch

应答位不符合预期。

0:无中断;

1:有中断。

0x0

UART

概述

通用异步收发器UART(Universal Asynchronous Receiver Transmitter)是一个异步串行的通信接口,主要功能是将来自外围设备的数据进行串并转换之后传入内部总线,以及将数据进行并串转换之后输出到外部设备。UART的主要功能是和外部芯片的UART进行对接,从而实现两芯片间的通信。

芯片共3个UART控制器:

  • UART0:2线UART,主要用于调试。
  • UART1/2:2/4线UART(具体详见《Hi35xxVxxx_PINOUT_CN》文档)。

须知:

当使用UART功能时,需要在UART初始化前对RXD管脚配置为上拉使能。具体的配置寄存器请参考Hi35xxVxxx_PINOUT_CN.xlsx(Hi35xxVxxx表示具体项目名称)。 例如:当使用系统的UART0时,需要配置iocfg_reg22的bit[8]为高。

特点

UART模块有以下特点:

  • 支持64 x 8bit的发送FIFO和64 x 12bit的接收FIFO。
  • 支持数据位和停止位的位宽可编程。数据位可通过编程设定为5/6/7/8比特;停止位可通过编程设定为1bit或2bit。
  • 支持奇、偶校验方式或者无校验。
  • 支持传输速率可编程。
  • 支持接收FIFO中断、发送FIFO中断、接收超时中断、错误中断。
  • 支持初始中断状态查询和屏蔽后中断状态查询。
  • 支持通过编程禁止UART模块或者UART发送/接收功能以降低功耗。
  • 支持关断UART时钟以节省功耗。
  • 支持DMA操作。

功能描述

应用框图

UART的典型应用框图如图1所示。

图 1 UART的典型应用框图

UART是一种异步双向串行总线,它提供了一种简单有效的数据传输方式,只需要两根数据线互相对接。

功能原理

UART的一次帧传输主要包括起始信号、数据、校验位和结束信号,如图2所示。数据帧从某一UART的TXD端输出,从另一个UART的RXD端输入。

图 2 UART帧格式

起始信号、数据、校验位和结束信号的含义如下:

  • 起始信号(start bit)

    一个数据帧开始的标志,UART协议规定TXD信号出现一个低电平就表示一个数据帧的开始。在UART不传输数据时,应该保持高电平。

  • 数据信号(data bit)

    数据位宽可以根据不同的应用要求进行调整,可以配置成5bit/6bit/7bit/8bit数据位宽。

  • 校验位(parity bit)

    校验位是1比特纠错信号,UART的校验位有奇校验、偶校验和固定校验位,同时支持校验位的使能和禁止,详细描述请见UART_LCR_H寄存器。

  • 结束信号(stop bit)

    结束信号即数据帧的停止位,支持1比特和2比特停止位两种配置。数据帧的结束信号就是把TXD拉成高电平。

工作方式

波特率配置

通过配置寄存器UART_IBRD和UART_FBRD可以设置UART工作的波特率,波特率计算公式为:

当前波特率=UART参考时钟频率(100MHz、50MHz、24MHz或3MHz)/(16 x 分频系数)

分频系数由整数和小数两部分组成,分别对应寄存器UART_IBRD和UART_FBRD。

例如:UART参考时钟频率为24MHz,如果配置UART_IBRD为0x1E,UART_FBRD为0x00,按照波特率计算公式,则当前的波特率为24/(16 x 30)=0.05Mbit/s。

UART波特率配置的典型值为:9,600bit/s、14,400bit/s、19,200bit/s、38,400bit/s、57,600bit/s、76,800bit/s、115,200bit/s、230,400bit/s、460,800bit/s。

分频系数值的计算以及分频系数寄存器的配置举例如下:

如果要求波特率为230,400bit/s,并且UART参考时钟频率为24MHz,那么分频系数为(24 x 106)/(16 x 230400)= 6.5104,因此IBRD(整数部分)为6,FBRD(小数部分)为0.5104。

计算6bitUART_FBRD寄存器中的数值:根据m=integer(FBRDx2n+0.5)(n=UART_FBRD寄存器的宽度),计算出m=integer(0.5104x26+0.5)=33,在UART_IBRD寄存器中配置0x0006,UART_FBRD寄存器中配置0x21。

当分频系数小数部分配置成33时,波特率除数的实际数值为6+33/26=6.5156,产生的波特率为(24 x 106)/(16 x 6.5156)=230216.7107,误差率为(230216.7107–230400)/230400x100=-0.07956%。

使用6bit UART_FBRD寄存器最大的误差率为1/26 x 100=1.56%,当m=1时会出现,误差率累计超过64个时钟周期。

软复位

说明:

复位寄存器请参考“3.2.5 CRG寄存器描述”。

复位后各配置寄存器的值均为默认值,因此复位后需要重新对这些寄存器进行初始化配置。

中断或查询方式下的数据传输

初始化

初始化步骤如下:

  1. 向UART_CR bit[0]写0,使UART处于禁止状态。
  2. 写相应的配置值到UART_IBRD、UART_FBRD寄存器,配置传输速率。
  3. 配置UART_CR、UART_LCR_H,设定相应的UART工作模式。
  4. 配置UART_IFLS设定相应的发送及接收FIFO阈值。
  5. 如果驱动程序采用中断方式则需设定UART_IMSC,使能相应中断信号;采用查询方式时应禁止产生相应中断信号。
  6. 向UART_CR bit[0]写1,使能UART,完成初始化配置。

数据发送

数据发送步骤如下:

  1. 将发送数据写入UART_DR,启动数据发送。
  2. 查询方式下,进行连续数据发送时通过读取UART_FR bit[5]检测TX_FIFO状态,根据TX_FIFO的状态决定是否向TX_FIFO中发送数据;中断方式下,则根据相应中断状态位检测;决定是否向TX_FIFO中发送数据。
  3. 通过检测UART_FR bit[7]是否为1,判断UART是否完成全部数据发送。

数据接收

数据接收的处理方式如下:

  • 查询方式下,进行数据接收时通过读取UART_FR [rxfe]检测RX_FIFO状态,根据RX_FIFO的状态决定是否读取RX_FIFO中的数据。
  • 中断方式下,则根据相应中断状态位检测决定是否读取RX_FIFO中的数据。

DMA方式下的数据传输

初始化

初始化步骤如下:

  1. 向UART_CR[uarten]写0,使UART处于禁止状态。
  2. 写相应的配置值到UART_IBRD、UART_FBRD寄存器,配置传输速率。
  3. 配置UART_CR、UART_LCR_H,设定相应的UART工作模式。
  4. 配置UART_IFLS设定相应的发送及接收FIFO阈值。
  5. 如果驱动程序采用中断方式则需设定UART_IMSC,使能相应中断信号;采用查询方式时应禁止产生相应中断信号。
  6. 向UART_CR [uarten]写1,使能UART,完成初始化配置。

数据发送

数据发送(以DMA模式为例)步骤如下:

  1. 配置DMA数据通道,包括数据传输源和目的地址、数据传输个数、传输类型等参数。具体配置时请参见“直接存储器存取控制器”的相关描述。
  2. 配置UART_DMACR为0x2,使能UART的DMA发送功能。
  3. 通过DMA中断上报,判断数据是否发送完成,如果完成则关闭UART的DMA发送功能。

数据接收

数据接收(以DMA模式为例)步骤如下:

  1. 配置DMA数据通道,包括数据传输源和目的地址、数据接收区地址、数据传输个数、传输类型等参数。
  2. 配置UART_DMACR为0x1,使能UART的DMA接收功能。
  3. 通过DMA状态查询,判断数据是否接收完成,如果完成则关闭UART的DMA接收功能。

UART寄存器概览

地址空间内:

  • UART0寄存器基地址:0x1104_0000
  • UART1寄存器基地址:0x1104_1000
  • UART2寄存器基地址:0x1104_2000

UART寄存器概览如表1所示。

表 1 UART寄存器概览

偏移地址

名称

描述

0x000

UART_DR

数据寄存器

0x004

UART_RSR

接收状态寄存器/错误清除寄存器

0x018

UART_FR

标志寄存器

0x024

UART_IBRD

整数波特率寄存器

0x028

UART_FBRD

小数波特率寄存器

0x02C

UART_LCR_H

线控寄存器

0x030

UART_CR

控制寄存器

0x034

UART_IFLS

中断FIFO阈值选择寄存器

0x038

UART_IMSC

中断屏蔽寄存器

0x03C

UART_RIS

原始中断状态寄存器

0x040

UART_MIS

屏蔽后中断状态寄存器

0x044

UART_ICR

中断清除寄存器

0x048

UART_DMACR

DMA控制寄存器

UART寄存器描述

UART_DR

UART_DR为UART数据寄存器,存放接收数据和发送数据,同时可以从该寄存器中读出接收状态。

Offset Address: 0x000 Total Reset Value: 0x0000

Bits

Access

Name

Description

Reset

[15:12]

-

reserved

保留。

0x0

[11]

RO

oe

溢出错误。

0:无溢出错误;

1:有溢出错误,接收FIFO满后接收到了数据。

0x0

[10]

RO

be

Break错误。

0:无break错误;

1:有break错误,即接收数据的输入保持低的时间比一个全字传输(包括start、data、parity、stop bit)还要长。

0x0

[9]

RO

pe

校验错误。

0:无校验错误;

1:有校验错误。

0x0

[8]

RO

fe

帧错误。

0:无帧错误;

1:有帧错误(错误的停止位)。

0x0

[7:0]

RW

data

接收数据和发送数据。

0x00

UART_RSR

UART_RSR为接收状态寄存器/错误清除寄存器。

  • 寄存器读时作为接收状态寄存器。
  • 寄存器写时作为错误清除寄存器。

接收状态也可以从UART_DR中读出。从UART_DR中读出的break、frame、parity的状态信息要比从UART_RSR读出的信息优先级高(即UART_DR中的状态变化比UART_RSR更快)。

对UART_RSR寄存器的任何写操作都会对UART_RSR寄存器进行复位。

Offset Address: 0x004 Total Reset Value: 0x00

Bits

Access

Name

Description

Reset

[7:4]

-

reserved

保留。

0x0

[3]

RW

oe

溢出错误。

0:无溢出错误;

1:溢出错误。

当FIFO满时,FIFO中的内容保持有效,因为不会有下一个数据写到FIFO中,只是移位寄存器会溢出。CPU必须立刻读数据以腾空FIFO。

0x0

[2]

RW

be

Break错误。

0:无break错误;

1:break错误。

Break的条件:接收数据的输入保持低的时间比一个全字传输(定义了start、data、parity、stop bit)还要长。

0x0

[1]

RW

pe

校验错误。

0:无校验错误;

1:接收数据的校验错误。

FIFO模式下,该错误与FIFO顶部的数据相关联。

0x0

[0]

RW

fe

帧错误。

0:无帧错误;

1:接收到的数据的停止位错误(有效的停止位为1)。

0x0

UART_FR

UART_FR为UART标志寄存器。

Offset Address: 0x018 Total Reset Value: 0x0096

Bits

Access

Name

Description

Reset

[15:8]

-

reserved

保留。

0x00

[7]

RO

txfe

该位的含义由UART_LCR_H[fen]的状态决定。

  • 如果UART_LCR_H[fen]为0,则当发送holding register空时该位置1;
  • 如果UART_LCR_H[fen]为1,则当发送FIFO为空时该位置1。

0x1

[6]

RO

rxff

该位的含义由UART_LCR_H[fen]的状态决定。

  • 如果UART_LCR_H[fen]为0,则当接收holding register满时该位置1;
  • 如果UART_LCR_H[fen]为1,则当接收FIFO为满时该位置1。

0x0

[5]

RO

txff

该位的含义由UART_LCR_H[fen]的状态决定。

  • 如果UART_LCR_H[fen]为0,则当发送holding register满时该位置1;
  • 如果UART_LCR_H[fen]为1,当发送FIFO为满时该位置1。

0x0

[4]

RO

rxfe

该位的含义由UART_LCR_H[fen]的状态决定。

  • 如果UART_LCR_H[fen]为0,则当接收holding register空时该位置1;
  • 如果UART_LCR_H[fen]为1,则当接收FIFO为空时该位置1。

0x1

[3]

RO

busy

UART忙闲状态位。

0:UART空闲或者完成发送数据;

1:UART正忙于发送数据。

该位一旦置位,该状态一直保持到整个字节(包括所有的停止位)完全从移位寄存器中发送出去。

一旦发送FIFO非空该位就置位,不管UART使能与否。

0x0

[2:0]

-

reserved

保留。

0x6

UART_IBRD

UART_IBRD为整数波特率寄存器。

Offset Address: 0x024 Total Reset Value: 0x0000

Bits

Access

Name

Description

Reset

[15:0]

RW

baud divint

整数波特率分频值。复位时全部清0。

0x0000

UART_FBRD

UART_FBRD为小数波特率寄存器。

须知:

  • 整数波特率寄存器和小数波特率寄存器的值必须等到当前数据发送和接收完毕才能更新。
  • 最小的分频值为1,最大的分频值为65535(216 - 1)。即UART_IBRD=0是无效的,而此时UART_FBRD将被忽略。同样,如果UART_IBRD=65535(0xFFFF),UART_FBRD就只能是0,如果比0大,则会导致发送和接收的失败。

Offset Address: 0x028 Total Reset Value: 0x00

Bits

Access

Name

Description

Reset

[7:6]

-

reserved

保留。

0x0

[5:0]

RW

baud divfrac

小数波特率分频值。复位时全部清0。

0x00

UART_LCR_H

UART_LCR_H为线控寄存器,如果更新UART_IBRD和UART_FBRD的内容,必须同时更新UART_LCR_H。

Offset Address: 0x02C Total Reset Value: 0x0000

Bits

Access

Name

Description

Reset

[15:8]

-

reserved

保留。

0x00

[7]

RW

sps

stick parity选择。

  • 当本寄存器的bit[1]、bit[2]、bit[7]被置位时,校验位就会作为0发送和检测;
  • 当本寄存器的bit[1]、bit[7]被置位,bit[2]为0时,校验位就会作为1发送和检测。
  • 当本寄存器的bit[7]为0时,stick parity禁止。

因为按照现在的说法,其功能应该是校验被禁止,而该bit只与stick parity相关。

0x0

[6:5]

RW

wlen

指示发送和接收一个帧里数据比特的数目。

00:5bit;

01:6bit;

10:7bit;

11:8bit。

0x0

[4]

RW

fen

发送和接收FIFO使能控制。

0:不使能发送和接收FIFO;

1:发送和接收FIFO使能。

0x0

[3]

RW

stp2

发送帧尾2bit停止位判断。

0:发送的帧尾没有2bit停止位;

1:发送的帧尾有2bit停止位。

接收逻辑在接收时不检查2bit的停止位。

0x0

[2]

RW

eps

发送和接收过程中的奇偶校验选择。

0:在发送和接收过程中生成奇校验或检查奇校验;

1:在发送和接收过程中生成偶校验或检查偶校验。

当UART_LCR_H[pen]为0时,该位不起作用。

0x0

[1]

RW

pen

校验选择位。

0:不作校验;

1:发送方向产生校验,接收方向作校验检查。

0x0

[0]

RW

brk

发送break。

0:无效;

1:在完成当前数据的发送后,UTXD连续输出低电平。

注意:

要正确的执行break命令,软件将该位置1的时间必须超过2个完整帧;在正常使用中,该位必须清0。

0x0

UART_CR

UART_CR为UART控制寄存器,配置UART_CR遵循以下步骤:

  1. 向UART_CR[uarten]写0,禁止UART。
  2. 等待当前数据发送或接收结束。
  3. 将UART_LCR_H[fen]清0。
  4. 配置UART_CR。
  5. 向UART_CR[uarten]写1,使能UART。

Offset Address: 0x030 Total Reset Value: 0x0300

Bits

Access

Name

Description

Reset

[15]

RW

ctsen

CTS硬件流控使能。

0:不使能CTS硬件流控;

1:使能CTS硬件流控,只有当nUARTCTS信号有效时才发送数据。

0x0

[14]

RW

rtsen

RTS硬件流控使能。

0:不使能RTS硬件流控;

1:使能RTS硬件流控,只有当接收FIFO有空间时才请求接收数据。

0x0

[13:12]

-

reserved

保留。

0x0

[11]

RW

rts

请求发送。

该bit为UART modem状态输出信号nUARTRTS的取反。

0:输出信号不变;

1:即该bit配置为1,则输出信号为0。

0x0

[10]

RW

dtr

数据发送准备。

该bit为UART modem状态输出信号nUARTDTR的取反。

0:输出信号不变;

1:即该bit配置为1,则输出信号为0。

0x0

[9]

RW

rxe

UART接收使能。

0:禁止;

1:使能。

在接收的过程中如果UART被禁止,则当前数据的接收就会在正常停止之前结束。

0x1

[8]

RW

txe

UART发送使能。

0:禁止;

1:使能。

在发送的过程中如果UART被禁止,则当前数据的发送就会在正常停止之前结束。

0x1

[7]

RW

lbe

环回使能。

0:禁止;

1:UARTTXD输出环回到UARTRXD。

0x0

[6:1]

-

reserved

保留。

0x00

[0]

RW

uarten

UART使能。

0:禁止;

1:使能。

如果在发送和接收过程中将UART禁止,则会在正常停止之前结束当前数据的传送。

0x0

UART_IFLS

UART_IFLS为中断FIFO阈值选择寄存器,用于设置FIFO的中断(UART_TXINTR或UART_RXINTR)触发线。

Offset Address: 0x034 Total Reset Value: 0x0012

Bits

Access

Name

Description

Reset

[15:6]

-

reserved

保留。

0x000

[5:3]

RW

rxiflsel

接收中断FIFO的阈值选择,接收中断的触发点如下。

000:接收FIFO≥1/8full;

001:接收FIFO≥1/4full;

010:接收FIFO≥1/2full;

011:接收FIFO≥3/4full;

100:接收FIFO≥7/8full;

101:接收FIFO≥1/16full

110:接收FIFO≥1/32full

111:保留。

0x2

[2:0]

RW

txiflsel

发送中断FIFO的阈值选择,发送中断的触发点如下。

000:发送FIFO≤1/8full;

001:发送FIFO≤1/4full;

010:发送FIFO≤1/2full;

011:发送FIFO≤3/4full;

100:发送FIFO≤7/8full;

101:发送FIFO≤15/16full;

110:发送FIFO≤31/32full;

111:保留。

0x2

UART_IMSC

UART_IMSC为中断屏蔽寄存器,用于屏蔽中断。

Offset Address: 0x038 Total Reset Value: 0x0000

Bits

Access

Name

Description

Reset

[15:11]

-

reserved

保留。

0x00

[10]

RW

oeim

溢出错误中断的屏蔽状态。

0:屏蔽该中断;

1:不屏蔽该中断。

0x0

[9]

RW

beim

break错误中断的屏蔽状态。

0:屏蔽该中断;

1:不屏蔽该中断。

0x0

[8]

RW

peim

校验中断的屏蔽状态。

0:屏蔽该中断;

1:不屏蔽该中断。

0x0

[7]

RW

feim

帧错误中断的屏蔽状态。

0:屏蔽该中断;

1:不屏蔽该中断。

0x0

[6]

RW

rtim

接收超时中断的屏蔽状态。

0:屏蔽该中断;

1:不屏蔽该中断。

0x0

[5]

RW

txim

发送中断的屏蔽状态。

0:屏蔽该中断;

1:不屏蔽该中断。

0x0

[4]

RW

rxim

接收中断的屏蔽状态。

0:屏蔽该中断;

1:不屏蔽该中断。

0x0

[3:0]

-

reserved

保留。

0x0

UART_RIS

UART_RIS为原始中断状态寄存器,其内容不受中断屏蔽寄存器的影响。

Offset Address: 0x03C Total Reset Value: 0x0002

Bits

Access

Name

Description

Reset

[15:11]

-

reserved

保留。

0x00

[10]

RO

oeris

原始的溢出错误中断状态。

0:未产生中断;

1:已产生中断。

0x0

[9]

RO

beris

原始的break错误中断状态。

0:未产生中断;

1:已产生中断。

0x0

[8]

RO

peris

原始的校验中断状态。

0:未产生中断;

1:已产生中断。

0x0

[7]

RO

feris

原始的错误中断状态。

0:未产生中断;

1:已产生中断。

0x0

[6]

RO

rtris

原始的接收超时中断状态。

0:未产生中断;

1:已产生中断。

0x0

[5]

RO

txris

原始的发送中断状态。

0:未产生中断;

1:已产生中断。

0x0

[4]

RO

rxris

原始的接收中断状态。

0:未产生中断;

1:已产生中断。

0x0

[3:0]

-

reserved

保留。

0x2

UART_MIS

UART_MIS为屏蔽后中断状态寄存器,其内容为原始中断状态和中断屏蔽进行“与”操作后的结果。

Offset Address: 0x040 Total Reset Value: 0x0000

Bits

Access

Name

Description

Reset

[15:11]

-

reserved

保留。

0x00

[10]

RO

oemis

屏蔽后的溢出错误中断状态。

0:未产生中断;

1:已产生中断。

0x0

[9]

RO

bemis

屏蔽后的break错误中断状态。

0:未产生中断;

1:已产生中断。

0x0

[8]

RO

pemis

屏蔽后的校验中断状态。

0:未产生中断;

1:已产生中断。

0x0

[7]

RO

femis

屏蔽后的错误中断状态。

0:未产生中断;

1:已产生中断。

0x0

[6]

RO

rtmis

屏蔽后的接收超时中断状态。

0:未产生中断;

1:已产生中断。

0x0

[5]

RO

txmis

屏蔽后的发送中断状态。

0:未产生中断;

1:已产生中断。

0x0

[4]

RO

rxmis

屏蔽后的接收中断状态。

0:未产生中断;

1:已产生中断。

0x0

[3:0]

-

reserved

保留。

0x0

UART_ICR

UART_ICR为中断清除寄存器,写1时相应的中断被清除,写0则不起作用。

Offset Address: 0x044 Total Reset Value: 0x0000

Bits

Access

Name

Description

Reset

[15:11]

-

reserved

保留。

0x00

[10]

WO

oeic

清除溢出错误中断。

0:无效;

1:清除中断。

0x0

[9]

WO

beic

清除break错误中断。

0:无效;

1:清除中断。

0x0

[8]

WO

peic

清除校验中断。

0:无效;

1:清除中断。

0x0

[7]

WO

feic

清除错误中断。

0:无效;

1:清除中断。

0x0

[6]

WO

rtic

清除接收超时中断。

0:无效;

1:清除中断。

0x0

[5]

WO

txic

清除发送中断。

0:无效;

1:清除中断。

0x0

[4]

WO

rxic

清除接收中断。

0:无效;

1:清除中断。

0x0

[3:0]

-

reserved

保留。

0x0

UART_DMACR

UART_DMACR为DMA控制寄存器,用于配置发送FIFO和接收FIFO的DMA使能。

Offset Address: 0x048 Total Reset Value: 0x0000

Bits

Access

Name

Description

Reset

[15:4]

-

reserved

保留。

0x0000

[3]

RW

rxlastsreq_en

UART RX DMA支持最后一笔数据的REQ使能。使能打开后,传输最后一笔数据时会发出LASTREQ给DMA控制器。

0:禁止;

1:使能。

0x0

[2]

RW

dmaonerr

UART错误中断(UARTEINTR)出现时的接收通道DMA使能控制。

0:当UART错误中断(UARTEINTR)有效时,接收通道DMA的请求输出(UARTRXDMASREQ或UARTTXDMABREQ)有效;

1:当UART错误中断(UARTEINTR)有效时,接收通道DMA的请求输出(UARTRXDMASREQ或UARTTXDMABREQ)无效。

0x0

[1]

RW

txdmae

发送FIFO的DMA使能控制。

0:禁止;

1:使能。

0x0

[0]

RW

rxdmae

接收FIFO的DMA使能控制。

0:禁止;

1:使能。

0x0

eMMC/SDIO/SD Card控制器

概述

eMMC/SDIO控制器(以下简称MMC)用于处理对eMMC、SD Card器件的读写等操作,并通过SDIO协议实现对扩展外设(如蓝牙、WiFi等)的支持。芯片提供2个MMC控制器SDIO0和SDIO1。

特点

MMC的功能特点如下。

Hi3516CV610 SDIO0:

  • 支持对接eMMC器件、SD卡、SDIO WIFI模组。
  • 支持non-DMA、SDMA、ADMA2的数据传输。
  • 支持命令与数据的CRC生成与校验。
  • 数据位宽支持1bit、4bit、8bit,可根据对接器件选择。
  • 支持1byte~65535bytes的块数据读写操作。
  • eMMC支持DS/HS/HS200/HS400模式,支持boot功能。
  • SD 支持Default Speed(DS)/High Speed(HS)模式。
  • SDIO支持Default Speed(DS)/High Speed(HS)模式。

说明:

其中,Hi3516CV610-10B/20S/20G SDIO0 不支持8bit 数据位宽;eMMC不支持HS400模式。

Hi3516CV610 SDIO1:

  • 支持对接SD卡、SDIO WIFI模组。
  • 支持non-DMA、SDMA、ADMA2的数据传输。
  • 支持命令与数据的CRC生成与校验。
  • 数据位宽支持1bit、4bit,可根据对接器件选择。
  • 支持1byte~65535bytes的块数据读写操作。
  • SD 支持Default Speed(DS)/High Speed(HS)模式。
  • SDIO支持Default Speed(DS)/High Speed(HS)模式。

功能描述

功能框图

SDIO0和SDIO1控制器对应的功能信号和管脚名,请参见《Hi35xxVxxx_PINOUT_CN》(Hi35xxVxxx表示具体项目名称)。

eMMC/SDIO/SD支持符合以下协议的设备:

  • MultiMediaCard(eMMC-version 5.0)
  • Secure Digital I/O(SDIO version 2.0)
  • Secure Digital Memory(SD mem-version 2.0)

MMC的功能框图如图1所示。

图 1 MMC功能框图

注:S:slave接口;M:master接口。

MMC通过内部总线与系统连接,由以下单元构成:

  • 命令通道

    完成指令的发送与响应的接收。

  • 数据通道

    配合命令通道完成数据读写操作。

  • 接口时钟控制单元

    控制接口时钟的关闭与开启,以及接口方向时钟相位调节。

典型应用

MMC的典型应用如图1所示。

图 1 MMC典型应用图

指令与响应

MMC与卡设备之间的所有交互操作均通过指令完成,包括卡初始化、寄存器读写、状态查询、数据传输等。

MMC指令为48bit的串行数据,由起始位、传输位、指令序号、指令参数、CRC校验位和终止位组成。卡收到指令后,会根据指令类型返回48bit或136bit的响应。

图 1 MMC指令格式

图 2 MMC指令响应格式

根据是否有数据传输,指令分为以下2种:

  • 非数据传输指令

    基于指令信号线CMD,MMC与卡采用串行方式进行指令发送与响应接收。

  • 数据传输指令

    除指令线上的交互外,还有数据线DAT0~DAT3(eMMC DAT0~DAT7)上的数据传输。

(1)非数据传输指令

MMC与卡设备之间的非数据传输指令操作如图3所示。

图 3 MMC非数据指令操作

(2)数据传输指令

MMC卡支持以下数据传输指令:

  • 流数据读写指令

    仅MMC卡支持,只使用1根数据线(即DAT0)进行数据传输,无CRC校验。

  • 单块数据读写指令

    一次传输完成一个块大小的数据,不需要使用停止命令结束一次数据传输。

  • 多块数据读写指令

    • predefined block count方式

      在多块读写指令前,发送块数量指令指定待传输的数据量。

    • open ended方式

      发送读写指令后,在数据传输末尾,需使用停止指令来结束一次数据传输。

    SDIO设备的多块读写指令,不同于上述2种方式,在发送读写指令时,指令参数中包含待传输的数据量。

根据响应的类型,指令分为以下3种:

  • 无响应指令

    如卡复位指令。

  • 短响应指令

    数据传输指令、卡状态查询等均属于这类指令。

  • 长响应指令

    仅用于读取卡的寄存器CID和CSD信息。

数据传输

单块读写和多块读写为较常用的数据传输方式。通常eMMC器件数据传输的一个块大小为512byte,而SDIO设备可根据应用自定义。

说明:

以块读写指令方式进行数据传输时,传输数据总量必须为块大小的整数倍。

数据传输指令均为短响应指令,并伴随着数据线上的数据传输。指令、响应及数据线上的时序配合关系如图1和图2所示。

  1. 单块与多块读操作

    图 1 单块与多块读操作

    MMC向卡发送单块或多块读指令。在接收响应的过程中,接收以块为单位的数据,其中每块数据中均包含有CRC校验位,以保证数据传输的完整性。

    单块读指令操作时,MMC在接收一块数据后完成一次数据传输;多块读指令操作时,MMC在接收多块数据后,需发送一条停止指令结束本次数据传输(仅open ended多块读指令)。

  2. 单块与多块写操作

    图 2 单块与多块写操作

    MMC往卡发送单块或多块写指令。在接收到响应后,往卡发送以块为单位的数据,其中每块数据中均包含有CRC校验位,卡会对每块数据进行CRC校验,并反馈CRC状态以确认数据传输的正确性。

    单块写指令操作时,MMC在发送一块数据后完成一次数据传输;多块写指令操作时,MMC在发送多块数据后,需发送一条停止指令完成本次数据传输(仅open ended多块写指令)。写操作结束后,卡可能会因为编程Flash而处于繁忙状态,MMC需查询DAT0状态,以确认卡脱离繁忙状态后才能对卡进行下一步操作。

  3. 数据传输格式

    块方式读写中,MMC与卡之间可采用1bit、4bit或8bit(eMMC only)数据线方式进行数据传输。在发送数据传输指令之前,应分别设置MMC与卡的数据传输位宽模式1bit、4bit或8bit(eMMC only),使它们保持一致。MMC的数据位宽通过寄存器HOST_CTRL1_R设置,卡的数据位宽则通过发送相应的指令进行设置。

    1bit、4bit和8bit(eMMC only)模式下的数据传输格式如图3、图4和图5所示。

    图 3 1bit数据线传输模式下的块数据格式

    图 4 4bit数据线传输模式下的块数据格式

    图 5 8bit数据线传输模式下的块数据格式

SD2.0支持的速度模式

控制器支持SD2.0,各传输模式如表1所示。

表 1 传输模式表

模式

支持的输入时钟(MHz)

卡侧时钟

最大数据位宽

电压

HS

50MHz

50MHz

4bit

3.3V

DS

25MHz

25MHz

4bit

3.3V

SDIO2.0支持的速度模式

控制器支持SDIO2.0,在SD-mode模式下各传输模式如表1所示。

表 1 传输模式表

模式

接口时钟

最大数据位宽

电压

HS

50MHz

4bit

3.3V

DS

25MHz

4bit

3.3V

eMMC支持的速度模式及电压

控制器在eMMC-mode模式下支持的各传输模式如表1所示。

表 1 传输模式表

模式

接口时钟

最大数据位宽

电压

HS400

148.5MHz

8bit

1.8V

HS200

148.5MHz

8bit

1.8V

HS_SDR

50MHz

8bit

1.8V/3.3V

Backwards Compatibility with legacy MMC card

25MHz

8bit

1.8V/3.3V

应用说明

时钟复位寄存器请参考"3.2.5 CRG寄存器描述"。

软复位

在数据传输出现异常而导致MMC无法回到空闲状态时:

CRG寄存器PERI_CRG3440/PERI_CRG3504 bit[16]写“1”分别对SDIO0/SDIO1模块进行软复位。

建议在使用MMC之前,软复位MMC。

接口时钟配置

遵循不同协议版本的eMMC/SD/SDIO器件,以及eMMC/SD/SDIO器件处于不同的状态时,均使用不同的时钟频率。

SDIO0/SDIO1分别通过CRG寄存器PERI_CRG3440/PERI_CRG3504 bit[26:24]配置;

在改变eMMC/SD/SDIO器件的时钟频率之前,必须保证没有数据或指令正在传输。为了避免输出到eMMC/SD/SDIO器件的时钟产生毛刺,在改变eMMC/SD/SDIO器件的时钟频率时应该遵照以下步骤:

  1. 关闭接口时钟。

    将寄存器CLK_CTRL_R bit[2]置“0”。

  2. 设置接口时钟频率。

    配置CRG寄存器PERI_CRG3440/PERI_CRG3504 bit[26:24],选择接口时钟频率。

  3. 重新使能接口时钟。

    将寄存器CLK_CTRL_R bit[2]置“1”。

MMC初始化

与卡进行命令和数据的交互前,需要初始化控制器,步骤如下:

  1. 清中断。将寄存器NORMAL_INT_STAT_R bit[15:0] 和ERROR_INT_STAT_R bit[15:0]所有位置“1”,清除原始中断状态位。
  2. 关闭中断信号使能。将寄存器NORMAL_INT_SIGNAL_EN_R bit[15:0] 和ERROR_INT_SIGNAL_EN_R bit[15:0]所有位置“0”。
  3. 设置超时计数。配置寄存器TOUT_CTRL_R bit[3:0]。
  4. 如果为eMMC,将寄存器EMMC_CTRL_R bit[0] 置“1”,否则置“0”。
  5. 开启power_on。将寄存器PWR_CTRL_R bit[0] 置“1”。
  6. 打开时钟。配置寄存器CLK_CTRL_R bit[3]、[2]和[0] 为“1”。
  7. 打开中断状态使能。配置寄存器NORMAL_INT_STAT_EN_R bit[15:0]和ERROR_INT_STAT_R bit[15:0]。
  8. 打开中断信号使能。配置寄存器NORMAL_INT_SIGNAL_EN_R bit[15:0]和ERROR_INT_SIGNAL_EN_R bit[15:0]。

完成以上步骤后,配置接口时钟以后,就可以往卡发送指令了。

非数据传输指令

发送非数据传输指令的步骤如下:

  1. 在寄存器ARGUMENT_R中设置相应的指令内容。
  2. 在寄存器XFER_MODE_R和CMD_R中设置相应指令参数。
  3. 等待指令被MMC执行。
  4. 检查寄存器NORMAL_INT_STAT_R bit[0]是否产生指令完成中断。
  5. 检查寄存器ERROR_INT_STAT_R bit[15:0]是否有异常响应中断,必要时可读取响应值。

单块或多块读数据

读取单块或多块数据的步骤如下:

  1. 清除中断寄存器NORMAL_INT_STAT_R和ERROR_INT_STAT_R中的中断。
  2. 向寄存器BLOCKSIZE_R写入块的大小。
  3. 向寄存器BLOCKCOUNT_R写入块的个数。
  4. 向寄存器ARGUMENT_R写入读取数据的起始地址。
  5. 配置寄存器XFER_MODE_R和CMD_R,设置数据传输参数。

    对于eMMC/SD器件,使用指令CMD17/CMD18进行单块/多块读操作;对于SDIO卡,使用指令CMD52/CMD53进行单块/多块读操作。

    一旦寄存器CMD_R被写入,MMC就执行指令;当指令被送到总线上以后,产生cmd_done中断。

  6. Non_DMA方式读取数据。检查寄存器NORMAL_INT_STAT_R bit[5],如果为1,则从寄存器BUF_DATA_R读取FIFO中的数据,以便MMC接收后面的数据;同时检查数据错误中断,即寄存器ERROR_INT_STAT_R bit[4]、bit[5]、bit[6]。此时,程序可以发送一个停止指令中止数据的传输。

  7. 当寄存器NORMAL_INT_STAT_R bit[1]为1时,数据传输完成,从寄存器BUF_DATA_R中读取残留在FIFO中的数据。

单块与多块写数据

写入单块或多块数据的步骤如下:

  1. 清除中断寄存器NORMAL_INT_STAT_R和ERROR_INT_STAT_R中的中断。
  2. 向寄存器BLOCKSIZE_R写入块的大小。
  3. 向寄存器BLOCKCOUNT_R写入块的个数。
  4. 向寄存器ARGUMENT_R写入要写数据的起始地址。
  5. 配置寄存器XFER_MODE_R和CMD_R,设置数据传输参数。

    对于eMMC器件,使用指令CMD24/CMD25进行单块/多块写操作;对于SDIO卡,使用指令CMD52/CMD53进行单块/多块写操作。

  6. Non_DMA方式写数据。将数据写入FIFO,即写寄存器BUF_DATA_R。

  7. 检查寄存器NORMAL_INT_STAT_R bit[4],如果为1,则向寄存器BUF_DATA_R写入要填充到FIFO中的数据,以便MMC发送后面的数据;同时检查数据错误中断,即寄存器ERROR_INT_STAT_R bit[4]、bit[5]、bit[6]。此时,程序可以发送一个停止指令中止数据的传输。
  8. 当寄存器NORMAL_INT_STAT_R bit[1]为1时,数据传输完成。

寄存器概览

寄存器概览如表1所示。

表 1 MMC寄存器概览(SDIO0/SDIO1基地址分别是0x1003_0000/0x1004_0000)

偏移地址

名称

描述

0x0000

SDMASA_R

SDMA系统地址寄存器

0x0004

BLOCKSIZE_R

BLOCK SIZE寄存器

0x0006

BLOCKCOUNT_R

BLOCK CNT寄存器

0x0008

ARGUMENT_R

SD/eMMC命令内容寄存器

0x000c

XFER_MODE_R

Transfer模式寄存器

0x000e

CMD_R

命令寄存器

0x0010

RESP01_R

RESP01寄存器

0x0014

RESP23_R

RESP23寄存器

0x0018

RESP45_R

RESP45寄存器

0x001c

RESP67_R

RESP67寄存器

0x0020

BUF_DATA_R

Buffer数据寄存器

0x0024

PSTATE_R

当前状态寄存器

0x0028

HOST_CTRL1_R

HOST控制1寄存器

0x0029

PWR_CTRL_R

上电控制寄存器

0x002c

CLK_CTRL_R

时钟控制寄存器

0x002e

TOUT_CTRL_R

超时控制寄存器

0x002f

SW_RST_R

软复位控制寄存器

0x0030

NORMAL_INT_STAT_R

普通中断状态寄存器

0x0032

ERROR_INT_STAT_R

错误中断状态寄存器

0x0034

NORMAL_INT_STAT_EN_R

普通中断状态使能寄存器

0x0036

ERROR_INT_STAT_EN_R

错误中断状态使能寄存器

0x0038

NORMAL_INT_SIGNAL_EN_R

普通中断信号使能寄存器

0x003a

ERROR_INT_SIGNAL_EN_R

错误中断信号使能寄存器

0x003c

AUTO_CMD_STAT_R

Auto命令状态寄存器

0x003e

HOST_CTRL2_R

HOST控制2寄存器

0x0040

CAPABILITIES1_R

能力1寄存器

0x0044

CAPABILITIES2_R

能力2寄存器

0x0048

CURR_CAPBILITIES1_R

当前能力1寄存器

0x0054

ADMA_ERR_STAT_R

ADMA错误状态寄存器

0x0058

ADMA_SA_LOW_R

ADMA系统地址低32bit寄存器

0x005c

ADMA_SA_HIGH_R

ADMA系统地址高32bit寄存器

0x0078

ADMA_ID_LOW_R

ADMA Integrated 描述子地址低32bit寄存器

0x007c

ADMA_ID_HIGH_R

ADMA Integrated 描述子地址高32bit寄存器

0x0500

MSHC_VER_ID_R

控制器版本ID寄存器

0x0504

MSHC_VER_TYPE_R

控制器版本类型寄存器

0x0510

MBIU_CTRL_R

MBIU控制寄存器

0x052c

EMMC_CTRL_R

eMMC控制寄存器

0x052e

BOOT_CTRL_R

BOOT 控制寄存器

0x0534

GP_OUT_R

eMMC复位和GPIO寄存器

0x0540

AT_CTRL_R

Tuning控制寄存器

0x0544

AT_STAT_R

Tuning状态寄存器

MMC寄存器描述

SDMASA_R

SDMASA_R为SDMA系统地址寄存器。

Offset Address: 0x0000 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:0]

RW

blockcnt_sdmasa

Host Version Enable=0,表示SDMA系统地址。

Host Version Enable=1,表示Block Count。

1表示一个block。

0x00000000

BLOCKSIZE_R

BLOCKSIZE_R为BLOCK SIZE寄存器。

Offset Address: 0x0004 Total Reset Value: 0x0000

Bits

Access

Name

Description

Reset

[15]

-

reserved

保留。

0x0

[14:12]

RW

sdma_buf_bdary

SDMA数据块边界值。

000:4K bytes;

001:8K bytes;

……

111:512K bytes。

0x0

[11:0]

RW

xfer_block_size

传输block size。(单位为byte,最大值:0x800)

0x000

BLOCKCOUNT_R

BLOCKCOUNT_R为BLOCK COUNT寄存器。

Offset Address: 0x0006 Total Reset Value: 0x0000

Bits

Access

Name

Description

Reset

[15:0]

RW

block_cnt

Block个数。

0x0000

ARGUMENT_R

ARGUMENT_R为SD/eMMC命令内容寄存器。

Offset Address: 0x0008 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:0]

RW

argument

32bit命令内容值。

0x00000000

XFER_MODE_R

XFER_MODE_R为Transfer模式命令寄存器。

Offset Address: 0x000c Total Reset Value: 0x0000

Bits

Access

Name

Description

Reset

[15:9]

-

reserved

保留。

0x00

[8]

RW

resp_int_disable

response中断关闭。

0:关闭;

1:使能。

0x0

[7]

RW

resp_err_chk_enable

response错误检查使能。

0:不使能;

1:使能。

0x0

[6]

RW

resp_type

response R1/R5类型。

0:R1;

1:R5。

0x0

[5]

RW

multi_blk_sel

multiple/single block选择。

0:single block;

1:multiple block。

0x0

[4]

RW

data_xfer_dir

Data Transfer 方向。

0:控制器到卡;

1:卡到控制器。

0x0

[3:2]

RW

auto_cmd_enable

Auto Command Enable。

00:关闭;

01:Auto CMD12 Enable;

10:Auto CMD23 Enable;

11:Auto CMD Auto Select。

(SDIO中固定为00)

0x0

[1]

RW

block_count_enable

Block count 使能。

0:关闭;

1:使能。

0x0

[0]

RW

dma_enable

DMA 使能。

0:无数据传输或者非DMA数据传输;

1:DMA数据传输。

0x0

CMD_R

CMD_R为Transfer模式命令寄存器。

Offset Address: 0x000e Total Reset Value: 0x0000

Bits

Access

Name

Description

Reset

[15:14]

-

reserved

保留。

0x0

[13:8]

RW

cmd_index

命令编号。

0x00

[7:6]

RW

cmd_type

命令类型。

00:Normal命令;

01:Suspend命令;

10:Resume命令;

11:Abort命令。

0x0

[5]

RW

data_present_sel

当前是否为数据传输。

0:无数据传输;

1:有数据传输。

0x0

[4]

RW

cmd_idx_chk_enable

命令编号检查使能。

0:关闭;

1:使能。

0x0

[3]

RW

cmd_crc_chk_enable

命令CRC检查使能。

0:关闭;

1:使能。

0x0

[2]

RW

sub_cmd_flag

子命令标识。

0:Main;

1:Sub Command。

0x0

[1:0]

RW

resp_type_select

response 类型。

00:无response;

01:response length 136;

10:response length 48;

11:response length 48 check。

0x0

RESP01_R

RESP01_R为RESP01寄存器。

Offset Address: 0x0010 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:0]

RO

resp01

RESP01寄存器。存放控制器发送命令的response bit[39:8]内容。

0x00000000

RESP23_R

RESP23_R为RESP23寄存器。

Offset Address: 0x0014 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:0]

RO

resp23

RESP23寄存器。存放控制器发送命令的response bit[71:40]内容。

0x00000000

RESP45_R

RESP45_R为RESP45寄存器。

Offset Address: 0x0018 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:0]

RO

resp45

RESP45寄存器。存放控制器发送命令的response bit[103:72]内容。

0x00000000

RESP67_R

RESP67_R为RESP67寄存器。

Offset Address: 0x001c Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:0]

RO

resp67

RESP67寄存器。存放控制器发送命令的response bit[135:104]内容。

0x00000000

BUF_DATA_R

BUF_DATA_R为Buffer数据寄存器。

Offset Address: 0x0020 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:0]

RW

buf_data

控制器中存放接收发送数据的Buffer,在Slave方式下通过不断写这个寄存器来写数据到卡中,通过不断读这个寄存器来获取卡中的数据。

0x00000000

PSTATE_R

PSTATE_R为当前状态寄存器。

Offset Address: 0x0024 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:28]

-

reserved

保留。

0x0

[27]

RO

cmd_issue_err

命令发送出错状态。

0:发送命令无错;

1:命令不能被发送出去。

0x0

[26:25]

-

reserved

保留。

0x0

[24]

RO

cmd_line_lvl

Cmd管脚状态。

0:cmd管脚为低电平;

1:cmd管脚为高电平。

0x0

[23:20]

RO

sd_dat_in[3:0]

Data[3:0]管脚状态,每个bit含义。

0:Data管脚为低电平;

1:Data管脚为高电平。

0x0

[19:12]

-

reserved

保留。

0x0

[11]

RO

buf_rd_enable

Buffer读使能。

0:不使能;

1:使能。

0x0

[10]

RO

buf_wr_enable

Buffer写使能。

0:不使能;

1:使能。

0x0

[9]

RO

Rd_xfer_active

读transfer有效。

0:空闲状态;

1:正在读数据。

0x0

[8]

RO

Wr_xfer_active

写transfer有效。

0:空闲状态;

1:正在写数据。

0x0

[7:4]

RO

sd_dat_in[7:4]

Data[7:4]管脚状态,每个bit含义。

0:Data管脚为低电平;

1:Data管脚为高电平。

0x0

[3]

-

reserved

保留。

0x0

[2]

RO

Dat_line_active

DATA数据线有效。

0:空闲状态;

1:正在数据传输。

0x0

[1]

RO

cmd_inhibit_dat

带数据的命令有效。

0:空闲状态,可以发送带数据的命令;

1:数据线正在传输或者读操作有效中。

0x0

[0]

RO

cmd_inhibit

CMD数据线有效。

0:空闲状态,控制器可以发送命令;

1:忙状态,控制器不可以发送命令。

0x0

HOST_CTRL1_R

HOST_CTRL1_R为HOST控制1寄存器。

Offset Address: 0x0028 Total Reset Value: 0x00

Bits

Access

Name

Description

Reset

[7:6]

-

reserved

保留。

0x0

[5]

RW

ext_data_xfer

扩展数据位宽。

0:参见dat_xfer_width寄存器描述;

1:8bit Bus width。

0x0

[4:3]

RW

dma_sel

DMA 选择。

当HOST_CTRL2_R寄存器中Host Version 4 Enable为1时:

00:SDMA;

01:保留;

10:ADMA2;

11:ADMA2或者ADMA3。

当HOST_CTRL2_R寄存器中Host Version 4 Enable为0时:

00:SDMA;

01:保留;

10:32bit地址ADMA2;

11:64bit地址ADMA2。

0x0

[2]

RW

high_speed_en

高速使能。

0:Normal Speed;

1:High Speed。

0x0

[1]

RW

dat_xfer_width

传输数据位宽。

0:1bit;

1:4bit。

0x0

[0]

-

reserved

保留。

0x0

PWR_CTRL_R

PWR_CTRL_R为HOST基础配置控制寄存器。

Offset Address: 0x0029 Total Reset Value: 0x00

Bits

Access

Name

Description

Reset

[7:1]

-

reserved

保留。

0x00

[0]

RW

sd_bus_pwr_vdd1

VDD1 Power使能。

0:Power off;

1:Power on。

0x0

CLK_CTRL_R

CLK_CTRL_R为时钟控制寄存器。

Offset Address: 0x002c Total Reset Value: 0x0000

Bits

Access

Name

Description

Reset

[15:4]

-

reserved

保留。

0x00

[3]

RW

pll_enable

PLL使能开关。

0:PLL处于low power模式;

1:PLL使能。

0x0

[2]

RW

sd_clk_en

SDIO/eMMC时钟使能。

0:关闭;

1:打开。

0x0

[1]

RO

internal_clk_statable

内部时钟状态。

0:不稳定;

1:稳定。

0x0

[0]

RW

internal_clk_en

内部时钟使能。

0:不使能;

1:使能。

0x1

TOUT_CTRL_R

TOUT_CTRL_R为超时控制寄存器。

Offset Address: 0x002e Total Reset Value: 0x00

Bits

Access

Name

Description

Reset

[7:4]

-

reserved

保留。

0x0

[3:0]

RW

tout_cnt

数据超时计数值。

0x0:TMCLKx2^13;

……

0xe:TMCLKx2^27;

其他:保留。

0x0

SW_RST_R

SW_RST_R为软复位控制寄存器。

Offset Address: 0x002f Total Reset Value: 0x00

Bits

Access

Name

Description

Reset

[7:3]

-

reserved

保留。

0x00

[2]

RW

sw_rst_dat

软复位数据线请求。

0:不复位;

1:复位。

0x0

[1]

RW

sw_rst_cmd

软复位命令线请求。

0:不复位;

1:复位。

0x0

[0]

RW

sw_rst_all

软复位控制器请求。

0:不复位;

1:复位。

0x0

NORMAL_INT_STAT_R

NORMAL_INT_STAT_R为普通中断状态寄存器。

Offset Address: 0x0030 Total Reset Value: 0x0000

Bits

Access

Name

Description

Reset

[15]

RO

err_interrupt

汇总错误中断状态。

0:无中断;

1:有中断。

0x0

[14]

WC

cqe_event

CMDQ事件中断状态。

0:无中断;

1:有中断。

0x0

[13]

RO

fx_event

FX事件中断状态。

0:无中断;

1:有中断。

0x0

[12]

-

reserved

保留。

0x0

[11]

RO

int_c

INT_C中断状态。

0:无中断;

1:有中断。

0x0

[10]

RO

int_b

INT_B中断状态。

0:无中断;

1:有中断。

0x0

[9]

RO

int_a

INT_A中断状态。

0:无中断;

1:有中断。

0x0

[8]

RO

card_interrupt

卡中断状态。

0:无中断;

1:有中断。

0x0

[7:6]

-

reserved

保留。

0x0

[5]

WC

buf_rd_ready

Buffer读ready中断状态。

0:无中断;

1:有中断。

0x0

[4]

WC

buf_wr_ready

Buffer写ready中断状态。

0:无中断;

1:有中断。

0x0

[3]

WC

dma_interrupt

DMA中断状态。

0:无中断;

1:有中断。

0x0

[2]

WC

bgap_event

因停止请求发生Block Gap事件中断状态。

0:无中断;

1:有中断。

0x0

[1]

WC

xfer_complete

读/写 transfer完成中断状态。

0:无中断;

1:有中断。

0x0

[0]

WC

cmd_complete

命令完成中断状态。

0:无中断;

1:有中断。

0x0

ERROR_INT_STAT_R

ERROR_INT_STAT_R为错误中断状态寄存器。

Offset Address: 0x0032 Total Reset Value: 0x0000

Bits

Access

Name

Description

Reset

[15:13]

-

reserved

保留。

0x0

[12]

WC

boot_ack_err

Boot Ack错误中断,仅用于eMMC。

0:无中断;

1:有中断。

0x0

[11]

WC

resp_err

response错误中断。

0:无中断;

1:有中断。

0x0

[10]

-

reserved

保留。

0x0

[9]

WC

adma_err

ADMA错误中断,系统总线错误response,或者ADMA2/3描述子无效。或者CQE描述子无效。

0:无中断;

1:有中断。

0x0

[8]

WC

auto_cmd_err

Auto CMD错误中断状态。

0:无中断;

1:有中断。

0x0

[7]

WC

cur_lmt_err

Current limit错误中断状态。

0:无中断;

1:有中断。

0x0

[6]

WC

data_end_bit_err

数据endbit错误中断状态。

0:无中断;

1:有中断。

0x0

[5]

WC

data_crc_err

数据CRC错误中断状态。

0:无中断;

1:有中断。

0x0

[4]

WC

data_tout_err

数据超时错误中断状态。

0:无中断;

1:有中断。

0x0

[3]

WC

cmd_idx_err

命令Index错误中断状态。

0:无中断;

1:有中断。

0x0

[2]

WC

cmd_end_bit_err

命令endbit错误中断状态。

0:无中断;

1:有中断。

0x0

[1]

WC

cmd_crc_err

命令CRC错误中断状态。

0:无中断;

1:有中断。

0x0

[0]

WC

cmd_tout_err

命令超时错误中断状态。

0:无中断;

1:有中断。

0x0

NORMAL_INT_STAT_EN_R

NORMAL_INT_STAT_EN_R为普通中断状态使能寄存器。

Offset Address: 0x0034 Total Reset Value: 0x0000

Bits

Access

Name

Description

Reset

[15]

-

reserved

保留。

0x0

[14]

RW

cqe_event_stat_en

CMDQ事件中断状态使能。

0:不使能;

1:使能。

0x0

[13]

RW

fx_event_stat_en

FX事件中断状态使能。

0:不使能;

1:使能。

0x0

[12]

-

reserved

保留。

0x0

[11]

RW

int_c_stat_en

INT_C中断状态使能。

0:不使能;

1:使能。

0x0

[10]

RW

int_b_stat_en

INT_B中断状态使能。

0:不使能;

1:使能。

0x0

[9]

RW

int_a_stat_en

INT_A中断状态使能。

0:不使能;

1:使能。

0x0

[8]

RW

card_interrupt_stat_en

卡中断状态使能。

0:不使能;

1:使能。

0x0

[7:6]

-

reserved

保留。

0x0

[5]

RW

buf_rd_ready_stat_en

Buffer读ready中断使能。

0:不使能;

1:使能。

0x0

[4]

RW

buf_wr_ready_stat_en

Buffer写ready中断使能。

0:不使能;

1:使能。

0x0

[3]

RW

dma_interrupt_stat_en

DMA中断使能。

0:不使能;

1:使能。

0x0

[2]

RW

bgap_event_stat_en

因停止请求发生Block Gap事件中断使能。

0:不使能;

1:使能。

0x0

[1]

RW

xfer_complete_stat_en

读/写 transfer完成中断状态使能。

0:不使能;

1:使能。

0x0

[0]

RW

cmd_complete_stat_en

命令完成中断状态使能。

0:不使能;

1:使能。

0x0

ERROR_INT_STAT_EN_R

ERROR_INT_STAT_EN_R为错误中断状态使能寄存器。

Offset Address: 0x0036 Total Reset Value: 0x0000

Bits

Access

Name

Description

Reset

[15:13]

-

reserved

保留。

0x0

[12]

RW

boot_ack_err_stat_en

Boot Ack错误中断状态使能,仅用于eMMC。

0:不使能;

1:使能。

0x0

[11]

RW

resp_err_stat_en

response错误中断状态使能。

0:不使能;

1:使能。

0x0

[10]

-

reserved

保留。

0x0

[9]

RW

adma_err_stat_en

ADMA错误中断状态使能。

系统总线错误response,或者ADMA2/3描述子无效,或者CQE描述子无效。

0:不使能;

1:使能。

0x0

[8]

RW

auto_cmd_err_stat_en

Auto CMD错误中断状态使能。

0:不使能;

1:使能。

0x0

[7]

RW

cur_lmt_err_stat_en

Current limit错误中断状态使能。

0:不使能;

1:使能。

0x0

[6]

RW

data_end_bit_err_stat_en

数据endbit错误中断状态使能。

0:不使能;

1:使能。

0x0

[5]

RW

data_crc_err_stat_en

数据CRC错误中断状态使能。

0:不使能;

1:使能。

0x0

[4]

RW

data_tout_err_stat_en

数据超时错误中断状态使能。

0:不使能;

1:使能。

0x0

[3]

RW

cmd_idx_err_stat_en

命令Index错误中断状态使能。

0:不使能;

1:使能。

0x0

[2]

RW

cmd_end_bit_err_stat_en

命令endbit错误中断状态使能。

0:不使能;

1:使能。

0x0

[1]

RW

cmd_crc_err_stat_en

命令CRC错误中断状态使能。

0:不使能;

1:使能。

0x0

[0]

RW

cmd_tout_err_stat_en

命令超时错误中断状态使能。

0:不使能;

1:使能。

0x0

NORMAL_INT_SIGNAL_EN_R

NORMAL_INT_SIGNAL_EN_R为普通中断信号使能寄存器。

Offset Address: 0x0038 Total Reset Value: 0x0000

Bits

Access

Name

Description

Reset

[15]

-

reserved

保留

0x0

[14]

RW

cqe_event_signal_en

CMDQ事件中断信号使能。

0:不使能;

1:使能。

0x0

[13]

RW

fx_event_signal_en

FX事件中断信号使能。

0:不使能;

1:使能。

0x0

[12]

-

reserved

保留

0x0

[11]

RW

int_c_signal_en

INT_C中断信号使能。

0:不使能;

1:使能。

0x0

[10]

RW

int_b_signal_en

INT_B中断信号使能。

0:不使能;

1:使能。

0x0

[9]

RW

int_a_signal_en

INT_A中断信号使能。

0:不使能;

1:使能。

0x0

[8]

RW

card_interrupt_signal_en

卡中断信号使能。

0:不使能;

1:使能。

0x0

[7:6]

-

reserved

保留

0x0

[5]

RW

buf_rd_ready_signal_en

Buffer读ready信号使能。

0:不使能;

1:使能。

0x0

[4]

RW

buf_wr_ready_signal_en

Buffer写ready信号使能。

0:不使能;

1:使能。

0x0

[3]

RW

dma_interrupt_signal_en

DMA中断信号使能。

0:不使能;

1:使能。

0x0

[2]

RW

bgap_event_signal_en

因停止请求发生Block Gap事件中断信号使能。

0:不使能;

1:使能。

0x0

[1]

RW

xfer_complete_signal_en

读/写 transfer完成中断信号使能。

0:不使能;

1:使能。

0x0

[0]

RW

cmd_complete_signal_en

命令完成中断信号使能。

0:不使能;

1:使能。

0x0

ERROR_INT_SIGNAL_EN_R

ERROR_INT_SIGNAL_EN_R为错误中断信号使能寄存器。

Offset Address: 0x003a Total Reset Value: 0x0000

Bits

Access

Name

Description

Reset

[15:13]

-

reserved

保留。

0x0

[12]

RW

boot_ack_err_signal_en

Boot Ack错误中断信号使能,仅用于eMMC。

0:不使能;

1:使能。

0x0

[11]

RW

resp_err_signal_en

response错误中断信号使能。

0:不使能;

1:使能。

0x0

[10]

-

reserved

保留。

0x0

[9]

RW

adma_err_signal_en

ADMA错误中断信号使能,系统总线错误response,或者ADMA2/3描述子无效,或者CQE描述子无效。

0:不使能;

1:使能。

0x0

[8]

RW

auto_cmd_err_signal_en

Auto CMD错误中断信号使能。

0:不使能;

1:使能。

0x0

[7]

RW

cur_lmt_err_signal_en

Current limit错误中断信号使能。

0:不使能;

1:使能。

0x0

[6]

RW

data_end_bit_err_signal_en

数据endbit错误中断信号使能。

0:不使能;

1:使能。

0x0

[5]

RW

data_crc_err_signal_en

数据CRC错误中断信号使能。

0:不使能;

1:使能。

0x0

[4]

RW

data_tout_err_signal_en

数据超时错误中断信号使能。

0:不使能;

1:使能。

0x0

[3]

RW

cmd_idx_err_signal_en

命令Index错误中断信号使能。

0:不使能;

1:使能。

0x0

[2]

RW

cmd_end_bit_err_signal_en

命令endbit错误中断信号使能。

0:不使能;

1:使能。

0x0

[1]

RW

cmd_crc_err_signal_en

命令CRC错误中断信号使能。

0:不使能;

1:使能。

0x0

[0]

RW

cmd_tout_err_signal_en

命令超时错误中断信号使能。

0:不使能;

1:使能。

0x0

AUTO_CMD_STAT_R

AUTO_CMD_STAT_R为Auto命令状态寄存器。

Offset Address: 0x003c Total Reset Value: 0x0000

Bits

Access

Name

Description

Reset

[15:8]

-

reserved

保留。

0x00

[7]

RO

cmd_not_issued_auto_cmd12

有Auto CMD12错误时发送后续命令状态。

0:无错误;

1:还没有通过数据线发送CMD。

0x0

[6]

-

reserved

保留。

0x0

[5]

RO

auto_cmd_resp_err

Auto CMD response状态。

0:无错;

1:错。

0x0

[4]

RO

auto_cmd_idx_err

Auto CMD Index状态。

0:无错;

1:错。

0x0

[3]

RO

auto_cmd_endbit_err

Auto CMD Endbit状态。

0:无错;

1:错。

0x0

[2]

RO

auto_cmd_crc_err

Auto CMD CRC状态。

0:无错;

1:错。

0x0

[1]

RO

auto_cmd_tout_err

Auto CMD 超时状态。

0:无错;

1:错。

0x0

[0]

RO

auto_cmd12_not_exec

Auto CMD12 执行状态。

0:执行;

1:没有执行。

0x0

HOST_CTRL2_R

HOST_CTRL2_R为控制器2寄存器。

Offset Address: 0x003e Total Reset Value: 0x0000

Bits

Access

Name

Description

Reset

[15]

RW

preset_val_enable

预设值自动选择使能。

0:不使能,SDCLK和驱动能力由驱动控制;

1:使能。

0x0

[14]

RW

async_int_enable

异步中断使能。

0:关闭;

1:打开。

0x0

[13]

-

reserved

保留。

0x0

[12]

RW

host_ver4_enable

控制器版本4使能。

0:3.0版本;

1:4.0版本。

0x0

[11]

RW

cmd23_enable

CMD23使能。

0:Auto CMD23关闭;

1:Auto CMD23使能。

0x0

[10]

RW

adma2_len_mode

ADMA2长度。

0:16bit数据长度;

1:26bit数据长度。

0x0

[9:8]

-

reserved

保留。

0x0

[7]

RW

sample_clk_sel

sample时钟选择。

0:选择fixed时钟采数据;

1:选tuned时钟采数据。

0x0

[6]

RW

exec_tuning

执行tuning,完成后自动清0。

0:没做tuning或者tuning完成;

1:执行tuning。

0x0

[5:4]

RW

drv_strength_sel

驱动能力选择。

00:选择TYPEB;

01:选择TYPEA;

10:选择TYPEC;

11:选择TYPED。

0x0

[3]

-

reserved

保留。

0x0

[2:0]

RW

uhs_mode_sel

UHS模式:

000:SDR12;

001:SDR25;

010:SDR50;

011:SDR104;

100:reserved;

101:reserved;

110:reserved;

111:reserved。

eMMC模式:

000:Legacy;

001:High Speed SDR;

010:reserved;

011:HS200;

100:reserved;

101:reserved;

110:reserved;

111:HS400。

0x0

CAPABILITIES1_R

CAPABILITIES1_R为能力1寄存器。

Offset Address: 0x0040 Total Reset Value: 0x3F6E_0181

Bits

Access

Name

Description

Reset

[31:30]

RO

slot_type_r

Slot类型。

00:可移除卡Slot;

01:Embedded Slot;

10:共享总线Slot(SD模式下使用);

11:保留。

0x0

[29]

RO

async_int_support

异步中断是否支持。

0:不支持;

1:支持。

0x1

[28]

-

reserved

保留。

0x1

[27]

-

reserved

保留。

0x1

[26:24]

-

reserved

保留。

0x7

[23]

RO

sus_res_support

暂停、恢复支持。

0:不支持;

1:支持。

0x0

[22]

RO

sdma_support

SDMA支持。

0:不支持;

1:支持。

0x1

[21]

RO

high_speed_support

是否支持High Speed。

0:不支持;

1:支持。

0x1

[20]

-

reserved

保留。

0x0

[19]

RO

adma2_support

是否支持ADMA2。

0:不支持;

1:支持。

0x1

[18]

RO

embedded_8_bit

是否支持Embedded器件8bit。

0:不支持;

1:支持。

0x1

[17:16]

RO

max_blk_len

最大block 长度。

00:512Byte;

01:1024Byte;

10:2048Byte;

11:保留。

0x2

[15:8]

RO

base_clk_freq

SD时钟基础频率。

0x0:1MHz;

0x3f:63MHz;

0x40~0xff:不支持。

0x01

[7]

RO

tout_clk_unit

超时时钟单位。

0:KHz;

1:MHz。

0x1

[6]

-

reserved

保留。

0x0

[5:0]

RO

tout_clk_freq

超时频率。

0x1:1KHz/1MHz;

0x2:2KHz/2MHz;

……

0x3f:63KHz/63MHz。

0x01

CAPABILITIES2_R

CAPABILITIES2_R为能力2寄存器。

Offset Address: 0x0044 Total Reset Value: 0x0800_2077

Bits

Access

Name

Description

Reset

[31:28]

-

reserved

保留。

0x0

[27]

RO

adma3_support

是否支持ADMA3。

0:不支持;

1:支持。

0x1

[26:16]

-

reserved

保留。

0x000

[15:14]

RO

re_tuning_modes

retuning模式。

00:MODE1,Timer;

01:MODE2,Timer和Retuning请求;

10:MODE3,Auto retuning Timer和Retuning请求;

11:保留。

0x0

[13]

RO

use_tuning_ser50

SDR50使用Tuning。

0:不使用;

1:使用。

0x1

[12]

-

reserved

保留。

0x0

[11:8]

RO

retune_cnt

Retuning计数。

0x1:1秒;

0x3:4秒;

其他:保留。

0x0

[7]

-

reserved

保留。

0x0

[6]

RO

drv_typed

是否支持TYPED。

0:不支持;

1:支持。

0x1

[5]

RO

drv_typec

是否支持TYPEC。

0:不支持;

1:支持。

0x1

[4]

RO

drv_typea

是否支持TYPEA。

0:不支持;

1:支持。

0x1

[3]

RO

uhs2_support

是否支持UHS2。

0:不支持;

1:支持。

0x0

[2]

-

reserved

保留。

0x1

[1]

RO

sdr104_support

是否支持SDR104。

0:不支持;

1:支持。

0x1

[0]

RO

sdr50_support

是否支持SDR50。

0:不支持;

1:支持。

0x1

CURR_CAPBILITIES1_R

CURR_CAPBILITIES1_R为当前能力1寄存器。

Offset Address: 0x0048 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:24]

-

reserved

保留。

0x00

[23:16]

RO

max_cur_18v

1.8V下电流值。

0x00

[15:8]

RO

max_cur_30v

3.0V下电流值。

0x00

[7:0]

RO

max_cur_33v

3.3V下电流值。

0x00

ADMA_ERR_STAT_R

ADMA_ERR_STAT_R为ADMA错误状态寄存器。

Offset Address: 0x0054 Total Reset Value: 0x00

Bits

Access

Name

Description

Reset

[7:3]

-

reserved

保留。

0x00

[2]

RO

adma_len_err

ADMA长度不匹配错误状态。

0:无错;

1:有错。

0x0

[1:0]

RO

adma_err_states

ADMA错误状态。

00:ST_STOP;

01:ST_FDS;

10:ST_UNUSED;

11:ST_TFR。

0x0

ADMA_SA_LOW_R

ADMA_SA_LOW_R为ADMA系统地址低32bit寄存器。

Offset Address: 0x0058 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:0]

RW

adma_sa_low

ADMA系统地址低32bit。

0x00000000

ADMA_SA_HIGH_R

ADMA_SA_HIGH_R为ADMA系统地址高32bit寄存器。

Offset Address: 0x005c Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:0]

RW

adma_sa_high

ADMA系统地址高32bit。

0x00000000

ADMA_ID_LOW_R

ADMA_ID_LOW_R为ADMA Integrated 描述子地址低32bit寄存器。

Offset Address: 0x0078 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:0]

RW

adma_id_low

ADMA Integrated 描述子地址低32bit。

0x00000000

ADMA_ID_HIGH_R

ADMA_ID_HIGH_R为ADMA Integrated 描述子地址高32bit寄存器。

Offset Address: 0x007c Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:0]

RW

adma_id_high

ADMA Integrated 描述子地址高32bit。

0x00000000

MSHC_VER_ID_R

MSHC_VER_ID_R为控制器版本ID寄存器。

Offset Address: 0x0500 Total Reset Value: 0x3137_302A

Bits

Access

Name

Description

Reset

[31:0]

RO

mshc_ver_id

控制器版本ID寄存器。

0x3137302A

MSHC_VER_TYPE_R

MSHC_VER_TYPE_R为控制器版本类型寄存器。

Offset Address: 0x0504 Total Reset Value: 0x6761_2A2A

Bits

Access

Name

Description

Reset

[31:0]

RO

mshc_ver_type

控制器版本类型寄存器。

0x67612A2A

MBIU_CTRL_R

MBIU_CTRL_R为MBIU控制寄存器。

Offset Address: 0x0510 Total Reset Value: 0x0707_000F

Bits

Access

Name

Description

Reset

[31:27]

-

reserved

保留。

0x00

[26:24]

RW

gm_write_osrc_lmt

写总线操作outstanding值。

等于此寄存器值加1。

0x7

[23:19]

-

reserved

保留。

0x00

[18:16]

RW

gm_read_osrc_lmt

读总线操作outstanding值。

等于此寄存器值加1。

0x7

[15:10]

-

reserved

保留。

0x00

[9]

RW

gm_onerequestonly

outstanding配置生效使能。

0:outstanding按gm_write_osrc_lmt /read_osrc_lmt生效;

1:outstanding固定为1。

0x0

[8]

RW

gm_axi_1k_en

AXI总线跨1K边界读写功能使能。

0:不使能;

1:使能。

0x0

[7:4]

-

reserved

保留。

0x0

[3]

RW

gm_enburst16

16burst使能。

0:关闭16burst;

1;使能16burst。

0x1

[2]

RW

gm_enburst8

8burst使能。

0:关闭8burst;

1;打开8burst。

0x1

[1]

RW

gm_enburst4

4burst使能。

0:关闭4burst;

1;打开4burst。

0x1

[0]

RW

gm_enburst_undef

burst配置生效使能。

0:按下面三种配置gm_enburst4/8/16产生固定burst;

1:按实际数据长度产生对应burst。

0x1

EMMC_CTRL_R

EMMC_CTRL_R为eMMC控制寄存器。

Offset Address: 0x052c Total Reset Value: 0x0000

Bits

Access

Name

Description

Reset

[15:9]

-

reserved

保留。

0x00

[8]

RW

enh_strobe_enable

Enhanced Strobe使能。

此寄存器域指示在HS400模式下控制器使用data Strobe来采集CMD线。

0:HS400模式下,用cclk_rx采样CMD线;

1:HS400模式下,用data strobe采样CMD线。

0x0

[7:2]

-

reserved

保留。

0x00

[1]

RW

disable_data_crc_chk

关闭数据CRC检查。

0:数据CRC检查使能;

1:数据CRC检查关闭。

0x00

[0]

RW

card_is_emmc

连接的卡类型。

0:非eMMC卡;

1:eMMC卡。

0x0

BOOT_CTRL_R

BOOT_CTRL_R为BOOT控制寄存器。

Offset Address: 0x052e Total Reset Value: 0x0000

Bits

Access

Name

Description

Reset

[15:12]

RW

boot_tout_cnt

boot ack超时计数。

0x0:TMCLKx2^13;

0x1:TMCLKx2^14;

……

0xE:TMCLKx2^27;

其他:保留。

0x00

[11:9]

-

reserved

保留。

0x0

[8]

RW

boot_ack_enable

boot ack使能。

0:关闭;

1:使能。

0x0

[7]

WO

validate_boot

强制boot有效使能。

0:无影响;

1:boot使能有效。

0x0

[6:1]

-

reserved

保留。

0x00

[0]

RW

man_boot_en

强制boot使能,要和validate_boot一起配置,boot传输完成后,这个bit会自清

0:无影响;

1:boot使能有效。

0x0

GP_OUT_R

GP_OUT_R为eMMC复位和GPIO寄存器。

Offset Address: 0x0534 Total Reset Value: 0x0000_0001

Bits

Access

Name

Description

Reset

[31:1]

-

reserved

保留。

0x00000000

[0]

RW

emmc_rst_n

eMMC卡复位信号。

0:复位;

1:不复位。

0x1

AT_CTRL_R

AT_CTRL_R为tuning控制寄存器。

Offset Address: 0x0540 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:5]

-

reserved

保留。

0x000000

[4]

RW

sw_tuning_en

软件配置tuning使能。

0:不使能;

1:使能。

0x00

[3:0]

-

reserved

保留。

0x0

AT_STAT_R

AT_STAT_R为tuning状态寄存器。

Offset Address: 0x0544 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:8]

-

reserved

保留。

0x000000

[7:0]

RW

sw_ph_sel_code

软件配置相位值。

0x0:0°;

0x1:11.25°;

0x2:22.5°;

……

0x1f:348.75°;

其他:保留。

说明:

SD/SDIO/eMMC DS/HS模式只支持0x0,0x4, 0x8, 0xC, 0x10, 0x14, 0x18和0x1C相位,其他相位不支持配置。

0x0

SPI

概述

SPI控制器实现数据的串并、并串转换,可以作为Master与外部设备进行同步串行通信。支持Motorola SPI接口、TI串行同步接口和National Semiconductor MicroWire接口三种外设接口协议。

特点

须知:

  • 芯片总共有2组SPI接口。
  • 工作参考时钟为100MHz。其中,SPI0/1主模式输出的SPI_CLK最大支持25MHz,SPI0/1从模式输入的SPI_CLK最大支持8.25MHz。

SPI的功能特点有:

  • 接口时钟频率可编程。
  • 2组SPI接口都支持主模式和从模式。
  • SPI0支持双片选,SPI1仅支持单片选,片选信号支持极性可配。
  • 接收FIFO的宽度为16bit、深度为256。
  • 发送FIFO的宽度为16bit、深度为256。
  • 串行数据帧长度可编程:4bit~16bit。
  • 内部提供环回测试模式。
  • 支持DMA操作。
  • 支持SPI、MicroWire、TI同步串行三种接口,支持单帧和连续帧格式。
  • 支持SPI全双工工作模式,时钟极性、相位可配置。
  • 支持MicroWire半双工工作模式。
  • 支持TI同步串行接口全双工工作模式。

功能描述

典型应用

SPI接Slave时的应用框图如图1所示。

图 1 SPI接Slave时的应用

三种外设总线时序

图1~图8中的缩略语含义:

Motorola SPI接口

说明:

SPO表示SPICLKOUT极性,SPH表示SPICLKOUT相位。它们是寄存器SPICR0 bit[7:6]。

SPO=0、SPH=0

SPI单帧帧格式如图1所示。

图 1 SPI单帧帧格式(SPO=0、SPH=0)

SPI连续帧帧格式如图2所示。

图 2 SPI连续帧帧格式(SPO=0、SPH=0)

在该模式下,当SPI处于空闲状态时:

  • SPI_CLK信号设置为低
  • SPI_CS_N信号设置为高
  • 发送数据线SPI_DO强制为低

当SPI处于使能状态,而且发送FIFO内存在有效数据时,设置SPI_CS_N信号为低,表示开始传输数据。来自Slave的数据立刻发送到Master的接收数据线SPI_DI。半个SPI_CLK时钟周期之后,有效的Master数据传输到SPI_DO。此时Master和Slave数据都已经有效,SPI_CLK管脚在接下来的半个SPI_CLK时钟周期之后变为高电平。数据在SPI_CLK时钟的上升沿被捕获,在时钟的下降沿被传送。

如果传输单个word,当捕捉到最后1bit数据时,SPI_CS_N在接下来的1个SPI_CLK时钟周期之后恢复为高电平。

如果是连续的传输,SPI_CS_N信号在每个word传输之间必须将SPI_CLK时钟拉高一个时钟周期。这是因为SPH为0时,Slave选择管脚会固定其内部串行设备寄存器的数据,使它不会变化。因此在连续传输时,主设备必须在每个word传输之间将SPI_CS_N信号拉高。连续传输结束时,SPI_CS_N在捕获到最后1bit之后的1个SPI_CLK时钟周期之后恢复为高电平。

SPO=0、SPH=1

SPI单帧帧格式如图3所示。

图 3 SPI单帧帧格式(SPO=0、SPH=1)

SPI连续帧帧格式如图4所示。

图 4 SPI连续帧帧格式(SPO=0、SPH=1)

在该模式下,当SPI处于空闲状态时:

  • SPI_CLK信号设置为低
  • SPI_CS_N设置为高
  • 发送数据线SPI_DO强制为低

当SPI为使能状态,而且发送FIFO内有有效数据时,设置SPI_CS_N信号为低表示开始传输数据。半个SPI_CLK时钟周期之后,Master和Slave的有效数据分别在各自的传输线上有效。同时,SPI_CLK从第一个上升沿开始有效。数据在SPI_CLK时钟的下降沿被捕获,在时钟的上升沿被传送。

如果传输单个word,当捕捉到最后1bit数据时,SPI_CS_N在接下来的1个SPI_CLK时钟之后恢复为高电平。

当连续传输时,在传输数据word之间SPI_CS_N保持为低。连续传输结束时,SPI_CS_N在最后1bit捕获之后的1个SPI_CLK时钟之后恢复为高电平。

SPO=1、SPH=0

SPI单帧帧格式如图5所示。

图 5 SPI单帧帧格式(SPO=1、SPH=0)

SPI连续帧帧格式如图6所示。

图 6 SPI连续帧帧格式(SPO=1、SPH=0)

在该配置下,当SPI处于空闲状态时:

  • SPI_CLK信号设置为高
  • SPI_CS_N信号设置为高
  • 发送数据线SPI_DO强制为低

当SPI为使能状态,而且发送FIFO内有有效数据时,设置SPI_CS_N信号为低表示开始传输数据。此时Slave的数据立刻发送到Master的接收数据线SPI_DI。半个SPI_CLK周期之后,Master的有效数据传送到SPI_DO。再过半个SPI_CLK时钟周期之后,SPI_CLK Master管脚设置为低。这表示数据在SPI_CLK时钟的下降沿被捕获,在SPI_CLK时钟的上升沿被传送。

如果传输单个word,当捕捉到最后1bit数据时,SPI_CS_N在接下来的1个SPI_CLK时钟之后恢复为高电平。

如果是连续的传输,SPI_CS_N信号在每个word传输之间必须拉高。这是因为当SPH为0时,Slave选择管脚固定其内部串行设备寄存器的数据,使它不会变化。SPI_CS_N在捕获到最后1bit数据之后的1个SPI_CLK时钟周期之后恢复为高电平。

SPO=1、SPH=1

SPI单帧帧格式如图7所示。

图 7 SPI单帧帧格式(SPO=1、SPH=1)

SPI连续帧帧格式如图8所示。

图 8 SPI连续帧帧格式(SPO=1、SPH=1)

在该模式下,当SPI处于空闲状态时:

  • SPI_CLK信号设置为高
  • SPI_CS_N信号设置为高
  • 发送数据线SPI_DO强制为低

当SPI为使能状态,而且发送FIFO内有有效数据时,设置SPI_CS_N Master信号为低表示开始传输数据。半个SPI_CLK时钟周期后,Master和Slave数据在各自的传输线上有效。同时,时钟SPI_CLK从1个下降沿开始有效。数据在SPI_CLK时钟的上升沿被捕获,在时钟的下降沿被传送。当传输单个word时,SPI_CS_N在传输的最后1bit捕获之后的1个SPI_CLK时钟周期之后恢复为高电平。

如果是连续传输,SPI_CS_N信号始终保持为低。SPI_CS_N在捕获到最后1bit之后的1个SPI_CLK时钟周期之后恢复到高状态。对于连续传输来说,SPI_CS_N在传输过程中一直保持为低,结束方式与单个传输方式相同。

接口时序

图 9 SPI接口时序图

TI同步串行接口

TI同步串行单帧帧格式如图1所示。

图 1 TI同步串行单帧帧格式

TI同步串行连续帧帧格式如图2所示。

图 2 TI同步串行连续帧帧格式

在该模式下,当SPI处于空闲状态时:

  • SPI_CK为低电平。
  • SPI_CS_N为低电平。
  • 传输数据线SPI_DO保持为高阻。

一旦发送FIFO有数据,SPI_CS_N就会产生一个SPI_CK时钟周期的高电平脉冲,将被发送的数据就会从发送FIFO传送到发送逻辑串行移位寄存器。在SPI_CK时钟的下一个上升沿,4bit~16bit数据帧的MSB就会从SPI_DO移位输出。同样,从外部串行slave设备接收数据的MSB会从SPI_DI管脚移位输入。

SPI和片外串行设备在SPI_CK时钟的下降沿将数据存入串行移位寄存器。接收串行寄存器在接收到LSB之后的第一个SPI_CK时钟上升沿将数据送给接收FIFO。

National Semiconductor Microwire接口

National Semiconductor Microwire单帧帧格式如图1所示。

图 1 National Semiconductor Microwire单帧帧格式

在SPI_DO LSB结束和SPI_DI MSB开始之间可以延迟0~255个时钟周期。

National Semiconductor Microwire连续帧帧格式如图2所示。

图 2 National Semiconductor Microwire连续帧帧格式

在SPI_DO LSB结束和SPI_DI MSB开始之间可以延迟0~255个时钟周期。

Microwire的格式与SPI的格式非常相近,使用master-slave信息的传输技术,只不过SPI是全双工通信,而Microwire半双工通信。在SPI向外部芯片发送串行数据的时候,都要先加8bit控制字。在这个过程中,SPI没有接收到任何数据。传输完毕之后,片外芯片对接收到的数据进行解码,在与8bit控制信息间隔一个时钟周期之后,slave开始响应所需求的数据。返回的数据长度为4bit~16bit,使得整个帧的长度为13bit~25bit。

在该模式下,当SPI处于空闲状态时:

  • SPI_CLK信号设置为低电平。
  • SPI_CS_N设置为高电平。
  • 发送数据线SPI_DO强制为低电平。

向发送FIFO内部写进一个控制字节开始一次传送。SPI_CS_N的下降沿引发数据的传输,发送FIFO的数据被发送到串行移位寄存器,8bit控制帧的MSB被发送到发送管脚SPI_DO。在帧的传送过程中,SPI_CS_N保持为低。SPI_DI在这个传送过程中保持为高阻。

片外的串行从设备在SPI_CLK时钟的每一个上升沿将数据锁存到串行移位寄存器中。当从设备锁存完最后1个bit的数据之后,在接下来的1个时钟周期的等待时间里,对接收到的数据开始解码,然后从设备反馈给SPI所要求的数据。每1个bit都是在SPI_CK时钟的下降沿写到SPI_DI的。对单个数据传送来说,在帧的结尾,SPI_CS_N在最后1个bit写到接收串行寄存器之后的1个时钟周期后拉高,这样就使接收到的数据传送到接收FIFO。

对于连续的传送来说,数据传送的开始和结束都和单个数据的传送方式相同。在这个传送过程中,信号SPI_CS_N时一直保持为低的,传送的数据也是连续的。下一帧的控制字直接和上一帧的LSB相邻。当帧的LSB锁存到SPI之后,接收到的每一个数值都是在SPI_CLK时钟的下降沿取自接收移位寄存器。

工作方式

工作模式

SPI的工作模式分为中断或查询方式下的数据传输和DMA方式下的数据传输。

时钟与复位

输出SPI时钟频率计算方式如下:

Fsspclkout = Fsspclk / (CPSDVSR x (1+SCR))

Fsspclk:SPI的工作参考时钟100MHz。

CPSDVSR、SCR请查询SPICPSR、SPICR0。

支持独立软复位和时钟门控,具体请参见“3.2.5 CRG寄存器描述”章节。

中断处理

SPI有5个中断,其中前4个是独立中断源、可屏蔽、高电平有效。

  • SPIRXINTR

    接收FIFO中断请求。当接收FIFO中有4个或更多的有效数据时,该中断置位。

  • SPITXINTR

    发送FIFO中断请求。当发送FIFO中有4个或更少的有效数据时,该中断置位。

  • SPIRORINTR

    接收overrun中断请求。当FIFO已满,且又有新的数据需要写入FIFO时,会引起FIFO overrun,该中断置位。此时数据被写入接收移位寄存器,而不是FIFO。

  • SPIRTINTR

    接收time out中断请求。当接收FIFO非空,且SPI处于idle态超过一个固定的32bit周期,该中断置位。

    此时表明接收FIFO中仍有数据需要传输。如果接收FIFO被读空或者当有新的数据被接收到FIFO中,该中断解除置位。也可以通过写寄存器SPIICR[RTIC]清除该中断。

  • SPIINTR

    组合中断,为以上4个中断经过“或”运算后的结果。如果上述4个独立中断中任意一个置位且使能,该中断置位。

SPI的中断SPIINTR请参见中断处理章节。

初始化

初始化步骤如下:

  1. 向寄存器SPICR1 [sse]写“0”,禁止SPI。
  2. 写寄存器SPICR0,配置帧格式及传输数据位宽等参数。
  3. 配置寄存器SPICPSR,设定时钟分频因子。
  4. 中断方式下,设置寄存器SPIIMSC,使能相应中断信号;查询、DMA方式下,应禁止产生相应中断信号。
  5. 中断或DMA方式,设置SPITXFIFOCR和SPIRXFIFOCR。
  6. DMA方式下,配置寄存器SPIDMACR,使能SPI的DMA功能。

查询方式下的数据传输

具体步骤如下:

  1. 向寄存器SPICR1 [sse]写“1”,使能SPI。
  2. 将需发送的数据连续写到寄存器SPIDR。
  3. 轮询寄存器SPISR,直到[BSY]=0(表示总线不忙)、[TFE]=1(表示发送FIFO已空)、[RNE]=1(表示接收FIFO非空)。
  4. 读出数据,需保证读空接收FIFO(可通过查询SPISR [RNE]得到)。

    须知:

    Motorola SPI/TI同步串行接口的全双工特性,每发一个数据就接收一个数据,即使只需发送数据,也需要清空接收FIFO。

  5. 向寄存器SPICR1[sse]写“0”,禁止SPI。

中断方式下的数据传输

具体步骤如下:

  1. 向寄存器SPICR1 [sse]写“1”,使能SPI。
  2. 将需发送的数据连续写到寄存器SPIDR。
  3. 等待中断SPIRXINTR,读出数据。循环直到读出所有数据。

    须知:

    Motorola SPI/TI同步串行接口的全双工特性,每发一个数据就接收一个数据,即使只需发送数据,也需要清空接收FIFO。

  4. 向寄存器SPICR1 [sse]写“0”,禁止SPI。

DMA方式下的数据传输

具体步骤如下:

  1. 获取一个DMAC通道。
  2. 向寄存器SPICR1 [sse]写“1”,使能SPI。
  3. 发送数据

    1. 配置该DMAC通道的配置寄存器和控制寄存器中的相关参数。
    2. 启动DMAC,响应SPI发送FIFO的DMA请求进行数据传输。
    3. 通过DMA中断上报,判断数据是否发送完成,如果完成则关闭SPI的DMA功能。
  4. 接收数据

    1. 配置该DMAC通道的配置寄存器和控制寄存器中的相关参数。
    2. 启动DMAC,响应SPI接收FIFO的DMA请求进行数据传输。
    3. 通过DMA中断上报,判断数据是否接收完成,如果完成则关闭SPI的DMA功能。
  5. 向寄存器SPICR1 [sse]写“0”,禁止SPI。

SPI寄存器概览

SPI寄存器概览如表1所示。

  • SPI0寄存器基地址:0x1107_0000
  • SPI1寄存器基地址:0x1107_1000

    表 1 SPI寄存器概览

    偏移地址

    名称

    描述

    0x000

    SPICR0

    控制寄存器0

    0x004

    SPICR1

    控制寄存器1

    0x008

    SPIDR

    数据寄存器

    0x00C

    SPISR

    状态寄存器

    0x010

    SPICPSR

    时钟分频寄存器

    0x014

    SPIIMSC

    中断屏蔽寄存器

    0x018

    SPIRIS

    原始中断状态寄存器

    0x01C

    SPIMIS

    屏蔽后中断状态寄存器

    0x020

    SPIICR

    中断清除寄存器

    0x024

    SPIDMACR

    DMA控制寄存器

    0x028

    SPITXFIFOCR

    发送FIFO控制寄存器

    0x02C

    SPIRXFIFOCR

    接收FIFO控制寄存器

SPI寄存器描述

SPICR0

SPICR0为控制寄存器0。

Offset Address: 0x000 Total Reset Value: 0x0000

Bits

Access

Name

Description

Reset

[15:8]

RW

SCR

串行时钟率,取值范围: [0, 255]。SCR的值用来产生SPI发送和接收的比特率,公式为Fsspclk / (CPSDVSR x (1+SCR))。

CPSDVSR是一个2~254之间的偶数,由寄存器SPICPSR配置。

0x00

[7]

RW

SPH

SPICLKOUT相位,具体含义请参见“三种外设总线时序”的SPI帧格式。

0x0

[6]

RW

SPO

SPICLKOUT极性,具体含义请参见“三种外设总线时序”的SPI帧格式。

0x0

[5:4]

RW

FRF

帧格式选择。

00:Motorola SPI帧格式;

01:TI同步串行帧格式;

10:National Microwire帧格式;

11:保留。

0x0

[3:0]

RW

DSS

设置数据位宽。

0011:4bit;

0100:5bit;

0101:6bit;

0110:7bit;

0111:8bit;

1000:9bit;

1001:10bit;

1010:11bit;

1011:12bit;

1100:13bit;

1101:14bit;

1110:15bit;

1111:16bit;

其他:保留。

0x0

SPICR1

SPICR1为控制寄存器1。

Offset Address: 0x004 Total Reset Value: 0x7F00

Bits

Access

Name

Description

Reset

[15]

RW

WaitEn

等待使能,当SPICR0寄存器的FRF配置为National Microwire帧格式时有效。

0:不使能;

1:使能。

0x0

[14:8]

RW

WaitVal

National Microwire帧格式时,写和读之间的等待拍数。当WaitEn 为1并且帧格式为National Microwire时有效。

0x7F

[7]

-

reserved

保留。

0x0

[6]

RW

mode_altasens

0:片选信号由芯片逻辑根据所选时序自动产生;

1:当采用Motorola SPI帧格式时,片选CS信号由SPI使能信号控制,使能后,片选拉低,否则片选拉高。

0x0

[5]

-

reserved

保留。

0x0

[4]

RW

BitEnd

数据正反序控制位。

0:数据顺序为MSB到LSB;

1:数据顺序为LSB 到MSB。

0x0

[3]

-

reserved

保留。

0x0

[2]

RW

MS

设置Master或者Slave模式,此位只能在SPI被禁止时改变。

0:Master模式;

1:Slave模式。

0x0

[1]

RW

SSE

设置SPI使能。

0:不使能;

1:使能。

0x0

[0]

RW

LBM

设置环回模式。

0:正常的串行接口操作使能;

1:发送串行移位寄存器的输出在内部连接到接收串行移位寄存器的输入上。

0x0

SPIDR

SPIDR为数据寄存器。

Offset Address: 0x008 Total Reset Value: 0x0000

Bits

Access

Name

Description

Reset

[15:0]

RW

DATA

发送/接收FIFO。

读:接收FIFO;

写:发送FIFO。

如果数据比特数少于16则必须右对齐。发送逻辑将忽略高位未使用的比特位,接收逻辑则自动将数据右对齐。

0x0000

SPISR

SPISR为状态寄存器。

Offset Address: 0x00C Total Reset Value: 0x0003

Bits

Access

Name

Description

Reset

[15:5]

-

reserved

保留。

0x000

[4]

RO

BSY

SPI忙标记。

0:空闲;

1:忙。

0x0

[3]

RO

RFF

接收FIFO是否已满。

0:未满;

1:已满。

0x0

[2]

RO

RNE

接收FIFO是否未空。

0:已空;

1:未空。

0x0

[1]

RO

TNF

发送FIFO是否未满。

0:已满;

1:未满。

0x1

[0]

RO

TFE

发送FIFO是否已空。

0:未空;

1:已空。

0x1

SPICPSR

SPICPSR为时钟分频寄存器。

Offset Address: 0x010 Total Reset Value: 0x0000

Bits

Access

Name

Description

Reset

[15:8]

-

reserved

保留。

0x00

[7:0]

RW

CPSDVSR

时钟分频因子。此值必须是2~254之间的偶数,取决于输入时钟SPICLK的频率。最低位读作“0”。

0x00

SPIIMSC

SPIIMSC为中断屏蔽寄存器。

Offset Address: 0x014 Total Reset Value: 0x0000

Bits

Access

Name

Description

Reset

[15:4]

-

reserved

保留。

0x000

[3]

RW

TXIM

发送FIFO中断屏蔽。

0:半空或更少情况下中断被屏蔽;

1:半空或更少情况下中断未被屏蔽。

0x0

[2]

RW

RXIM

接收FIFO中断屏蔽。

0:半空或更少情况下中断被屏蔽;

1:半空或更少情况下中断未被屏蔽。

0x0

[1]

RW

RTIM

接收超时中断。

0:接收超时中断屏蔽;

1:接收超时中断不屏蔽。

0x0

[0]

RW

RORIM

接收溢出中断屏蔽。

0:接收FIFO溢出中断屏蔽;

1:接收FIFO溢出中断不屏蔽。

值为“1”时使能硬件流控功能,即接收FIFO满后SPI停止发送数据。

0x0

SPIRIS

SPIRIS为原始中断状态寄存器。值“0”表示无中断,值“1”表示有中断。

Offset Address: 0x018 Total Reset Value: 0x0008

Bits

Access

Name

Description

Reset

[15:4]

-

reserved

保留。

0x000

[3]

RO

TXRIS

发送FIFO中断的原始中断状态。

0x1

[2]

RO

RXRIS

接收FIFO中断的原始中断状态。

0x0

[1]

RO

RTRIS

接收超时中断的原始中断状态。

0x0

[0]

RO

RORRIS

接收溢出中断的原始中断状态。

0x0

SPIMIS

SPIMIS为屏蔽后中断状态寄存器。值“0”表示无中断,值“1”表示有中断。

Offset Address: 0x01C Total Reset Value: 0x0000

Bits

Access

Name

Description

Reset

[15:4]

-

reserved

保留。

0x000

[3]

RO

TXMIS

发送FIFO中断屏蔽后的状态。

0x0

[2]

RO

RXMIS

接收FIFO中断屏蔽后的状态。

0x0

[1]

RO

RTMIS

接收超时中断屏蔽后的状态。

0x0

[0]

RO

RORMIS

接收溢出中断屏蔽后的状态。

0x0

SPIICR

SPIICR为中断清除寄存器。写“1”清除中断,写“0”无影响。

Offset Address: 0x020 Total Reset Value: 0x0000

Bits

Access

Name

Description

Reset

[15:2]

-

reserved

保留。

0x0000

[1]

WC

RTIC

清除接收超时中断。

0x0

[0]

WC

RORIC

清除接收溢出中断。

0x0

SPIDMACR

SPIDMACR为DMA控制寄存器。

Offset Address: 0x024 Total Reset Value: 0x0000

Bits

Access

Name

Description

Reset

[15:2]

-

reserved

保留位。

0x0000

[1]

RW

TXDMAE

DMA发送FIFO使能寄存器。

0:禁止;

1:使能。

0x0

[0]

RW

RXDMAE

DMA接收FIFO使能寄存器。

0:禁止;

1:使能。

0x0

SPITXFIFOCR

SPITXFIFOCR为发送FIFO控制寄存器。

Offset Address: 0x028 Total Reset Value: 0x0009

Bits

Access

Name

Description

Reset

[15:6]

-

reserved

保留。

0x000

[5:3]

RW

TXINTSize

配置发送FIFO请求中断的水线。即,发送FIFO中数据数目小于或等于TXINTSize所配置的字数时,TXRIS有效。

000:1;

001:4;

010:8;

011:16;

100:32;

101:64;

110:128;

111:128。

0x1

[2:0]

RW

DMATXBRSize

配置发送FIFO请求DMA进行burst传输的水线。即,发送FIFO中数据数目小于或等于(256-DMATXBRSize)所配置的字数时,DMATXBREQ有效,此处字长是16位。

000:1;

001:4;

010:8;

011:16;

100:32;

101:64;

110:64;

111:64。

0x1

SPIRXFIFOCR

SPIRXFIFOCR为接收FIFO控制寄存器。

Offset Address: 0x02C Total Reset Value: 0x0009

Bits

Access

Name

Description

Reset

[15:6]

-

reserved

保留。

0x000

[5:3]

RW

RXINTSize

配置接收FIFO请求中断的水线。即,接收FIFO中数据数目大于或等于(256-RXINTSize)所配置的字数时,RXRIS有效,此处字长是16位。

000:1;

001:4;

010:8;

011:16;

100:32;

101:64;

110:128;

111:192。

0x1

[2:0]

RW

DMARXBRSize

配置接收FIFO请求DMA进行burst传输的水线。即,接收FIFO中数据数目大于或等于DMARXBRSize所配置的字数时,DMARXBREQ有效。

000:1;

001:4;

010:8;

011:16;

100:32;

101:64;

110:96;

111:128。

0x1

GPIO

概述

芯片支持11组GPIO(General Purpose Input/Output),即GPIO0~GPIO10。每组GPIO提供8个可编程的输入输出管脚。

每个管脚可以配置为输入或者输出。这些管脚用于生成特定应用的输出信号或采集特定应用的输入信号。作为输入管脚时,GPIO可作为中断源;作为输出管脚时,每个GPIO都可以独立地清0或置1。

GPIO可以根据电平或跳变值产生可屏蔽的中断。GPIOINTR(General Purpose Input Output Interrupt)信号给中断控制器一个指示,表示有中断发生。

须知:

  • GPIO具体管脚个数、管脚与其他管脚复用及相关复用控制的说明请参见 Hi35xxVxxx_PINOUT_CN.xlsx(Hi35xxVxxx表示具体项目名称)。
  • 对于默认是输出信号的管脚上复用的GPIO,请注意对接芯片和器件的管脚必须是输入。

特点

每个GPIO管脚均可配置为输入、输出。

  • 作为输入管脚时,可作为中断源。
  • 作为输出管脚时,每个GPIO管脚都可以独立地清0或置1。

工作方式

接口复位

在芯片上电复位或系统复位时,GPIO模块同时被复位,GPIO管脚在复位之后处于输入状态。

通用输入输出

每个管脚可以配置为输入或者输出,具体步骤如下:

  1. 参考“管脚复用控制寄存器”配置管脚的相应位,使能需要使用的GPIO管脚功能。
  2. 配置寄存器GPIO_DIR,选择GPIO是作为输入还是输出。
  3. 当配置成输入管脚时,读取GPIO_DATA寄存器可查看输入信号值;当配置成输出管脚时,通过向GPIO_DATA寄存器写入输出值可控制GPIO管脚输出电平。

须知:

当GPIO用作输出时,应不使能GPIO的中断功能,否则当输出信号符合中断产生条件时,会产生GPIO中断。

中断操作

GPIO的中断通过GPIO_IS等7个寄存器进行控制。通过这些寄存器可以选择中断源、极性以及边沿特性。GPIO对应的中断号请参见“3.3 中断系统”。

当有多个中断同时发生时,将会统一汇集成一个中断进行上报,GPIO的中断映射关系请参见“3.3 中断系统”。

GPIO_IS、GPIO_IBE、GPIO_IEV三个寄存器共同决定了中断源的特性和中断触发类别。

通过GPIO_RIS和GPIO_MIS分别读取中断的原始状态和屏蔽后的状态。通过GPIO_IE可以控制中断的最终上报情况。此外还提供了单独的GPIO_IC用于对中断状态进行清除控制。

每个GPIO管脚都可以配置成中断模式,配置步骤如下:

  1. 配置GPIO_IS,选择边沿触发或电平触发。
  2. 配置GPIO_IEV,选择下降沿/上升沿触发和高电平/低电平触发。
  3. 如果选择边沿触发,需配置GPIO_IBE,选择单沿或双沿触发方式。
  4. 向寄存器GPIO_IC写0xFF,清中断。
  5. 配置GPIO_IE为1,使能中断。

须知:

初始化过程中GPIO管脚上数据需保持稳定,以免产生假中断。

GPIO的中断设置由7个寄存器控制。当有一个或多个GPIO管脚产生中断,一个组合中断会输送到中断控制器。边沿触发和电平触发有以下不同。

  • 边沿触发的中断:软件必须清除该中断以使能更深的中断。
  • 电平触发的中断:外部中断源应该保持该电平直到处理器识别到该中断。

GPIO寄存器概览

芯片的GPIO基地址如表1所示。

表 1 芯片GPIO寄存器对应的基地址

GPIO控制器

基地址

GPIO10

0x1109_A000

GPIO9

0x1109_9000

GPIO8

0x1109_8000

GPIO7

0x1109_7000

GPIO6

0x1109_6000

GPIO5

0x1109_5000

GPIO4

0x1109_4000

GPIO3

0x1109_3000

GPIO2

0x1109_2000

GPIO1

0x1109_1000

GPIO0

0x1109_0000

说明:

GPIOn对应的寄存器地址:GPIOn基地址+该寄存器偏移地址。

表2是单组GPIO内部寄存器的偏移地址以及定义,GPIO0~GPIO10具有相同的寄存器组。

表 2 GPIO寄存器概览

偏移地址

名称

描述

0x000~0x3FC

GPIO_DATA

GPIO数据寄存器

0x400

GPIO_DIR

GPIO方向控制寄存器

0x404

GPIO_IS

GPIO中断触发寄存器

0x408

GPIO_IBE

GPIO双沿触发中断寄存器

0x40C

GPIO_IEV

GPIO触发中断条件寄存器

0x410

GPIO_IE

GPIO中断屏蔽寄存器

0x414

GPIO_RIS

GPIO原始中断状态寄存器

0x418

GPIO_MIS

GPIO屏蔽状态中断寄存器

0x41C

GPIO_IC

GPIO中断清除寄存器

GPIO寄存器描述

GPIO_DATA

GPIO_DATA为GPIO数据寄存器。用来对输入或输出数据进行缓存。

当配置GPIO_DIR中对应位为输出时,写入GPIO_DATA寄存器的值将会输出到相应的管脚(注意需要配置正确的管脚复用);如果配置为输入时,将会读取相应输入管脚的值。

须知:

当GPIO_DIR相应的比特配置为输入时,有效读取的结果将返回管脚的值;当配置为输出的时候,有效读取的结果将返回写入的值。 GPIO_DATA寄存器利用PADDR[9:2]实现了读写寄存器比特的屏蔽操作。该寄存器对应256个地址空间。PADDR[9:2]分别对应GPIO_DATA[7:0],当相应的bit为高时,则可以对相应的位进行读写操作;反之,若对应bit为低则不能进行操作。例如:

  • 若地址为0x3FC(0b11_1111_1100),则对GPIO_DATA[7:0]这8bit操作全部有效。
  • 若地址为0x200(0b10_0000_0000),则仅对GPIO_DATA[7]的操作有效。

Offset Address: 0x000~0x3FC Total Reset Value: 0x00

Bits

Access

Name

Description

Reset

[7:0]

RW

gpio_data

当GPIO配置为输入模式时,为GPIO输入数据;当GPIO配置为输出模式时,为输出数据。各比特均可独立控制。与GPIO_DIR配合使用。

0x00

GPIO_DIR

GPIO_DIR为GPIO方向控制寄存器。用来配置GPIO管脚方向。

Offset Address: 0x400 Total Reset Value: 0x00

Bits

Access

Name

Description

Reset

[7:0]

RW

gpio_dir

GPIO方向控制寄存器。bit[7:0]分别对应GPIO_DATA[7:0],各比特可独立控制。

0:输入;

1:输出。

0x00

GPIO_IS

GPIO_IS为GPIO中断触发寄存器。用来配置GPIO管脚触发电平方式。

Offset Address: 0x404 Total Reset Value: 0x00

Bits

Access

Name

Description

Reset

[7:0]

RW

gpio_is

GPIO中断触发控制寄存器,bit[7:0]分别对应GPIO_DATA[7:0],各比特独立控制。

0:边沿触发中断;

1:电平触发中断。

0x00

GPIO_IBE

GPIO_IBE为GPIO双沿触发中断寄存器。用来配置GPIO管脚沿触发方式。

Offset Address: 0x408 Total Reset Value: 0x00

Bits

Access

Name

Description

Reset

[7:0]

RW

gpio_ibe

GPIO中断沿触发控制寄存器,bit[7:0]分别对应GPIO_DATA[7:0],各比特独立控制。

0:单边沿触发中断,具体是上升沿还是下降沿触发由GPIO_IEV控制;

1:双边触发中断。

0x00

GPIO_IEV

GPIO_IEV为GPIO触发中断条件寄存器。用来配置GPIO管脚触发中断条件。

Offset Address: 0x40C Total Reset Value: 0x00

Bits

Access

Name

Description

Reset

[7:0]

RW

gpio_iev

GPIO触发中断条件寄存器,bit[7:0]分别对应GPIO_DATA[7:0],各比特独立控制。

0:下降沿或低电平触发中断;

1:上升沿或高电平触发中断。

0x00

GPIO_IE

GPIO_IE为GPIO中断屏蔽寄存器。用来屏蔽GPIO管脚中断。

Offset Address: 0x410 Total Reset Value: 0x00

Bits

Access

Name

Description

Reset

[7:0]

RW

gpio_ie

GPIO中断屏蔽寄存器,bit[7:0]分别对应GPIO_DATA[7:0],各比特独立控制。

0:屏蔽中断;

1:不屏蔽中断。

0x00

GPIO_RIS

GPIO_RIS为GPIO原始中断状态寄存器。用来查询GPIO管脚原始中断状态。

Offset Address: 0x414 Total Reset Value: 0x00

Bits

Access

Name

Description

Reset

[7:0]

RO

gpio_ris

GPIO原始中断寄存器,bit[7:0]分别对应GPIO_DATA[7:0],指示未屏蔽的中断状态。该状态不受GPIO_IE寄存器屏蔽控制。

0:未发生中断;

1:已发生中断。

0x00

GPIO_MIS

GPIO_MIS为GPIO屏蔽状态中断寄存器。用来查询GPIO管脚屏蔽后的中断状态。

Offset Address: 0x418 Total Reset Value: 0x00

Bits

Access

Name

Description

Reset

[7:0]

RO

gpio_mis

GPIO屏蔽后中断寄存器,bit[7:0]分别对应GPIO_DATA [7:0],指示经屏蔽后的中断状态。该状态受GPIO_IE寄存器屏蔽控制。

0:中断无效;

1:中断有效。

0x00

GPIO_IC

GPIO_IC为GPIO中断清除寄存器。用来清除GPIO管脚产生的中断,同时清除GPIO_RIS寄存器和GPIO_MIS寄存器。

Offset Address: 0x41C Total Reset Value: 0x00

Bits

Access

Name

Description

Reset

[7:0]

WC

gpio_ic

GPIO中断清除寄存器,bit[7:0]分别对应GPIO_DATA [7:0],各比特可独立控制。

0:无影响;

1:清除中断。

0x00

USB DRD

概述

芯片支持1个USB2.0 DRD (Dual Role Device)接口,支持工作在USB2.0 Host模式或USB2.0 Device模式,不支持动态切换。

  • USB2.0 Host支持USB2.0协议规定的480Mbps/12Mbps/1.5Mbps三种传输速率;支持控制传输、批量传输、同步传输、中断传输四种基本的传输方式;内部集成一个Root Hub,最多同时支持64个设备;支持XHCI协议规范。
  • USB2.0 Device支持480Mbps/12Mbps两种传输速率,支持控制传输、批量传输、同步传输、中断传输四种基本的传输方式,支持3个IN端点和3个OUT端点(控制端点除外)。

USB DRD主要完成:

  • 协议的控制和处理
  • 数据的解析和打包
  • 传输信号的编码和解码
  • 为驱动程序提供中断向量接口

功能描述

逻辑框图

USB 2.0 DRD逻辑框图如图1所示。

图 1 USB 2.0 DRD逻辑框图

UTMI:USB2.0 Transceiver Macrocell Interface

XHCI:eXtensible Host Controller Interface

功能特点

USB2.0 DRD具有以下功能特点:

  • 支持USB2.0协议,向下兼容 USB 1.1协议。
  • 支持工作在Host模式或Device 模式,不支持动态切换。
  • Host模式支持480Mbps、12Mbps、1.5Mbps三种传输速率。
  • Device模式支持480Mbps、12Mbps两种传输速率,支持3个IN端点和3个OUT端点(控制端点除外)。
  • 支持USB 2.0 Suspend、Resume、Remote wakeup低功耗特性。
  • 支持控制传输、批量传输、同步传输、中断传输四种基本的传输方式。
  • 支持DMA数据存取。
  • Host模式支持外扩USB Hub,最多可连接64个设备。

工作原理

USB2.0工作于Host 模式时,支持以下4种标准的传输方式:

  • Control Transfer(控制传输)

    主要用于USB Host与USB Device端点0之间的传输。控制传输是双向传输,数据量通常较小,可以传输8byte、16byte、32byte或64byte的数据,取决于设备和传输速率。

  • Bulk Transfer(批量传输)

    主要用于没有带宽和间隔时间要求的设备的数据传输,这类设备适合于传输非常慢和大量的被延迟的数据,可以等到所有其它类型的数据传输完成之后再传输。它的特点是以错误检测和重传的方式保证USB Host与USB Device之间无差错的数据传输。

  • Isochronous Transfer(同步传输)

    主要用于时间严格并具有较强容错性的流数据传输,或者用于数据传输速率恒定的即时应用中。同步传输提供了确定的带宽和间隔时间。

  • Interrupt Transfer(中断传输)

    主要用于少量、分散、不可预测的数据的传输。中断传输方式下,定时查询设备是否有中断数据要发送。设备的端点模式器的结构决定了它的查询频率为1ms~255ms。典型的中断方式传输是单向的,并且对于USB Host来说只有输入的方式。

工作方式

USB2.0 DRD时钟复位

在初始化控制器之前,对时钟复位寄存器做相应的配置。

步骤如下:

  1. 向PERI_CRG3632[4]写0x1,打开USB2.0 PHY的参考时钟;
  2. 向PERI_CRG3632[0]写0x0,撤离USB2.0 PHY的Power-On Reset复位,延时1毫秒;
  3. 向USB2_PHY_ANA_CFG5[1:0]写0x3,使USB2 PHY待机时保持PLL常开;
  4. 向PERI_CRG3632[1]写入0x0,撤离USB2.0 PHY的数字复位;
  5. 向PERI_CRG3634[0]写入0x0,撤离USB2.0控制器的复位。

USB2.0 PHY眼图参数

USB DRD控制器对应USB2.0 PHY。

说明:

调节PHY的参数时,需注意只改动对应控制比特位的值,其他比特位的值保持不变。

USB2.0 PHY寄存器概览

USB2.0 PHY寄存器映射表如表1所示。

表 1 USB2.0 PHY寄存器映射表(基地址是0x1031_0000)

偏移地址

名称

描述

0x0000

USB2_PHY_ANA_CFG0

USB2 PHY pre-drive调节寄存器

0x0010

USB2_PHY_ANA_CFG4

USB2 PHY高速眼图幅度配置寄存器

0x0014

USB2_PHY_ANA_CFG5

USB2 PHY的PLL配置寄存器

USB2.0 PHY寄存器描述

USB2_PHY_ANA_CFG0

USB2_PHY_ANA_CFG0为USB2 PHY pre-drive调节寄存器。

Offset Address: 0x0000 Total Reset Value: 0x0A33_C003

Bits

Access

Name

Description

Reset

[31:28]

-

Reserved

保留。

0x0

[27:24]

RW

usb2_phy_rg_hstx_pdrv_p

配置Pre-drive强度的档位:bit<0>*1+bit<1>*2+bit<2>*4+bit<3>*8

0xA

[23:0]

-

Reserved

保留。

0x33C003

USB2_PHY_ANA_CFG4

USB2_PHY_ANA_CFG4为USB2 PHY高速眼图幅度配置寄存器。

Offset Address: 0x0010 Total Reset Value: 0x0000_0643

Bits

Access

Name

Description

Reset

[31:7]

-

Reserved

保留。

0x000000C

[6:4]

RW

usb2_phy_rg_vtxref_sel

配置HS眼图幅度的参考值(仅代表调节趋势,不代表精确值):

000:380mv

001:390mv

010:400mv

011:410mv

100:420mv

101:430mv

110:440mv

111:460mv

0x4

[3:0]

-

Reserved

保留。

0x3

USB2_PHY_ANA_CFG5

USB2_PHY_ANA_CFG5为USB2 PHY的PLL配置寄存器。

Offset Address: 0x0014 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:2]

-

Reserved

保留。

0x00000000

[1]

RW

rg_pll_en_cfg

PLL的寄存器使能,为1时PLL使能信号受rg_pll_en_value控制,不受suspend影响,高有效。

0:无效;

1:有效。

0x0

[0]

RW

rg_pll_en_val

PLL的寄存器使能信号的配置值。

0:不使能;

1:使能。

0x0

LSADC

概述

LSADC(Low Speed ADC)实现将外部模拟信号转换成一定比例的数字值,从而实现对模拟信号的测量,可应用于电量检测,按键检测等。

芯片提供1个LSADC。

  • Hi3516CV610-10B/20S/20G支持2个独立通道;
  • Hi3516CV610-00S/00G支持4个独立通道。

特点

LSADC具有以下特点:

  • 电源电压3.3V;
  • 扫描频率不能高于200kHz;
  • 10bit采样精度;
  • 支持单次扫描和连续扫描模式;
  • 支持16次平均算法模式和32次平均算法模式;
  • 扫描完成自动上报中断;
  • 支持多通道扫描防串扰。

工作方式

单次扫描处理流程

在单次读取模式(LSADC_CTRL0 [model_sel]=0),CPU配置扫描通道号(只能配置一个通道)、扫描模式、键值映射表信息,启动LSADC完成一次通道扫描。通道扫描完成后,通过中断通知系统扫描完成,CPU可以获取转换结果。

图 1 单次扫描处理流程

连续扫描处理流程

在连续读取模式(LSADC_CTRL0 [model_sel]=1),CPU根据应用场景设置连续扫描的时间间隔Tscan、毛刺宽度(Tglitch)、有效通道号(ch_vld),启动LSADC。LSADC在一个时间间隔Tscan内完成一个有效通道(配置LSADC_CTRL0通道是否有效指示位为有效)的扫描。在下一个扫描时刻到来时,启动对下一个有效通道的扫描。待完成对所有有效通道的扫描后,启动下一轮对有效通道的扫描。

以使能通道0、1为例,连续扫描模式下通道轮询扫描示意图如图1所示。

图 1 连续扫描模式下通道轮询扫描示意图

图 2 连续扫描处理流程

滤毛刺流程

滤毛刺电路采用多数判决算法。在滤毛刺窗口Tglitch中,如果出现多数次的ADC采样值value,且value不为空按键时ADC采样值,则认为value为一次有效的按键值,否则认为是一个毛刺信号。

  • 在单次读取模式下,不进行滤毛刺操作。
  • 在连续扫描模式下,使能滤毛刺功能,需要设置合适的滤毛刺时间窗口Tglitch。请参考LSADC_CTRL1寄存器的描述。

采样精度设置

通过LSADC_CTRL9 [9:0]可以设置采样精度,可以根据应用需要设置对应的采样精度。

  • 当采样精度设置成10bit时,采样结果10bit全部有效。
  • 当采样精度设置小于10bit时,对应的采样结果高位有效,例如:当采样精度设置成8bit时,采样结果的高8bit才有效。

平均算法设置

通过LSADC_CTRL0[12]可以选择通道采样的平均算法模式,可以根据应用需要设置对应的平均算法模式。请参考LSADC_CTRL0寄存器的描述。

  • 单次读取模式,不支持采样平均算法操作。
  • 连续扫描模式,可选择16次或32次平均算法。

以使能16次平均算法模式为例,连续扫描模式下通道平均算法示意图如图1所示。

图 1 16次平均算法处理流程

防串扰模式配置

连续扫描配置基础上,可通过配置如下寄存器防止通道间串扰。

LSADC寄存器概览

LSADC寄存器概览如表1所示。

表 1 LSADC寄存器概览(基地址:0x1110_0000)

偏移地址

名称

描述

0x0000

LSADC_CTRL0

LSADC配置寄存器

0x0004

LSADC_CTRL1

滤毛刺配置寄存器

0x0008

LSADC_CTRL2

扫描间隔配置寄存器

0x0010

LSADC_CTRL4

中断使能寄存器

0x0014

LSADC_CTRL5

中断状态寄存器

0x0018

LSADC_CTRL6

中断清除寄存器

0x001C

LSADC_CTRL7

Start配置寄存器

0x0020

LSADC_CTRL8

Stop配置寄存器

0x0024

LSADC_CTRL9

转换结果精度寄存器

0x0028

LSADC_CTRL10

LSADC_ZERO寄存器

0x002C

LSADC_CTRL11

LSADC通道0数据寄存器

0x0030

LSADC_CTRL12

LSADC通道1数据寄存器

0x0034

LSADC_CTRL13

LSADC通道2数据寄存器

0x0038

LSADC_CTRL14

LSADC通道3数据寄存器

0x0050

LSADC_CTRL20

LSADC通道0平均算法数据寄存器

0x0054

LSADC_CTRL21

LSADC通道1平均算法数据寄存器

0x0058

LSADC_CTRL22

LSADC通道2平均算法数据寄存器

0x005C

LSADC_CTRL23

LSADC通道3平均算法数据寄存器

LSADC寄存器描述

LSADC_CTRL0

LSADC_CTRL0为LSADC配置寄存器。

Offset Address: 0x0000 Total Reset Value: 0x0000_800F

Bits

Access

Name

Description

Reset

[31:29]

-

reserved

保留

0x00

[28:25]

RW

channel_scan_time

防串扰周期选择。

单个时钟周期为:333.3ns。

0x0:15个时钟周期;

0x1:20个时钟周期;

0x2:25个时钟周期;

0x3:30个时钟周期;

0x4:35个时钟周期;

0x5:40个时钟周期;

0x6:45个时钟周期;

0x7:50个时钟周期;

0x8:60个时钟周期;

0x9:70个时钟周期;

0xa:80个时钟周期;

0xb:100个时钟周期;

0xc:150个时钟周期;

其他:15个时钟周期。

0x0

[24]

RW

channel_scan_sel

防串扰使能配置bit[1]。

0:不使能;

1:使能。

0x0

[23:20]

RW

lsadc_data_delta

LSADC转换结果误差范围(在连续扫描模式下使用,配置两次转换结果间的误差范围,在误差范围内,则认定两次转换结果相同)。

0x0

[19:18]

-

reserved

保留。

0x0

[17]

RW

deglitch_bypass

滤毛刺功能bypass。(此功能在连续扫描模式下使用)

0:使能滤毛刺功能;

1:不使能滤毛刺功能。

0x0

[16]

RW

channel_scan_mode_sel

防串扰使能配置bit[0]。

0:不使能;

1:使能。

0x0

[15]

RW

lsadc_reset

设置LSADC是否进入复位状态。

0:退出复位状态;

1:进入复位状态。

0x1

[14]

-

reserved

保留。

0x0

[13]

RW

model_sel

LSADC扫描模式选择。

0:单次扫描模式;

1:连续扫描模式。

0x0

[12]

RW

equ_model_sel

LSADC平均算法模式选择。

0:16次平均算法模式;

1:32次平均算法模式。

0x0

[11]

RW

ch_3_vld

LSADC通道3是否有效。

0:无效;

1:有效。

0x0

[10]

RW

ch_2_vld

LSADC通道2是否有效。

0:无效;

1:有效。

0x0

[9]

RW

ch_1_vld

LSADC通道1是否有效。

0:无效;

1:有效。

0x0

[8]

RW

ch_0_vld

LSADC通道0是否有效。

0:无效;

1:有效。

0x0

[7:4]

RW

cnt_cs_time

防串扰模式下系统连续扫描周期选择。

单个时钟周期为:333.3ns。

0x0:20个时钟周期;

0x1:25个时钟周期;

0x2:30个时钟周期;

0x3:35个时钟周期;

0x4:40个时钟周期;

0x5:45个时钟周期;

0x6:50个时钟周期;

0x7:60个时钟周期;

0x8:70个时钟周期;

0x9:80个时钟周期;

0xa:100个时钟周期;

0xb:150个时钟周期;

0xc:200个时钟周期;

其他:20个时钟周期。

0x0

[3]

RW

ch_3_eq_enable

LSADC通道3采样平均算法是否有效。

0:无效;

1:有效。

0x1

[2]

RW

ch_2_eq_enable

LSADC通道2采样平均算法是否有效。

0:无效;

1:有效。

0x1

[1]

RW

ch_1_eq_enable

LSADC通道1采样平均算法是否有效。

0:无效;

1:有效。

0x1

[0]

RW

ch_0_eq_enable

LSADC通道0采样平均算法是否有效。

0:无效;

1:有效。

0x1

LSADC_CTRL1

LSADC_CTRL1为滤毛刺配置寄存器。

Offset Address: 0x0004 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:0]

RW

glitch_sample

滤毛刺时间窗口(当LSADC的转换结果在此时间窗口内保持不变时,则认为此转换结果为有效值,否则认为是毛刺,此窗口值一般设为ms级,在连续扫描模式下不能配置为0)。

0x00000000

LSADC_CTRL2

LSADC_CTRL2为扫描间隔配置寄存器。

Offset Address: 0x0008 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:0]

RW

time_scan

在连续扫描模式下,两个扫描通道之间连续扫描的时间间隔。时间间隔为 Tscan=time_scan*0.333us(连续扫描时间间隔应该大于LSADC的转换时间,即配置值不能少于0x20)。

0x00000000

LSADC_CTRL4

LSADC_CTRL4为中断使能寄存器。

Offset Address: 0x0010 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:1]

-

reserved

保留。

0x00000000

[0]

RW

int_enable

扫描值有效中断使能位。

0:不使能;

1:使能。

0x0

LSADC_CTRL5

LSADC_CTRL5为中断状态寄存器。

Offset Address: 0x0014 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:5]

-

reserved

保留。

写无效,读为0。

0x00000000

[4]

RO

lsadc_auto_busy

在自动扫描模式下,LSADC busy状态指示。

0:IDLE;

1:BUSY。

0x0

[3]

RO

int_flag_in3

通道3扫描值有效中断标志位。

0:无中断;

1:有中断。

0x0

[2]

RO

int_flag_in2

通道2扫描值有效中断标志位。

0:无中断;

1:有中断。

0x0

[1]

RO

int_flag_in1

通道1扫描值有效中断标志位。

0:无中断;

1:有中断。

0x0

[0]

RO

int_flag_in0

通道0扫描值有效中断标志位。

0:无中断;

1:有中断。

0x0

LSADC_CTRL6

LSADC_CTRL6为中断清除寄存器。

Offset Address: 0x0018 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:4]

-

reserved

保留。

0x0000000

[3]

WO

clr_int_flag_in3

通道3中断清除寄存器。

0:不清除;

1:清除中断。

0x0

[2]

WO

clr_int_flag_in2

通道2中断清除寄存器。

0:不清除;

1:清除中断。

0x0

[1]

WO

clr_int_flag_in1

通道1中断清除寄存器。

0:不清除;

1:清除中断。

0x0

[0]

WO

clr_int_flag_in0

通道0中断清除寄存器。

0:不清除;

1:清除中断。

0x0

LSADC_CTRL7

LSADC_CTRL7为Start配置寄存器。

Offset Address: 0x001C Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:0]

WO

start

LSADC启动信号(向此寄存器写任意值都可以启动LSADC)。

0x00000000

LSADC_CTRL8

LSADC_CTRL8为Stop配置寄存器。

Offset Address: 0x0020 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:0]

WO

stop

停止自动扫描(在自动扫描模式下,向此寄存器写任意值都可以停止LSADC的自动扫描功能,需再写使能start才可以重新启动自动扫描)。

0x00000000

LSADC_CTRL9

LSADC_CTRL9为转换结果精度寄存器。

Offset Address: 0x0024 Total Reset Value: 0x0000_03FF

Bits

Access

Name

Description

Reset

[31:10]

-

reserved

保留。

0x000000

[9:0]

RW

lsadc_active_bit

LSADC转换结果精度。

10'b1111111111表示10比特精度;

10'b1111111110表示9比特精度;

……

10'b1000000000表示1比特精度

0x3FF

LSADC_CTRL10

LSADC_CTRL10为LSADC_ZERO寄存器。

Offset Address: 0x0028 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:10]

-

reserved

保留。

0x000000

[9:0]

RW

lsadc_zero

键盘无键按下时LSADC的值。

0x000

LSADC_CTRL11

LSADC_CTRL11为LSADC通道0数据寄存器。

Offset Address: 0x002C Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:10]

-

reserved

保留。

0x000000

[9:0]

RO

lsadc_data_in0

LSADC通道0扫描值。

0x000

LSADC_CTRL12

LSADC_CTRL12为LSADC通道1数据寄存器。

Offset Address: 0x0030 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:10]

-

reserved

保留。

0x000000

[9:0]

RO

lsadc_data_in1

LSADC 通道1扫描值。

0x000

LSADC_CTRL13

LSADC_CTRL13为LSADC通道2数据寄存器。

Offset Address: 0x0034 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:10]

-

reserved

保留。

0x000000

[9:0]

RO

lsadc_data_in2

LSADC通道2扫描值。

0x000

LSADC_CTRL14

LSADC_CTRL14为LSADC通道3数据寄存器。

Offset Address: 0x0038 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:10]

-

reserved

保留。

0x000000

[9:0]

RO

lsadc_data_in3

LSADC通道3扫描值。

0x000

LSADC_CTRL20

LSADC_CTRL20为LSADC通道0平均算法数据寄存器。

Offset Address: 0x0050 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:16]

-

reserved

保留。

0x0000

[15]

RO

lsadc_equ_value_valid_0

LSADC通道0采样平均算法结果有效指示。

0:无效;

1:有效。

0x0

[11:10]

-

reserved

保留。

0x0

[9:0]

RO

lsadc_equ_value_0

LSADC 通道0采样平均算法结果。

0x000

LSADC_CTRL21

LSADC_CTRL21为LSADC通道1平均算法数据。

Offset Address: 0x0054 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:16]

-

reserved

保留。

0x0000

[15]

RO

lsadc_equ_value_valid_1

LSADC通道1采样平均算法结果有效指示。

0:无效;

1:有效。

0x0

[11:10]

-

reserved

保留。

0x0

[9:0]

RO

lsadc_equ_value_1

LSADC 通道1采样平均算法结果。

0x000

LSADC_CTRL22

LSADC_CTRL22为LSADC通道2平均算法数据寄存器。

Offset Address: 0x0058 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:16]

-

reserved

保留。

0x0000

[15]

RO

lsadc_equ_value_valid_2

LSADC通道2采样平均算法结果有效指示。

0:无效;

1:有效。

0x0

[11:10]

-

reserved

保留。

0x0

[9:0]

RO

lsadc_equ_value_2

LSADC 通道2采样平均算法结果。

0x000

LSADC_CTRL23

LSADC_CTRL23为LSADC通道3平均算法数据寄存器。

Offset Address: 0x005C Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:16]

-

reserved

保留。

0x0000

[15]

RO

lsadc_equ_value_valid_3

LSADC通道3采样平均算法结果有效指示。

0:无效;

1:有效。

0x0

[11:10]

-

reserved

保留。

0x0

[9:0]

RO

lsadc_equ_value_3

LSADC 通道3采样平均算法结果。

0x000

PWM0

概述

芯片中有1个可编程PWM0控制器,包含4路输出,对应管脚SVB_PWM/PWM0_OUT1/PWM0_OUT2/PWM0_OUT3。

警告:

  • 管脚SVB_PWM为系统调压专用,相关寄存器不可擅自配置,否则可能引发SVB异常。
  • PWM0不支持工作时钟、复位和输出脉冲个数配置,仅支持输出周期、占空比和极性配置,建议优先选择PWM1。

对于PWM0控制器输出:

  • 工作时钟为50MHz。
  • 输出周期可配置。支持最高25MHz(50MHz/2)输出,最低约50KHz(50MHz/1000)输出。
  • 输出高电平拍数可配置。
  • 周期和占空比计数器为10bits。通过配置PWM0相关的寄存器,可实现指定周期和占空比的PWM输出。

配置流程

PWM0_OUT(n)输出配置流程如下:

  1. 根据所需的PWM输出频率(Freq)和占空比(duty),计算出对应的PWM循环周期数和高电平计数值。

    循环周期数计算公式为:

    pwm0_out(n)_period =(50000000/Freq)-1

    高电平周期数计算公式为:

    pwm0_out(n)_duty =(50000000/Freq)*duty-1

  2. 配置PWM循环周期数_pwm0_out__(n)_period_和高电平周期数寄存器_pwm0_out(n)_duty_。

  3. 配置PWM0_OUT(n)_CTRL[2]为1,加载配置的参数,使配置的参数生效。
  4. 配置PWM0_OUT(n)_CTRL[0]为1,使能PWM输出。

    说明:

    上述步骤中50000000为工作时钟, n=1, 2, 3,对应三个PWM0_OUT通道。步骤2~步骤4可以一起配置。

例如:PWM0_OUT1需要输出1个频率为50KHz,高电平占72.5%(即占空比)的波形。

循环周期数配置为50MHz/50KHz=1000,四舍五入后为1000,十六进制为0x3E8,根据步骤1减1后为0x3E7。高电平周期数配置为1000(周期数)x 72.5%(占空比)=725,四舍五入后为725,十六进制为0x2D5,根据步骤1减1后为0x2D4。

计算完毕后,配置:

  • PWM0_OUT1_CTRL[25:16]为0x2D4

  • PWM0_OUT1_CTRL[13:4]为0x3E7

  • PWM0_OUT1_CTRL[2]为1
  • PWM0_OUT1_CTRL[0]为1

即配置PWM0_OUT1寄存器为0x02D43E75,可输出所需要的波形。

PWM0寄存器概览

PWM0寄存器概览如表1所示。

表 1 PWM0寄存器概览(基址是0x1102_9000)

偏移地址

名称

描述

0x0000

SVB_PWM_CTRL

SVB_PWM控制寄存器

0x0004

PWM0_OUT1_CTRL

PWM0_OUT1控制寄存器

0x0008

PWM0_OUT2_CTRL

PWM0_OUT2控制寄存器

0x000C

PWM0_OUT3_CTRL

PWM0_OUT3控制寄存器

PWM0寄存器描述

SVB_PWM_CTRL

SVB_PWM_CTRL为 SVB_PWM控制寄存器。

Offset Address: 0x0000 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:0]

-

reserved

保留。

注意:该寄存器为系统调压专用寄存器,不可配置,否则会导致系统电压异常。

0x00000000

PWM0_OUT1_CTRL

PWM0_OUT1_CTRL为PWM0_OUT1控制寄存器。

Offset Address: 0x0004 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:26]

-

reserved

保留。

0x00

[25:16]

RW

pwm0_out1_duty

PWM0_OUT1输出的高电平周期数,实际高电平周期数为此数值加1。

0x000

[15:14]

-

reserved

保留。

0x0

[13:4]

RW

pwm0_out1_period

PWM0_OUT1输出的循环周期数,实际周期数为此数值加1。

0x000

[3]

-

reserved

保留。

0x0

[2]

W1_PULSE

pwm0_out1_load

PWM0_OUT1输出参数加载控制,向此值写1使参数生效。

0x0

[1]

RW

pwm0_out1_inv

PWM0_OUT1输出正反相位控制。

0:正相;

1:反相。

0x0

[0]

RW

pwm0_out1_enable

PWM0_OUT1使能控制。

0:不使能;

1:使能。

0x0

PWM0_OUT2_CTRL

PWM0_OUT2_CTRL为PWM0_OUT2控制寄存器。

Offset Address: 0x0008 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:26]

-

reserved

保留。

0x00

[25:16]

RW

pwm0_out2_duty

PWM0_OUT2输出的高电平周期数,实际高电平周期数为此数值加1。

0x000

[15:14]

-

reserved

保留。

0x0

[13:4]

RW

pwm0_out2_period

PWM0_OUT2输出的循环周期数,实际周期数为此数值加1。

0x000

[3]

-

reserved

保留。

0x0

[2]

W1_PULSE

pwm0_out2_load

PWM0_OUT2输出参数加载控制,向此值写1使参数生效。

0x0

[1]

RW

pwm0_out2_inv

PWM0_OUT2输出正反相位控制。

0:正相;

1:反相。

0x0

[0]

RW

pwm0_out2_enable

PWM0_OUT2使能控制。

0:不使能;

1:使能。

0x0

PWM0_OUT3_CTRL

PWM0_OUT3_CTRL为PWM0_OUT3控制寄存器。

Offset Address: 0x000C Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:26]

-

reserved

保留。

0x00

[25:16]

RW

pwm0_out3_duty

PWM0_OUT3输出的高电平周期数,实际高电平周期数为此数值加1。

0x000

[15:14]

-

reserved

保留。

0x0

[13:4]

RW

pwm0_out3_period

PWM0_OUT3输出的循环周期数,实际周期数为此数值加1。

0x000

[3]

-

reserved

保留。

0x0

[2]

W1_PULSE

pwm0_out3_load

PWM0_OUT3输出参数加载控制,向此值写1使参数生效。

0x0

[1]

RW

pwm0_out3_inv

PWM0_OUT3输出正反相位控制。

0:正相;

1:反相。

0x0

[0]

RW

pwm0_out3_enable

PWM0_OUT3使能控制。

0:不使能;

1:使能。

0x0

PWM1

概述

PWM1为脉冲宽度调节信号模块,用来输出周期性脉冲信号。

芯片提供1组PWM1控制器:

最多提供8路脉冲宽度调制信号输出,对应管脚PWM1_OUT0~7。

特点

PWM1控制器支持的特性:

  • 工作时钟

    PWM1支持198MHz/24MHz/1MHz(详见“系统”章节PERI_CRG4454)切换。

  • 每路PWM输出支持独立使能。如:PWM1_OUT3为一路输出。

  • 支持周期方波输出模式,周期可配。
  • 支持固定数目方波输出模式,方波数目可配。
  • 支持脉冲信号左对齐、右对齐、中间对齐。
  • 支持脉冲信号极性可控。
  • 支持周期、占空比、对齐模式、极性等配置动态更新。
  • 支持多路PWM信号同步输出,支持单次同步输出和循环输出两种同步模式。
  • 支持占空比配置范围:0%~100%(占空比0%一直是低电平,占空比100%一直是高电平,配置流程如配置流程章节所示)。

工作方式

对齐模式

PWM1输出的脉冲信号支持三种模式:左对齐,右对齐和中间对齐。可以通过配置PWM(n)_ctrl.pwm(n)_align_mode_cfg来设置每路PWM输出的脉冲对齐模式。

左对齐模式

图 1 左对齐输出波形

将PWM(n)_ctrl.pwm(n)_align_mode_cfg 配置为 1。左对齐模式。

该模式下,PWM先根据占空比配置输出有效信号电平,再输出无效信号电平直到配置的周期输出完成。

有效信号电平默认为高,并可以通过配置PWM(n)_ctrl.pwm(n)_inv_cfg来控制。当PWM(n)_ctrl.pwm(n)_inv_cfg配置为1时,有效信号电平为低,对应的波形为PWM_INV。

右对齐模式

图 1 右对齐输出波形

将PWM(n)_ctrl.pwm(n)_align_mode_cfg配置为0,PWM输出为右对齐模式。该模式下,PWM先输出无效信号电平,再根据占空比配置输出有效信号电平。

有效信号电平默认为高,并可以通过配置PWM(n)_ctrl.pwm(n)_inv_cfg来控制。当PWM(n)_ctrl.pwm(n)_inv_cfg配置为1时,有效信号电平为低,对应的波形为PWM_INV。

中间对齐模式

须知:

中间对齐模式下仅支持占空比和周期数为偶数。

图 1 中间对齐输出波形

将PWM(n)_ctrl.pwm(n)_align_mode_cfg配置为2,PWM输出为中间对齐模式。

PWM先输出无效信号电平,再按占空比配置输出有效信号电平,最后再输出无效信号电平。整个周期中,有效信号电平位于中央。

有效信号电平默认为高,并可以通过配置PWM(n)_ctrl.pwm(n)_inv_cfg来控制。当PWM(n)_ctrl.pwm(n)_inv_cfg配置为1时,有效信号电平为低,对应的波形为PWM_INV。

同步模式

每个PWM控制器提供的多路PWM信号进行同步输出,各路的同步延时独立可配。如图1。

图 1 同步模式输出波形

从起始点START开始,各路PWM根据PWM(n)_sync_delay_cfg寄存器配置来延时启动各自的PWM。每路PWM的周期,占空比,对齐方式等可以独立配置。

PWM同步模式下支持触发模式和循环输出两种模式。

  • 触发模式(适用于输出若干个脉冲信号)

    每路PWM输出信号完成配置脉冲输出信号数目后,则停止输出。直到下一次START启动为止。

    注:触发模式需要把PWM(n)_sync_cfg.pwm(n)_sync_mux同步源头设置为非工作状态的PWM输出。

  • 循环模式(周期性输出脉冲信号)

    每路PWM通过PWM(n)_sync_cfg.pwm(n)_sync_mux来配置同步源头,当同步源头对应的PWM信号完成所配置PWM输出后,相关同步每一路PWM都会进行一次重载,重新进行START状态,以此实现周期性的输出。

    注:循环模式设置同步延时PWM(n)_sync_delay_cfg的情况下,需要保证PWM(n)_sync_cfg.pwm(n)_sync_mux同步源头的延时值最小。

配置流程

通用模式

配置流程如下:

  1. 配置对应的CRG寄存器(PERI_CRG4454),打开时钟门控。
  2. 通过计算得到需要的周期数和高电平拍数,并写入寄存器PWM(n)_duty0_cfg、PWM(n)_period。
  3. 如果需要周期性输出脉冲信号,将寄存器PWM(n)_ctrl[2]位域配置为1。如果需要输出固定个数脉冲信号,将寄存器PWM(n)_ctrl[2]配置为0,并将脉冲个数写入寄存器PWM(n)_num_cfg。
  4. 根据输出脉冲信号对齐方式配置寄存器PWM(n)_ctrl[5:4]。
  5. 根据输出脉冲信号极性需求配置寄存器PWM(n)_ctrl[1]。
  6. 配置脉冲使能寄存器PWM(n)_ctrl[0],写入1,使能PWM输出。

例如:需要输出1个频率为4KHz,高电平占80%(即占空比),脉冲个数为10的波形,脉冲右对齐。

周期数配置为198MHz*1/4KHz=49500,四舍五入后为49500,十六进制为0x000C15C。高电平数配置为49500(周期数)x 80%(占空比)=39600,四舍五入后为39600,十六进制为0x00009AB0。

按如下步骤进行寄存器操作,即可输出所需要的波形:

  1. 配置对应的CRG寄存器(如PERI_CRG4454[4])写入0x1,打开PWM时钟。
  2. 配置PWM(n)_ctrl寄存器为0x100。
  3. 向PWM(n)_period_cfg写入0x000C15C。
  4. 向PWM(n)_duty0_cfg写入0x00009AB0。
  5. 向PWM(n)_num_cfg 写入0x9。
  6. 向PWM(n)_ctrl写入0x101(仅更新bit[0])。
  7. 读取PWM(n)_ctrl_st bit[0],等待bit0位为1(表示PWM正在输出方波)
  8. 读取PWM(n)_period和0x000C15C进行校验。
  9. 读取PWM(n)_duty0和0x00009AB0进行校验。
  10. 读取PWM(n)_num bit[15:0]和0x09进行校验(当PWM(n)_ctrl_st bit[0]为1时表示PWM正在输出方波,当该位为0时表示已经输出完设定的方波数目)。

占空比0%和100%配置方法

占空比100%配置流程

例如:需要输出1个高电平。

周期数配置为198MHz*1/4KHz=49500,四舍五入后为49500,十六进制为0x0000C15C。高电平数配置为49500(周期数)x100%(占空比)=49500,四舍五入后为49500,十六进制为0x0000C15C。

按如下步骤进行寄存器操作,即可输出所需要的波形:

  1. 配置对应的CRG寄存器(如PERI_CRG4454[4])写入0x1,打开PWM时钟。
  2. 配置PWM(n)_ctrl寄存器为0x104。
  3. 向PWM(n)_period_cfg写入0x0000C15B。
  4. 向PWM(n)_duty0_cfg写入0x0000C15B。
  5. 向PWM(n)_ctrl写入0x105(仅更新bit[0])。

占空比0%配置流程

例如:需要输出1个低电平。

周期数配置为198MHz*1/4KHz=49500,四舍五入后为49500,十六进制为0x0000C15C。高电平数配置为49500(周期数)x100%(占空比)=49500,四舍五入后为49500,十六进制为0x0000C15C。

按如下步骤进行寄存器操作,即可输出所需要的波形:

  1. 配置对应的CRG寄存器(如PERI_CRG4454[4])写入0x1,打开PWM时钟。
  2. 配置PWM(n)_ctrl寄存器为0x106。(配置PWM正相输出占空比为100%,即PWM反相输出占空比为0%。这里配置pwm(n)_inv_cfg寄存器为1,PWM输出反相)
  3. 向PWM(n)_period_cfg写入0x0000C15B。
  4. 向PWM(n)_duty0_cfg写入0x0000C15B。
  5. 向PWM(n)_ctrl写入0x107(仅更新bit[0])。

同步模式

同步模式配置流程如下:

  1. 配置PWM同步模式,PWM(n)_sync_cfg bit[5]配置为0x1。
  2. 根据触发模式或循环模式配置寄存器。

  3. 配置PWM信号的模式(同通用模式的步骤1~8)

  4. 配置PWM_sync_start寄存器的对应bit启动PWM。

    例如:需要同步启动PWM0、PWM1、PWM5的话,则在PWM_sync_start寄存器写入0x23。

寄存器偏移地址变量表及概览

PWM1寄存器基地址:0x1108_0000

各模块的寄存器偏移地址中变量的取值范围和含义如表1所示。

表 1 各模块的寄存器偏移地址变量表

变量名称

取值范围

描述

n

0~7

PWM1模块的8个通道

PWM1寄存器概览

PWM1寄存器概览如表1所示。

表 1 PWM1寄存器概览

偏移地址

名称

描述

0x0000+0x100×n

PWM(n)_period_cfg

PWM(n)周期配置寄存器

0x0004+0x100×n

PWM(n)_duty0_cfg

PWM(n)占空比配置寄存器

0x0010+0x100×n

PWM(n)_num_cfg

PWM(n)输出方波数目配置寄存器

0x0014+0x100×n

PWM(n)_ctrl

PWM(n)工作模式配置寄存器

0x0030+0x100×n

PWM(n)_sync_cfg

PWM(n)同步模式配置寄存器

0x0034+0x100×n

PWM(n)_sync_delay_cfg

PWM(n)同步延时配置寄存器

0x0040+0x100×n

PWM(n)_period

PWM(n)实时周期回读寄存器

0x0044+0x100×n

PWM(n)_duty0

PWM(n)实时占空比回读寄存器

0x0050+0x100×n

PWM(n)_num

PWM(n)方波数量实时回读寄存器。

0x0054+0x100×n

PWM(n)_ctrl_st

PWM(n)实时工作状态回读寄存器

0x0074+0x100×n

PWM(n)_sync_delay

PWM(n)实时同步延时配置回读寄存器

0xFF0

PWM_sync_start

PWM同步启动使能寄存器

PWM1寄存器描述

PWM(n)_period_cfg

PWM(n)_period_cfg为PWM(n)周期配置寄存器。

Offset Address: 0x0000+0x100×n Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:20]

-

reserved

保留。

0x000

[19:0]

RW

pwm(n)_period_cfg

PWM n 周期配置。单位:时钟周期,实际值减一配置。

0x00000

PWM(n)_duty0_cfg

PWM(n)_duty0_cfg为PWM(n)占空比配置寄存器。

Offset Address: 0x0004+0x100×n Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:20]

-

reserved

保留。

0x000

[19:0]

RW

pwm(n)_duty0_cfg

PWM n 有效信号占空比配置。单位:时钟周期,实际值减一配置。

0x00000

PWM(n)_num_cfg

PWM(n)_num_cfg为PWM(n)输出方波数目配置寄存器。

Offset Address: 0x0010+0x100×n Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:16]

-

reserved

保留。

0x0000

[15:0]

RW

pwm(n)_num_cfg

PWM n 输出方波的数目配置。实际值减一配置。

只在pwm(n)_keep配置为0时才生效。

0x0000

PWM(n)_ctrl

PWM(n)_ctrl为PWM(n)工作模式配置寄存器。

Offset Address: 0x0014+0x100×n Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:6]

-

reserved

保留。

0x0000000

[5:4]

RW

pwm(n)_align_mode_cfg

PWM n对齐模式控制。

00:右对齐模式;

01:左对齐模式;

10:中间对齐模式;

其他:保留。

0x0

[3]

-

reserved

保留。

0x0

[2]

RW

pwm(n)_keep_cfg

PWM n输出模式控制。

0:输出pwm(n)_num个方波;

1:一直输出方波。

0x0

[1]

RW

pwm(n)_inv_cfg

PWM n输出正反相控制。

0:正常;

1:反相。

0x0

[0]

RW

pwm(n)_enable

PWM n使能控制。

0:关闭;

1:使能。

0x0

PWM(n)_sync_cfg

PWM(n)_sync_cfg为PWM(n)同步模式配置寄存器。

Offset Address: 0x0030+0x100×n Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:6]

-

reserved

保留。

0x0000000

[5]

RW

pwm(n)_sync_enable

PWM同步工作模式使能。

0:普通模式;

1:开启同步工作模式,由PWM_SYNC_START启动PWM功能。

0x0

[4]

RW

pwm(n)_sync_mode

PWM同步模式选择。

0:触发模式;

1:循环模式。

0x0

[3:0]

RW

pwm(n)_sync_mux

循环模式的重载信号源头选择。

0x0:来自PWM0 完成信号;

0x1:来自PWM1完成信号;

0x2:来自PWM2完成信号;

0x3:来自PWM3完成信号;

0x4:来自PWM4完成信号;

0x5:来自PWM5完成信号;

0x6:来自PWM6完成信号;

0x7:来自PWM7完成信号;

其他:保留。

0x0

PWM(n)_sync_delay_cfg

PWM(n)_sync_delay_cfg为PWM(n)同步延时配置寄存器。

Offset Address: 0x0034+0x100×n Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:20]

-

reserved

保留。

0x000

[19:0]

RW

pwm(n)_sync_delay_cfg

PWM n同步模式启动延时配置寄存器。单位:周期,实际减一配置。

0x00000

PWM(n)_period

PWM(n)_period为PWM(n)实时周期回读寄存器。

Offset Address: 0x0040+0x100×n Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:20]

-

reserved

保留。

0x000

[19:0]

RO

pwm(n)_period

PWM n 周期生效值。

0x00000

PWM(n)_duty0

PWM(n)_duty0为PWM(n)实时占空比回读寄存器。

Offset Address: 0x0044+0x100×n Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:20]

-

reserved

保留。

0x000

[19:0]

RO

pwm(n)_duty0

PWM n 占空比生效值。

0x00000

PWM(n)_num

PWM(n)_num为PWM(n)方波数量实时回读寄存器。

Offset Address: 0x0050+0x100×n Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:16]

RO

pwm(n)_num_cnt

PWM n 还需要输出的方波数目。

只有当pwm(n)_busy为1且pwm(n)_keep为0时才有意义。

0x0000

[15:0]

RO

pwm(n)_num

PWM n 输出方波的数目生效值。

0x0000

PWM(n)_ctrl_st

PWM(n)_ctrl_st为PWM(n)实时工作状态回读寄存器。

Offset Address: 0x0054+0x100×n Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:6]

-

reserved

保留。

0x0000000

[5:4]

RO

pwm(n)_align_mode

PWM n对齐模式生效值。

00:右对齐模式;

01:左对齐模式;

10:中间对齐模式;

其他:保留。

0x0

[3]

-

reserved

保留。

0x0

[2]

RO

pwm(n)_keep

PWM n输出模式生效值。

0:输出PWM(n)_num个方波;

1:一直输出方波。

0x0

[1]

RO

pwm(n)_inv

PWM n输出正反相生效值。

0:正常;

1:反相。

0x0

[0]

RO

pwm(n)_busy

PWM n工作状态。

0:空闲;

1:工作。

0x0

PWM(n)_sync_delay

PWM(n)_sync_delay为PWM(n)实时同步延时配置回读寄存器。

Offset Address: 0x0074+0x100×n Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:20]

-

reserved

保留。

0x000

[19:0]

RO

pwm(n)_sync_delay

PWM n同步模式启动延时配置生效值。

0x00000

PWM_sync_start

PWM_sync_start为PWM同步启动使能寄存器。

Offset Address: 0xFF0 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:8]

-

reserved

保留。

0x0000000

[7]

WO

pwm7_sync_start

PWM7启动配置寄存器,写1启动。

0x0

[6]

WO

pwm6_sync_start

PWM6启动配置寄存器,写1启动。

0x0

[5]

WO

pwm5_sync_start

PWM5启动配置寄存器,写1启动。

0x0

[4]

WO

pwm4_sync_start

PWM4启动配置寄存器,写1启动。

0x0

[3]

WO

pwm3_sync_start

PWM3启动配置寄存器,写1启动。

0x0

[2]

WO

pwm2_sync_start

PWM2启动配置寄存器,写1启动。

0x0

[1]

WO

pwm1_sync_start

PWM1启动配置寄存器,写1启动。

0x0

[0]

WO

pwm0_sync_start

PWM0启动配置寄存器,写1启动。

0x0