外围设备
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实现,既能配置出标准时序也能配置出非标准时序。
标准时序----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方式下的数据传输(中断方式写操作)
请遵循以下步骤:
- 配置I2C_HCNT和I2C_LCNT,使控制器工作在正确的模式下。
- 配置I2C_TX_WATERMARK为0x20。
- 配置I2C_GLB,使能控制器。
- 根据实际时序,参考时序描述原理完成时序配置。
- 配置I2C_CTRL1为0x1,启动控制器。
- 配置I2C_INTR_EN为0x811。
-
在中断服务程序里,查询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中断时,表示所有数据都已经写到从设备端。
-
配置I2C_INTR_EN为0x0,I2C_INTR_RAW为0x1fff,清除中断并且禁止中断上报,为不同工作方式之间的切换做好清理工作。
非DMA方式下的数据传输(查询方式写操作)
请遵循以下步骤:
- 配置I2C_HCNT和I2C_LCNT,使控制器工作在正确的模式下。
- 配置I2C_GLB,使能控制器。
- 根据实际时序,参考时序描述原理完成时序配置。
- 配置I2C_CTRL1为0x1,启动控制器。
- 不断查询I2C_FIFO_STAT [tx_fifo_not_full],查到为1后,将1Byte待写数据写入TX FIFO。当所有待写数据都写入TX FIFO后,执行下一步骤。
- 不断查询I2C_INTR_RAW,查到arb_lost_raw 或者ack_bit_unmatch_raw为1则认为是异常,查到all_cmd_done_raw为1则表示所有时序已经完成。
- 配置I2C_INTR_EN为0x0,I2C_INTR_RAW为0x1fff,清除中断并且禁止中断上报,为不同工作方式之间的切换做好清理工作。
非DMA方式下的数据传输(中断方式读操作)
请遵循以下步骤:
- 配置I2C_HCNT和I2C_LCNT,使控制器工作在正确的模式下。
- 配置I2C_RX_WATERMARK为0x20。
- 配置I2C_GLB,使能控制器。
- 根据实际时序,参考时序描述原理完成时序配置。
- 配置I2C_CTRL1为0x1,启动控制器。
- 配置I2C_INTR_EN为0x1805。
- 在中断服务程序里,查询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中断,然后等待下一次中断服务程序被触发。
- 配置I2C_INTR_EN为0x0,I2C_INTR_RAW为0x1fff,清除中断并且禁止中断上报,为不同工作方式之间的切换做好清理工作。
非DMA方式下的数据传输(查询方式读操作)
请遵循以下步骤:
- 配置I2C_HCNT和I2C_LCNT,使控制器工作在正确的模式下。
- 配置I2C_GLB,使能控制器。
- 根据实际时序,参考时序描述原理完成时序配置。
- 配置I2C_CTRL1为0x1,启动控制器。
- 不断查询I2C_FIFO_STAT [rx_fifo_not_empty],查到为1后,从RX FIFO中读出1Byte数据。当所有数据都已读回,执行下一步骤。
- 不断查询I2C_INTR_RAW,查到arb_lost_raw或者ack_bit_unmatch_raw为1则认为是异常,查到all_cmd_done_raw为1则表示所有时序已经完成。
- 配置I2C_INTR_EN为0x0,I2C_INTR_RAW为0x1fff,清除中断并且禁止中断上报,为不同工作方式之间的切换做好清理工作。
DMA方式下的数据传输(写操作)
请遵循以下步骤:
- 获取一个DMAC通道。
- 完成DMAC通道的设置并启动。
- 配置I2C_HCNT和I2C_LCNT,使控制器工作在正确的模式下。
- 配置I2C_TX_WATERMARK为0x10(该值仅为示例,具体配置值应根据实际使用决定)。
- 配置I2C_GLB,使能控制器。
- 根据实际时序,参考时序描述原理完成时序配置。
- 配置I2C_CTRL1为0x201,启动控制器。
- 等待DMAC完成中断。
- 不断查询I2C_INTR_RAW,查到arb_lost_raw或者ack_bit_unmatch_raw为1则认为是异常,查到all_cmd_done_raw为1则表示所有时序已经完成。
- 配置I2C_INTR_EN为0x0,I2C_INTR_RAW为0x1fff,清除中断并且禁止中断上报,为不同工作方式之间的切换做好清理工作。
DMA方式下的数据传输(读操作)
请遵循以下步骤:
- 获取一个DMAC通道。
- 完成DMAC通道的设置并启动。
- 配置I2C_HCNT和I2C_LCNT,使控制器工作在正确的模式下。
- 配置I2C_RX_WATERMARK为0x10(该值仅为示例,具体配置值应根据实际使用决定)。
- 配置I2C_GLB,使能控制器。
- 根据实际时序,参考时序描述原理完成时序配置。
- 配置I2C_CTRL1为0x301,启动控制器。
- 等待DMAC完成中断。
- 不断查询I2C_INTR_RAW,查到arb_lost_raw或者ack_bit_unmatch_raw为1则认为是异常,查到all_cmd_done_raw为1则表示所有时序已经完成。
- 配置I2C_INTR_EN为0x0,I2C_INTR_RAW为0x1fff,清除中断并且禁止中断上报,为不同工作方式之间的切换做好清理工作。
异常处理流程
请遵循以下步骤:
- 配置I2C_GLB [i2c_enable] 为0,禁用控制器。
- 配置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_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_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_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
dev_addr i2c dev addr 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
data_buf i2c data buf 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_data1 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_data2 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 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 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_timing_cmd 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_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_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_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_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_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_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_watermark 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_watermark 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_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_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
fifo_stat i2c fifo stat 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_intr_raw 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_intr_en 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_intr_stat 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寄存器描述”。
复位后各配置寄存器的值均为默认值,因此复位后需要重新对这些寄存器进行初始化配置。
中断或查询方式下的数据传输
初始化
初始化步骤如下:
- 向UART_CR bit[0]写0,使UART处于禁止状态。
- 写相应的配置值到UART_IBRD、UART_FBRD寄存器,配置传输速率。
- 配置UART_CR、UART_LCR_H,设定相应的UART工作模式。
- 配置UART_IFLS设定相应的发送及接收FIFO阈值。
- 如果驱动程序采用中断方式则需设定UART_IMSC,使能相应中断信号;采用查询方式时应禁止产生相应中断信号。
- 向UART_CR bit[0]写1,使能UART,完成初始化配置。
数据发送
数据发送步骤如下:
- 将发送数据写入UART_DR,启动数据发送。
- 查询方式下,进行连续数据发送时通过读取UART_FR bit[5]检测TX_FIFO状态,根据TX_FIFO的状态决定是否向TX_FIFO中发送数据;中断方式下,则根据相应中断状态位检测;决定是否向TX_FIFO中发送数据。
- 通过检测UART_FR bit[7]是否为1,判断UART是否完成全部数据发送。
数据接收
数据接收的处理方式如下:
- 查询方式下,进行数据接收时通过读取UART_FR [rxfe]检测RX_FIFO状态,根据RX_FIFO的状态决定是否读取RX_FIFO中的数据。
- 中断方式下,则根据相应中断状态位检测决定是否读取RX_FIFO中的数据。
DMA方式下的数据传输
初始化
初始化步骤如下:
- 向UART_CR[uarten]写0,使UART处于禁止状态。
- 写相应的配置值到UART_IBRD、UART_FBRD寄存器,配置传输速率。
- 配置UART_CR、UART_LCR_H,设定相应的UART工作模式。
- 配置UART_IFLS设定相应的发送及接收FIFO阈值。
- 如果驱动程序采用中断方式则需设定UART_IMSC,使能相应中断信号;采用查询方式时应禁止产生相应中断信号。
- 向UART_CR [uarten]写1,使能UART,完成初始化配置。
数据发送
数据发送(以DMA模式为例)步骤如下:
- 配置DMA数据通道,包括数据传输源和目的地址、数据传输个数、传输类型等参数。具体配置时请参见“直接存储器存取控制器”的相关描述。
- 配置UART_DMACR为0x2,使能UART的DMA发送功能。
- 通过DMA中断上报,判断数据是否发送完成,如果完成则关闭UART的DMA发送功能。
数据接收
数据接收(以DMA模式为例)步骤如下:
- 配置DMA数据通道,包括数据传输源和目的地址、数据接收区地址、数据传输个数、传输类型等参数。
- 配置UART_DMACR为0x1,使能UART的DMA接收功能。
- 通过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_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_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_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]的状态决定。
|
0x1
|
[6]
|
RO
|
rxff
|
该位的含义由UART_LCR_H[fen]的状态决定。
|
0x0
|
[5]
|
RO
|
txff
|
该位的含义由UART_LCR_H[fen]的状态决定。
|
0x0
|
[4]
|
RO
|
rxfe
|
该位的含义由UART_LCR_H[fen]的状态决定。
|
0x1
|
[3]
|
RO
|
busy
|
UART忙闲状态位。
0:UART空闲或者完成发送数据;
1:UART正忙于发送数据。
该位一旦置位,该状态一直保持到整个字节(包括所有的停止位)完全从移位寄存器中发送出去。
一旦发送FIFO非空该位就置位,不管UART使能与否。
|
0x0
|
[2:0]
|
-
|
reserved
|
保留。
|
0x6
|
UART_IBRD
uart ibrd 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 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
lcr_h uart lcr h 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_cr
UART_CR为UART控制寄存器,配置UART_CR遵循以下步骤:
- 向UART_CR[uarten]写0,禁止UART。
- 等待当前数据发送或接收结束。
- 将UART_LCR_H[fen]清0。
- 配置UART_CR。
- 向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 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 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 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 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 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 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种:
(1)非数据传输指令
MMC与卡设备之间的非数据传输指令操作如图3所示。
图 3 MMC非数据指令操作

(2)数据传输指令
MMC卡支持以下数据传输指令:
-
流数据读写指令
仅MMC卡支持,只使用1根数据线(即DAT0)进行数据传输,无CRC校验。
-
单块数据读写指令
一次传输完成一个块大小的数据,不需要使用停止命令结束一次数据传输。
-
多块数据读写指令
SDIO设备的多块读写指令,不同于上述2种方式,在发送读写指令时,指令参数中包含待传输的数据量。
根据响应的类型,指令分为以下3种:
-
无响应指令
如卡复位指令。
-
短响应指令
数据传输指令、卡状态查询等均属于这类指令。
-
长响应指令
仅用于读取卡的寄存器CID和CSD信息。
数据传输
单块读写和多块读写为较常用的数据传输方式。通常eMMC器件数据传输的一个块大小为512byte,而SDIO设备可根据应用自定义。
说明:
以块读写指令方式进行数据传输时,传输数据总量必须为块大小的整数倍。
数据传输指令均为短响应指令,并伴随着数据线上的数据传输。指令、响应及数据线上的时序配合关系如图1和图2所示。
-
单块与多块读操作
图 1 单块与多块读操作

MMC向卡发送单块或多块读指令。在接收响应的过程中,接收以块为单位的数据,其中每块数据中均包含有CRC校验位,以保证数据传输的完整性。
单块读指令操作时,MMC在接收一块数据后完成一次数据传输;多块读指令操作时,MMC在接收多块数据后,需发送一条停止指令结束本次数据传输(仅open ended多块读指令)。
-
单块与多块写操作
图 2 单块与多块写操作

MMC往卡发送单块或多块写指令。在接收到响应后,往卡发送以块为单位的数据,其中每块数据中均包含有CRC校验位,卡会对每块数据进行CRC校验,并反馈CRC状态以确认数据传输的正确性。
单块写指令操作时,MMC在发送一块数据后完成一次数据传输;多块写指令操作时,MMC在发送多块数据后,需发送一条停止指令完成本次数据传输(仅open ended多块写指令)。写操作结束后,卡可能会因为编程Flash而处于繁忙状态,MMC需查询DAT0状态,以确认卡脱离繁忙状态后才能对卡进行下一步操作。
-
数据传输格式
块方式读写中,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器件的时钟频率时应该遵照以下步骤:
-
关闭接口时钟。
将寄存器CLK_CTRL_R bit[2]置“0”。
-
设置接口时钟频率。
配置CRG寄存器PERI_CRG3440/PERI_CRG3504 bit[26:24],选择接口时钟频率。
-
重新使能接口时钟。
将寄存器CLK_CTRL_R bit[2]置“1”。
MMC初始化
与卡进行命令和数据的交互前,需要初始化控制器,步骤如下:
- 清中断。将寄存器NORMAL_INT_STAT_R bit[15:0] 和ERROR_INT_STAT_R bit[15:0]所有位置“1”,清除原始中断状态位。
- 关闭中断信号使能。将寄存器NORMAL_INT_SIGNAL_EN_R bit[15:0] 和ERROR_INT_SIGNAL_EN_R bit[15:0]所有位置“0”。
- 设置超时计数。配置寄存器TOUT_CTRL_R bit[3:0]。
- 如果为eMMC,将寄存器EMMC_CTRL_R bit[0] 置“1”,否则置“0”。
- 开启power_on。将寄存器PWR_CTRL_R bit[0] 置“1”。
- 打开时钟。配置寄存器CLK_CTRL_R bit[3]、[2]和[0] 为“1”。
- 打开中断状态使能。配置寄存器NORMAL_INT_STAT_EN_R bit[15:0]和ERROR_INT_STAT_R bit[15:0]。
- 打开中断信号使能。配置寄存器NORMAL_INT_SIGNAL_EN_R bit[15:0]和ERROR_INT_SIGNAL_EN_R bit[15:0]。
完成以上步骤后,配置接口时钟以后,就可以往卡发送指令了。
非数据传输指令
发送非数据传输指令的步骤如下:
- 在寄存器ARGUMENT_R中设置相应的指令内容。
- 在寄存器XFER_MODE_R和CMD_R中设置相应指令参数。
- 等待指令被MMC执行。
- 检查寄存器NORMAL_INT_STAT_R bit[0]是否产生指令完成中断。
- 检查寄存器ERROR_INT_STAT_R bit[15:0]是否有异常响应中断,必要时可读取响应值。
单块或多块读数据
读取单块或多块数据的步骤如下:
- 清除中断寄存器NORMAL_INT_STAT_R和ERROR_INT_STAT_R中的中断。
- 向寄存器BLOCKSIZE_R写入块的大小。
- 向寄存器BLOCKCOUNT_R写入块的个数。
- 向寄存器ARGUMENT_R写入读取数据的起始地址。
-
配置寄存器XFER_MODE_R和CMD_R,设置数据传输参数。
对于eMMC/SD器件,使用指令CMD17/CMD18进行单块/多块读操作;对于SDIO卡,使用指令CMD52/CMD53进行单块/多块读操作。
一旦寄存器CMD_R被写入,MMC就执行指令;当指令被送到总线上以后,产生cmd_done中断。
-
Non_DMA方式读取数据。检查寄存器NORMAL_INT_STAT_R bit[5],如果为1,则从寄存器BUF_DATA_R读取FIFO中的数据,以便MMC接收后面的数据;同时检查数据错误中断,即寄存器ERROR_INT_STAT_R bit[4]、bit[5]、bit[6]。此时,程序可以发送一个停止指令中止数据的传输。
- 当寄存器NORMAL_INT_STAT_R bit[1]为1时,数据传输完成,从寄存器BUF_DATA_R中读取残留在FIFO中的数据。
单块与多块写数据
写入单块或多块数据的步骤如下:
- 清除中断寄存器NORMAL_INT_STAT_R和ERROR_INT_STAT_R中的中断。
- 向寄存器BLOCKSIZE_R写入块的大小。
- 向寄存器BLOCKCOUNT_R写入块的个数。
- 向寄存器ARGUMENT_R写入要写数据的起始地址。
-
配置寄存器XFER_MODE_R和CMD_R,设置数据传输参数。
对于eMMC器件,使用指令CMD24/CMD25进行单块/多块写操作;对于SDIO卡,使用指令CMD52/CMD53进行单块/多块写操作。
-
Non_DMA方式写数据。将数据写入FIFO,即写寄存器BUF_DATA_R。
- 检查寄存器NORMAL_INT_STAT_R bit[4],如果为1,则向寄存器BUF_DATA_R写入要填充到FIFO中的数据,以便MMC发送后面的数据;同时检查数据错误中断,即寄存器ERROR_INT_STAT_R bit[4]、bit[5]、bit[6]。此时,程序可以发送一个停止指令中止数据的传输。
- 当寄存器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请参见中断处理章节。
初始化
初始化步骤如下:
- 向寄存器SPICR1 [sse]写“0”,禁止SPI。
- 写寄存器SPICR0,配置帧格式及传输数据位宽等参数。
- 配置寄存器SPICPSR,设定时钟分频因子。
- 中断方式下,设置寄存器SPIIMSC,使能相应中断信号;查询、DMA方式下,应禁止产生相应中断信号。
- 中断或DMA方式,设置SPITXFIFOCR和SPIRXFIFOCR。
- DMA方式下,配置寄存器SPIDMACR,使能SPI的DMA功能。
查询方式下的数据传输
具体步骤如下:
- 向寄存器SPICR1 [sse]写“1”,使能SPI。
- 将需发送的数据连续写到寄存器SPIDR。
- 轮询寄存器SPISR,直到[BSY]=0(表示总线不忙)、[TFE]=1(表示发送FIFO已空)、[RNE]=1(表示接收FIFO非空)。
-
读出数据,需保证读空接收FIFO(可通过查询SPISR [RNE]得到)。
须知:
Motorola SPI/TI同步串行接口的全双工特性,每发一个数据就接收一个数据,即使只需发送数据,也需要清空接收FIFO。
-
向寄存器SPICR1[sse]写“0”,禁止SPI。
中断方式下的数据传输
具体步骤如下:
- 向寄存器SPICR1 [sse]写“1”,使能SPI。
- 将需发送的数据连续写到寄存器SPIDR。
-
等待中断SPIRXINTR,读出数据。循环直到读出所有数据。
须知:
Motorola SPI/TI同步串行接口的全双工特性,每发一个数据就接收一个数据,即使只需发送数据,也需要清空接收FIFO。
-
向寄存器SPICR1 [sse]写“0”,禁止SPI。
DMA方式下的数据传输
具体步骤如下:
- 获取一个DMAC通道。
- 向寄存器SPICR1 [sse]写“1”,使能SPI。
-
发送数据
- 配置该DMAC通道的配置寄存器和控制寄存器中的相关参数。
- 启动DMAC,响应SPI发送FIFO的DMA请求进行数据传输。
- 通过DMA中断上报,判断数据是否发送完成,如果完成则关闭SPI的DMA功能。
-
接收数据
- 配置该DMAC通道的配置寄存器和控制寄存器中的相关参数。
- 启动DMAC,响应SPI接收FIFO的DMA请求进行数据传输。
- 通过DMA中断上报,判断数据是否接收完成,如果完成则关闭SPI的DMA功能。
-
向寄存器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管脚在复位之后处于输入状态。
通用输入输出
每个管脚可以配置为输入或者输出,具体步骤如下:
- 参考“管脚复用控制寄存器”配置管脚的相应位,使能需要使用的GPIO管脚功能。
- 配置寄存器GPIO_DIR,选择GPIO是作为输入还是输出。
- 当配置成输入管脚时,读取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管脚都可以配置成中断模式,配置步骤如下:
- 配置GPIO_IS,选择边沿触发或电平触发。
- 配置GPIO_IEV,选择下降沿/上升沿触发和高电平/低电平触发。
- 如果选择边沿触发,需配置GPIO_IBE,选择单沿或双沿触发方式。
- 向寄存器GPIO_IC写0xFF,清中断。
- 配置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_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_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_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_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_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_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_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_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_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时钟复位
在初始化控制器之前,对时钟复位寄存器做相应的配置。
步骤如下:
- 向PERI_CRG3632[4]写0x1,打开USB2.0 PHY的参考时钟;
- 向PERI_CRG3632[0]写0x0,撤离USB2.0 PHY的Power-On Reset复位,延时1毫秒;
- 向USB2_PHY_ANA_CFG5[1:0]写0x3,使USB2 PHY待机时保持PLL常开;
- 向PERI_CRG3632[1]写入0x0,撤离USB2.0 PHY的数字复位;
- 向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)输出配置流程如下:
-
根据所需的PWM输出频率(Freq)和占空比(duty),计算出对应的PWM循环周期数和高电平计数值。
循环周期数计算公式为:
pwm0_out(n)_period =(50000000/Freq)-1
高电平周期数计算公式为:
pwm0_out(n)_duty =(50000000/Freq)*duty-1
-
配置PWM循环周期数_pwm0_out__(n)_period_和高电平周期数寄存器_pwm0_out(n)_duty_。
- 配置PWM0_OUT(n)_CTRL[2]为1,加载配置的参数,使配置的参数生效。
-
配置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寄存器为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输出的脉冲信号支持三种模式:左对齐,右对齐和中间对齐。可以通过配置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同步源头的延时值最小。
配置流程
通用模式
配置流程如下:
- 配置对应的CRG寄存器(PERI_CRG4454),打开时钟门控。
- 通过计算得到需要的周期数和高电平拍数,并写入寄存器PWM(n)_duty0_cfg、PWM(n)_period。
- 如果需要周期性输出脉冲信号,将寄存器PWM(n)_ctrl[2]位域配置为1。如果需要输出固定个数脉冲信号,将寄存器PWM(n)_ctrl[2]配置为0,并将脉冲个数写入寄存器PWM(n)_num_cfg。
- 根据输出脉冲信号对齐方式配置寄存器PWM(n)_ctrl[5:4]。
- 根据输出脉冲信号极性需求配置寄存器PWM(n)_ctrl[1]。
- 配置脉冲使能寄存器PWM(n)_ctrl[0],写入1,使能PWM输出。
例如:需要输出1个频率为4KHz,高电平占80%(即占空比),脉冲个数为10的波形,脉冲右对齐。
周期数配置为198MHz*1/4KHz=49500,四舍五入后为49500,十六进制为0x000C15C。高电平数配置为49500(周期数)x 80%(占空比)=39600,四舍五入后为39600,十六进制为0x00009AB0。
按如下步骤进行寄存器操作,即可输出所需要的波形:
- 配置对应的CRG寄存器(如PERI_CRG4454[4])写入0x1,打开PWM时钟。
- 配置PWM(n)_ctrl寄存器为0x100。
- 向PWM(n)_period_cfg写入0x000C15C。
- 向PWM(n)_duty0_cfg写入0x00009AB0。
- 向PWM(n)_num_cfg 写入0x9。
- 向PWM(n)_ctrl写入0x101(仅更新bit[0])。
- 读取PWM(n)_ctrl_st bit[0],等待bit0位为1(表示PWM正在输出方波)
- 读取PWM(n)_period和0x000C15C进行校验。
- 读取PWM(n)_duty0和0x00009AB0进行校验。
- 读取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。
按如下步骤进行寄存器操作,即可输出所需要的波形:
- 配置对应的CRG寄存器(如PERI_CRG4454[4])写入0x1,打开PWM时钟。
- 配置PWM(n)_ctrl寄存器为0x104。
- 向PWM(n)_period_cfg写入0x0000C15B。
- 向PWM(n)_duty0_cfg写入0x0000C15B。
- 向PWM(n)_ctrl写入0x105(仅更新bit[0])。
占空比0%配置流程
例如:需要输出1个低电平。
周期数配置为198MHz*1/4KHz=49500,四舍五入后为49500,十六进制为0x0000C15C。高电平数配置为49500(周期数)x100%(占空比)=49500,四舍五入后为49500,十六进制为0x0000C15C。
按如下步骤进行寄存器操作,即可输出所需要的波形:
- 配置对应的CRG寄存器(如PERI_CRG4454[4])写入0x1,打开PWM时钟。
- 配置PWM(n)_ctrl寄存器为0x106。(配置PWM正相输出占空比为100%,即PWM反相输出占空比为0%。这里配置pwm(n)_inv_cfg寄存器为1,PWM输出反相)
- 向PWM(n)_period_cfg写入0x0000C15B。
- 向PWM(n)_duty0_cfg写入0x0000C15B。
- 向PWM(n)_ctrl写入0x107(仅更新bit[0])。
同步模式
同步模式配置流程如下:
- 配置PWM同步模式,PWM(n)_sync_cfg bit[5]配置为0x1。
-
根据触发模式或循环模式配置寄存器。
-
配置PWM信号的模式(同通用模式的步骤1~8)
-
配置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_sync_start 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
|