寄存器手册
引言
编写目的
W800芯片是联盛德微电子推出的一款嵌入式Wi-Fi SoC芯片。该芯片集成度高,所需外围器件少,性价比高。适用于IoT(智能家庭)领域各种智能产品。高度集成的Wi-Fi和蓝牙4.2 Combo功能是其主要功能;另外,该芯片集成XT804内核,内置QFlash,SDIO、SPI、UART、GPIO、I²C、PWM、I²S、7816,LCD,Touch Sensor等接口, 支持多种硬件加解密算法。此外,该芯片MCU含有安全内核,支持代码安全权限设置,全系统支持固件加密存储,固件签名,安全调试,安全升级等各种安全措施,提升产品安全特性。
本文档主要描述W800芯片内部结构,各功能模块信息以及详细寄存器使用信息;是开发者开发驱动程序、应用程序的主要参考资料。联盛德微电子提供的SDK中有各种功能的开源实现,开发者可以参考对应驱动程序、应用程序示例,以增加对芯片功能和寄存器描述的理解。本文档没有对Wi-Fi/BT部分的寄存器描述。
参考资料
W800 芯片封装参数、电气特性、射频参数等信息,请参考《W800芯片产品规格书》 ;
W800芯片集成了ROM程序,ROM程序提供了下载固件,MAC地址读写、Wi-Fi参数读写等功能,详细信息请参考《WM_W800_ROM功能简述》 ;
W800芯片内置了2Mbytes QFlash存储器,作为代码以及参数的存储空间。本文档提供了QFlash基本操作信息。如有超出本文档范围的需求,需要参考QFlash手册;
W800芯片采用杭州平头哥 XT804 核心,804相关的功能介绍、开发资料等可以参考平头哥公司发布信息;
更多信息请参考联盛德微电子网站(http://www.winnermicro.com/)。
特征
芯片封装
QFN32封装,4mm x 4mm。
芯片集成度
集成XT804处理器,最高240MHz
集成288KB SRAM
集成2MB FLASH
集成8通道DMA控制器,支持16个硬件申请,支持软件链表管理
集成PA/LNA/TR-Switch
集成32.768KHz时钟振荡器
集成电压检测电路
集成LDO
集成上电复位电路
芯片接口
集成1个SDIO2.0 Device控制器,支持SDIO 1位/4位/SPI三种操作模式,工作时钟范围0~50MHz
集成 1个 SDIO 2.0 HOST控制器,支持SDIO 与 SD卡操作,工作时钟范围0~50MHz
集成1个QSPI PSRAM 接口,支持最大 64MB 容量PSRAM,最高工作时钟频率80MHz;
集成5个UART接口,支持RTS/CTS,波特率范围1200bps~2Mbps
集成1个高速SPI从设备接口,工作时钟范围0~50MHz
集成1个SPI主/从接口,主设备工作时钟最高为20MHz,从设备支持最高6Mbps数据传输速率
集成一个I2C控制器,支持100/400Kbps速率
集成PWM控制器,支持5路PWM,单独输出或者2路PWM输入。最高输出频率20MHz,最高输入频率20MHz
集成双工I2S控制器,支持32KHz到192KHz I2S接口编解码
集成1个7816接口,兼容UART接口支持 ISO-7816-3 T=0.T=1 模式;支持EVM2000协议
支持多种硬件加解密模式,包括RSA/AES/RC4/DES/3DES/RC4/SHA1/MD5/CRC8/CRC16/CRC32/TRNG
集成 1路差分,或者两路单端12bit ADC 接口;
集成11路 Touch Sensor;
支持最多17个GPIO口,每个IO口都有丰富的复用关系。具备输入输出配置选项。
WIFI协议与功能
支持GB15629.11-2006、IEEE802.11 b/g/n;
支持WMM/WMM-PS/WPA/WPA2/WPS
支持WiFi Direct;
支持EDCA信道接入方式;
支持20/40M带宽工作模式;
支持STBC、GreenField、Short-GI、支持反向传输;
支持RIFS帧间隔;
支持AMPDU、AMSDU;
支持802.11n MCS 0~7、MCS32物理层传输速率档位,传输速率最高到150Mbps;
支持HT-immediate Compressed BlockAck、nornal ACK、no ACK应答方式;
支持CTS to self;
支持AP功能;AP和STA同时使用;
在BSS网络中,支持多个组播网络,并且支持各个组播网络加密方式不同,最多可以支持总和为32个的组播网络和入网STA加密;
BSS网络支持做为AP使用时,支持站点与组的总和为32个;
接收灵敏度:
20MHz MCS7@-71dBm@10%PER;
40MHz MCS7@-67dBm@10%PER;
54Mbps@-73dBm@10%PER;
11Mbps@-86dBm@8%PER;
1Mbps@-96dBm@8%PER;
支持多种不同的接收帧过滤选项;
支持监听功能;
蓝牙协议与功能
集成蓝牙基带处理器/协处理器,支持BT/BLE4.2协议
支持DR/EDR 各种速率;
支持BLE 1Mbps 速率;
供电与功耗
3.3V单电源供电;
支持Wi-Fi节能模式功耗管理;
支持工作、睡眠、待机、关机工作模式;
待机功耗小于15uA;
概述
本芯片是一款支持多接口、多协议的无线局域网802.11n(1T1R)的SOC芯片。该SOC芯片集成射频收发前端RF Transceiver,CMOS PA功率放大器,基带处理器/媒体访问控制,SDIO、SPI、UART、GPIO等接口的低功耗WLAN芯片。
W800芯片支持GB15629.11-2006、IEEE802.11 b/g/ n协议,并且支持STBC、Green Field、Short-GI、反向传输、RIFS帧间隔、AMPDU、AMSDU、T-immediate Compressed Block Ack、normal ACK、no ACK、CTS to self等丰富的协议以及操作。
W800芯片片内集成了射频收发前端、A/D和D/A转换器。它支持DSSS(直接序列扩频)以及OFDM(正交频分复用)调制模式,具备数据解扰能力,支持多种不同的数据传输速率。在收发器的模拟前端配备的收发AGC功能使得芯片系统能够获得最佳的性能。W800芯片还包含了内置增强信号监测器,可以很大程度上消除 多径效应的影响。
W800芯片在安全方面,不仅支持国家标准的WAPI加密,还支持国际标准WEP、TKIP、CCMP加密,这些硬件组件使得基于该芯片的数据传输系统在进行保密通信时仍然能够获得与非加密通信时相近的数据传输性能。
W800芯片除了支持IEEE802.11以及Wi-Fi协议规定的节能操作外,还支持用户定制的节能方案。芯片支持工作、睡眠、待机、关机四种工作模式,从而使整个系统实现低功耗,并方便用户根据自身的使用场景定义不同的节能方案。
W800芯片集成了高性能的32位嵌入式处理器,大量的内存资源,以及丰富的外设接口,便于使用者很容易的将芯片应用于特定产品的二次开发工作。
W800芯片支持AP功能,可以实现同时组建5个SSID网络,实现5个独立AP的功能。支持建立多组播网络功能。可以实现作为STA加入别的网络的同时,自己又作为AP建立BSS网络的功能。
W800芯片支持WPS方式,从而让用户采用一键式操作即可以实现加密的完全网络,保证信息的安全性。
W800芯片多功能、高集成度保证了WLAN系统不需要过多的片外电路和外部存储器。
芯片结构
芯片结构
下图描述W800芯片的整体结构,核心部分包括XT804 CPU,288KB SRAM和20KB ROM存储空间。PMU部分作为芯片的常供电模块提供了上电时序管理,起振时钟,实时时钟功能等。提供了丰富的外设功能和硬件加解密功能。Wi-Fi部分集成了MAC,BB和RF。

图 1 W800芯片结构图
总线结构
W800 芯片由两级总线构成,如下图所示

图 2 W800总线结构图
(1)AHB-1 总线
本级总线有四个主设备-即XT804,DMA,GPSEC以及5个从设备。
XT804 是面向控制领域的32 位高能效嵌入式CPU 核, 采用16/32 位混合编码指令系统,设计了精简高效的3 级流水线。
XT804提供多种可配置功能,包括硬件浮点单元、片上高速缓存、DSP 加速单元、可信防护技术、片上紧耦合IP 等,用户可根据应用需要进行配置。此外,XT804 提供多总线接口,支持系统总线、指令总线、数据总线的灵活配置。XT804 针对中断响应做了特殊的加速,中断响应延时仅需13 个周期。总线时钟最快工作在240MHz频率,可以配置为240/160/120/80/40MHz,或更低。
主设备 |
功能 |
CPU |
完成芯片寄存器配置,存储器管理与使用,以及完整的802.11MAC 协议。最高运行频率240MHz |
DMA |
支持链表结构的独立的8通道DMA模块,支持片上16个硬件DMA请求源。 |
GPSEC |
通用加密模块,支持DES/3DESSHA1/AES/MD5/RC4/CRC/PRDN。自动完成指定内存空间内的数据块加密并回写。 |
从设备 |
功能 |
ROM |
ROM用来存放CPU上电后的初始化固件。主要完成芯片寄存器空间的初始配置等工作。在完成上述工作后,将CPU 控制权交给FLASH中存储的固件。 |
AHB2AHB |
完成CPU总线时钟域到BusMatrix2总线时钟域主设备访问的转 换。要求时钟域必须同源,且CPU时钟与BusMatrix2时钟频率的比例为M:1,M为大于等于1的整数。 |
FLASH |
存储固件代码以及运行参数。 |
SRAM 160KB |
可用于存放指令或数据,固件可以根据需要使用该存储器。 |
RSA |
支持最长2048bit的RSA加解密运算 |
GPSEC |
通用加密/解密模块,支持SHA1/AES/MD5/RC4/CRC/TRNG。自动完成指定内存空间内的数据块加密/解密并回写。 |
SDIO_HOST |
SDIO 2.0 标准的SDIO HOST控制器;可通过此接口访问SDIO接口时钟为总线时钟分频得到,最高支持50MHz。 |
PSRAM_CTRL |
QSPI 接口的PSRAM控制器。可通过此控制器访问外接PSRAM。QSPI接口时钟由总线时钟分频得到,最高支持80MHz时钟。 |
(2)AHB-2总线
本条总线有4个主设备,3个从设备,使用crossbar连接结构,能够实现不同主设备对不同从设备的同时访问,从而加大带宽。总线时钟最快工作在40MHz频率,可以根据需要配置为更低。
主设备 |
功能 |
MAC |
802.11MAC控制协议处理模块。对总线的操作主要包括发送读取数据,接收写数据,以及发送完成描述符的回写等操作。 |
SEC |
安全模块,完成发送接收数据加解密和搬移。发送时,将发送数据和MAC 描述符搬移至指定位置,并完成加密;接收时,将接收数据和MAC接收描 述符搬移至指定位置,并完成解密。 |
AHB2AHB |
AHB-1总线到AHB-2总线的总线主设备访问的转换。 |
SDIO/HSPI |
将主机通过SDIO2.0设备控制器或高速SPI从设备控制器对芯片的 访问转换为AHB总线信号,并访问内容存储器和寄存器空间。 |
各主设备采用固定优先级,自上而下优先级递减。
从设备 |
功能 |
SRAM 128KB |
用于存储上行和下行数据缓存,SDIO/SPI/UART接口使用此RAM用作数据缓存 |
Configuration |
寄存器配置空间,高速模块配置寄存器在这里统一编址。 |
APB |
所有低速模块访问空间,各种低速模块使用APB总线连接。 |
BT_CORE |
蓝牙控制器。 |
时钟结构
W800 使用24/40MHz晶体作为SoC时钟源,片内内置1个DPLL 输出480MHz,供给CPU,系统总线,数据总线及WiFi系统使用;片内另外内置32.768KHZ RC振荡器,供PMU 及LCD 模块使用。时钟结构概括图如下图所示。

图 3 W800 时钟结构
地址空间

W800 地址映射
XT804支持4G存储空间,如上图所示分为6个block,分别为代码区,内存区,片上外设,片外存储区,片外外设和系统外设区。根据需求,w800片内存储空间如图三所示映射到前三区。
总线从设备 |
BootMode=0 |
地址空间细分 |
备注 |
ROM |
0x0000 0000 ~ 0x0004 FFF |
存放固化的固件代码 |
|
FLASH |
0x0800 0000 ~ 0x0FFF FFFF |
作为专用的指令存储器。 |
|
SRAM |
0x2000 0000 ~ 0x2002 7FFF |
固件内存和指令存储区 |
|
Mac RAM |
0x2002 8000 ~ 0x2004 7FFF |
SDIO/H-SPI/UART 数据缓存 |
|
PSRAM |
0x3000 000~0x30800000 |
外设内存 |
|
CONFIG |
0x4000 0000 ~ 0x4000 2FFF |
0x4000 0000 ~ 0x4000 05FF |
RSA配置空间 |
0x4000 0600 ~ 0x4000 07FF |
GPSEC配置空间 |
||
0x4000 0800 ~ 0x4000 09FF |
DMA配置空间 |
||
0x4000 0A00 ~ 0x4000 0CFF |
SDIO_HOST 配置空间 |
||
0x4000 0D00 ~ 0x4000 0DFF |
PMU配置空间 |
||
0x4000 0E00 ~ 0x4000 0EFF |
Clock与Reset配置空间 |
||
0x4000 0F00 ~ 0x4000 0FFF |
MacPHY Router配置空间 |
||
0x4000 1000 ~ 0x4000 13FF |
BBP配置空间 |
||
0x4000 1400 ~ 0x4000 17FF |
MAC配置空间 |
||
0x4000 1800 ~ 0x4000 1FFF |
SEC配置空间 |
||
0x4000 2000 ~ 0x4000 21FF |
FLASH Controller配置空间 |
||
0x4000 2200 ~ 0x4000 23FF |
PSRAM_CTRL 配置空间 |
||
0x4000 2400 ~ 0x4000 25FF |
SDIO Slave配置空间 |
||
0x4000 2600 ~ 0x4000 27FF |
H-SPI配置空间 |
||
0x4000 2800 ~ 0x4000 29FF |
SD Wrapper配置空间 |
||
0x4000 2A00 ~ 0x4000 A9FF |
BT Core 配置空间 |
||
0x4000 B000 ~ 0x4000 B0FF |
SASC-B1一级总线内存安全配置模块 |
||
0x4000 B100 ~ 0x4000 B1FF |
SASC-Flash Flash安全配置模块 |
||
0x4000 B200 ~ 0x4000 B2FF |
SASC-B2 二级总线内存安全配置模块 |
||
APB |
0x4001 0000 ~ 0x 4001 C000 |
0x4001 0000 ~ 0x4001 01FF |
I2C master |
0x4001 0200 ~ 0x4001 03FF |
Sigma ADC |
||
0x4001 0400 ~ 0x4001 07FF |
SPI master |
||
0x4001 0600 ~ 0x4001 07FF |
UART0 |
||
0x4001 0800 ~ 0x4001 09FF |
UART1 |
||
0x4001 0A00 ~ 0x4001 0BFF |
UART2 |
||
0x4001 0C00 ~ 0x4001 0DFF |
UART3 |
||
0x4001 0E00 ~ 0x4001 0FFF |
UART4 |
||
0x4001 1000 ~ 0x4001 11FF |
UART5 |
||
0x4001 1200 ~ 0x4001 13FF |
GPIO-A |
||
0x4001 1400 ~ 0x4001 15FF |
GPIO-B |
||
0x4001 1600 ~ 0x4001 17FF |
WatchDog |
||
0x4001 1800 ~ 0x4001 19FF |
Timer |
||
0x4001 1A00 ~ 0x4001 1BFF |
RF_Controller |
||
0x4001 1C00 ~ 0x4001 1DFF |
LCD |
||
0x4001 1E00 ~ 0x4001 1FFF |
PWM |
||
0x4001 2000 ~ 0x4001 22FF |
I2S |
||
0x4001 2200 ~ 0x4001 23FF |
BT-modem |
||
0x4001 2400 ~ 0x4001 25FF |
Touch Sensor |
||
0x4001 2600 ~ 0x4001 25FF |
TIPC Interface安全设置 |
||
0x4001 4000 ~ 0x4000 BFFF |
RF_BIST DAC发射内存 |
||
0x4001 C000 ~ 0x4003 BFFF |
RF_BIST ADC 接收内存 |
||
0x4001 3C00 ~ 0x5FFF FFFF |
RSV |
SRAM
W800内置288KB SRAM。其中160KB 挂载一级AHB总线上,128KB挂载在二级AHB总线上。CPU等一级总线设备可以访问所有内存区域,但是二级总线上的设备只能访问二级总线上128KB的内存。
Flash
QFlash
W800内部集成2MBytes QFlash。通过芯片内部集成32KB cache 实现XIP方式在QFlash上执行程序。 程序运行过程中,CPU首先从Cache中读取指令,当不能获取指令时,以8Bytes一行的方式从QFlash读取指令,存入Cache内。因此,当持续运行代码大小小于32K时,C PU将无需从QFlash读取指令,此时CPU可以运行在更高的频率。上述方式为读取指令操作方式,整个Image的RO段都会以这种方式操作。此过程用户无需干预。
QFlash也可以存储数据,当用户程序需要读写QFlash内数据时,需要通过内置的QFlash控制器进行操作,QFlash提供了相应的地址、指令等寄存器来协助实现用户想要的操作。具体描述请参考QFlash控制器对应章节。
用户需要注意的是,程序进行读取或者写入数据时,无需进行状态判断、等待等操作,因为QFlash控制器本身会进行判断。当QFlash控制器返回时,表明读取或者写入已经完成。
SPI Flash
W800芯片除了支持6PIN的QFlash接口之外(内置PIN,未封装),还支持低速SPI接口访问。该SPI接口的最高工作频率可达20MHz,支持主从功能,详细描述参考SPI接口对应章节。
PSRAM
W800内置SPI/QSPI接口的PSRAM控制器,支持外置最大容量64Mb的PSRAM设备访问,提供总线方式的PSRAM读写擦操作。最高读写速度80MHz。当存储容量需要扩充时,可以使用片外PSRAM扩充代码存储空间或者数据存储空间。PSRAM同样支持XIP方式执行程序,CPU Cache同样支持缓存PSRAM中数据。
启动配置
W800芯片上电后,CPU会启动执行ROM中的固件,加载Flash中指定地址的用户Image。
ROM固件在开始运行时会读取BootMode(PA0)引脚,根据引脚的信号判断进入启动状态:
BootMode |
启动条件 |
启动模式 |
高 |
正常启动流程 |
|
低 |
持续<30ms,快速测试模式无效 |
正常启动流程 |
持续>=30ms |
进入功能模式 |
|
注:测试模式:芯片测试功能,用户不可操作。 |
功能模式:进入rom实现的基本功能,例如:下载固件,烧写mac地址等,详细信息参考《wm_w800_rom功能简述.pdf》 |
通常,BootMode引脚应该用于生产或者调试阶段。在生产阶段,用户通过将BootMode引脚持续拉低30ms以上,进入功能模式,可以快速进行烧录Flash 工作。
在产品返工或者维修的场景中,在芯片未进入“最高安全等级”(关于安全等级的描述请参考《WM_W800_ROM功能简述》)时,可以通过该引脚进入功能模式,擦除旧的Image,写入新的Image。
在调试阶段,无论固件出现任何故障,都可以通过将BootMode引脚持续拉低30ms以上,进入串口下载功能,烧录新的固件。
时钟与复位模块
功能概述
时钟与复位模块完成了软件对芯片时钟和复位系统的控制。时钟控制包括时钟变频,时钟关断以及自适应门控;复位控制包括系统以及子模块的软复位控制。
主要特性
支持各模块时钟关断
支持部分模块时钟自适应关断
支持各模块软件复位
支持CPU频率设置
支持ADC/DAC回环测试
支持I2S时钟设置
功能描述
时钟门控
通过配置时钟门控使能寄存器CLK_GATE_EN可以控制指定功能的时钟关断,从而达到关断某一模块功能的目的。
为了提供固件对系统功耗控制的灵活性,时钟与复位模块提供了系统内各模块的时钟门控功能。当关闭相应模块的时钟时,该模块的数字逻辑与时钟树将停止工作,能够降低系统的动态功耗。
具体各模块的开关对应寄存器SW_CLKG_EN的详细描述。
时钟自适应关断
芯片依据内部的某些状态的迁移,自适应关断某些功能模块的时钟。
用户请不要更改配置,否则可能会在配置PMU功能时导致系统异常。
功能复位
芯片提供了各子系统的软复位功能,通过设置SW_RST_CTRL相应BIT为0可以达到子系统复位。
但是,复位状态不会自动清除,要恢复正常工作需将SW_RST_CTRL相应BIT位置1。
软复位功能并不会复位CPU及WatchDog。
该寄存器中,对APB/BUS1/BUS2(对应APB总线,系统总线及数据总线)的复位操作不推荐,会导致系统访问设备异常。
时钟分频
W800系统采用40MHz/24MHz 晶体作为系统时钟源,系统内置DPLL,固定输出480MHz 时钟作为全系统的时钟源(如下图)。

图 4系统时钟分频关系
系统总线的时钟与CPU时钟一致,数据总线的时钟固定为WLAN根时钟的1/4。
WLAN根时钟同时也是整个WLAN系统的时钟源头。
此模块中提供了设定CPU时钟与WLAN 根时钟的功能,供固件调节系统性能及功耗使用。
设置SYS_CLK_DIV寄存器的BIT[7:0]可以调整CPU时钟分频系数。CPU时钟分频的源时钟为DPLL的输出,固定为480MHz。CPU时钟分频系数默认值为6,即CPU 默认工作频率为480MHz的6分频,即80MHz。当需要调整CPU所需时钟时,可以重新配置本参数。
CLK_PERI 时钟提供SoC系统中加密模块的运行时钟的根时钟,以及某些接口的运行时钟的根时钟,比如PWM接口,I2S接口,Flash接口时钟。此时钟也由DPLL输出的480MHz分频得出。正常工作情况下应固定为3分频,得到CLK_PERI 根时钟 160MHz。由CLK_PERI 根时钟进行2分频,4分频得到80MHz和40MHz,提供给加密模块和接口模块使用。
设置SYS_CLK_DIV寄存器的BIT[15:8]可以调整WLAN时钟分频系数。默认分频因子为3,即对DPLL的480MHz输出3分频,得到160MHz时钟,作为根节点时钟送给WLAN(WLAN再继续分频得到更为详细的低频时钟供WLAN 系统使用。
注意:如果希望WLAN系统正常工作,WLAN根时钟需要保持在160MHz,否则WLAN系统将失效。
当不需要WLAN系统工作的时候,可以将WLAN根时钟降低,降低系统动态功耗。
在改变系统时钟配置的时候,需要注意:系统总线与数据总线的比例需要维持在M:1,其中M为整数,最小为1。在改变系统时钟配置时,也需要同时更新寄存器SYS_CLK_DIV的BIT [23:16], 设置正确的比例系数。否则,访问数据总线将得到异常数据。
SYS_CLK_SEL的[15:8]提供了设置SAR_ADC工作频率的分频因子,以40M为时钟源进行分频。分频系数即为所配分频值。
SYS_CLK_SEL的BIT[4]为配置RSA模块核心运算的时钟频率选择,可以选择80MHz或者160MHz。
BIT[5]为配置GPSEC模块核心运算的时钟频率选择,可以选择80MHz或者160MHz。
BIT[6]为配置FLASH模块对外总线的时钟频率选择,可以选择40MHz或者80MHz。
当需要重新配置cpu_clk_divider,wlan_clk_divider,bus2_syncdn_factor,sdadc_fdiv时,需要置位SYS_CLK_DIV的BIT[31],硬件自动更新上述四个参数到分频器,然后清零BIT[31]。
I2S_CLK_CTRL提供了I2S 模块的时钟配置功能。
调试功能控制
用户可以通过设置DEBUG_CTRL的值(SYS_CLK_SEL- BIT[16])来达到使能和禁用JTAG功能的目的。
寄存器描述
寄存器列表
偏移地址 |
名称 |
缩写 |
访问 |
描述 |
复位值 |
0X0000 |
软件时钟门控使能寄存器 |
SW_CLKG_EN |
RW |
软件配置模块是否关断时钟 |
0X0000_7FFF |
0X0004 |
软件时钟掩码寄存器 |
SW_CLK_MASK |
RW |
软件配置模块是否自适应关断时钟 |
0X0000_007E |
0X0008 |
保留 |
||||
0X000C |
软件复位控制寄存器 |
SW_RST_CTRL |
RW |
软件配置复位模块 |
0X01FF_FFFF |
0X0010 |
时钟分频配置寄存器 |
SYS_CLK_DIV |
RW |
配置时钟分频比 |
0X0000_2212 |
0X0014 |
调试控制寄存器 |
DEBUG_CTRL |
RW |
配置ADC/DAC回环测试 |
0X0000_0000 |
0X0018 |
I2S时钟控制寄存器 |
I2S_CLK _ CTRL |
RW |
配置I2S时钟 |
0X0000_0000 |
0X001C |
复位状态寄存器 |
RESET _ STATUS |
RW |
查看CPU软复位与Watchdog复位状态 |
0x0000_0000 |
软件时钟门控使能寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:22] |
RO |
保留 |
|
[21] |
RW |
soft_touch_gate _en 配置 touch_sensor 模块时钟的门控,默认 touch_sensor 模块门控开启 0:touch_sensor 模块时钟关闭 1: touch_sensor时钟开启 |
1’b1 |
[20] |
RW |
soft_bt_gate_en 配置BT. / BLE模块时钟的门控,默认BT / BLE模块门控开启 0:BT/BLE模块时钟关闭 1: BT/BLE时钟开启 |
1’b1 |
[19] |
RW |
soft_qsram_gate_en 配置 qspi_ram 模块时钟的门控,默认 qspi_ram 模块门控开启 0:qspi_ram 模块时钟关闭 1: qspi_ram 时钟开启 |
1’b1 |
[18] |
RW |
soft_sdio_m_gate _en 配置 sdio_master 模块时钟的门控,默认 sdio_master 模块门控开启 0:sdio_master模块 时钟关闭 1: sdio_master时钟开启 |
1’b1 |
[17] |
RW |
soft_gpsec_gate _en 配置 gpsec 模块时钟的门控,默认 gpsec 模块门控开启 0:gpsec模块时钟关闭 1: gpsec时钟开启 |
1’b1 |
[16] |
RW |
soft_rsa_gate_en 配置 RSA 时钟的门控,默认 RSA 门控开启 0:RSA模块时钟关闭 1:RSA时钟开启 |
1’b1 |
[15] |
RW |
soft_i2s_gate_en 配置 i2s 时钟的门控,默认 i2s 门控开启 0:i2s时钟关闭 1:i2s时钟开启 |
1’b1 |
[14] |
RW |
soft_lcd_gate_en 配置 lcd 时钟的门控,默认 lcd 门控开启 0:lcd时钟关闭 1:lcd时钟开启 |
1’b1 |
[13] |
RW |
Soft_pwm_gate_en 配置 pwm 时钟的门控,默认 pwm 门控开启 0:pwm时钟关闭 1:pwm时钟开启 |
1’b1 |
[12] |
RW |
soft_sd_adc_gate _en 配置 sd_adc_时钟的门控,默认 sd_adc_门控开启 0:sd_adc_时钟关闭 1:sd_adc_时钟开启 |
1’b1 |
[11] |
RW |
soft_gpio_gate _en 配置 GPIO 时钟的门控,默认 GPIO 门控开启 0:GPIO时钟关闭 1:GPIO时钟开启 |
1’b1 |
[10] |
RW |
soft_timer_gate _en 配置 timer 时钟的门控,默认 timer 门控开启 0:timer时钟关闭 1:timer时钟开启 |
1’b1 |
[9] |
RW |
soft_rf_cfg_gate _ en:内部使用,请勿修改 配置 rf_cfg 时钟的门控,默认 rf_cfg 门控开启 1’b0:rf_cfg 时钟关闭 1’b1:rf_cfg 时钟开启 |
1’b1 |
[8] |
RW |
soft_dma_gate_en 表示供给 dma 时钟域的时钟是否关断 1’b0:dma 时钟关闭 1’b1:dma 时钟开启 |
1’b1 |
[7] |
RW |
soft_ls_spi_gate _en 配置低速 spi 时钟的门控,默认低速 spi 门控开启 1’b0:低速 spi 时钟关闭 1’b1:低速 spi 时钟开启 |
1’b1 |
[6] |
RW |
soft_uart5_gate _en 配置 uart5 的门控,默认 uart5 开启 0:uart5 关闭 1:uart5 开启 |
1’b1 |
[5] |
RW |
soft_uart4_gate _en 配置 uart4 的门控,默认 uart4 开启 0:uart4 关闭 1:uart4 开启 |
1’b1 |
[4] |
RW |
soft_uart3_gate _en 配置 uart3 的门控,默认 uart3 开启 0:uart3 关闭 1:uart3 开启 |
1’b1 |
[3] |
RW |
soft_uart2_gate _en 配置 uart2 的门控,默认 uart2 开启 0:uart2关闭 1:uart2开启 |
1’b1 |
[2] |
RW |
soft_uart1_gate _en 配置 uart1 时钟的门控,默认 uart1 门控开启 1’b0:uart1 时钟关闭 1’b1:uart1 时钟开启 |
1’b1 |
[1] |
RW |
soft_uart0_gate _en 配置 uart0 时钟的门控,默认 uart0 门控开启 1’b0:uart0 时钟关闭 1’b1:uart0 时钟开启 |
1’b1 |
[0] |
RW |
soft_i2c_gate_en 配置 i2c 时钟的门控,默认 i2c 门控开启 1’b0:i2c 时钟关闭 1’b1:i2c 时钟开启 |
1’b1 |
软件时钟掩码寄存器
位 |
访问 |
操作说明 |
复位值 |
[6] |
RW |
soft_cpu_clk_gt _mask 表示供给CPU时钟域(包括CPU,bus1、ROM、SRAM )的时钟是否能够自适应的关断( 当CPU需要进入WFI 状态的时候,不要设置自适应关断 ) 1’b0:允许自适应关断和开启 1’b1:不允许自适应关断和开启 |
1’b1 |
[5 : 2] |
RW |
保留, 内部使用,请勿修改 |
|
[1] |
RW |
soft_sdioahb_clk _gt _mask 表示供给sdio ahb时钟域的时钟是否能够自适应的关断 1’b0:允许自适应关断和开启 1’b1:不允许自适应关断和开启 |
1’b1 |
[0] |
RW |
soft_pmu_clk_gt _mask pll输出的时钟后有一个门控单元,采用该寄存器配置,表示是否允许被PMU关断。 1’b0:允许PMU关断该门控单元,从而关断时钟 1’b1:不允许PMU关断该门控单元 |
1’b0 |
软件复位控制寄存器
位 |
访问 |
操作说明 |
复位值 |
[31] |
RW |
soft_touch _rst_n 软件复位 touch_sensor 模块 0:复位 1:复位释放 |
1’b1 |
[30] |
RW |
soft_rst_flash _n 软件复位Flash控制器模块 0:复位 1:复位释放 |
1’b1 |
[29] |
RW |
soft_rst_bt _n 软件复位BT模块 0:复位 1:复位释放 |
1’b1 |
[28] |
RW |
soft_rst_qspi _ram_n 软件复位qspi_ram模块 0:复位 1:复位释放 |
1’b1 |
[27] |
RW |
soft_rst_sdio_m_n 软件复位sdio_master模块 0:复位 1:复位释放 |
1’b1 |
[26] |
RW |
soft_rst_gpsec_n 软件复位gpsec模块 1’b0:复位 1’b1:复位释放 |
1’b1 |
[25] |
RW |
soft_rst_rsa_n 软件复位RSA模块 1’b0:复位 1’b1:复位释放 |
1’b1 |
[24] |
RW |
soft_rst_i2s_n 软件复位i2s模块 1’b0:复位 1’b1:复位释放 |
1’b1 |
[23] |
RW |
soft_rst_lcd_n 软件复位lcd模块 1’b0:复位 1’b1:复位释放 |
1’b1 |
[22] |
RW |
soft_rst_pwm_n 软件复位pwm模块 1’b0:复位 1’b1:复位释放 |
1’b1 |
[21] |
RW |
soft_rst_sar_adc_n 软件复位sar_adc模块 1’b0:复位 1’b1:复位释放 |
1’b1 |
[20] |
RW |
soft_rst_timer_n 软件复位timer模块 1’b0:复位 1’b1:复位释放 |
1’b1 |
[19] |
RW |
soft_rst_gpio_n 软件复位gpio模块 1’b0:复位 1’b1:复位释放 |
1’b1 |
[18] |
RW |
soft_rst_rf_cfg_n 软件复位配置RF的寄存器模块( 内部使用,请勿修改 ) 1’b0:复位 1’b1:复位释放 |
1’b1 |
[17] |
RW |
soft_rst_spis_n 软件复位高速spi模块 1’b0:复位 1’b1:复位释放 |
1’b1 |
[16] |
RW |
soft_rst_spim_n 软件复位低速spi模块 1’b0:复位 1’b1:复位释放 |
1’b1 |
[15] |
RW |
soft_rst_uart5_n 软件复位片内uart5模块 1’b0:复位 1’b1:复位释放 |
1’b1 |
[14] |
RW |
soft_rst_uart4_n 软件复位片内uart4模块 1’b0:复位 1’b1:复位释放 |
1’b1 |
[13] |
RW |
soft_rst_uart3_n 软件复位片内uart3模块 1’b0:复位 1’b1:复位释放 |
1’b1 |
[12] |
RW |
soft_rst_uart2_n 软件复位片内uart2模块 1’b0:复位 1’b1:复位释放 |
1’b1 |
[11] |
RW |
soft_rst_uart1_n 软件复位片内uart1模块 1’b0:复位 1’b1:复位释放 |
1’b1 |
[10] |
RW |
soft_rst_uart0_n 软件复位片内uart0模块 1’b0:复位 1’b1:复位释放 |
1’b1 |
[9] |
RW |
soft_rst_i2c_n 软件复位片内i2c模块 1’b0:复位 1’b1:复位释放 |
1’b1 |
[8] |
RW |
soft_rst_bus2_n 软件复位片内bus2模块 1’b0:复位 1’b1:复位释放 |
1’b1 |
[7] |
RW |
soft_rst_bus1_n 软件复位片内bus1模块 1’b0:复位 1’b1:复位释放 |
1’b1 |
[6] |
RW |
soft_rst_apb_n 软件复位abp桥接模块 1’b0:复位 1’b1:复位释放 |
1’b1 |
[5] |
RW |
soft_rst_mem _mng_n 软件复位mem_mng模块( 内部使用,请勿修改 ) 1’b0:复位 1’b1:复位释放 |
1’b1 |
[4] |
RW |
soft_rst_dma_n 软件复位dma模块 1’b0:复位 1’b1:复位释放 |
1’b1 |
[3] |
RW |
soft_rst_sdio _ahb_n 软件复位sdio ahb时钟域模块 1’b0:复位 1’b1:复位释放 |
1’b1 |
[2] |
RW |
soft_rst_sec_n 软件复位安全模块( 内部使用,请勿修改 ) 1’b0:复位 1’b1:复位释放 |
1’b1 |
[1] |
RW |
soft_rst_mac_n 软件复位mac模块( 内部使用,请勿修改 ) 1’b0:复位 1’b1:复位释放 |
1’b1 |
[0] |
RW |
soft_rst_bbp_n 软件复位bbp模块( 内部使用,请勿修改 ) 1’b0:复位 1’b1:复位释放 |
1’b1 |
时钟分频配置寄存器
位 |
访问 |
操作说明 |
复位值 |
[31] |
RW |
divide_freq_en 当需要重新配置cpu_clk_divider ,wlan_clk_divider ,bus2_syncdn_factor,sdadc_fdiv 时,置位本寄存器,硬件自动更新上述四个参数到分频器,然后清零本寄存器。 1’b0:分频系数已生效 1’b1:要求硬件更新分频参数 注:此处配置分频因子时,当Divide_freq_en有效时 ,所有因子必须已经有效 |
1’b0 |
[30:28] |
保留 |
||
[27:24] |
RW |
Peripheral _divider 160M时钟 分频因子: 以DPLL为时钟源进行分频。分频系数即为所配分频值。分频输出应为160MHz。DPLL 输出为480MHz,应配置为3 . |
4’h3 |
[23: 16] |
RW |
bus2_syncdn _factor bus1和bus2的时钟比例关系,应该为N:1 其中N为整数,在实际调整时,主要看CPU的工作频率和bus2 的时钟频率之比。 由于默认cpu采用80MHz时钟,bus2采用40MHz时钟,则N=2 |
8’h2 |
[15 : 8] |
RW |
wlan_clk_divider 从PLL出来的时钟分频后,送给wlan系统。本寄存器为分频因子,该因子>=2。 默认分频因子为3,即对pll的 480MHz输出3分频,得到1 60MHz时钟,作为根节点时钟 送给wlan(wlan在继续分 频得到更为详细的低频时钟); 注1:如需WLAN系统正常工作 ,此时钟需固定在160MHz; 如WLAN系统关闭,则此时钟可 降频节省功耗。此时钟不得配置高于160MHz。 注2:二级总线时钟及APB时钟 为此时钟四分频; |
8’h3 |
[7 : 0] |
RW |
cpu_clk_divider 从PLL出来的时钟分频后,送给CPU。本寄存器为分频因子,该因子>=2。 默认分频因子为6,即复位释放后,对PLL输出的480MHz时钟6分频,送给cpu的是80MHz时钟。当需要调整cpu所需时钟时,可以重新配置本参数 |
8’h6 |
调试控制寄存器
位 |
访问 |
操作说明 |
复位值 |
[16] |
RW |
JTAG使能 1’b0: 禁止JTAG调试功能 1’b1: 使能JTAG调试功能 |
1’b0 |
[15:8] |
RW |
sd_adc_div sigma-delta ADC 时钟分频因子: 以40MHz为时钟源进行分频。分频系数即为所配分频值。 配置此寄存器后必须配置寄存器clk_divider中Divide_freq_en才能生效; |
8’d10 |
[7] |
RW |
RSV |
1’b0 |
[6] |
RW |
qflash_clk_sel QSPI_FLASH 时钟选择 1:使用80MHz; 0:使用40MHz; |
1’b0 |
[5] |
RW |
gpsec_sel GPSEC 时钟选择 1:使用160MHz: 0:使用80MHz; |
1’b0 |
[4] |
RW |
rsa_sel RSA 时钟选择 1:使用160MHz; 0:使用80MHz; |
1’b0 |
[3:0] |
RW |
保留, 请勿修改 |
4’d0 |
I2S时钟控制寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:18] |
保留 |
||
[17: 8] |
RW |
BCLKDIV BCLK分配器:F_BCLK = F_I2SCLK / BCLKDIV 注意:如果未选择EXTAL_EN而使用内部PLL则F_I2SCLK =F_CPU (与CPU频率相同)。 假设F_CPU = 160MHz,启用WXTAL_EN时F_I2SCLK = 外部晶振频率, BCLKDIV = round (F_I2SCLK/(Fs*W *F)) 其中Fs是音频数据的采样频率,W是字宽; 数据为单声道时F = 1; 当数据为立体声时F = 2 例如,如果使用内部PLL且数据 宽度为24位,则格式为立体声格式,采样频率为128KHz,BCLKDIV应配置为(160 * 10e6 / 128 * 10e3 * 24 * 2)= 10’h1a。 |
10’b0 |
[7 : 2] |
RW |
MCLKDIV 如果选择外部时钟,则该MCLK分频器用于产生适当的MCLK频率。 F_mclk = F_I2SCLK / (2 * MCLKDIV); 当MCLKDIV = 0时F_I2SCLK是外部时钟 ; 当MCLKDIV >= 1时F_mclk = F_I2SCLK; 注意:F_mclk应配置为256 * fs,其中fs是采样频率。 |
6’b0 |
[1] |
RW |
MCLKEN MCLK使能开关 1’b0:禁止MCLK 1’b1:使能MCLK |
1’b0 |
[0] |
RW |
EXTAL_EN 外部时钟选择,选择使用内部I2S块时钟还是外部时钟 1’b0:内部时钟 1’b1:外部时钟 注意:使用外部时钟时,外部时钟必须为2 * N * 256 fs,其中fs为采样频率,N必须为整数。 |
1’b0 |
复位状态寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:18] |
保留 |
||
[17: 8] |
WO |
CPU 软复位 状态清除 写1 清除 CPU soft Reset Status 状态。 |
1’b0 |
[7 : 2] |
WO |
Wdog 软复位 状态清除 写1 清除 Wdog Reset Status 状态。 |
1’b0 |
[1] |
RO |
CPU 软复位 状态 1: CPU 产生过软复位; 0: CPU 未产生软复位; |
1’b |
[0] |
RO |
Wdog 复位状态 1: Wdog 产生了Reset; 0:Wdpg 未产生Reset |
1’b |
DMA模块
功能概述
DMA用于在外设与存储器之间以及存储器与存储器之间提供高速数据传输。可以在无需任何CPU操作的情况下通过DMA快速移动数据。这样节省的CPU资源,不影响CPU进行其他指令的操作。
DMA挂载在AHB总线上,最多支持8通道,16个硬件外设请求源,支持链表结构与寄存器控制。
主要特性
Amba2.0标准总线接口,8路DMA通道
支持基于存储器链表结构的DMA操作
支持16个硬件外设请求源
支持1,4-burst操作模式
支持byte、half-word,word为单位传输操作
支持源、目的地址不变或顺序递增或可配置在预定义地址范围内循环操作
支持内存到内存,内存到外设,外设到内存的数据传输方式
功能描述
DMA通道
W800共支持8路DMA通道,DMA通道互相不干涉,可以同时运行。请求不同的数据流可以选择不同的DMA通道。
每个DMA通道分配在不同的寄存器地址偏移段,可以直接选择相应通道的地址段进行配置使用即可。不同通道的寄存器配置方式完全一致。
DMA基地址 |
0x4000 0800 |
DMA_CH0 |
偏移量(0x10~0x38) |
DMA_CH1 |
偏移量(0x40~0x68) |
DMA_CH2 |
偏移量(0x70~0x98) |
… |
… |
DMA_CH7 |
偏移量(0x160~0x188) |
DMA数据流
8路DMA通道能够实现源和目的之间单向数据传输链路。
DMA的源和目的地址可以设置为每次DMA操作完成之后不变、递增或循环三种模式:
DMA_CTRL[2:1]控制源地址每次DMA操作后变化方式;
DMA_CTRL[4:3]控制目的地址每次DMA操作后变化方式。
DMA可以设置byte、half-word、word的搬运单位,最终搬运数据的数量是搬运单位的整数倍,通过DMA_CTRL[6:5]来设置。
DMA可以通过burst设置每次搬运多少个单位的数据,通过DMA_CTRL[7]来选择一次搬运1或4个单位的数据,如果DMA_CTRL[6:5]设置为word,burst设置为4,则每次搬运4个word的数据。
DMA可以设置每次启动DMA传输的Byte个数,最大65535 Byte,通过DMA_CTRL[23:8]来设置。
DMA循环模式
DMA循环地址模式是指设置DMA的源和目的地址之后,数据搬运达到设定的循环边界之后,会跳转到循环起始地址,如此循环执行,直到到达设定的传输字节。
循环地址模式的源和目的地址需要用SRC_WRAP_ADDR和DEST_WRAP_ADDR寄存器来设定,并通过WRAP_SIZE来设定循环的长度值。
DMA传输模式
DMA支持3种传输模式:
内存到内存
源地址和目的地址均配置成需要传输的内存地址,DMA_MODE[0]设置为0,软件方式。
内存到外设
源地址设置为内存地址,目的地址设置成外设地址,DMA_MODE[0]设置为1,硬件方式,DMA_MODE[5:2]选择所使用的外设。
外设到内存
源地址设置为外设地址,目的地址设置成内存地址,DMA_MODE[0]设置为1,硬件方式,DMA_MODE[5:2]选择所使用的外设。
DMA外设选择
当使用外设到内存或者内存到外设这种传输方式的时候,除了相应的外设需要设置为DMA TX或RX外,DMA_MODE[5:2]也需要选择对应的外设。
注意:因为UART口共有3个,在UART使用DMA的时候,还需要通过UART_CH[1:0]来选择对应的UART。
DMA链表模式
DMA支持链表工作模式。 通过链表模式,我们在DMA搬运当前链表内存数据的时候,可以提前向下一个链表中填充数据,DMA搬完当前链表之后,判断到下一个链表有效,可以直接搬运下一个链表的数据。通过链表的方式可以有效的提高DMA和CPU配合的效率。
链表操作方式:通过DMA_MODE[1]寄存器设置DMA为链表工作方式,再将DESC_ADDR寄存器设置为链表结构的起始地址,然后再通过CHNL_CTRL寄存器使能DMA。当DMA处理完成当前内存的搬移后,软件通过设置有效标志,通知DMA链表中依然存在有效的数据,DMA依据链表的有效标志处理下一个待 搬移数据。
DMA中断
DMA传输完成或者burst均可以产生中断,INT_MASK寄存器可以屏蔽DMA通道对应的中断。
当DMA相应中断产生后,可以通过INT_SRC寄存器查询当前中断的状态,指示当前是什么产生的中断,相应的状态位需要软件写1清0。
寄存器描述
寄存器列表
偏移地址 |
名称 |
缩写 |
访问 |
描述 |
复位值 |
0X0000 |
中断屏蔽寄存器 |
INT_MASK |
RW |
设置需要屏蔽的DMA中断 |
0X0000_FFFF |
0X0004 |
中断状态寄存器 |
INT_SRC |
RW |
指示当前DMA的中断状态 |
0X0000_0000 |
0X0008 |
DMA channel选择寄存器 |
DMA_CH |
RW |
UART外设时选哪个UART |
0X0000_0000 |
0X000C |
保留 |
||||
DMACHNL0 registers |
|||||
0X0010 |
DMA源地址寄存器 |
SRC_ADDR |
RW |
DMA传输的源地址 |
0X0000_0000 |
0X0014 |
DMA目的地址寄存器 |
DEST_ADDR |
RW |
DMA传输的目的地址 |
0X0000_0000 |
0X0018 |
DMA循环源起始地址寄存器 |
SRC_WRAP _ADDR |
RW |
循环模式下DMA传输源地址 |
0X0000_0000 |
0X001C |
DMA循环目的起始地址寄存器 |
DEST_WRA _ADDR |
RW |
循环模式下DMA传输目的地址 |
0X0000_0000 |
0X0020 |
DMA循环长度寄存器 |
WRAP_SIZE |
RW |
循环模式下DMA循环边界 |
0X0000_0000 |
0X0024 |
DMA通道控制寄存器 |
CHNL_CTRL |
RW |
当前通道DMA启动和停止 |
0X0000_0000 |
0X0028 |
DMA模式选择寄存器 |
DMA_MODE |
RW |
设置DMA的工作方式 |
0X0000_0000 |
0X002C |
DMA数据流控制寄存器 |
DMA_CTRL |
RW |
设置DMA传输数据流 |
0X0000_0000 |
0X0030 |
DMA传输字节数寄存器 |
DMA_STATUS |
RO |
获取当前已传输的字节数 |
0X0000_0000 |
0X0034 |
DMA链表入口地址寄存器 |
DESC_ADDR |
RW |
DMA链表地址入口地址设置 |
0X0000_0000 |
0X0038 |
DMA当前目的地址寄存器 |
CUR_DEST _ADDR |
RO |
当前DMA操作的地址 |
0X0000_0000 |
DMA CHNL1 registers |
|||||
0X0040 - 0X0068 |
同 DMA CHNL0 registers |
||||
DMA CHNL2 registers |
|||||
0X0070 - 0X0098 |
同 DMA CHNL0 registers |
||||
DMA CHNL3 registers |
|||||
0X00A0 -0X00C8 |
同 DMA CHNL0 registers |
||||
DMACHNL4registers |
|||||
0X00D0 - 0X00F8 |
同 DMA CHNL0 registers |
||||
DMA CHNL5 registers |
|||||
0X0100 - 0X0128 |
同 DMA CHNL0 registers |
||||
DMA CHNL6 registers |
|||||
0X0130 - 0X0158 |
同 DMA CHNL0 registers |
||||
DMA CHNL7 registers |
|||||
0X0160 - 0X0188 |
同 DMA CHNL0 registers |
中断屏蔽寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:16] |
保留 |
||
[15] |
RW |
channel7 transfer_done中断屏蔽,高有效。 |
1’b1 |
[14] |
RW |
channel7 burst_done中断屏蔽,高有效。 |
1’b1 |
[13] |
RW |
channel6 transfer_done中断屏蔽,高有效。 |
1’b1 |
[12] |
RW |
channel6 burst_done中断屏蔽,高有效。 |
1’b1 |
[11] |
RW |
channel5 transfer_done中断屏蔽,高有效。 |
1’b1 |
[10] |
RW |
channel5 burst_done中断屏蔽,高有效。 |
1’b1 |
[9] |
RW |
channel4 transfer_done中断屏蔽,高有效。 |
1’b1 |
[8] |
RW |
channel4 burst_done中断屏蔽,高有效。 |
1’b1 |
[7] |
RW |
channel3 transfer_done中断屏蔽,高有效。 |
1’b1 |
[6] |
RW |
channel3 burst_done中断屏蔽,高有效。 |
1’b1 |
[5] |
RW |
channel2 transfer_done中断屏蔽,高有效。 |
1’b1 |
[4] |
RW |
channel2 burst_done中断屏蔽,高有效。 |
1’b1 |
[3] |
RW |
channel1 transfer_done中断屏蔽,高有效。 |
1’b1 |
[2] |
RW |
channel1 burst_done中断屏蔽,高有效。 |
1’b1 |
[1] |
RW |
channel0 transfer_done中断屏蔽,高有效。 |
1’b1 |
[0] |
RW |
channel0 burst_done中断屏蔽,高有效。 |
1’b1 |
中断状态寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:16] |
保留 |
||
[15] |
RW |
channel7 transfer_done中断状态,写1清0。DMA传输完成产生中断。 |
1’b0 |
[14] |
RW |
channel7 burst_done中断状态,写1清0。DMA burst完成产生中断。 |
1’b0 |
[13] |
RW |
channel6 transfer_done中断状态,写1清0。DMA传输完成产生中断。 |
1’b0 |
[12] |
RW |
channel6 burst_done中断状态,写1清0。DMA burst完成产生中断。 |
1’b0 |
[11] |
RW |
channel5 transfer_done中断状态,写1清0。DMA传输完成产生中断。 |
1’b0 |
[10] |
RW |
channel5 burst_done中断状态, 写1清0。DMA burst完成产生中断。 |
1’b0 |
[9] |
RW |
channel4 transfer_done中断状态,写1清0。DMA传输完成产生中断。 |
1’b0 |
[8] |
RW |
channel4 burst_done中断状态, 写1清0。DMA burst完成产生中断。 |
1’b0 |
[7] |
RW |
channel3 transfer_done中断状态,写1清0。DMA传输完成产生中断。 |
1’b0 |
[6] |
RW |
channel3 burst_done中断状态,写1清0。DMA burst完成产生中断。 |
1’b0 |
[5] |
RW |
channel2 transfer_done中断状态,写1清0。DMA传输完成产生中断。 |
1’b0 |
[4] |
RW |
channel2 burst_done中断状态,写1清0。DMA burst完成产生中断。 |
1’b0 |
[3] |
RW |
channel1 transfer_done中断状态,写1清0。DMA传输完成产生中断。 |
1’b0 |
[2] |
RW |
channel1 burst_done中断状态,写1清0。DMA burst完成产生中断。 |
1’b0 |
[1] |
RW |
channel0 transfer_done中断状态,写1清0。DMA传输完成产生中断。 |
1’b0 |
[0] |
RW |
channel0 burst_done中断状态, 写1清0。DMA burst完成产生中断。 |
1’b0 |
UART选择寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 24] |
保留 |
||
[23:8] |
RW |
dma req clear: 对每bit 写1 清除对应的dma req 请求。自清。 如对bit 23写1 将清除 dma_sel 中第15个对应的dma请求; 对bit 8 写 1 将清除dma_sel中第0个dma请求-uart_rx_req; |
16’d0 |
[2 : 0] |
RW |
Uart dma channel 选择: 3’d0: uart0 模块dma通道接入dma 3’d1: uart1 模块dma通道接入dma 3’d2: uart2/7816 模块dma通道接入dma 3’d3: uart3 模块dma通道接入dma 3’d4: uart4 模块dma通道接入dma 3’d5: uart5 模块dma通道接入dma |
3’h0 |
DMA源地址寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 0] |
RW |
非循环模式下,DMA搬运的源地址,外设地址或内存地址 |
32’h0 |
DMA目的地址寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 0] |
RW |
非循环模式下,DMA搬运的目的地址,外设地址或内存地址 |
32’h0 |
DMA循环源起始地址寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 0] |
RW |
循环模式下,DMA搬运的源地址的起始地址,外设地址或内存地址 |
32’h0 |
DMA循环目的起始地址寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 0] |
RW |
循环模式下,DMA搬运的目的地址的起始地址,外设地址或内存地址 |
32’h0 |
DMA循环长度寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:16] |
RW |
循环模式下,DMA目的地址循环长度。 DMA从起始地址依次递增搬运数据,当搬运数据字节数达到此设定值之后,会跳转到循环起始地址,从起始地址开始继续搬运数据 |
16’h0 |
[15: 0] |
RW |
循环模式下,DMA源地址循环长度。 |
16’h0 |
DMA通道控制寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 2] |
保留 |
||
[1] |
RW |
dma_stop 停止dma操作,高有效。 DMA会在完成当前burst操作后停止,并同时清除chnl_on。软件应根据chnl_on为0确定dma已经完全停止。 |
1’b0 |
[0] |
RW |
chnl_on 启动当前通道DMA转换,高有效。 Dma完成后转换或设置停止后,自动清0。 |
1’b0 |
DMA模式选择寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 7] |
保留 |
||
[6] |
RW |
chain_link_en 链表方式下有效,表示dma在处理完第一个链表后,是否继续读取和处理后续链表。 如果为1,则更新链表中的next_desc_addr,并继续 读取下一个链表,直到链表中vld为0;如果为0,则处理完成当前链表后即停止。 |
1’b0 |
[5 : 2] |
RW |
dma_sel 16个dma_req的选择。 4’d0:uart rx dma req 4’d1:uart tx dma req 4’d2:pwm_cap0_req 4’d3:pwm_cap1_req 4’d4:LS_SPI rx dma req 4’d5:LS_SPI tx dma req 4’d6:SD_ADC chnl0 req 4’d7:SD_ADC chnl1 req 4’d8:SD_ADC chnl2 req 4’d9:SD_ADC chnl3 req 4’d10: I2S RX req 4’d11: I2S TX req 4’d12: SDIO_HOST req |
4’h0 |
[1] |
RW |
chain_mode 1’b0:使用普通模式 1’b1:使用链表模式 |
1’b0 |
[0] |
RW |
dma_mode 1’b0:软件方式。 1’b1:硬件方式。 |
1’b0 |
DMA数据流控制寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:24] |
保留 |
||
[23: 8] |
RW |
total_byte 总共需要操作的byte个数。需要与data_size配置相一致,即若果为字操作,则应该为配置为4的整数倍;如果为半字操作 ,则应该配置为2的整数倍。 |
16’h0 |
[7] |
RW |
burst_size 设置DMA每次搬运多少个单位的数据 1’b0:burst为1 1’b1:burst为4 当最后一次burst大小超过剩余传输的个数时,使用burst大小为剩余数据的大小。 |
1’b0 |
[6 : 5] |
RW |
data_size 设置DMA的搬运单位 2’h0:byte 2’h1:half_word 2’h2:word 2’h3:保留 |
2’h0 |
[4 : 3] |
RW |
dest_addr_inc 2’h0:每次操作后目的地址不变; 2’h1:每次操作后目的地址自动累加。 2’h2:保留 2’h3:循环操作,每次操作后目的地址自动累加,到达定义的循 环边界跳转到循环起始地址。 |
2’h0 |
[2 : 1] |
RW |
src_addr_inc 2’h0:每次操作后源地址不变 ; 2’h1:每次操作后源地址自动 累加。 2’h2:保留 2’h3:循环操作,每次操作后源地址自动累加,到达定义的循环边界跳转到循环起始地址。 |
2’h0 |
[0] |
RW |
auto_reload 当完成当前DMA搬运后,自动按当前DMA配置重新下一次DMA搬运。 |
1’b0 |
DMA传输字节数寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:16] |
保留 |
||
[15: 0] |
RW |
transfer_cnt 当前传输的字节个数。 每次重新开启dma(chnl_on置1)清0,并重新开始计数。 |
16’h0 |
DMA链表入口地址寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 0] |
RW |
desc_addr 链表使能时,作为链表的入口地址。每传输完成一次链表后,将下一个链表的基地址更新至此寄存器。 |
32’h0 |
DMA当前目的地址寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 0] |
RO |
current_dest_addr 当前DMA操作目的地址。 当软件停止dma时,可以通过查看此寄存器获悉dma将要操作的目的地址。 |
32’h0 |
通用硬件加密模块
功能概述
加密模块自动完成指定长度的源地址空间数据的加密,完成后自动将加密数据回写到指定的目的地址空间;支持SHA1/MD5/RC4/DES/3DES/AES/CRC/TRNG。
主要特征
支持SHA1/MD5/RC4/DES/3DES/AES/CRC/TRNG加密算法
DES/3DES支持ECB和CBC两种模式
AES支持ECB、CBC和CTR三种模式
CRC支持CRC8、CRC16_MODBUS、CRC16_CCITT和CRC32四种模式
CRC支持输入/输出反向
SHA1/MD5/CRC支持连续多包加密
内置真随机数发生器,也支持seed种子产生伪随机数
功能描述
SHA1加密
可对连续多包数据进行硬件SHA1计算,计算结果存在寄存器中,上一包的加密结果可以作为下一包的初始值。
MD5加密
可对连续多包数据进行硬件MD5计算,计算结果存在寄存器中,上一包的加密结果可以作为下一包的初始值。
RC4加密
支持RC4加密和解密。
DES加密
支持DES加密和解密,支持ECB和CBC两种模式。
3DES加密
支持3DES加密和解密,支持ECB和CBC两种模式。
AES加密
支持AES加密和解密,支持ECB、CBC和CTR三种模式。
CRC加密
可对连续多包数据进行硬件CRC计算,计算结果存在寄存器中,上一包的加密结果可以作为下一包的初始值,支持CRC8、CRC16_MODBUS、CRC16_CCITT和CRC32四种模式,支持输入/输出反向。
CRC32计算公式如下:
1、CRC-32: 0x04C11DB7
X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X+1
常用于ZIP, RAR, IEEE 802 LAN/FDDI, IEEE 1394, PPP-FCS等协议。
2、CRC-16: 支持两种多项式
2.1: 0X1021
X16 + X12 + X5 + 1
常用于ISO HDLC, ITU X.25, V.34/V.41/V.42, PPP-FCS CCITT等协议。
2.2: 0X8005
X16 + X15 + X2 + 1
常用于USB, ANSI X3.28, SIA DC-07等协议。
3、CRC-8:0X207
x8+x2+x1+1
TRNG随机数发生器
W800 系统中集成真随机数发生器模块。分为模拟模块与数字后处理模块。模拟模块输出随机时钟ad_trng_clks 与随机数 ad_trng_dout, 数字后处理模块用来消除随机数的偏差与自相关性。相关控制寄存器在GPSEC 寄存器列表中。
基本操作流程如下:
使能TRNG_EN,设置TRNG_SEL 为1,使得GPSEC 寄存器0x48 显示TRNG 的输出值。此时模拟模块开始输出随机时钟及随机信号。前8个时钟采样得到的信号作为LFSR的初始状态初始化LFSR 链,后面每个随机时钟采样得到的数据经过XOR CHAIN 及LFSR 寄存器的后处理,移位存储到寄存器TRNG_RANDOM 中。
软件可通过GPSEC 寄存器0x48 读取随机值。寄存器TRNG_DIG_BYPASS 设置为1时数字后处理模块停止工作,直接将模拟模块的输出值存储到结果寄存器TRNG_RANDOM 中。
寄存器描述
寄存器列表
偏移地址 |
名称 |
缩写 |
访问 |
描述 |
复位值 |
0X0000 |
源地址寄存器 |
SRC_ADDR |
RW |
RC4 / SHA1 / AES / DES / 3DES / CRC / MD5复用源地址 |
0X0000_0000 |
0X0004 |
目的地址寄存器 |
DEST_ADDR |
RW |
RC4 / AES / DES / 3DES复用目的地址 |
0X0000_0000 |
0X0008 |
配置寄存器 |
GPSEC_CFG |
RW |
通用硬件加密模块配置寄存器 |
0X0000_0000 |
0X000C |
控制寄存器 |
GPSEC_CTRL |
RW |
通用硬件加密模块控制寄存器 |
0X0000_0000 |
0X0010 |
秘钥0低位寄存器 |
KEY00 |
RW |
ey0低32位第一个输入key(RC4 / AES / DES / 3DES),复用CRC Ci |
0X0000_0000 |
0X0014 |
秘钥0高位寄存器 |
KEY01 |
RW |
Key0高32位第一个输入key(RC4 / AES / DES / 3DES) |
0X0000_0000 |
0X0018 |
秘钥1低位寄存器 |
KEY10 |
RW |
Key1低32位第二个输入key(RC4 / AES // 3DES) |
0X0000_0000 |
0X001C |
秘钥1高位寄存器 |
KEY11 |
header-rows |
Key1高32位第二个输入key(RC4 / AES // 3DES) |
0X0000_0000 |
0X0020 |
秘钥2低位寄存器 |
KEY20 |
RW |
Key2低32位第三个输入key(3DES),复用iv1低32位输入初始向量(AES) |
0X0000_0000 |
0X0024 |
秘钥2高位寄存器 |
KEY21 |
RW |
Key2高32位第三个输入key(3DES),复用iv1高32位输入初始向量(AES) |
0X0000_0000 |
0X0028 |
初始向量0低位寄存器 |
IV00 |
RW |
IV0低32位输入初始向量(AES / DES / 3DES) |
0X0000_0000 |
0X002C |
初始向量0高位寄存器 |
IV01 |
RW |
IV0高32位输入初始向量(AES / DES / 3DES) |
0X0000_0000 |
0X0030 |
状态寄存器 |
GPSEC_STS |
RW |
通用硬件加密模块状态寄存器 |
0X0000_0000 |
0X0034 |
摘要0寄存器 |
SHA1-DIGEST0 |
RW |
sha1-digest0 / MD5- digest0 |
0X6745_2301 |
0X0038 |
摘要1寄存器 |
SHA1-DIGEST1 |
RW |
sha1-digest1 / MD5- digest1 |
0XEFCD_AB89 |
0X003C |
摘要2寄存器 |
SHA1-DIGEST2 |
RW |
sha1-digest2 / MD5- digest2 |
0X98BA_DCFE |
0X0040 |
摘要3寄存器 |
SHA1-DIGEST3 |
RW |
sha1-digest3 / MD5- digest3 |
0X1032_5476 |
0X0044 |
摘要4寄存器 |
SHA1-DIGEST4 |
RW |
sha1-digest4 / CRC |
0XC3D2_E1F0 |
0X0048 |
RNG_result |
RNG_RESULT |
RW |
RNG输出 |
0X0000_0000 |
0X004C |
秘钥3低位寄存器 |
Key30 |
RW |
Key3低32位第三个输入key(RC4的256bit 模式) |
0X0000_0000 |
0X0050 |
秘钥3低位寄存器 |
Key31 |
RW |
Key3高32位第三个输入key(RC4的256bit 模式) |
0X0000_0000 |
0X0054 |
TRNG配置 |
RNG_CR |
RW |
真随机数发生器配置选择 |
0X40 |
配置寄存器
位 |
访问 |
操作说明 |
复位值 |
[31] |
RW |
RC4_128_256 0:标志RC4加密/解密是按照 128bit块长度进行; 1:标志RC4加密/解密是按照 256bit块长度进行。 |
1’b0 |
[30] |
RW |
RNG start 1’b0:不启动RNG 1’b1:启动RNG |
1’b0 |
[29] |
RW |
RNG Load_seed 硬件自动清0 1’b0:随机数发生器会默认以零为种子,产生相应位数的随机数 1’b1:种子加载完成以后开始 生成随机数 |
1’b0 |
[28] |
RW |
RNG switch 控制生成随机数的位数, 1’b0:16位 1’b1:32位 |
1’b0 |
[27] |
RW |
des_soft_reset des软复位完成后硬件自动清0 1’b0:不产生软复位且不改变当前状态 1’b1:加密算法被软件复位为初始状态 |
1’b0 |
[26] |
RW |
aes_soft_reset aes软复位完成后硬件自动清0 1’b0:不产生软复位且不改变当前状态 1’b1:加密算法被软件复位为初始状态 |
1’b0 |
[25] |
RW |
rc4_soft_reset rc4软复位完成后硬件自动清0 1’b0:不产生软复位且不改变 当前状态 1’b1:加密算法被软件复位为 初始状态 |
1’b0 |
[24] |
RW |
crc_datarev 1’b0:CRC输入数据不反向 1’b1:CRC输入数据反向 |
1’b0 |
[23] |
RW |
crc_chksrev 1’b0:CRC输出结果不反向 1’b1:CRC输出结果反向 |
1’b0 |
[22:21] |
RW |
sub_mode 算法类型子模式选择: 0:DES/AES密码算法的ECB模式,可复用CRC算法的CRC8模式 1:DES/AES密码算法的CBC,可复用CRC算法的CRC16_0模式 2:AES密码算法的CTR模式 ,可复用CRC算法的CRC16_1模式 3: AES密码算法的MAC模式,可复用CRC算法的CRC32 |
2’b0 |
[20] |
RW |
encrypt_decrypt RC4/AES/DES/3DE S算法的加密或解密模式选择: 1’b0:加密 1’b1:解密 |
1’b0 |
[19] |
RW |
gpsec_int_mask 1’b0:不屏蔽加/解密完成中断 1’b1:屏蔽加/解密完成中断 |
1’b0 |
[18:16] |
RW |
cypher_mode 密码算法类型 3’b000:RSV 3’b001:RC4 3’b010:SHA1 3’b011:AES 3’b100:DES 3’b101:3DES 3’b110:CRC 3’b111:MD5 |
3’b0 |
[15: 0] |
RW |
total_byte 总共需要加解密操作的byte个数。 |
16’h0 |
TRNG控制寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 7] |
保留 |
||
[6] |
RW |
TRNG_INT_MASK TRNG 中断mask 0:TRNG 模块上报中断; 1:TRNG 模块不上报中断; |
1’b1 |
[5:3] |
RW |
TRNG_CP TRNG 模块控制信号 |
3’d0 |
[2] |
RW |
TRNG_DIG_BYPASS TRNG 数字后处理模块bypass: 0:TRNG 模块进行后处理; 1:TRNG 模块不进行后处理; |
1’b0 |
[1] |
RW |
TRNG_SEL: RNG 输出选择信号。 0:寄存器0x48 显示 伪随机模块输出结果; 1:寄存器0x48 显示 TRNG输出结果; |
1’b0 |
[0] |
RW |
TRNG_EN: TRNG 模块使能信号。高有效。 0:TRNG 模块停止; 1:TRNG 模块开始工作; |
1’b0 |
控制寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 2] |
保留 |
||
[1] |
RW |
sec_stop 停止当前正在进行的加解密操作 1’b0:无效 1’b1:加/解密停止 |
1’b0 |
[0] |
RW |
sec_strt 启动加解密,完成加解密操作的byte个数后,硬件自动清0 1’b0:不启动加/解密 1’b1:启动加/解密 |
1’b0 |
状态寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 17] |
保留 |
||
[16] |
RW |
int_flag 软件写1清零 1’b0:不产生加/解密完成中断 1’b1:产生加/解密完成中断 |
1’b0 |
[15: 0] |
RO |
transfer_cnt 当前加密完成的字节个数。 每次重新开启加解密时清0,并重新开始计数。 |
16’h0 |
RSA加密模块
功能概述
RSA运算硬件协处理器,提供Montgomery(FIOS算法)模乘运算功能。配合RSA软件库实现RSA算法。支持128位到2048位模乘。
主要特征
支持128位到2048位模乘(模乘长度是32位的整数倍)
支持D*D;X*Y;D*Y;X*X等4个模乘模式
功能描述
模乘功能
RSA运算硬件协处理器,提供Montgomery(FIOS算法)模乘运算功能。配合RSA软件库一同实现RSA算法。支持128位到2048位模乘。
寄存器描述
寄存器列表
偏移地址 |
名称 |
缩写 |
访问 |
描述 |
复位值 |
0X0000 ~ 0X00FC |
数据X寄存器 |
XBUF |
RW |
数据X寄存器 |
|
0X0100 ~ 0X01FC |
数据Y寄存器 |
YBUF |
RW |
数据Y寄存器 |
|
0X0200 ~ 0X02FC |
数据M寄存器 |
MBUF |
RW |
数据M寄存器 |
|
0X0300 ~ 0X03FC |
数据D寄存器 |
DBUF |
RW |
数据D寄存器 |
|
0X0400 |
RSA 控制寄存器 |
RSACON |
RW |
RSA 控制寄存器 |
0X0000_0000 |
0X0404 |
参数MC寄存器 |
RSAMC |
WO |
参数MC寄存器 |
0X0000_0000 |
0X0408 |
参数N寄存器 |
RSAN |
RW |
参数N寄存器 |
0X0000_0000 |
数据X寄存器
XBUF对应数据X(2048bit)的缓冲区,对应haddr值为0000h~00fch。对应规则如下表:
000h |
004h |
008h |
······ |
00f8h |
00fch |
X[31 : 0] |
X[63 : 32] |
X[95 : 64] |
······ |
X[2015 : 1984] |
X[2047 : 2016] |
数据Y寄存器
YBUF对应数据Y(2048bit)的缓冲区,对应haddr值为0100h~01fch。对应规则如下表:
0100h |
0104h |
0108h |
······ |
01f8h |
01fch |
Y[31 : 0] |
Y[63 : 32] |
Y[95 : 64] |
······ |
Y[2015 : 1984] |
Y[2047 : 2016] |
数据M寄存器
MBUF对应数据M(2048bit)的缓冲区,对应haddr值为0200h~02fch。对应规则如下表:
0200h |
0204h |
0208h |
······ |
02f8h |
02fch |
M[31 : 0] |
M[63 : 32] |
M[95 : 64] |
······ |
M[2015 : 1984] |
M[2047 : 2016] |
数据D寄存器
DBUF对应数据D(2048bit)的缓冲区,对应haddr值为0300h~03fch。对应规则如下表:
0300h |
0304h |
0308h |
······ |
03f8h |
03fch |
D[31 : 0] |
D[63 : 32] |
D[95 : 64] |
······ |
D[2015 : 1984] |
D[2047 : 2016] |
RSA 控制寄存器
RSACON,RSA控制寄存器,实际物理空间为32bit寄存器。
位 |
访问 |
操作说明 |
复位值 |
[31: 6] |
保留 |
||
[5] |
RW |
模乘启动控制位。软件写“1”启 动模乘运算,运算结束后,硬件自 动清“0”。 |
1’b0 |
[4] |
RW |
提供软复位功能,高有效。软件写 “1”进行软复位,复位完成后,硬件自动清“0”。 1.设置参数MC和N为0。 2.启动模乘后(bit5置1),将此位置“1”,会终止当前的运算(当bit0变高,表示软复 位命令执行完成,运算被终止), 但内部数据缓冲区(X,Y,M, D)中已经完成的部分运算结果会保留。 |
1’b0 |
[2 : 3] |
RW |
模乘模式选择。 2’b00:X = D*D mod M 2’b01:D = X*Y mod M 2’b10:X = D*Y mod M 2’b11:D = X*X mod M |
2’b0 |
[1] |
RW |
保留 |
1’b0 |
[0] |
RW |
模乘运算完成标识,高有效。硬件 置“1”,软件清“0”。软件写 “1”无效。 |
1’b0 |
参数MC寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 0] |
WO |
RSAMC对应参数MC(32b it)。复位值全0。读出值为全0。 |
32’h0 |
参数N寄存器
RSAN对应参数N(7bit)。N值为模乘长度除以32的值。即如果调用1024bit的模乘运算,需设置N=32。对该寄存器写入时,取低7位为有效数据,读出时,高25位为0。复位值全0。
位 |
访问 |
操作说明 |
复位值 |
[31: 7] |
保留 |
||
[6 : 0] |
RW |
RSAN对应参数N(7bit)。N值为模乘长度除以32的值。 |
7’h0 |
GPIO模块
功能概述
GPIO控制器实现了软件对GPIO属性的配置,使用户能够方便的操作GPIO。
每个GPIO都可以通过软件单独配置,设置其作为输入端口、输出端口,设置其悬浮、上拉、下拉状态,设置其上升沿、下降沿、双沿、高电平、低电平中断触发方式。
主要特性
支持GPIO软件配置
支持GPIO中断配置
最多提供48个GPIO可用
功能描述
W800中提供的GPIO分为两组,一组为GPIOA,一组为GPIOB,GPIOA和GPIOB寄存器起始地址不同,但是功能一致。
当用户希望将某个特定IO作为软件控制的GPIO 使用的话,将GPIO复用选择寄存器中对应位置为0 即可。
GPIO方向控制寄存器用来控制GPIO 的方向,1表示对应的GPIO作为输出引脚,0表示对应的GPIO 作为输入引脚。
GPIO上下拉控制寄存器用来控制相应IO的上下拉功能。
GPIO上拉控制寄存器为低有效,设置为0表示打开相应IO的上拉功能,设置为1表示关闭上下拉功能。IO具有的属性请参见IO复用表。
GPIO下拉控制寄存器为高有效,设置为1表示打开相应IO的下拉功能,设置为0表示关闭上下拉功能。IO具有的属性请参见IO复用表。
GPIO数据寄存器在设置为输入状态时表示输入IO的电平,在设置为输出状态时可以写入1或者0指定IO的输出电平。此寄存器受到GPIO数据使能寄存器的控制,只有在GPIO数据使能寄存器设置为1的时候,GPIO数据寄存器才能读写。
GPIO 模块提供输入信号检测功能。通过配置GPIO中断相关的寄存器可以实现高低电平检测以及上下沿跳变检测。当对应IO的输入信号符合预先设置的条件,比如说高电平触发或者上升沿触发等,即会触发GPIO 中断,上报给MCU 处理。MCU 需要清除相应的中断状态,以免中断误触发。
寄存器描述
寄存器列表
偏移地址 |
名称 |
缩写 |
访问 |
描述 |
复位值 |
0X0000 |
GPIO数据寄存器 |
GPIO_DATA |
RW |
读写GPIO当前数据 |
0X180B |
0X0004 |
GPIO数据使能寄存器 |
GPIO_DATA _EN |
RW |
配置GPIO_DATA的使能位 |
0XFFFF |
0X0008 |
GPIO方向控制寄存器 |
GPIO_DIR |
RW |
配置GPIO方向 |
0X0000 |
0X000C |
GPIO上拉控制寄存器 |
GPIO_PULL _EN |
RW |
配置GPIO上拉 |
0XFFFF |
0X0010 |
GPIO复用选择寄存器 |
GPIO_AF_SEL |
RW |
配置GPIO复用功能使能位 |
0XFFFF |
0X0014 |
GPIO复用选择寄存器1 |
GPIO_SF_S1 |
RW |
GPIO复用功能选择位高地址位 |
0X0000 |
0X0018 |
GPIO复用选择寄存器0 |
GPIO_AF_S0 |
RW |
GPIO复用功能选择位低地址位 |
0X0000 |
0X001C |
GPIO下拉控制寄存器 |
GPIO_DN_ENA |
RW |
配置GPIO下拉 |
0X0000 |
0X0020 |
GPIO中断触发方式配置寄存器 |
GPIO_IS |
RW |
配置GPIO的中断触发方式 |
0X0000 |
0X0024 |
GPIO中断边沿触发模式配置寄存器 |
GPIO_IBE |
RW |
配置GPIO中断边沿触发模式 |
0X0000 |
0X0028 |
GPIO中断上下边沿触发配置寄存器 |
GPIO_IEV |
RW |
配置GPIO中断上下边沿触发或高低电平触发 |
0X0000 |
0X002C |
GPIO中断使能配置寄存器 |
GPIO_IE |
RW |
配置GPIO中断使能 |
0X0000 |
0X0030 |
GPIO裸中断状态寄存器 |
GPIO_RIS |
RO |
查询GPIO裸中断状态(MASK前) |
0X0000 |
0X0034 |
GPIO屏蔽后中断状态寄存器 |
GPIO_MIS |
RO |
查询GPIO屏蔽后中断状态(MASK后) |
0X0000 |
0X0038 |
GPIO中断清除控制寄存器 |
GPIO_IC |
WO |
控制GPIO中断清除 |
0X0000 |
偏移地址 |
名称 |
缩写 |
访问 |
描述 |
复位值 |
0X0000 |
GPIO数据寄存器 |
GPIO_DATA |
RW |
读写GPIO当前数据 |
0X0000_7304 |
0X0004 |
GPIO数据使能寄存器 |
GPIO_DATA _EN |
RW |
配置GPIO_DATA的使能位 |
0X7FFF_FFFF |
0X0008 |
GPIO方向控制寄存器 |
GPIO_DIR |
RW |
配置GPIO方向 |
0X0000_0000 |
0X000C |
GPIO上拉控制寄存器 |
GPIO_PULL _EN |
RW |
配置GPIO上拉 |
0XFFFF_FFFF |
0X0010 |
GPIO复用选择寄存器 |
GPIO_AF_SEL |
RW |
配置GPIO复用功能使能位 |
0XFFFF_FFFF |
0X0014 |
GPIO复用选择寄存器1 |
GPIO_SF_S1 |
RW |
GPIO复用功能选择位高地址位 |
0X0000_0000 |
0X0018 |
GPIO复用选择寄存器0 |
GPIO_AF_S0 |
RW |
GPIO复用功能选择位低地址位 |
0X0000_0000 |
0X001C |
GPIO下拉控制寄存器 |
GPIO_DN_ENA |
RW |
配置GPIO下拉 |
0X0000_0000 |
0X0020 |
GPIO中断触发方式配置寄存器 |
GPIO_IS |
RW |
配置GPIO的中断触发方式 |
0X0000_0000 |
0X0024 |
GPIO中断边沿触发模式配置寄存器 |
GPIO_IBE |
RW |
配置GPIO中断边沿触发模式 |
0X0000_0000 |
0X0028 |
GPIO中断上下边沿触发配置寄存器 |
GPIO_IEV |
RW |
配置GPIO中断上下边沿触发或高低电平触发 |
0X0000_0000 |
0X002C |
GPIO中断使能配置寄存器 |
GPIO_IE |
RW |
配置GPIO中断使能 |
0X0000_0000 |
0X0030 |
GPIO裸中断状态寄存器 |
GPIO_RIS |
RO |
查询GPIO裸中断状态(MASK前) |
0X0000_0000 |
0X0034 |
GPIO屏蔽后中断状态寄存器 |
GPIO_MIS |
RO |
查询GPIO屏蔽后中断状态(MASK后) |
0X0000_0000 |
0X0038 |
GPIO中断清除控制寄存器 |
GPIO_IC |
WO |
控制GPIO中断清除 |
0X0000_0000 |
GPIO数据寄存器
位 |
访问 |
操作说明 |
复位值 |
[15: 0] |
RW |
GPIO当前数据,每BIT与相应的GPIO线对应 |
16’h180b |
位 |
访问 |
操作说明 |
复位值 |
[31: 0] |
RW |
GPIO当前数据,每BIT与相应的GPIO线对应 |
32’h7304 |
GPIO数据使能寄存器
位 |
访问 |
操作说明 |
复位值 |
[15: 0] |
RW |
对应GPIO_DATA的BIT使能位,只有对应BIT为1时,对GPIO_DATA相应位的操作才有效,每BIT与相应的GPIO线对应,1’bx: [x] = 0, GPIO_DATA[x]不可读写 [x] = 1, GPIO_DATA[x]可读写 |
16’hffff |
位 |
访问 |
操作说明 |
复位值 |
[31: 0] |
RW |
对应GPIO_DATA的BIT使能位,只有对应BIT为1时,对GPIO_DATA相应位的操作才有效,每BIT与相应的GPIO线对应,1’bx: [x] = 0, GPIO_DATA[x]不可读写 [x] = 1, GPIO_DATA[x]可读写 |
32’h7fff_ffff |
GPIO方向控制寄存器
位 |
访问 |
操作说明 |
复位值 |
[15: 0] |
RW |
GPIO方向控制,每BIT与相应的GPIO线对应,1’bx: [x] = 0, GPIO[x]为输入 [x] = 1, GPIO[x]为输出 |
16’h0 |
位 |
访问 |
操作说明 |
复位值 |
[31: 0] |
RW |
GPIO方向控制,每BIT与相应的GPIO线对应,1’bx: [x] = 0, GPIO[x]为输入 [x] = 1, GPIO[x]为输出 |
32’h0 |
GPIO上下拉控制寄存器
位 |
访问 |
操作说明 |
复位值 |
[15: 0] |
RW |
GPIO上拉控制,每BIT与相应的GPIO线对应,1’bx: 注意:该寄存器为低有效 [x] = 0, GPIO[x]有上拉 [x] = 1, GPIO[x]无上拉 |
16’hffff |
位 |
访问 |
操作说明 |
复位值 |
[15: 0] |
RW |
GPIO下拉控制,每BIT与相应的GPIO线对应,1’bx: 注意:该寄存器为高有效 [x] = 1, GPIO[x]有下拉 [x] = 0, GPIO[x]无下拉 |
16’h0000 |
位 |
访问 |
操作说明 |
复位值 |
[31: 0] |
RW |
GPIO上拉控制,每BIT与相应的GPIO线对应,1’bx: 注意:该寄存器为低有效 [x] = 0, GPIO[x]有上拉 [x] = 1, GPIO[x]无上拉 |
32’hffff_ffff |
位 |
访问 |
操作说明 |
复位值 |
[31: 0] |
RW |
GPIO下拉控制,每BIT与相应的GPIO线对应,1’bx: 注意:该寄存器为高有效 [x] = 1, GPIO[x]有下拉 [x] = 0, GPIO[x]无下拉 |
32’h0000_0000 |
GPIO复用选择寄存器
位 |
访问 |
操作说明 |
复位值 |
[15: 0] |
RW |
GPIO复用功能使能位,每BIT对应相应GPIO复用功能是否打开,1’bx: [x] = 0, GPIO[x]复用功能关闭 [x] = 1, GPIO[x]复用功能打开 [x] = 1时,复用功能取决于GPIO_AF_S1和GPIO_AF_S0两个寄存器相应BIT的状态。 S1.[x] = 0,S0.[x] = 0,复用功能1(opt1) S1.[x] = 0,S0.[x] = 1,复用功能2(opt2) S1.[x] = 1,S0.[x] = 0,复用功能3(opt3) S1.[x] = 1,S0.[x] = 1,复用功能4(opt4) [x] = 0时,如果GPIO_DIR[x] = 0,且GPIO_PULL_EN [x] = 1,则GPIO复用为opt6模拟IO功能 IO复用功能参见芯片引脚复用关系 |
16’hffff |
位 |
访问 |
操作说明 |
复位值 |
[31: 0] |
RW |
GPIO复用功能使能位,每BIT对应相应GPIO复用功能是否打开,1’bx: [x] = 0, GPIO[x]复用功能关闭 [x] = 1, GPIO[x]复用功能打开 [x] = 1时,复用功能取决于GPIO_AF_S1和GPIO_AF_S0两个寄存器相应BIT的状态。 S1.[x] = 0,S0.[x] = 0,复用功能1(opt1) S1.[x] = 0,S0.[x] = 1,复用功能2(opt2) S1.[x] = 1,S0.[x] = 0,复用功能3(opt3) S1.[x] = 1,S0.[x] = 1,复用功能4(opt4) [x] = 0时,如果GPIO_DIR[x] = 0,且GPIO_PULL_EN [x] = 1,则GPIO复用为opt6模拟IO功能 IO复用功能参见芯片引脚复用关系 |
32’hffff_ffff |
GPIO复用选择寄存器1
位 |
访问 |
操作说明 |
复位值 |
[15: 0] |
RW |
GPIO复用功能选择位高地址位,和GPIO_AF_S0共同决定复用功能 IO复用功能参见芯片引脚复用关系 |
16’h0 |
位 |
访问 |
操作说明 |
复位值 |
[31: 0] |
RW |
GPIO复用功能选择位高地址位,和GPIO_AF_S0共同决定复用功能 IO复用功能参见芯片引脚复用关系 |
32’h0 |
GPIO复用选择寄存器0
位 |
访问 |
操作说明 |
复位值 |
[15: 0] |
RW |
GPIO复用功能选择位低地址位,和GPIO_AF_S1共同决定复用功能 如何配置参见GPIO_AF_SEL寄存器说明 |
16’h0 |
位 |
访问 |
操作说明 |
复位值 |
[31: 0] |
RW |
GPIO复用功能选择位低地址位,和GPIO_AF_S1共同决定复用功能 如何配置参见GPIO_AF_SEL寄存器说明 |
32’h0 |
GPIO中断触发方式配置寄存器
位 |
访问 |
操作说明 |
复位值 |
[15: 0] |
RW |
GPIO的中断触发方式,每BIT与相应的GPIO线对应,1’ bx: [x] = 0, GPIO[x]中断为边沿触发 [x] = 1, GPIO[x]中断为电平触发 |
16’h0 |
位 |
访问 |
操作说明 |
复位值 |
[31: 0] |
RW |
GPIO的中断触发方式,每BIT与相应的GPIO线对应,1’ bx: [x] = 0, GPIO[x]中断为边沿触发 [x] = 1, GPIO[x]中断为电平触发 |
32’h0 |
GPIO中断边沿触发模式配置寄存器
位 |
访问 |
操作说明 |
复位值 |
[15: 0] |
RW |
GPIO中断边沿触发模式,每BIT与相应的GPIO线对应,1 ’bx: [x] = 0, GPIO[x]边沿触发中断模式由GPIO_IEV决定 [x] = 1, GPIO[x]双沿都触发中断 |
16’h0 |
位 |
访问 |
操作说明 |
复位值 |
[31: 0] |
RW |
GPIO中断边沿触发模式,每BIT与相应的GPIO线对应,1 ’bx: [x] = 0, GPIO[x]边沿触发中断模式由GPIO_IEV决定 [x] = 1, GPIO[x]双沿都触发中断 |
32’h0 |
GPIO中断上下边沿触发配置寄存器
位 |
访问 |
操作说明 |
复位值 |
[15: 0] |
RW |
GPIO中断上下边沿触发或高低电平触发选择,每BIT与相应的GPIO线对应,1’bx: [x] = 0, GPIO[x]中断为低电平或下降沿触发 [x] = 1, GPIO[x]中断为高电平或上升沿触发 |
16’h0 |
位 |
访问 |
操作说明 |
复位值 |
[31: 0] |
RW |
GPIO中断上下边沿触发或高低电平触发选择,每BIT与相应的GPIO线对应,1’bx: [x] = 0, GPIO[x]中断为低电平或下降沿触发 [x] = 1, GPIO[x]中断为高电平或上升沿触发 |
32’h0 |
GPIO中断使能配置寄存器
位 |
访问 |
操作说明 |
复位值 |
[15: 0] |
RW |
GPIO中断使能控制,每BIT与相应的GPIO线对应,1’b x: [x] = 0, GPIO[x]中断失能 [x] = 1, GPIO[x]中断使能 |
16’h0 |
位 |
访问 |
操作说明 |
复位值 |
[31: 0] |
RW |
GPIO中断使能控制,每BIT与相应的GPIO线对应,1’b x: [x] = 0, GPIO[x]中断失能 [x] = 1, GPIO[x]中断使能 |
32’h0 |
GPIO裸中断状态寄存器
位 |
访问 |
操作说明 |
复位值 |
[15: 0] |
RW |
GPIO裸中断状态(MASK前),每BIT与相应的GPIO线 对应,1’bx: [x] = 0, GPIO[x]没有中断产生 [x] = 1, GPIO[x]有中断产生 |
16’h0 |
位 |
访问 |
操作说明 |
复位值 |
[31: 0] |
RW |
GPIO裸中断状态(MASK前),每BIT与相应的GPIO线对应,1’bx: [x] = 0, GPIO[x]没有中断产生 [x] = 1, GPIO[x]有中断产生 |
32’h0 |
GPIO屏蔽后中断状态寄存器
位 |
访问 |
操作说明 |
复位值 |
[15: 0] |
RW |
GPIO屏蔽后中断状态(MASK后),每BIT与相应的GPIO线对应,1’bx: [x] = 0, GPIO[x]没有中断产生(MASK后) [x] = 1, GPIO[x]中断产生(MASK后) |
16’h0 |
位 |
访问 |
操作说明 |
复位值 |
[31: 0] |
RW |
GPIO屏蔽后中断状态(MASK后),每BIT与相应的GPIO线对应,1’bx: [x] = 0, GPIO[x]没有中断产生(MASK后) [x] = 1, GPIO[x]中断产生(MASK后) |
32’h0 |
GPIO中断清除控制寄存器
位 |
访问 |
操作说明 |
复位值 |
[15: 0] |
RW |
GPIO中断清除控制,每BIT与相应的GPIO线对应,1’bx: [x] = 0, 无动作 [x] = 1, 清除GPIO[x]中断状态 |
16’h0 |
位 |
访问 |
操作说明 |
复位值 |
[31: 0] |
RW |
GPIO中断清除控制,每BIT与相应的GPIO线对应,1’bx: [x] = 0, 无动作 [x] = 1, 清除GPIO[x]中断状态 |
32’h0 |
高速SPI设备控制器
功能概述
兼容通用SPI物理层协议,通过约定与主机交互的数据格式,主机可以对设备进行高速访问,最高支持工作频率为50MHZ。
主要特性
兼容通用SPI协议
可选择的电平中断信号
最高支持50Mbps速率
简单的帧格式,全硬件解析与DMA
功能描述
SPI协议简介
SPI以主从方式工作,通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时)。分别是SDI(数据输入)、SDO(数据输出)、SCLK(时钟)、CS(片选)。
(1)SDI – Serial Data In,串行数据输入
(2)SDO – Serial Data Out,串行数据输出
(3)SCLK – Serial Clock,时钟信号,由主设备产生
(4)CS – Chip Select,从设备使能信号,由主设备控制。
其中,CS是从芯片是否被主芯片选中的控制信号,也就是说只有片选信号为预先规定的使能信号时(高电位或低电位),主芯片对此从芯片的操作才有效。这就使在同一条总线上连接多个SPI设备成为可能。
除了上述4根信号线之后,HSPI还额外增加了一根INT线,当从设备有数据需要上传时,产生一个下降沿的中断,实现数据的主动上报。
SPI通讯是通过数据交换完成的,数据是一位一位的传输的,由SCLK提供时钟脉冲,SDI,SDO则基于此脉冲完成数据传输。数据输出通过SDO线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取。完成一位数据传输,输入也使用同样原理。因此,至少需要8次时钟信号的改变(上沿和下沿为一次),才 能完成8位数据的传输。
SCLK信号线由主设备控制,从设备不能控制信号线。在一个基于SPI的设备中,至少有一个主控设备。
SPI工作过程
芯片内部的HSPI是和wrapper控制器一起工作的,wrapper控制器内部集成DMA,通过DMA实现HSPI内部FIFO和芯片内部缓存之间的数据交换。该操作是硬件实现的,软件不需要关心数据发送接收过程,只需要配置发送接收数据链表,以及操作wrapper控制器相应的寄存器。
关于wrapper控制器的详细介绍,请参考相关章节。
寄存器描述
HSPI芯片内部操作的寄存器列表
偏移地址 |
名称 |
缩写 |
问 |
描述 |
复位值 |
0X0000 |
HSPI FIFO清空寄存器 |
CLEAR_FIFO |
RW |
清除Tx和Rx FIFO的内容,同时会同步复位系统时钟域的电路 |
0X0000_0000 |
0X0004 |
HSPI配置寄存器 |
SPI_CFG |
RW |
配置SPI的传输模式以及大小端配置 |
0X0000_0000 |
0X0008 |
HSPI模式配置寄存器 |
MODE_CFG |
RW |
配置ahb master访问总线时的burst长度 |
0X0000_0000 |
0X000C |
HSPI中断配置寄存器 |
SPI_INT_CPU _MASK |
RW |
配置中断是否使能 |
0X0000_0003 |
0X0010 |
HSPI中断状态寄存器 |
SPI_INT_CPU _STTS |
RW |
获取以及清除中断状态 |
0X0000_0000 |
0X0018 |
HSPI数据上传长度寄存器 |
RX_DAT_LEN |
RW |
配置可以上传的数据长度 |
0X0000_0000 |
HSPI FIFO清空寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 1] |
RO |
保留 |
|
[0] |
RW |
Clear FIFOs,清除Tx和Rx FIFO的内容,同时会同步复位系统时钟域的电路(本列表中的寄存器除外) 0:不清除FIFO 1:清除有效 软件置位,硬件清零 注:如果要复位整个电路,需要采用本模块的异步复位管腿:rst_n |
1’b0 |
HSPI 配置寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 4] |
RO |
保留 |
|
[3] |
RW |
Bigendian, spi 接口支持数据的大小端选择。 0:支持小段数据传输 1:支持大端数据传输 |
1’b0 |
[2] |
RW |
spi_tx_always _drive 0:spi输出只有在片选有效时有效,其它时刻为高阻 1:spi输出一直有效 |
1’b0 |
[1] |
RW |
SPI CPHA 0:传输模式A 1:传输模式B |
1’b0 |
[0] |
RW |
SPI CPOL,SCK在IDLE时的极性 0:SCK IDLE时为0 1:SCK IDLE 时为1 |
1’b0 |
HSPI 模式配置寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 1] |
RO |
保留 |
|
[0] |
RW |
Burst len,ahb master访问总线时的burst长度 0:burst len为1字 1:burst len为4字 建议设置为4个字的burst传输,这样在spi接口频率较高时,可以保证不断流 |
1’b0 |
HSPI 中断配置寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 2] |
RO |
保留 |
|
[1] |
RW |
IntEnRxOverrun,RxOverrun中断使能 0:Rx FIFO overflow 中断使能 1:Rx FIFO overflow 中断不使 |
1’b |
[0] |
RW |
IntEnTxUnderrun,TxUnderrun中断使能 0:Tx FIFO underflow 中断使能 1:Tx FIFO underflow 中断不使能 |
1’b |
HSPI 中断状态寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 2] |
RO |
保留 |
|
[1] |
RW |
RxOverrun 0:Rx FIFO overflow 1:Rx FIFO overflow 写1清零 |
1’b0 |
[0] |
RW |
TxUnderrun 0:Tx FIFO underflow 1:Tx FIFO underflow 写1清零 |
1’b0 |
HSPI 数据上传长度寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:16] |
RO |
保留 |
|
[15: 0] |
RW |
Rx_dat_len 表示可以上传的数据长度,单位为字节 上传长度都是字的整数倍,如果上传长度不足整字,向上取整。 |
16’h0 |
主机端访问HSPI控制器寄存器列表
主机端通过固定的SPI命令格式访问SPI接口寄存器。命令长度固定为一个字节,数据长度固定为两个字节。
偏移地址 |
名称 |
缩写 |
访问 |
描述 |
复位值 |
0X02 |
获取数据长度寄存器 |
RX_DAT_LEN |
RO |
上传数据时,spi主机用来获取从device端读取的数据长度 |
0X0000 |
0X03 |
下发数据标志寄存器 |
TX_BUFF _AVAIL |
RO |
主向从发数据时,用于判断是否可以下传数据或者命令 |
0X0000 |
0X04 |
保留 |
RSV |
RO |
||
0X05 |
中断配置寄存器 |
SPI_INT _HOST _MASK |
RW |
是否屏蔽中断 |
0X0000 |
0X06 |
中断状态寄存器 |
SPI_INT _HOST _STTS |
RO |
中断状态寄存器,spi主机查询该位确认是否有数据上传 |
0X0000 |
0X07 |
保留 |
RSV |
RO |
||
0X00 |
数据端口0 |
DAT_PORT0 |
RW |
Spi主机通过该寄存器端口向从设备下发数据,下发前面的数据帧使用该端口 |
|
0X10 |
数据端口1 |
DAT_PORT1 |
RW |
Spi主机通过该寄存器端口向从设备下发数据,下发最后一个数据帧使用该端口 |
|
0X01 |
命令端口0 |
DN_CMD _PORT0 |
WO |
Spi主机通过该寄存器向从设备下发命令数据,下发前面的命令数据使用该端口 |
|
0X11 |
命令端口1 |
DN_CMD _PORT1 |
WO |
Spi主机通过该寄存器向从设备下发命令数据,下发最后一帧命令数据使用该端口 |
HSPI 获取数据长度寄存器
位 |
访问 |
操作说明 |
复位值 |
[15: 0] |
RO |
spi主机只读寄存器,在上传数据时,主要用来获知从device端读取多少数据 但在本模块中,上传长度都是字的整数倍,如果此上传长度值不为整字,则主机读数时向上取整,即多读部分冗余字节 |
16’h0 |
HSPI 下发数据标志寄存器
位 |
访问 |
操作说明 |
复位值 |
[15: 2] |
RO |
保留 |
|
[1] |
RO |
tx_cmdbuff_avail 标志发送cmd的buff是否可用,如果可用,则主机可以下发cmd。 0:发送buff不可用 1:发送buff可用 |
1’b0 |
[0] |
RO |
tx_buff_avail 标志发送buff是否可用,如果可用,则主机可以下发数据。 0:发送buff不可用 1:发送buff可用 |
1’b0 |
HSPI 中断配置寄存器
位 |
访问 |
操作说明 |
复位值 |
[15: 1] |
RO |
保留 |
|
[0] |
RO |
IntMaskup_dat _cmd_rdy 中断屏蔽 0:中断没有被屏蔽,可以产生中断 1:中断被屏蔽 注:建议采用主机自己内部的中断屏蔽,这样可以提高效率。 |
1’b0 |
HSPI 中断状态寄存器
位 |
访问 |
操作说明 |
复位值 |
[15: 1] |
RO |
保留 |
|
[0] |
RO |
up_dat_cmd_rdy 向SPI主机产生中断的状态寄存器 0:数据或命令没有准备好 1:数据或命令已经准备好 读可清 |
1’b0 |
HSPI 数据端口0
位 |
访问 |
操作说明 |
复位值 |
RW |
SPI主机通过该寄存器端口和device进行数据传输,向该寄存器写数,即可下发数据,从该寄存器读数,即可上传数据。如果正在传输的帧需要通过多次传输才能完成,则最后一次传输采用寄存器端口DAT_PORT1,其它的采用DAT_PORT0。 |
HSPI 数据端口1
位 |
访问 |
操作说明 |
复位值 |
RW |
SPI主机通过该寄存器端口和device进行数据传输,向该寄存器写数,即可下发数据,从该寄存器读数,即可上传数据。如果正在传输的帧需要通过多次传输才能完成,则最后一次传输采用寄存器端口DAT_PORT1,其它的采用DAT_PORT0。 |
HSPI 命令端口0
位 |
访问 |
操作说明 |
复位值 |
RW |
SPI主机通过该寄存器端口和device进行命令交互,向该寄存器写数,即可下发命令。如果正在传输的命令需要通过多次传输才能完成,则最后一次传输采用寄存器端口DN_CMD_PORT1 ,其它的采用DN_CMD_PORT0。 注:此窗口只用来下发驱动和固件协商的命令。 |
HSPI 命令端口1
位 |
访问 |
操作说明 |
复位值 |
RW |
SPI主机通过该寄存器端口和device进行命令交互,向该寄存器写数,即可下发命令。如果正在传输的命令需要通过多次传输才能完成,则最后一次传输采用寄存器端口DN_CMD_PORT1 ,其它的采用DN_CMD_PORT0。 注:此窗口只用来下发驱动和固件协商的命令。 |
高速SPI设备控制器接口时序
主要描述SPI读写时序,以及主SPI如何与HSPI进行数据交互。
数据格式
数据格式分为命令域和数据域两部分,如下图。其中命令域固定长度为8bit,数据域长度根据访问对象不同,长度不同,具体参见下文。
命令域的最高bit为读写标志位,其余7bit为地址.
0表示从后边7bit地址处读数据
1表示向后边7bit地址写数据

图 5上位机SPI收发数据格式
本模块数据域只支持两种长度,上位机SPI访问接口配置寄存器(表2),数据域长度为16bit;
通过端口(数据端口0,数据端口1,命令端口0和命令端口1)传输数据,数据域长度为32bit的整数倍;
下图为读写接口配置寄存器的时序图。从设备默认配置是小端模式。

图 6 HSPI 寄存器读操作(大端模式)

图 7 HSPI寄存器写操作(大端模式)

图 8 寄存器读操作(小端模式)

图 9 寄存器写操作(小端模式)
下图为读写数据的时序图,数据域长度为32bit的整数倍,图示只传输一个字的长度。

图 10 端口读操作(大端模式)

图 11 端口写操作(大端模式)

图 12 端口读操作(小端模式)

图 13 端口写操作(小端模式)
注:命令和数据之间可以没有等待时间,即传输命令字段后,可以紧接着数据传输,不需要多余空闲时钟或者空闲时间。有时间延迟也可以,但不能出现空闲时钟。
时序
本模块支持半双工,可以支持的时序根据时钟相位和采样点的不同,分为4种。以下时序只是给出时钟的相位和采样关系。需要注意的是,芯片默认支持(CPOL=0,CPHA=0)。
注:命令和数据之间可以没有等待时间,即传输命令字段后,可以紧接着数据传输,不需要多余空闲时钟或者空闲时间。有时间延迟也可以,但不能出现空闲时钟。

图 14 CPOL=0,CPHA=0

图 15 CPOL=0,CPHA=1

图 16 CPOL=1,CPHA=0

图 17 CPOL=1,CPHA=1
中断
中断信号由从设备发送给主设备,通过SPI_INT管脚触发,低电平有效。
spi_int主要通知spi主机有数据或者命令需要上传,spi主机处理中断时关心的接口寄存器为:
SPI_INT_HOST_MASK
SPI_INT_HOST_STTS
RX_DAT_LEN
注:每一上传的帧对应一个中断。只有当前需要上传的帧传输完成后,如果还有帧需要上传,此时,才会产生新的中断。下图是处理中断的一种方式。

图 18主SPI处理中断流程
主SPI收发数据工作流程

图 19下行数据流程图
注意:下发的数据的长度必须是以字为单位,如果非整字,填0补齐。

图 20下行命令流程图
注意:下发的命令的长度必须是以字为单位,如果非整字,填0补齐。

图 21上行数据(命令)流程图
上行数据和上行命令的流程一样。
此处需要注意的是,上行的数据的长度必须是以字为单位,如果有效长度非整字,尾部多余数据可以扔掉。
需要说明的是,主从之间有数据和命令两个通道可以交互数据,用户可以根据需要任意选择一个通道使用或者两个都使用。命令通道一次交互最大数据长度为256字节,数据通道一次交互最大数据长度为1500字节。数据长度限制由从设备控制,如果长度超限,会破坏从设备的数据结构。
SDIO设备控制器
功能概述
W800集成了SDIO设备端接口,作为从设备,完成与主机数据的交互。内部集成了1024byte的异步FIFO,完成主机与芯片的数据交互。
主要特性
兼容SDIO卡规范2.0
支持主机速率0~50MHz
支持最大1024字节的Block
支持1比特SD和4比特SD模式
功能描述
SDIO总线
SDIO总线和USB总线类似,SDIO总线也有两端,其中一端是主机端,另一端是设备端,采用HOST- DEVICE这样的设计是为了简化DEVICE的设计,所有的通信都是由HOST端发出命令开始的。在DEVICE端只要能解析HOST的命令,就可以同HOST进行通信了,SDIO的HOST可以连接多个DEVICE。
在SDIO总线定义中,DAT1信号线复用为中断线。在SDIO的1BIT模式下DAT0用来传输数据,DAT1用作中断线。在SDIO的4BIT模式下DAT0-DAT3用来传输数据,其中DAT1复用作中断线。
SDIO命令
SDIO总线上都是HOST端发起请求,然后DEVICE端回应请求,其中请求和回应中会包含数据信息:
Command:用于开始传输的命令,是由HOST端发往DEVICE端的,其中命令是通过CMD信号线传送的;
Response:回应是DEVICE返回的,作为Command的回应。也是通过CMD线传送的;
Data:数据是双向的传送的。可以设置为1线模式,也可以设置为4线模式。数据是通过DAT0-DAT3信号线传输的。
SDIO的每次操作都是由HOST在CMD线上发起一个CMD,对于有的CMD,DEVICE需要返回Response,有的则不需要。
对于读命令,首先HOST会向DEVICE发送命令,紧接着DEVICE会返回一个握手信号,此时,当HOST收到回应的握手信号后,会将数据放在4位的数据线上,在传送数据的同时会跟随着CRC校验码。当整个读传送完毕后,HOST会再次发送一个命令,通知DEVICE操作完毕,DEVICE同时会返回一个响应。
对于写命令,首先HOST会向DEVICE发送命令,紧接着DEVICE会返回一个握手信号,此时,当HOST收到回应的握手信号后,会将数据放在4位的数据线上,在传送数据的同时会跟随着CRC校验码。当整个写传送完毕后,HOST会再次发送一个命令,通知DEVICE操作完毕,DEVICE同时会返回一个响应。
SDIO内部存储
SDIO设备内部具有固定的存储映射,包括一般资讯区域(CIA)和特殊功能区域(function unique area)。
CIA中的寄存器包括了I/O端口功能,中断产生以及端口工作信息,可以通过读写功能0对CIA所定义的寄存器进行相关操作。CIA包含了CCCR,FBR和CIS共三方面信息。其中CCCR定义了SDIO卡的公共控制寄存器,主机端通过操作CCCR可以对SDIO卡进行检查和对端口进行操作,CCCR的地址为0X0 0-0XFF。FBR定义了所支持的端口功能1到端口功能7的操作,包括了各端口的要求和功能,电源控制等,FBR的地址为0Xn00-0Xnff(其中n为功能端口号)。CIS定义了卡的一些信息结构,地址为0X1000- 0X17FFF,CIS有公共CIS和各功能端口各自的CIS,其中公共CIS的初始地址在CCCR的CIS Pointer域中,各端口功能的CIS在各功能端口FBR的CIS Pointer域中。
CIA的存储映射如下图。

图 22 SDIO内部存储映射
CIA中各寄存器的描述参考下文。要深入了解CIA,请参阅SDIO协议规范。
寄存器描述
寄存器列表
SDIO Fn0 寄存器
Fn0寄存器为SDIO协议规定的寄存器,其地址范围为:0x00000~0x1FFFF,共128K。起始地址为0x00000。
Fn0寄存器由SDIO 主机通过CMD52命令进行访问,偏移地址即为访问地址,功能号为0。

图 23 CCCR 寄存器存储结构
图 23 CCCR 寄存器存储结构

图 24 FBR1 寄存器结构
图 24 FBR1 寄存器结构

图 25 CIS存储空间结构
图 25 CIS存储空间结构
SDIO CCCR寄存器和FBR1寄存器列表
偏移地址 |
名称 |
缩写 |
访问 |
描述 |
复位值 |
0X00 |
CCCR/SDIO Revision |
SDIOx |
RO |
[3:0],表示 支持的CCCR/FBR格式 4’h0:CCCR/FBR Version 1.00 4’h1:CCCR/FBR Version 1.10 4’h2:CCCR/FBR Version 1.20 4’h3-4’hF:Rsv 由CIA Register [3:0] 来表示 |
4’h2 |
CCCRx |
RO |
[7:4],表示支持的SDIO协议版本 4’h0:SDIO Version 1.00 4’h1:SDIO Version 1.10 4’h2:SDIO Version 1.20 (unrelea sed) 4’h3:SDIO Version 2.00 4’h4-4’hF:Rsv 由CIA Register [7:4] 来表示 |
4’h3 |
||
0X01 |
SD pecifica tion Revision |
SDx |
RO |
[3:0],表示支持的SD协议版本 4’h0:SD Physical Version 1.01 (March 2000) 4’h1:SD Physical Version 1.10 (October 2004) 4’h2:SD Physical Version 2.00 (May 2006) 4’h3-4’hF:Rsv 由CIA Register [11:8] 来表示 |
4’h2 |
RO |
RFU |
4’h0 |
|||
0X02 |
I/O Enable |
IOEx |
RO |
RFU |
1’b0 |
RW |
[7:1],Function使能,bit1-bit7分别对应7个function,对应SD主机使相应bit为1,则使能相应function,否则相应function不能工作。 注:CIS0,CIS1以及CSA放在Fn1中,此时即使Fn1不使能,SD主机也可以对这个三个区域进行读写(CIS0,CIS1不可以写)。 |
7’b0 |
|||
0X03 |
I/O Ready |
IORx |
RO |
RFU |
1’b0 |
RO |
[7:1],IOR共7bit,分别对应7个function的状态 ,如果对应bit为1,则表示该function可以工作。 本设计中,HC8051通过配置program register 的function ready 位为1,使的本寄存器bit1=1 ,从而标志Fn1可以正常工作。 注:对CIS0、 CIS1、CSA 的读写操作独立于IOR1,即,即使IOR1=0,也可以访问这三个存储空间的内容。 |
7’b0 |
|||
0X04 |
Int Enable |
IENM |
RW |
[0],中断使能信号 0:来至卡里的中断不能送给SD主机 1:任何func tion的中断都 可以送给主机 |
1’b0 |
IENx |
RW |
[7:1], functionx 的中断使能。 IEN1=0,则来至Fn1的中断不会送给主机。 IEN1=1,则允许Fn1的中断送给主机 |
7’b0 |
||
0X05 |
Int Pending |
RO |
[0],RFU |
1’b0 |
|
INTx |
RO |
[7:1], functionx 的中断挂起。 INT1=0,没 有Fn1的中断被挂起 INT1=1,Fn1有中断被挂起 。 注:如果IEN1和IENM不为1,则主机不会收到挂起中断 |
7’b0 |
||
0X06 |
I/O Abort |
ASx |
WO |
[2:0],取消IO读或者写,从而释放总线。 取消Fn1操作,应该采用CMD52写写入3’b1 。该命令在SPI下不支持。 |
3’b0 |
RES |
WO |
[3],软复位信号 1:复位SD 时钟域的电路,该bit在置位后自动清零,不需要专门清零。该复位信号不会影响当前卡的协议选择(SD 或者SPI模式) ,同时也不会影响 CD Disable。只能采用CMD52操作。 |
1‘b0 |
||
RO |
RFU |
4‘b0 |
|||
0X07 |
Bus Interface ontrol |
Bus Width |
RW |
[1:0],数据线宽度 2’b00:1bit数据线模式 2’b10:4bit数据线模式 复位或者上电,会变为2’b00 |
2’b00 |
RO |
[4:2],RFU |
3’b000 |
|||
ECSI |
RW |
[5],允许连续的SPI中断。 如果SCSI为1 ,则这一个寄存器用来允许SDIO卡在SPI模式下,在任何时间给出中断,此时不需要关心CS线的状态 。 |
1’b0 |
||
SCSI |
RO |
[6],支持连续的SPI中断。 如果为1,表示SDIO卡支持SPI模式下,在任何时候给出中断,而不需要关心CS的状态。 当progtam reg [2] 为1 ,该寄存器置位。 |
1’b1 |
||
CD Disable |
RW |
[7],连接或者 断开 CD/DAT[3] (pin1) 上的10-90K上拉电阻。 0:连接上拉电阻 1:断开上拉电阻 在上电后,该寄存器清零,即连接上拉电阻。该寄存器的状态不会被SD 协议中的复位命令影响。 |
1’b0 |
||
0X08 |
Card Capability |
SDC |
RO |
[0],支持在数据传输期间执行CMD52命令。在SPI模式下不支持该寄存器。 当progtam reg [3] 为1 时,该寄存器为1 |
1’b1 |
SMB |
RO |
[1],表示SDIO卡支持CMD53要求的Block传输模式。 当program_reg [4] 为1时,该寄存器为 1 |
1’b1 |
||
SRW |
RO |
[2],表示SDIO支持读等待-Read Wait Control( RWC)操作。 当program_reg [5] 为1时,该寄存器为 1 |
1’b1 |
||
SBS |
RO |
3,表示SDIO卡支持挂起/恢复。 如果为0,则不支持(0x0C-0x0F)寄存器 如果为1,除了Fn0,所有function都会根据SD主机要求挂起或者恢复 当program_reg [6] 为1时,该寄存器为 1 |
1’b1 |
||
S4MI |
RO |
[4],表示SDIO卡支持在4bit多Block数据传输模式下,向主机产生中断。 0:不支持在Block传输间产生中断,在这种情况下,只要IENx =1,SDIO还是可以在其他中断周期向主机发起中断 1:支持在Block传输间产生中断 当program_reg [7] 为 1时,该寄存器为 1 |
1’b1 |
||
E4MI |
RW |
[5],中断使能 。 允许4bit多Block模式下,在两block数据传输中间向主机产生中断。 0:不允许 1:允许 上电复位或者复位命令会使该寄存器清0 |
1’b0 |
||
LSC |
RO |
[6], 0:表示SDIO卡为全速设备 1:表示SDIO卡为低速设备 当program_reg [8] 为 1时,该寄存器为 1 |
1’b0 |
||
4BLS |
RO |
[7], 0:表示SDIO为低速模式设备或者不支持4bit模式 1:表示SDIO为低速模式设备,且支持4bit模式 当program_reg [9] 为 1时,该寄存器为 1 |
1’b1 |
||
0X09-0X0B |
Common CIS pointer |
RO |
[23:0],指向SDIO卡共用 CIS(CIS0)的起始地址指针 。CIS0包含关于整个卡的信息。其访问空间为:0x001000- 0x017FFF 。指针以小端格式存储(LSB)。 |
24’h001000 |
|
0X0C |
Bus Suspend |
BS |
RO |
[0],总线状态 。 0:当前选中的function没有使用数据总线 1:当前选中的function( 用FSx或者用IO命令中的function number)正在执行将要在数据线上传输数据的命令 这个寄存器被主机用来决定哪个function当前正在使用数据总线 。 如果SDIO卡不支持挂起恢复功能 ,则该寄存器为0 . 任何访问CIA的操作不能挂起,该寄存器一直为1,即使BR寄存器为 1。 SPI模式下,只读,且为0. |
1’b0 |
BR |
RW |
总线释放请求/状态。该寄存器用来请求选定的function(用FSx或者CMD53总function number选中)释放数据总线并挂起相关操作。 如果主机设置该寄存器为1,则选定的function将暂时停止在数据线上的数据传输 ,并挂起当前数据操作的命令。BR寄存器保持为1,直到释放过程完成 。一旦function被挂起,设备通过清零BS、BR来通知主机。主机可以通过读BR来监测挂起请求的执行状态,如果 BR为1,则挂起请求仍在执行。主机可以主动向BR写0来取消正在执行的挂起请求。 SPI模式下,只读,且为0. |
4’h0 |
||
RO |
[7:2],RFU |
6’b0 |
|||
0X0D |
Function Select |
FSx |
RW |
[3:0],在挂起/恢复操作中,用来选取 function [0-7] 。两种方法写FSx: 对CCCR执行IO写操作 新发起的IO命令将导致FSx设置为命令中的function number。 如果function当前被挂起, 向FSx写该function的number,则在读FSx时,将恢复该function的数据传输操作。返回的值将会是当前选中的 function 的number。 注:当读FSx时,如果BS=0,则FSx的值未定义。 4’b0000:Transaction of function 0 (CIA) 4’b0001- 4’b0111:Transaction to functions 1-7 4’b1000:Transaction of memory in combo card 4’b1001- 4’b1111:Not defined, reserved for future use |
4’b0 |
RO |
[3:1],RFU |
3’b000 |
|||
DF |
RO |
[7],恢复数据标志。向FSx写入function number,将 恢复选中function的数据传输。一旦数据传输恢复,DF寄存器将标明是否有更多的数据要传输。 0:在function被恢复后,没有更多数据要传输。 1:在function被恢复后,有更多数据要传输。 DF用来在4bit模式下,控制中断周期。如果为1 ,在function恢复后,有更多数据要传输,在这种情况下,中断周期被取消。如果为0,function在数据传输结束后恢复(在b usy情况下), 在这种情况下,在恢复后,没有数据传输,因此主机可以在function恢复后监测到中断周期的开始。 |
1’b0 |
||
0X0E |
Exec Flags |
EXx |
RO |
[7:0],执行标志位。主机通过这些bit位来决定所有 function [7-1] 执行命令的状态。 这些寄存器可以告知主机某一function正在执行命令,因此不能对该function发出新的命令 。 SPI模式下,只读,且为0. |
8’h00 |
0X0F |
Ready Flags |
RFx |
RO |
[7:0],读标志位。主机通过这些寄存器可以得知对 function [7-1] 读写忙状态。如果一个function 正在执行一个写交易,对应的RFx bit清零标志着该function忙,没有准备好接收更多的数据。如果一个function正在执行一个读操作,对应的RFx bit清零,则标明读数据无效,如果为1,则标明读数据可以传输。 SPI无效,只读,且为0 |
8’h00 |
0X10-0X11 |
FN0 Block Size |
RW |
[15:0],Fn0对应的Block传输时,Block size大小。最大2048Byte,最小1Byte。存储方式为小段格式(LSB) |
16’h00 |
|
0X12 |
Power Control |
SMPC |
RO |
[0],支持主机功耗控制。 0:SDIO总电流小于200mA ,即使所有function都有效(IOEx=1) 。EMPC、SPS、EPS都为0 。 1:SDIO总电流可以超过200 mA。EMPC、SPS、EPS有效。 |
1’b1 |
EMPC |
RO |
[1],主机功耗控制使能。 0:SDIO卡总电流小于200mA。SDIO卡自动切换function(s)到低电流模式或者不允许一些function使能,而其忽略EPS的值, 从而使卡的电流小于等于200mA 。 1:SDIO卡总电流可以超过200mA,且SPS和EPS有效。主机根据自己提供电流的能力使用FBR中的SPS、EPS以及IOEx 使能更大电流的function。 |
1’b0 |
||
RO |
[7:2],RFU |
||||
0X13 |
High-Speed |
SHS |
RO |
[0],表示SDIO卡支持高速 0:不支持高速 1:支持高速 |
1’b1 |
EHS |
RW |
[1],高速使能 0:SDIO卡工作在缺省速度下,最高频率25MHZ 1:SDIO卡可以工作在高速模式下,最高频率50MHZ |
1’b0 |
||
RO |
[7-2],RFU |
||||
0X14-0XEF |
RFU |
RO |
Reserved for Future Use (RFU) |
8’b0 |
|
0XF0-0XFF |
Reserved for Vendors |
RO |
Area Reserved for Vendor Unique Registers |
8’b0 |
|
0X100 |
I/O Device Interface Code |
RO |
[3:0],标志 Fn1为什么样的设备。 通过寄存器CIA [15:12]可编程。 4’h0 No SDIO standard interface supported by this function 4’h1 This function supports the SDIO Standard UART 4’h2 This function supports the SDIO Type-A for Bluetooth standard interface 4’h3 This function supports the SDIO Type-B for Bluetooth standard interface 4’h4 This function supports the SDIO GPS standard interface 4’h5 This function supports the SDIO Camera standard interface 4’h6 This function supports the SDIO PHS standard interface 4’h7 This function supports the SDIO WLAN interface 4’h8 This function supports the Embedded SDIO-ATA standard interface |
4’h7 |
|
RFU |
RO |
[5:4],RFU |
2’b00 |
||
Function supports CSA |
RO |
[6], 0:Fn1不支持CSA 1:Fn1支持且有CSA 可以通过寄存器CIA[16]编程 |
1’b0 |
||
Function CSA enable |
RW |
[7], 0:不允许访问CSA 1:允许访问CSA |
1’b0 |
||
0X101 |
Extended standard I/O device type code |
RO |
[7:0],I/O Device Interface Code的扩展 通过可以通过寄存器CIA[24:17]编程 |
8’b0 |
|
0X102 |
SPS |
RO |
[0],标明Fn1是否有功耗选择 0:没有功耗选择 1:有两个功耗选择,可以通过EPS选择 通过可以通过寄存器CIA[25]编程 |
1’b0 |
|
EPS |
RW |
[1],功耗选择 0:Fn1工作在高电流模式 1:Fn1工作在低电流模式 |
1’b0 |
||
RO |
[7:2],RFU |
6’b0 |
|||
0X103 - 0X108 |
RO |
RFU |
0 |
||
0X109 - 0X10B |
Address pointer to function CIS1 |
RO |
[16:0],Fn1的CIS地址指针,即CIS1,指示主机访问Fn1的CIS起始地址。存储方式为LSB小段格式。 |
17’h02000 |
|
RO |
[23:17], RFU |
7’b0 |
|||
0X10C - 0X10E |
Address pointer to function CSA |
RW |
[23:0],指向CSA的24bit地址指针,主机通过CSA访问窗口访问CSA后,该指针自动加1. 地址采用小段格式 存储(LSB) |
24’h00 0000 |
|
0X10F |
Data access window to CSA |
RW |
[7:0],对CSA的读写窗口。对该地址写操作时,对应的数据会通过本窗口写入CSA 24bit地址指针所指示的地址中,对该地址读操作时,从24bit CSA地址指针所指示的地址读取数据,通过本窗口送给主机。 |
8’b00 |
|
0X110 - 0X111 |
Function 1 IO Block Size |
RW |
[15:0],16bit的寄存器,用来设置IO block size。最大的 block size为2048Byte,最小为1。 该数据以小端模式存储(LSB)。 |
16’b0 |
|
0X1000 - 0X1010 |
CIS0 |
RO |
主机访问Fn0的CIS地址空间,即主机通过这个地址空间段访问CIS0.本SDIO 卡中支持最多17个字节的CIS0 |
||
0X2000 - 0X2133 |
CIS1 |
RO |
主机访问Fn1的CIS地址空间,即主机通过这个地址空间段访问CIS1。本SDIO卡支持CIS1的字节数据为55~ 308. |
||
RFU |
RFU |
SDIO Fn1 寄存器
Fn1寄存器为SDIO协议分配给function1的地址空间,其地址范围为:0x00000~0x1FFFF,共128K。
由于芯片内部AHB总线地址位宽为32位,SDIO无法使用17位地址直接对芯片内部进行访问,因此在设计中, 需要完成一次地址映射。具体映射关系如下表:(FN1访问空间)
SDIO主机访问窗口 |
对应实际理地址空间 |
实际物理地址空间内容 |
0X0000 ~ 0X00FF |
0X0000 ~ 0X00FF |
SDIO模块内部寄存器地址空间。 |
0X1000 ~ 0X1FFF |
可配置 |
CIS0物理空间,具体物理空间由固件配置。 |
0X2000 ~ 0X2FFF |
可配置 |
CAPINVS1物理空间,具体物理空间由固件配置。 |
0X4000 ~ 0X4FFF |
可配置 |
下行和上行cmd物理空间,具体物理空间地址由固件配置。 |
0X5000 ~ 0X5FFF0X15000 ~ 0X15FFF |
可变 |
送buffer地址空间,具体根据sdio_txbd中的指示。 |
0X6000 ~ 0X7FFF0X16000 ~ 0X17FFF |
可变 |
收buffer地址空间,具体根据sdio_rxbd中的指示。 |
0X8000 ~ 0X9FFF |
0X0E000000 ~ 0X0E002000 |
AHB总线config地址空间。 |
0XA000 ~ 0XBFFF |
0X0F000000 ~ 0X0F002000 |
AHB总线APB地址空间。 |
驱动应该避免访问超出以上范围的空间,这样做可能会带来意想不到的结果。
其中第一项地址空间寄存器是在SDIO内部,并且只能由SDIO HOST访问;其他地址空间的访问将根据描述映射到芯片 内部其他空间中。
本节只介绍SDIO 0x0000 ~ 0x00FF地址空间中的寄存器,这些寄存器由SDIO 主机通过CMD52命令直接访问, 偏移地址即为访问地址,功能号为1。
偏移地址 |
名称 |
位宽 |
访问 |
描述 |
复位值 |
0X00~0X03 |
RO |
RSV |
|||
0X04 |
[7:1] |
RO |
RSV |
7’b0 |
|
int_read _data |
[0] |
RW |
上行数据中断。高有效,写1清零。 在读取0x1C时,也会被自动清0。 |
1’b0 |
|
0X05 |
[7:1] |
RO |
RSV |
7’b0 |
|
int_mask |
[0] |
RW |
对应int_src的屏蔽使能信号。1则屏蔽相应中断。 |
1’d0 |
|
0X06 |
[7:2] |
RO |
RSV |
6’b0 |
|
wlan_awake _stts |
[0] |
RO |
当前WLAN状态: 1为ACTIVE;0为SLEEP。 |
1’b1 |
|
0X1C |
dat_len0 |
[6:0] |
RO |
上行数据长度高7bit。共12bit,低5bit在0x1D中。 |
7’b0 |
dat_vld |
[7] |
RO |
1’b1 |
1’b1 |
|
0X1D |
dat_len1 |
[7:3] |
RO |
上行数据长度低5bit。共12bit,高7bit在0x1C中。 |
5’b0 |
[2:0] |
RO |
RSV |
3’b0 |
||
0X1E |
RO |
RSV |
|||
0X1F |
[7:2] |
RO |
RSV |
6’b0 |
|
down _cmdbuf _vld |
[1] |
RO |
下行命令 buffer 可用,1有效。 |
1’b1 |
|
txbuf_vld |
[0] |
RO |
下行数据buffer可用。1有效,表示存在可用的发送buffer。 |
1’b0 |
|
0X20 |
wlan_wake _en |
[0] |
RW |
SLEEP状态下SDIO下发的芯片唤醒使能,高有效。 芯片被唤醒后,此位将被硬件自动清0。 |
1’b0 |
0X21 |
[7:1] |
RO |
RSV |
7’b0 |
|
fn1_rst |
[0] |
RW |
软复位,1有效。 软件写1后,(即芯片wlan部分电路)被复位,写0后,function1复位被释放。 |
1’b0 |
|
0X22 |
[7:1] |
RO |
RSV |
7’b0 |
|
fn1_recov |
[0] |
RW |
错误恢复使能,1有效,命令response结束后,该位自动清0。 该功能用来完成fn0/fn1 io abort相同的功能,当存在cmd异常或者提前结束命令时,可以将此寄存器置1, 来完成io abort操作。 由于在某些bus driver版本中,io abort命令受限制(即该寄存器 访问地址空间受限 ),不允许用户驱动使用, 此时向该寄存器写1可以取代io abort操作,并产生相同的效果 。 |
1’b0 |
SDIO AHB接口从设备寄存器
下面的寄存器,在SDIO从设备初始化的时候使用。
传输数据时,需要和wrapper控制器配合使用,Wrapper控制器的部分参考HSPI部分说明文档。
偏移地址 |
名称 |
位宽 |
访问 |
描述 |
复位值 |
0X0000 0X0004 |
RO |
Rsv |
|||
0X0008 |
CIS function0 address |
[31:0] |
RW |
CIS0在系统内部memory中存储的偏移地址。 CIS0实际存储起始地址 =0x01000 (读命令起始地址 )+该偏移地址 |
32’b0 |
0X000C |
CIS function1 address |
[31:0] |
RW |
CIS1在系统内部memory中存储的偏移地址。 CIS1实际存储起始地址=0x02000 (读命令起始地址 )+该偏移地址 |
32’b0 |
0X0010 |
CSA address |
[31:0] |
RW |
固件初始化时设置访问CSA的便宜地址,其原理和CIS设置相同。本设计中不支持CSA。 |
32’b0 |
0X0014 |
Read address |
[31:0] |
RW |
用来设置DMA从memory读取数据的起始地址。配合Data Port寄存器可以实现对系统内部 memory的读操作(即访问地址为0x00+ Read address)。在本设计中,没有采用这种方法,因此缺省为0 |
32’b0 |
0X0018 |
Write address |
[31:0] |
RW |
用来设置DMA向memory写数据的起始地址。配合Data Port寄存器可以实现对系统内部 memory的写操作(即访问地址为0x00+ write address)。在本设计中,没有采用这种方法,因此缺省为0 |
32’b0 |
0X001C |
AHB Transfer count |
[20:0] |
RW |
SDIO设备通知主机,在将发起的读数据操作中,需要读取多少字节数据。 [23:21]RFU |
32’b0 |
0X001F |
RO |
rsv |
|||
0X0020 |
SDIO Transfer count |
[20:0] |
RO |
一次数据传输中,从主机向SDIO设备下发的字节数 。当数据传输完成后,通过该寄存器高速设备内部下发的字节数。 [31:21]RFU |
32’b0 |
0X0024 |
CIA register |
– |
RW |
[3:0]:CCCR Revision。缺省为4’h2 4’h0 CCCR/FBR Version 1.00 4’h1 CCCR/FBR Version 1.10 4’h2 CCCR/FBR Version 1.20 [7:4]SDIO Revision 。缺省为4’h3 4’h0 SDIO Specification 1.00 4’h1 SDIO Version 1.10 4’h2 SDIO Version 1.20 4’h3 SDIO Version 2.0 [11:8]SD Revision。缺省为4’h2 4’h0 SD Physical Specification 1.01 4’h1 SD Physical -Spec-1.10 4’h2 SD Physical Spec 2.0 [15:12]IO-Device Code。缺省为 4’h7,即本产品为WLAN设备 。 [16]csa_support, 缺省为1. 0:不支持CSA 1:支持CSA 初始化时,固件需要配置该寄存器为 0。 [24:17], Extended IO-device code 缺省为8’b0。 Fn1的standard IO-device code的扩展。 [25],SPS ,缺省为1,即Fn1支持高功耗 0:不支持 1:支持 [26],SHS ,缺省为1,支持高速 0:不支持 1:支持 [31:27]:RFU |
32’h06017232 |
0X0028 |
Program Register |
– |
RW |
[0],function ready。hc8051在完成SD初始化所需要的Fn1寄存器配值后,置位该寄存器,向SD主机标明 Fn1已经准备好工作。缺省为0 0:Fn1 not ready 1:Fn1 ready [1],fun1 read data ready。Fn 1准备好向SD主机送数据时,置位该寄存器。当主机响应读中断后,读中断源寄存器(Interrupt Identification),该bit自动清零。缺省为0. 0:无数据送给主机 1:有数据送给主机。 [2],SCSI。支持连续的SPI中断。缺省为1 . 0:不支持 1:支持 [3],SDC。标明SDIO卡在数据传输同时,支持执行CMD52 命令。缺省为1 0:不支持 1:支持 [4],SMB。 SDIO卡支持CMD53的Block传输。缺省为1. 0:不支持 1:支持 [5],SRW。标明SDIO卡支持读等待。缺省为1. 0:不支持 1:支持 [6],SBS。 标明SDIO卡支持挂起/恢复。缺省为1 0:不支持 1:支持 [7],S4MI 。标明SDIO卡支持在4bit多Block数据传输时产生中断。缺省为1。 0:不支持 1:支持 [8],LSC。标明SDIO卡是低速设备。缺省为0. 0:全速设备 1:低速设备 [9],4BLS 。标明SDIO卡是一个低速设备,但支持4bit数据传输。缺省为1 。 0:不支持 1:支持 [10],card ready。属于SD时钟域的信号,上电复位释放后 ,该寄存器自动变为1,标明SDIO(接口部分)已经准备好。固件监测到该信号,即可以配置初始化时需要的Fn1寄存器。上电复位时为0 . [15:11], RFU。缺省为0 |
16’h 02fc |
0X0034 |
OCR register |
– |
RW |
[23:0],工作情况寄存器,内部可编程,主要用来与主机工作电压范围匹配。缺省为 :24’hff8 000。 寄存器Bit 支持电压范围 0-3 Reserved 4 Reserved 5 Reserved 6 Reserved 7 Reserved 8 2.0-2.1 9 2.1-2.2 10 2.2-2.3 11 2.3-2.4 12 2.4-2.5 13 2.5-2.6 14 2.6-2.7 15 2.7-2.8 16 2.8-2.9 17 2.9-3.0 18 3.0-3.1 19 3.1-3.2 20 3.2-3.3 21 3.3-3.4 22 3.4-3.5 23 3.5-3.6 [31:24], 8’b0 |
32’h00ff 8000 |
0X0038 |
RW |
– |
rsv |
32’h0 |
|
0X003C |
CD_State Register |
– |
RW |
[0],标明SD dat[3]数据线上拉电阻的状态 。 0:上拉有效 1:上拉无效 片内AHB总线都可以对该寄存器访问。 注:AHB对该寄存器的写操作结果会间接修改CCCR7[7] CD的值。 [31:1],RFU |
32’b0 |
0X0040 |
Fn1_Ena Register |
– |
RW |
[0],标明Fn1是否被使能。 0:禁止 1:使能 片内AHB总线都可以对该寄存器访问。 注:AHB对该寄存器的写操作结果会间接修改CCCR1[1] IOE1的值。 [31:1],RFU |
32’b0 |
HSPI/SDIO Wrapper控制器
功能概述
配合接口控制器(SDIO和HSPI)完成主机和芯片内部缓存之间数据的DMA操作。包括上下行数据缓存的软硬件交互控制,发送与接收缓存的填充与释放,上行数据中断的产生等等。
SDIO和HSPI都通过wrapper控制器和上位机交互数据,两者的控制命令以及流程是相同的。为了描述方便,部分寄存器加上了前缀SDIO。相应寄存器操作同样适用于HSPI
需要注意的是,对于前缀是SDIO_TX相关寄存器,控制的是设备接收数据,对于SDIO_RX相关寄存器,控制的是设备发送数据。
对于寄存器中出现的cmd字段,只是从描述上和数据帧区分,并不表示命令通道只能传输命令,也可以用来传输数据。在这里命令和数据的区别是,命令通道只有一块缓存区,并且缓存长度一般会少于256字节,而数据通道有多块缓存区,每块缓存区的长度都超过1K,多块缓存构成一个链表结构,具体长度由软件配置。由于数据帧的 这种链表缓存结构,传输速率会快于命令通道。
主要特性
支持字对齐的数据搬移
支持DMA功能
支持链表结构管理
支持中断产生
最大可接收4096字节数据
功能描述
上行数据接收功能
上行方向是指主设备(SDIO或者HSPI)向从设备(W800)发送数据的方向。
当主设备向从设备发送数据时,SDIO或者HSPI模块接收到数据后,会通过WRAPPER把数据链接到接收BD,并产生中断通知应用软件处理数据。
接收BD描述符:

图 26 SDIO接收BD描述符
当W800的SDIO模块或者HSPI模块检测到接收使能有效后,读取RXBD,并判断Vld的标志。
下行数据搬移功能
当W800有数据要向主设备发送数据的时候,软件先把发送描述准备好,然后,通知WRAPPER把数据搬移,WRAPPER通过SDIO或者HSPI的中断信号通知主设备来读取要发送的设备,当数据发送完成后,WRAPPER产生发送完成中断通知程序。
发送BD描述符:

图 27 SDIO发送BD描述符
寄存器描述
寄存器列表
偏移地址 |
名称 |
缩写 |
访问 |
描述 |
复位值 |
0X0000 |
WRAPPER 中断状态寄存器 |
INT_STTS |
RW |
命令或者数据帧中断状态 |
0X0000 |
0X0004 |
WRAPPER 中断配置寄存器 |
INT_MASK |
RW |
命令或者数据帧中断是否屏蔽 |
0X0000 |
0X0008 |
WRAPPER 上行命令就绪寄存器 |
UP_CMD _AVAIL |
RW |
上行命令是否就绪 |
0X0000 |
0X000c |
WRAPPER 下行命令 buf 就绪寄存器 |
DOWN_CMD _BUF _AVAIL |
RW |
下行命令buf是否就绪 |
0X0000 |
0X0010 |
SDIO_TX 链接使能寄存器 |
SDIO_TX_BD _LINK_EN |
RW |
指示 sdio_txbd 链表描述符是否有效 |
0X0001 |
0X0014 |
SDIO_TX链接地址寄存器 |
SDIO_TX_BD _ADDR |
RW |
当前 sdio_txbd 指向的地址,需要字对齐,初始化时需要配置 |
0X0000 |
0X0018 |
SDIO_TX 使能寄存器 |
SDIO_TX_EN |
RW |
SDIO发送帧使能 |
0X0000 |
0X001c |
SDIO_TX状态寄存器 |
SDIO_TX _STTS |
RO |
SDIO发送状态 |
0X0000 |
0X0020 |
SDIO_RX 链接使能寄存器 |
SDIO_RX_BD _LINK_EN |
RW |
指示 sdio_rxbd 链表描述符是否有效 |
0X0001 |
0X0024 |
SDIO_RX 链接地址寄存器 |
SDIO_RX_BD _ADDR |
RW |
当前 sdio_rxbd 指向的地址,需要字对齐,初始化时需要配置 |
0X0000 |
0X0028 |
SDIO_RX使能寄存器 |
SDIO_RX_EN |
RW |
SDIO接收帧使能 |
0X0000 |
0X002c |
SDIO_RX状态寄存器 |
SDIO_RX _STTS |
RO |
SDIO接收状态 |
0X0000 |
0X0030 |
WRAPPER CMD BUF基地址寄存器 |
CMD_BUF _BASE_ADDR |
RW |
下行cmd buf 基地址 |
0X0000 |
0X0034 |
WRAPPER CMD BUF SIZE寄存器 |
CMD_BUF _SIZE |
RW |
Cmd buf字节大小 |
0X0064 |
WRAPPER中断状态寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 4] |
RO |
保留 |
|
[3] |
RW |
int_down_cmd 下行cmd帧完成中断。写1清0。 |
1’b0 |
[2] |
RW |
int_up_cmd 上行cmd帧字完成中断。写1清0。 |
1’b0 |
[1] |
RW |
int_sdio_txfrm 下行数据帧完成中断。写1清0。 |
1’b0 |
[0] |
RW |
int_sdio_rxfrm 上行数据帧完成中断。写1清0。 |
1’b0 |
WRAPPER中断配置寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 4] |
RO |
保留 |
|
[3] |
RW |
int_mask_down_cmd 下行cmd帧完成中断屏蔽寄存器。1为屏蔽,下同。 |
1’b0 |
[2] |
RW |
int_mask_up_cmd 上行cmd帧完成中断屏蔽寄存器。 |
1’b0 |
[1] |
RW |
int_mask_sdio_t xfrm 下行数据帧完成中断屏蔽寄存器。 |
1’b0 |
[0] |
RW |
int_mask_sdio_r xfrm 上行数据帧完成中断屏蔽寄存器。 |
1’b0 |
WRAPPER上行命令就绪寄存器
位 |
访问 |
操作说明 |
复位值 |
|
[31: 1] |
RO |
保留 |
||
[0] |
RW |
存在上行cmd帧时,固件置此位为1。当完成上行cmd传输时,硬件自动将其清0,并产生int_up_cmd中断。 |
1’b0 |
WRAPPER下行命令buf就绪寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 1] |
RO |
保留 |
|
[0] |
RW |
发送完下行cmd后,硬件将此位清0,同时产生中断。当固件处理完成此下行命令后,将此位置1。 |
1’b0 |
SDIO TX链接使能寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 1] |
RO |
保留 |
|
[0] |
RW |
sdio_txbd链接使能,高有效。 若此位有效,硬件在处理完成一个sdio_txbd描述符,直接处理next_sdio_txbd_addr指向的下一个描述符 。若此位无效,硬件在处理完成一个sdio_txbd后,会立即停止。 对HSPI同样适用。 |
1’b1 |
SDIO TX链接地址寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 0] |
RW |
当前sdio_txbd字节地址,软件需要严格保证字对齐,下同。 初始时固件需要配置此寄存器,硬件每次处理完成一个发送buf后,将sdio_txbd描述符中的next_sdio_txbd_addr更新至此寄存器。 对HSPI同样适用。 |
32’h0 |
SDIO TX使能寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 1] |
RO |
保留 |
|
[0] |
RW |
SDIO发送帧使能,高有效。 固件在组建完成每个描述符sdio_txbd描述符后,将此位置1,以通知SDIO模块存在新的发送描述符。SDIO模块检测到此位有效,则启动读取当前的sdio_txbd,并完成发送帧流程。 硬件自动完成此寄存器的清0操作 。 对HSPI同样适用。 |
1’b0 |
SDIO TX状态寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 1] |
RO |
保留 |
|
[0] |
RW |
SDIO发送状态。 0:SDIO由于没有可用发送描述符,已停止发送流程 1:SDIO处于发送过程中 对HSPI同样适用。 |
1’b0 |
SDIO RX链接使能寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 1] |
RO |
保留 |
|
[0] |
RW |
sdio_rxbd链接使能,高有效。 若此位有效,硬件在处理完成一个sdio_rxbd描述符,直接处理next_sdio_rxbd_addr指向的下一个描述符 。若此位无效,硬件在处理完成一个sdio_rxbd后,会立即停止。 对HSPI同样适用。 |
1’b1 |
SDIO RX链接地址寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 0] |
RW |
当前sdio_rxbd字节地址 。 初始时固件需要配置此寄存器,硬件每次处理完成一个发送buf后 ,将sdio_rxbd描述符中的next_sdio_rxbd_addr更新至此寄存器。 对HSPI同样适用。 |
32’h0 |
SDIO RX使能寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 1] |
RO |
保留 |
|
[0] |
RW |
SDIO接收帧使能,高有效。 固件在组建完成每个描述符sdio_rxbd描述符后,将此位置 1,以通知SDIO模块存在新的接收描述符。SDIO模块检测到此位有效,则启动读取当前的sdio_txbd,并完成接收帧流程。 硬件自动完成此寄存器的清0操作 。 对HSPI同样适用。 |
1’b0 |
SDIO RX状态寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 1] |
RO |
保留 |
|
[0] |
RW |
SDIO接收状态。 0:SDIO由于没有有效的上行描述符和上行命令,已停止接收流程 1:SDIO处于接收过程中 对HSPI同样适用。 |
1’b0 |
WRAPPER CMD BUF基地址寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 0] |
RW |
下行cmd buf基地址。 上行cmd buf基地址为该基地址加上cmd_buf_size。 |
32’h0 |
WRAPPER CMD BUF SIZE寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:12] |
RO |
保留 |
|
[11: 0] |
RW |
cmd buf字节大小,必须为4字节的整数倍。 |
12’d64 |
SDIO HOST设备控制器
功能概述
SDIO HOST 设备控制器提供了一个能够访问安全数字输入输出卡(SDIO)以及MMC卡的数字接口。能够访问兼容SDIO 2.0 协议的SDIO 设备和SD卡设备。主要接口有CK,CMD以及4根数据线。
主要特性
兼容SD卡规范1.0/1.1/2.0(SDHC)
兼容SDIO 内存卡规范1.1.0
兼容MMC规范2.0~4.2
可配置接口时钟速率,支持主机速率0~50MHz,
支持标准MMC接口
支持最大1024字节的Block
支持软复位功能
自动Command/Response CRC 生成/校验;
自动数据 CRC 生成/校验;
可配置timeout检测;
支持SPI、1比特SD和4比特SD模式
支持DMA 数据传输
功能描述
寄存器描述
寄存器列表
偏移地址 |
寄存器名称 |
名称 |
位宽 |
属性 |
说明 |
复位值 |
0x00 |
mmc_ctrl |
RSV |
[15:11] |
RO |
||
[10] |
RW |
SDIO 读等待使能 ‘1’ : 使能SDIO读等待 ‘0’ : 关闭SDIO读等待 |
1’b0 |
|||
[9] |
RW |
SDIO 中断使能 ‘1’ : SDIO 中断使能 ‘0’ : SDIO 中断关闭 |
1’b0 |
|||
[8] |
RW |
SDIO 模式使能 ‘1’ : SDIO ‘0’ : SD/MMC |
1’b0 |
|||
[7] |
RW |
SD / MMC / SDIO 接口数据宽度 ‘1’ : 4 bits ‘0’ : 1 bit |
1’b0 |
|||
[6] |
RW |
SD / MMC / SDIO 传输模式 ‘1’ : High-Speed Mode ‘0’ : Low-Speed Mode |
1’b1 |
|||
[5:3] |
RW |
SDIO / MMC / SDIO 端口时钟速率选择 参考Table 2 |
3’b000 |
|||
[2] |
RW |
SDIO / MMC / SDIO 接口驱动模式选择 ‘1’ : open _DrainMode ‘0’ :Push - Pull Mode |
1’b1 |
|||
[1] |
RW |
信号模式选择 ‘1’ : 自动选择传输模式 ‘0’ :使用 mmc_port 寄存器选择 |
1’b0 |
|||
[0] |
RW |
端口模式选择 ‘1’ : MMC mode ‘0’ :SPI mode |
1’b1 |
|||
0x04 |
mmc_io |
RSV |
RO |
[15:10] |
6’d0 |
|
RW |
[9] |
SDIO cmd12 / IO Abort 标志 ‘1’ : 将当前命令标志为cmd12 / IO Abort ‘0’ : 标志当前命令不是cmd12 / IO Abort |
1’b0 |
|||
RW |
[8] |
SDIO 命令属性 ‘1’ : 标记当前命令后有数据块; ’0‘ : 标记当前命令后没有数据块和命令响应; |
1’b0 |
|||
RW |
[7] |
Enable auto generate 8 null clock after response / command or single block data 在响应/命令或者单个数据块后自动生成8个null 时钟功能 ‘1’ : 使能 ‘0’ : 关闭 |
1’b0 |
|||
RW |
[6] |
Enable auto receive response after command 在命令后自动接收响应功能 ‘1’ : 使能 ‘0’ : 关闭 |
1’b0 |
|||
RW |
[5] |
SD / MMC / SDIO 端口时钟线上8个 null 时钟生成 ‘1’ : 生成8个 null 时钟 ‘0’ : 根据bit 3 设置接收响应/发送命令 |
1’b0 |
|||
RW |
[4] |
为CID 和 CSD 读设计。当发送CID或 者CSD命令时 ,SD / MMC / SDIO 卡设备会在CMD线上回复136bit CID 或者11 CSD 数据。当设置此bit为1时,CID 或者 CSD 数据将存储在命令 buffer 区域的 [135:8] 中; |
1’b0 |
|||
RW |
[3] |
bit[5] 为‘0’时响应/命令选择 ‘1’: 接收响应 ‘0’: 发送命令. |
1’b0 |
|||
RW |
[2] |
设置 自动 8 null时钟/命令/响应传输功能 ‘1’: 使能自动 8 null时钟/命令/响应传输 ‘0’: 关闭自动 8 null时钟/命令/响应传输 . 根据bit 5 与 bit3 设置,生成8个null时钟,接收response或者传输命令。当传输完成,此bit自动清除; |
1’b0 |
|||
RW |
[1] |
设置数据传输方向 ’1‘ : 读数据; ‘0’ : 写数据; |
1’b0 |
|||
RW |
[0] |
设置自动数据传输 ‘1’ : 使能自动数据传输 ‘0’ :关闭自动数据传输. 当数据传输完毕,此bit将被自动清除; |
1’b0 |
|||
0x08 |
mmc_bytecntl |
RW |
[15:0] |
数据传输字节计数寄存器 |
16’h0200 |
|
0x0C |
mmc_tr_blockcnt |
RO |
[15:0] |
多数据块传输时,已完成数据块计数器 |
16’h0000 |
|
0x10 |
mmc_crcctl |
RW |
[7] |
SD / MMC / SDIO port CMD Line CRC circuit enable. SD / MMC / SDIO 端口 CMD 线 CRC 功能 ‘1’: 使能. ‘0’: 关闭. |
1’b0 |
|
RW |
[6] |
SD / MMC / SDIO 端口数据线 CRC 功能 ‘1’: 使能. ‘0’: 关闭. |
1’b0 |
|||
RW |
[5] |
使能自动CRC 检查 crc_status ‘1’: 使能,当crc_status !=3’b010时,会产生crc 状态中断,写数据传输将被stop命令中断, 并且mmc_io[0] 或者 mmc _io _mbctl [2:0] 将被清除; 0: 关闭; |
1’b0 |
|||
RW |
[4] |
在response之前读多数据块功能 ‘1’: 使能. ‘0’ : 关闭 |
1’b0 |
|||
RW |
[3:2] |
DAT CRC selection. DAT CRC 选择 参考Table 4 |
1’b0 |
|||
RO |
[1] |
CMD CRC 错误. |
1’b0 |
|||
RO |
[0] |
DAT CRC 错误 |
1’b0 |
|||
0x14 |
cmd_crc |
RSV |
RO |
[7] |
RSV |
1’b0 |
RO |
[6:0] |
CMD CRC 寄存器值 |
7’d0 |
|||
0x18 |
dat_crcl |
RO |
[7:0] |
The DAT CRC 低位寄存器值 |
NA |
|
0x1C |
dat_crch |
RO |
[7:0] |
The DAT CRC 高位寄存器值 |
NA |
|
0x20 |
mm_port |
RW |
[7] |
SD / MMC / SDIO port 时钟线信号. |
1’b0 |
|
RW |
[6] |
SD / MMC / SDIO port CMD 线信号 |
1’b1 |
|||
RW |
[5] |
SD / MMC / SDIO port 数据线信号 |
1’b1 |
|||
RW |
[4] |
自动 检查Ncr 超时功能 1’: 使能自动检查 Ncr 超时. ‘0’ :关闭自动检查 Ncr 超时 |
1’b1 |
|||
RW |
[3:0] |
Ncr 超时计数值 (SD/MMC /SDIO 时钟数). |
4’hF |
|||
0x24 |
mmc _int _mask |
RSV |
RO |
[15:9] |
7’d0 |
|
[8] |
SDIO 数据线 1 中断 屏蔽 ‘1’: 不屏蔽 ‘0’: 屏蔽 |
1’b0 |
||||
[7] |
CRC 状态 token 错误中断屏蔽 ‘1’: 不屏蔽 ‘0’: 屏蔽 |
1’b0 |
||||
[6] |
命令和响应 Ncr 超时中断屏蔽 ‘1’: 不屏蔽 ‘0’: 屏蔽 |
1’b0 |
||||
[5] |
多数据块超时中断 屏蔽. ‘1’: 不屏蔽 ‘0’: 屏蔽 |
1’b0 |
||||
[4] |
多数据块传输完成中断 屏蔽. ‘1’: 不屏蔽 ‘0’: 屏蔽 |
1’b0 |
||||
[3] |
命令CRC 错误中断屏蔽 ‘1’: 不屏蔽 ‘0’: 屏蔽 |
1’b0 |
||||
[2] |
数据CRC 错误中断屏蔽 ‘1’: 不屏蔽 ‘0’: 屏蔽 |
1’b0 |
||||
[1] |
数据传输完成中断屏蔽 ‘1’: 不屏蔽 ‘0’: 屏蔽 |
1’b0 |
||||
[0] |
命令传输完成中断屏蔽 ‘1’: 不屏蔽 ‘0’: 屏蔽 |
1’b0 |
||||
0x28 |
clr _mmc _int |
RSV |
RO |
[15:9] |
7’d0 |
|
RW |
[8] |
W: 清除SDIO 数据线1 中断 R: SDIO 数据线1 中断状态 |
1’b0 |
|||
RW |
[7] |
W: 清除CRC 状态 token 错误 中断 R: CRC 状态 token 错误 中断状态; 当此bit 为1时,判断mmc_sig[6:4] |
1’b0 |
|||
RW |
[6] |
W:清除命令和响应 Ncr 超时中断; R:命令和响应 Ncr 超时中断状态; |
1’b0 |
|||
RW |
[5] |
W: 清除多数据块超时中断; R: 多数据块超时中断状态; |
1’b0 |
|||
RW |
[4] |
W: 清除多数据块传输完成中断; R: 多数据块传输完成中断状态: |
1’b0 |
|||
RW |
[3] |
W: 清除命令CRC 错误中断; R: 命令CRC错误中断状态; |
1’b0 |
|||
RW |
[2] |
W: 清除数据CRC 错误中断; R: 数据CRC错误中断状态; |
1’b0 |
|||
RW |
[1] |
W: 清除数据传输完成中断; R: 数据传输完成中断状态; |
1’b0 |
|||
RW |
[0] |
W: 清除命令传输完成中断; R: 命令传输完成中断状态; |
1’b0 |
|||
0x2C |
mmc _cardsel |
RW |
[7] |
SD / MMC / SDIO 控制器使能 ‘1’: 使能 ‘0’: 关闭 |
1’b0 |
|
RW |
[6] |
使能SD / MMC / SDIO 卡设备时钟线 ‘1’: 使能 ‘0’: 关闭 |
1’b1 |
|||
RW |
[5:0] |
SD / MMC / SDIO 时间基准系数 使用此寄存器建立1MHz时钟; 1MHz = Fhclk / ((mmc _cardsel [5:0 ] + 1) * 2) |
6’d0 |
|||
0x30 |
mmc_sig |
RW |
[7] |
SD / MMC / SDIO port CMD线信号 当读取此寄存器时,SDIO控制器将在时钟线上生成一个时钟脉冲。并且在时钟上升沿时CMD线上状态将被存储到此寄存器中 。 |
1’b1 |
|
RW |
[6:4] |
CRC status [2:0] 当写数据CRC status token时; |
3’b111 |
|||
RW |
[3] |
SD / MMC / SDIO port DAT3 数据信号. |
1’b1 |
|||
RW |
[2] |
SD / MMC / SDIO port DAT2数据信号. |
1’b1 |
|||
RW |
[1] |
SD / MMC / SDIO port DAT1数据信号. |
1’b1 |
|||
RW |
[0] |
SD / MMC / SDIO port DAT0数据信号. |
1’b1 |
|||
0x34 |
mmc _io _mbctl |
RW |
[7:6] |
SD / MMC / SDIO NAC 超时范围选择 参考Appen dix 2 -Table5. |
2‘b0 |
|
RW |
[5:4] |
SD / MMC / SDIO Busy timeout scale selection. SD / MMC / SDIO 设备忙超时范围选择. 参考Appen dix 2 -Table 6 |
2’d1 |
|||
RW |
[3] |
SD / MMC / SDIO port 时钟线极性 1:时钟下降沿发送,上升沿采集; 0:时钟上升沿发送,下降沿采集; |
1’b0 |
|||
RW |
[2] |
设置SD / MMC / SDIO 端口全自动命令和多数据块传输 ‘1’: 使能 ‘0’: 关闭 设置此bit 为1(mmc_io [7:6] ==11)会触发一个SD / MMC / SDIO 的命令,响应,8 null 时钟,多数据块传输。当数据传输完毕,此bit会自动清零。 |
1’b0 |
|||
RW |
[1] |
Select multiple block data transfer direction. 设置多数据块传输方向 ‘1’ : 读数据. ‘0’ : 写数据. |
1’b0 |
|||
RW |
[0] |
Set SD / MMC / SDIO port auto multiple block data ransfer . 设置SD / MMC / SDIO 端口自动多数据块传输 ‘1’ : 使能. ‘0’ : 关闭. 设置此bit为1(mmc_io [7:6] ==11)会触发一个SD / MMC / SDIO 的多数据块传输 。数据块个数在 mmc_blocknt 寄存器中设置。当数据传输完毕,此bit会自动清零。 |
1’b0 |
|||
0x38 |
mmc_blockcnt |
RW |
[15:0] |
Data block number register. 数据块个数寄存器 配置此寄存器定义在多数据块传输中总共传输数据块个数。 |
16’h0001 |
|
0x3C |
mmc_timeoutcnt |
RW |
[7:0] |
Data transfer timeout count register. 数据传输超时计数器 Time = Scale * bit [7:0 ]. Scale 通过寄存器mmc_io_mbctl [7:6 ] / [5:4] 定义; |
8’h40 |
|
0x40 |
cmd_buf0 |
RW |
[7:0] |
The cmd_buf byte 0.Mapped to command line bit [15:8] 命令buf 字节0,映射到命令线上 bit[15: 8] |
8’h00 |
|
0x44 |
cmd_buf1 |
RW |
[7:0] |
The cmd_buf byte 1.Mapped to command line bit [23:16] 命令buf 字节1,映射到命令线上 bit [23: 16] |
8’h00 |
|
0x48 |
cmd_buf2 |
RW |
[7:0] |
The cmd_buf byte 2.Mapped to command line bit [31:24] 命令buf 字节2,映射到命令线上 bit [31: 24] |
8’h00 |
|
0x4C |
cmd_buf3 |
RW |
[7:0] |
The cmd_buf byte 3.Mapped to command line bit [39:32] 命令buf 字节3,映射到命令线上 bit [39: 32] |
8’h00 |
|
0x50 |
cmd_buf4 |
RW |
[7:0] |
The cmd_buf byte 4.Mapped to command line bit [47:40] 命令buf 字节4,映射到命令线上 bit [47: 40] |
8’h00 |
|
0x54 |
cmd_buf5 |
RW |
[7:0] |
The cmd_buf byte 5. Mapped to command line bit [55:48] 命令buf 字节5,映射到命令线上 bit [55: 48] |
8’h00 |
|
0x58 |
cmd_buf6 |
RW |
[7:0] |
The cmd_buf byte 6. Mapped to command line bit [63:56] 命令buf 字节6,映射到命令线上 bit [63: 56] |
8’h00 |
|
0x5C |
cmd_buf7 |
RW |
[7:0] |
The cmd_buf byte 7.Mapped to command line bit [71:64] 命令buf 字节7,映射到命令线上 bit [71: 64] |
8’h00 |
|
0x60 |
cmd_buf8 |
RW |
[7:0] |
The cmd_buf byte 8.Mapped to command line bit [79:72] 命令buf 字节8,映射到命令线上 bit [79: 72] |
8’h00 |
|
0x64 |
cmd_buf9 |
RW |
[7:0] |
The cmd_buf byte 9.Mapped to command line bit [87:80] 命令buf 字节9,映射到命令线上 bit [87: 80] |
8’h00 |
|
0x68 |
cmd_buf10 |
RW |
[7:0] |
The cmd_buf byte 10.Mapped to command line bit [95:88] 命令buf 字节10,映射到命令线上 bit [95: 88] |
8’h00 |
|
0x6C |
cmd_buf11 |
RW |
[7:0] |
The cmd_buf byte 11. Mapped to command line bit [103:96 ] 命令buf 字节11,映射到命令线上 bit [103 :96] |
8’h00 |
|
0x70 |
cmd_buf12 |
RW |
[7:0] |
The cmd_buf byte 12. Mapped to command line bit [111:10 4] 命令buf 字节12,映射到命令线上 bit [111 :104] |
8’h00 |
|
0x74 |
cmd_buf13 |
RW |
[7:0] |
The cmd_buf byte 13.Mapped to command line bit [119:11 2] 命令buf 字节13,映射到命令线上 bit [119 :112] |
8’h00 |
|
0x78 |
cmd_buf14 |
RW |
[7:0] |
The cmd_buf byte 14.Mapped to command line bit [127:12 0] 命令buf 字节14,映射到命令线上 bit [127 :120] |
8’h00 |
|
0x7C |
cmd_buf15 |
RW |
[7:0] |
The cmd_buf byte 15.Mapped to command line bit [135:12 8] 命令buf字节15,映射到命令线上 bit [135 :128] |
8’h00 |
|
0x80 |
buf_ctrl |
RW |
[15] |
数据缓冲清除使能 1: 触发数据缓冲清除; 0:保持 当写1后,此寄存器在一个时钟后自动清零; |
1’b0 |
|
RW |
[14] |
DMA 请求屏蔽 0:不屏蔽; 1:屏蔽; 注意:请在使能dma之前配置此寄存器;在使能dma后再配置此寄存器无效果; |
1’b0 |
|||
RW |
[13] |
RSV |
1’b0 |
|||
RW |
[12] |
数据 FIFO 状态信号屏蔽配置 1:激活 0:默认 数据FIFO 状态信号,高有效; 读取卡设备时屏蔽FIFO full信号; 写卡设备时屏蔽 FIFO空信号; |
1’b0 |
|||
RW |
[11] |
设置缓冲访问方向 1: 写 0: 读 |
1’b0 |
|||
RW |
[10] |
DMA 硬件接口使能: 1:使能DMA 接口; 0: AHB接口访问数据缓存; 当使用DMA接口时,当数据传输完成后将自动复位此bit( 单数据块传输或者多数据块传输 ) |
1’b0 |
|||
RW |
[9:2] |
数据缓存数据水线设置;只有当buf_ctl[10]=1 时有效; 注意:数据缓存深度为 128个word,不要配置此寄存器大于127. |
8’d0 |
|||
RO |
[1] |
数据缓存空信号 |
1’b1 |
|||
RO |
[0] |
数据缓存满信号 |
1’b0 |
|||
0x100~0x2FF |
data_buf |
RW |
数据缓存 |
NA |
Bit5 |
Bit4 |
Bit3 |
Speed |
0 |
0 |
0 |
1/2 base clock |
0 |
0 |
1 |
1/4 base clock |
0 |
1 |
0 |
1/6 base clock |
0 |
1 |
1 |
1/8 base clock |
1 |
0 |
0 |
1/10 base clock |
1 |
0 |
1 |
1/12 base clock |
1 |
1 |
0 |
1/14 base clock |
1 |
1 |
1 |
1/16 base clock |
Note:当mmc_ctrl[6] = 1 ,控制器工作在高速模式时,base clk = hclk;
当mmc_ctrl[6] = 0 ,控制器工作在低速模式时,base clk = clk1m;
Clk1m= Fhclk/((mmc_cardsel[5:0]+1)*2);
Bit7 |
Bit6 |
Bit5 |
Bit4 |
Bit3 |
Bit2 |
Bit1 |
Bit0 |
操作模式 |
传输字节 |
x |
x |
x |
x |
x |
0 |
x |
0 |
无操作 |
N/A |
x |
x |
1 |
x |
0 |
Trig |
x |
0 |
生成8 null clk |
N/A |
0 |
0 |
0 |
x |
0 |
Trig |
x |
0 |
发送命令 |
6 |
0 |
0 |
0 |
0 |
1 |
Trig |
x |
0 |
接收响应 |
6 |
0 |
0 |
0 |
1 |
1 |
Trig |
x |
0 |
接收响应 |
17 |
1 |
0 |
0 |
0 |
0 |
Trig |
x |
0 |
传输命令+生成8 null clk |
N/A |
0 |
1 |
0 |
0 |
0 |
Trig |
x |
0 |
传输命令+接收响应 |
N/A |
1 |
1 |
0 |
0 |
0 |
Trig |
x |
0 |
传输命令+接收响应+生成 8 null clk |
N/A |
x |
x |
x |
x |
x |
0 |
1 |
Trig |
读取单个数据+8 null clk |
mmc _bytecnt |
x |
x |
x |
x |
x |
0 |
0 |
Trig |
写单个数据+8 null clk |
mmc _bytecnt |
Note:
Table 3 中除了最后两行,其他操作会产生CMD DONE 中断;
Table 3中最后两行操作会产生数据传输完成中断。
Bit3 |
Bit2 |
data_crcl 和 data_crch寄存器显示内容 |
0 |
0 |
DAT0 线上数据CRC值 |
0 |
1 |
DAT1 线上数据CRC值 |
1 |
0 |
DAT2 线上数据CRC值 |
1 |
1 |
DAT3 线上数据CRC值 |
Bit7 |
Bit6 |
Bit2 |
Bit1 |
Bit0 |
操作描述 |
传输字节数 |
mmc_io |
mmc_io_mbctl |
|||||
1 |
1 |
Trig |
0 |
0 |
写多块命令+响应+8 null clock +数据 |
mmc _blokcnt |
1 |
1 |
Trig |
1 |
0 |
读多块命令+响应+8 null clock +数据 |
mmc _blokcnt |
x |
x |
0 |
0 |
Trig |
写多块数据 |
mmc _blockcnt |
x |
x |
0 |
1 |
Trig |
读多块数据 |
mmc _blockcnt |
Note:
Table 5 中前两列操作会产生多块数据完成中断,每块数据会产生数据完成中断,以及CMD DONE 中断;
2.当超时发生时,多块数据完成中断将不会产生,而会产生超时中断。
Bit7 |
Bit6 |
时间单位 |
0 |
0 |
1us |
0 |
1 |
100us |
1 |
0 |
10ms |
1 |
1 |
1s |
Bit7 |
Bit6 |
时间单位 |
0 |
0 |
1us |
0 |
1 |
100us |
1 |
0 |
10ms |
1 |
1 |
1s |
Note:
当使用DMA接口时,DMA使能需要先打开;
如果不使用中断,当传输命令/响应/8 null clock 时,可以查询mmc_io[2];当需要传输数据时,可以查询mmc_io[0];当传输多块数据时,可以查询mmc_io_mbctl[2]/mmc_io_mbctl[0];
当Ncr 超时发生时,数据传输会中断,控制器需要重新配置 一个新的传输;
SPI控制器
功能概述
SPI是串行外设接口(Serial Peripheral Interface)的缩写。SPI是一种高速、全双工、同步的通信总线。SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时),包括 SDI(数据输入)、SDO(数据输出)、SCLK(时钟)、CS(片选)。
主要特性
既可作为SPI主设备,也可作为SPI从设备
发送和接收通路各有8个字深度的FIFO
master支持motorola spi的4种格式(CPOL,CPHA),TI时序,macrowire时序
slave支持motorola spi的4种格式(CPOL,CPHA)
支持全双工和半双工
主设备支持bit传输,最大支持65535bit传输
从设备支持各种长度byte的传输模式
从设备输入的spi_clk最大时钟频率为系统APB时钟的1/6
功能描述
主从可配
SPI控制器既支持设备作为SPI通信主设备,也支持设备作为SPI通信从设备。通过设置SPI_CFG寄存器的Bit2可以来回切换设备主从角色。
多种模式支持
作为主设备时,通过设置SPI_CFG寄存器的Bit1(CPHA) 和 Bit0(CPOL),可以使其分别以MOTOROLA SPI的四种格式传输数据。CPOL是用来决定SCK时钟信号空闲时的电平,CPOL=0,空闲电平为低电平,CPOL=1时,空闲电平为高电平。CPHA是用来决定采样时刻的,CPHA =0,在每个周期的第一个时钟沿采样,CPHA=1,在每个周期的第二个时钟沿采样。还可以通过设置TRANS_MODE寄存器来设置主设备以TI时序或者microwire时序来传输数据,两种时序下的传输数据长度均可调。
作为从设备时,则只支持MOTOROLA SPI的四种格式,格式选择也是通过设置与作为主设备时相同的寄存器来实现。
高效的数据传输
FIFO存储器是一个先入先出的双口缓冲器,即第一个进入其内的数据第一个被移出,其中一个存储器的输入口,另一个口是存储器的输出口。SPI控制器集成了两个(收发各一个)深度均为8个字的FIFO存贮器,以增加数据传输率、处理大量数据流、匹配具有不同传输率的系统,从而提高了系统性能。可以通过设置MODE_C FG寄存器的Bit[8:6]和Bit[4:2]可以设置RXFIFO和TXFIFO的trigger level,以满足不同传输速率下的性能要求。FIFO的trigger level被触发后,就可以触发中断或者DMA,将数据从内存移到TXFIFO或者将将数据从RXFIFO搬移至内存。
寄存器描述
寄存器列表
偏移地址 |
名称 |
缩写 |
访问 |
描述 |
复位值 |
0X0000 |
通道配置寄存器 |
CH_CFG |
RW |
用以对收发通道的相关项进行一些配置 |
0X0000_0000 |
0X0004 |
SPI配置寄存器 |
SPI_CFG |
RW |
对SPI通信相关项进行配置 |
0X0000_0004 |
0X0008 |
时钟配置寄存器 |
Clk_CFG |
RW |
用以设置时钟分频系数 |
0X0000_0000 |
0X000C |
模式配置寄存器 |
MODE_CFG |
RW |
配置传输模式 |
0X0000_0000 |
0X0010 |
中断控制寄存器 |
SPI_INT _MASK |
RW |
屏蔽或者使能相关中断 |
0X0000_00FF |
0X0014 |
中断状态寄存器 |
SPI_INT _SOURCE |
RW |
用于查询中断源 |
0X0000_0000 |
0X0018 |
SPI状态寄存器 |
SPI_STATUS |
RO |
列举SPI通信中的相关状态 |
0X0000_0000 |
0X001C |
SPI超时寄存器 |
SPI_TIME_OUT |
RW |
设置SPI通信超时 |
0X0000_0000 |
0X0020 |
数据发送寄存器 |
SPI_TX_DATA |
RW |
TX FIFO,用于存放待发送数据 |
0X0000_0000 |
0X0024 |
传输模式寄存器 |
TRANS_MODE |
RW |
设置传输模式 |
0X0000_0000 |
0X0028 |
数据长度寄存器 |
SLV_XMIT _LEN |
RO |
作为从设备时用于存放发送出去或者接收到的数据的长度 |
0X0000_0000 |
0X002C |
RSV |
保留 |
0X0000_0000 |
||
0X0030 |
数据接收寄存器 |
SPI_RX_DATA |
RW/RO |
RX FIFO,用于存放接收到的数据 |
0X0000_0000 |
通道配置寄存器
位 |
访问 |
操作说明 |
复位值 |
[31] |
RSV |
1’b0 |
|
[30:23] |
RW |
RX_INVALID_BIT 表示接收通路在开始接收时,前多少bit是无效数据,这些无效数据需要直接扔掉,不进入Rx FIFO。只有后续的数据进入Rx FIFO 本寄存器与Tx/Rx length配合使用。最后实际存入Rx FIFO的数据量为Tx/Rx length - RX_INVALID_BIT 注:master模式有效 Motorola/ TI模式有效 |
8’h0 |
[22] |
RW |
Clear FIFOs,清除Tx和Rx FIFO的内容,同时同步复位master和slave所有电路(配置寄存器除外) 1’b0:不清除FIFO 1’b1:清除有效 软件置1,硬件清0 注:master/slave都有效 Motorola / TI / microwire 模式有效 |
1’b0 |
[21] |
RW |
continue mode,该模式下,spi发送不受Tx FIFO空的影响。,持续传输,直至整个传输过程完成。 1’b0:normal,Tx FIFO空后,需要等待FIFO 中出现数据,SCK停止翻转,同理,Rx FIFO满后,SCK停止翻转,等待RX FIFO有空间接收数据 1’b1:continue mode,Tx fifo空,仍可以传输,直至传输完成,但此时如果rx fifo满,则需要暂停传输,直至rx fifo可以存数为止 注:master有效 一般情况下,不设置该模式。 开启该模式时,如果tx fifo中没有数据,有可能导致无效数据先发送出去。所以请先填入数据后,再启动spi master Motorola / TI / microwire 模式有效 |
1’b0 |
[20] |
RW |
RxChOn,接收通路是否开启 1’b0: Rx channel off 1’b1: Rx channel on 注:master/slave都有效 Motorola / TI / microwire 模式有效 |
1’b0 |
[19] |
RW |
TxChOn,发送通路是否开启 1’b0: Tx channel off 1’b1: Tx channel on 注:master/slave都有效 Motorola / TI / microwire 模式有效 |
1’b0 |
[18:3] |
RW |
Tx/Rx length Spi在传输时,有效的SCK数 也间接的反映了发送或者接收数据的长度。 当(TxChOn=1,RxCh On=1)时,表示发送的bit数,以及最大接收的bit数(具 体接收多少与RX_INVALI D_BIT有关) 当(TxChOn=1,RxCh On=0)时, 表示发送的bit数, 当(TxChOn=0,RxCh On=1)时, 表示最大接收的bit数(具体接收多少与RX_INVALID_BIT有关,实际接收数为Tx/ Rx length - RX_INVALID_BIT) 当(TxChOn=0,RxCh On=0)时, 无意义。 注:master有效 Motorola / TI / microwire 模式有效 |
16’h0 |
[2] |
RW |
Chip selects 1’b0:SPI_CS有效信号为0 1’b1:SPI_CS有效信号为1 注:master有效 Motorola / TI / microwire 模式有效 |
1’b0 |
[1] |
RW |
Force CS out 1’b0:spi_cs信号输出由硬件控制 1’b1:spi_cs信号输出由软件控制,具体输出值为Chip selects 该信号配合Chip selects可以实现输出csn信号可编程,即该信号为1时, spi_cs = Chip selects 注:master有效 Motorola / TI / microwire 模式有效 |
1’b0 |
[0] |
RW |
SPI start, 命令SPI开始接收或者发送,写1为spi开始工作,之后,自动归零 1’b0:停止spi工作 1’b1:启动spi的一次发送或者接收,自动归零 注:master有效 Motorola / TI / microwire 模式有效 |
1’b0 |
SPI配置寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:19] |
RSV |
13’h0 |
|
[18:17] |
RW |
FRAM FORMAT 2’b00:motorola 2’b01:TI 2’b10:microwire 2’b11:RSV 选择master支持那个厂家的协议 注:master有效 |
2’b0 |
[16] |
RW |
SPI_TX pin always driven 1’b0:spi输出只有在spi_cs有效时,被驱动,其它时间为三态 1’b1:spi输出一直有驱动,即使没有数据传输 注:master/slave都有效 Motorola / TI / microwire 模式有效 |
1’b0 |
[15] |
RSV |
1’b0 |
|
[14:12] |
RW |
cs hold spi_cs在数据传输完成后持续有效的时间,即spi_cs的hold时间 3’b000 >=1 个APB 总线 CLK 3’b001 >=2 个APB 总线CLK 3’b010 >=4 个APB 总线 Clk 3’b011 >=8 个APB 总线 CLK 3’b100 >=16 个APB 总线 CLK 3’b101 >=32 个APB 总线 CLK 3’b110 >=64 个APB 总线 CLK 3’b111 >=127 个APB 总线 CLK 注: master有效 Motorola模式有效 |
3’b0 |
[11:9] |
RW |
cs setup, spi_cs在数据传输前提前有效的时间,即spi_cs的setup时间 3’b000 >=1 个APB 总线 CLK 3’b001 >=2 个APB 总线 CLK 3’b010 >=4 个APB 总线 CLK 3’b011 >=8 个APB 总线 CLK 3’b100 >=16 个APB 总线 CLK 3’b101 >=32 个APB 总线 CLK 3’b110 >=64 个APB 总线 CLK 3’b111 >=127 个APB 总线 CLK 注:master有效 Motorola模式有效 |
3’b0 |
[8:7] |
RW |
SPI-out delay, SPI数据输出相对与SCK的delay,主要是为了hold time考虑。 [8:7] 系统时钟周期数(APB clock) 2’b00 0 2’b01 1 2’b10 2 2’b11 3 注:master/slave都有效 Motorola模式有效 |
2’b0 |
[6:4] |
RW |
Frame delay,默认在一帧(spi_cs有效期间)传输结束到下一帧开始的间隔为SCK时钟周期的一半,即SPI_CS无效时间。 但为了兼容性,此处可配置。默认至少0.5SCK [6:4] SCK clock 3’b000 0 3’b001 2 3’b010 4 3’b011 8 3’b100 16 3’b101 32 3’b110 64 3’b111 127 例如,按照block模式传输128byte的数据,数据传输完成后,会加入所设置的延迟时间。 注:master有效 |
3’b0 |
[3] |
RW |
Bigendian 1’b0:数据格式采用小端模式,即传输过程中,先发低字节 1’b1:数据格式采用大端模式,即传输过程中,先发高字节 |
1’b0 |
[2] |
RW |
MASTER/SLAVE 1’b0:slave,该设备是 slave 1’b1:master,该设备 是master 注:master/slave都有效 |
1’b1 |
[1] |
RW |
SPI CPHA 1’b0:传输模式A 1’b1:传输模式B 注:master/slave都有效 Motorola模式有效 |
1’b0 |
[0] |
RW |
SPI CPOL,SCK在IDLE时的极性 1’b0:SCK IDLE时为0 1’b1:SCK IDLE时为1 注:master/slave都有效 Motorola模式有效 |
1’b0 |
时钟配置寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:16] |
RSV |
16‘h0 |
|
[15:0] |
RW |
Divider FSCK = FAPB_CL K/ ( 2 x (Divider +1)) 注:master有效 Motorola / TI / microwire 模式有效 |
16’h0 |
[31:16] |
RSV |
16’h0 |
|
[15:0] |
RW |
Divider FSCK = FAPB_CL K/ ( 2 x (Divider +1)) 注:master有效 Motorola / TI / microwire 模式有效 |
16’h0 |
模式配置寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:9] |
RSV |
23’h0 |
|
[8:6] |
RW |
RxTrigger level RX FIFO 存储的数据触发中断或者DMA请求的阈值:0~7word 只有rxbuffer中的数据大于RxTrigger level,才会触发中断或者请求DMA搬移 注:master/slave都有效 Motorola / TI / microwire 模式有效 |
3’b0 |
[5] |
RSV |
1’b0 |
|
[4:2] |
RW |
TxTrigger level TX FIFO 存储的数据触发中断或者DMA请求的阈值:0~7word 只有txbuffer中的数据大于等于TxTrigger level,才会触发中断或者请求DMA搬移 注:master/slave都有效 Motorola / TI / microwire 模式有效 |
3’b0 |
[1] |
RW |
RxDMA On,采用DMA搬移数据使能 1’b0:不采用DMA, 1’b1:采用DMA 注:master/slave都有效 Motorola / TI / microwire 模式有效 |
1’b0 |
[0] |
RW |
TxDMA On,采用DMA搬移数据使能 1’b0:不采用DMA, 1’b1:采用DMA 注:master/slave都有效 Motorola / TI / microwire 模式有效 |
1’b0 |
中断控制寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:8] |
RSV |
24’h0 |
|
[7] |
RW |
IntEn_spi_timeout 1’b0:允许产生spi_timeout中断 1’b1:不允许产生spi_timeout中断 注:master/slave都有效 Motorola / TI / microwire 模式有效 |
1’b1 |
[6] |
RW |
IntEn_spi_done 1’b0:spi发送或者接收完成,允许产生中断 1’b1:spi发送或者接收完成,不允许产生中断 注:master/slave都有效Motorola / TI / microwire 模式有效 |
1’b1 |
[5] |
RW |
IntEnRxOverrun 1’b0:Rx FIFO overflow 中断使能 1’b1:Rx FIFO overflow 中断不使能 注:master/slave都有效Motorola / TI / microwire 模式有效 |
1’b1 |
[4] |
RW |
IntEnRxUnderrun 1’b0:Rx FIFO underflow 中断不使能 1’b1:Rx FIFO underflow 中断使能 注:master/slave都有效Motorola / TI / microwire 模式有效 |
1’b1 |
[3] |
RW |
IntEnTxOverrun 1’b0:Tx FIFO overflow 中断使能 1’b1:Tx FIFO overflow 中断不使能 注:master/slave都有效Motorola / TI / microwire 模式有效 |
1’b1 |
[2] |
RW |
IntEnTxUnderrun 1’b0:Tx FIFO underflow 中断使能 1’b1:Tx FIFO underflow 中断不使能 注:master/slave都有效Motorola / TI / microwire 模式有效 |
1’b1 |
[1] |
RW |
IntEnRxFifoRdy 1’b0:Rx FIFO 有数据上传中断使能 1’b1:Rx FIFO 有数据上传中断不使能 注:master/slave都有效Motorola / TI / microwire 模式有效 |
1’b1 |
[0] |
RW |
IntEnTxFifoRdy 1’b0:Tx FIFO可以向TX FIFO写数据中断使能 1’b1:Tx FIFO可以向TX FIFO写数据中断不使能 注:master/slave都有效Motorola / TI / microwire 模式有效 |
1’b1 |
中断状态寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:8] |
RSV |
24’h0 |
|
[7] |
RW |
spi_timeout 1’b0:rxfifo中没有结尾数据需要CPU取走 1’b1:rxfifo中有结尾数据需要CPU取走 写1清零 注:master/slave都有效Motorola / TI / microwire 模式有效 |
1’b0 |
[6] |
RW |
spi_done 1’b0:SPI发送或者接收没有完成 1’b1:SPI发送或者接收完成 写1清零 注:master/slave都有效Motorola / TI / microwire 模式有效 |
1’b0 |
[5] |
RW |
RxOverrun 1’b0:Rx FIFO overflow 1’b1:Rx FIFO overflow 写1清零 注:master/slave都有效Motorola / TI / microwire 模式有效 |
1’b0 |
[4] |
RW |
RxUnderrun 1’b0:Rx FIFO underflow 1’b1:Rx FIFO underflow 写1清零 注:master/slave都有效Motorola / TI / microwire 模式有效 |
1’b0 |
[3] |
RW |
TxOverrun 1’b0:Tx FIFO overflow 1’b1:Tx FIFO overflow 写1清零 注:master/slave都有效Motorola / TI / microwire 模式有效 |
1’b0 |
[2] |
RW |
TxUnderrun 1’b0:Tx FIFO underflow 1’b1:Tx FIFO underflow 写1清零 在 continue mode = 1 的情况下,永远不会产生该中断。 注:master/slave都有效Motorola / TI / microwire 模式有效 |
1’b0 |
[1] |
RW |
RxFifoRdy 1’b0:Rx FIFO 数据量<= RxTrigger level,不需要上传 1’b1:Rx FIFO数据量> RxTrigger level,要求上传 写1清零 注:master/slave都有效Motorola / TI / microwire 模式有效 |
1’b0 |
[0] |
RW |
TxFifoRdy 1’b0:Tx FIFO 数据量 > TxTrigger level,不可以向Tx FIFO写数据 1’b1:Tx FIFO 数据量 <= TxTrigger level,可以向TX FIFO写数据 写1清零 注:master/slave都有效Motorola / TI / microwire 模式有效 |
1’b0 |
SPI状态寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:13] |
RSV |
19’h0 |
|
[12] |
RO |
SPI Busy 1’b0:SPI没有发送和接收任务 1’b1:SPI处于发送或者接收过程 注:master/slave都有效Motorola / TI / microwire 模式有效 |
1’b0 |
[11:6] |
RO |
RX FIFO fill level Rx FIFO中数据量,单位为字节 注:master/slave都有效Motorola / TI / microwire 模式有效 |
6’h0 |
[5:0] |
RO |
Tx FIFO fill level Tx FIFO中数据量,单位为字节 注:master/slave都有效Motorola / TI / microwire 模式有效 |
6’h0 |
SPI超时寄存器
位 |
访问 |
操作说明 |
复位值 |
[31] |
RW |
spi_timer_en 1’b0:不允许timer计时 1’b1:允许timer计时 注:master/slave都有效Motorola / TI / microwire 模式有效 |
1’b0 |
[30:0] |
RW |
SPI_TIME_OUT 当一次传输完成后,在接收通路rxfifo中,结尾的数据如果不能触发接收中断RxFifoRdy或者DMA请求时,需要采用计时机制来通知CPU搬走结尾数据 。 具体方法:当rxfifo处于idle状态下(没有读写操作,没有dma请求,cs无效,rxfifo中有数据,且数据量小于等于RxTrigger level),开始计数,达到本寄存器设置的值,则触发time out中断,请求CPU搬走结尾数据。 任何对rxfifo的读写操作都会清楚timeout计时器。 所表示的时间为:T = SPI_TIME_OUT / F APB_CLK 注:master/slave都有效Motorola / TI / microwire 模式有效 |
31’h0 |
数据发送寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:0] |
RW |
向Tx FIFO写数据的窗口地址 注: master/slave都有效 Motorola / TI / microwire 模式有效 |
32’h0 |
传输模式寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:30] |
RSV |
16’d0 |
|
[29:24] |
RW |
TI_BLK_LEN 在TI的时序模式下,每个block传输的长度,即每次CS有效之后的传输数据长度。支持4~32bit 6’h4: 4bit长数据 6’h5: 5bit长数据 6’h6: 6bit长数据 …….. 6’h20: 32bit长数据 注:master有效 TI模式有效 |
6’d0 |
[16] |
RW |
MICRO_BURST 1b’1:Microwire模式下,采用burst传输,即Tx发送控制字,Rx接收数据,依次交替进行,MICRO_CONTROL_LEN表示的是控制字长度,MICRO_DAT_LEN 表示的是发送或者接收字的长度,Tx/Rx length表示的是整个传输过程中有效sck,burst模式下,发送接收交替进行的次数为(Tx/Rx length)/(MICRO_CONTROL _LEN + MICRO_DAT _LEN + 1 ) 1’b0:Microwire模式下,不采用burst传输 在此模式下,有两种情况 1)tx_ch_on = 1, rx_ch_on = 0,此时,只有发送,MICRO_CONTROL _LEN表示的是控制字长度,Tx/Rx length表示的是整个传输过程中有效sck,此时发送的数据长度为 m * MICRO_DAT_LEN = Tx/Rx length - MICRO_CONTROL _LEN,其中m表示发送多少个(MICRO_DAT _LEN)长度的字 2)tx_ch_on = 1, rx_ch_on = 1,此时,Tx发送控制字,Rx接收数据,MICRO_CONTROL _LEN表示的是控制字长度,Tx/Rx length表示的是整个传输过程中有效sck,接收数据长度为 m*MICRO_DAT _LEN = Tx/Rx length-MICRO_CONTROL _LEN-1,其中m 表示接收多少个(MICRO_D AT_LEN)长度的字 注:master有效 microwire模式有效 |
1’b0 |
[13:8] |
RW |
MICRO_DAT_LEN Microwire模式下,在burst模式模式时,每个burst传输数据的长度 从1~32: 6’h1: 1bit长数据 6’h2: 2bit长数据 6’h3: 3bit长数据 …….. 6’h20 32bit长数据 注:master有效 microwire模式有效 |
6’d0 |
[5:0] |
RW |
MICRO_CONTROL_LEN Microwire模式下,命令字的长度 从1~32: 6’h1: 1bit长命令 6’h2: 2bit长命令 6’h3: 3bit长命令 …….. 6’h20 32bit长命令 注:master有效 microwire模式有效 |
6’d0 |
数据长度寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:16] |
RO |
作为slave时,在cs有效期间,发送出去的数据长度,单位为 bit 注:slave有效 Motorola模式有效 |
16’h0 |
[15:0] |
RO |
作为slave时,在cs有效期间,接收到的数据长度,单位为bit 注:slave有效 Motorola模式有效 |
16’h0 |
数据接收寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:0] |
RO |
从Rx FIFO读数据的窗口地址 注:master/slave都有效 Motorola / TI / microwire 模式有效 |
32’h0 |
I2C控制器
功能概述
I2C总线是一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。
主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件.在总线上主和从、发和收的关系不是恒定的,而取决于此时数据传送方向。如果主机要发送数据给从器件,则主机首先寻址从器件,然后主动发送数据至从器件,最后由主机终止数据传送;如果主机要接收从器件的数据,首先由主器件 寻址从器件.然后主机接收从器件发送的数据,最后由主机终止接收过程。在这种情况下.主机负责产生定时时钟和终止数据传送。
主要特性
APB总线协议标准接口
只可作为主设备控制器使用
I2C工作速率可配,100KHz~400KHz
多路GPIO可复用成I2C的通信接口
可快速输出和检测时序信号
功能描述
传输速率选择
通过设置寄存器PRERlo和寄存器 PRERhi就可以将I2C总线上的数据传输速率配置在100KHz到400KHz之间的任意总线频率整数分频值。
中断及启动停止可控
通过设置寄存器CTR的Bit6允许或者禁止I2C控制器产生中断,并且还可以通过设置Bit7来随时启动或者停止I2C控制器的工作。
快速输出及检测信号
通过设置寄存器CR_SR的相应位可以使控制器快速输出或者检测总线START信号,总线STOP信号,总线ACK信号,总线NACK信号。在主模式下,I2C接口启动数据传输并生成时钟信号。 一个串行数据传输始终以启动信号开始,以停止信号结束。一旦在总线上生成启动信号,就选择了主设备模式。
寄存器描述
寄存器列表
偏移地址 |
名称 |
缩写 |
访问 |
描述 |
复位值 |
0X0000 |
时钟分频寄存器_1 |
PRERlo |
RW |
存放低8位的分频值,用以对APB总线时钟进行分频 |
0X0000_00FF |
0X0004 |
时钟分频寄存器_2 |
PRERhi |
RW |
存放高8位的分频值,用以对APB总线时钟进行分频 |
0X0000_00FF |
0X0008 |
控制寄存器 |
CTR |
RW |
用以控制中断的使能以及I2S控制器的使能 |
0X0000_0040 |
0X000C |
数据寄存器 |
TXR_RXR |
RW |
用以存放待发送的数据或者接收到的数据 |
0X0000_0000 |
0X0010 |
收发控制寄存器 |
CR_SR |
RW |
用以控制一些数据读写相关的操作 |
0X0000_0000 |
0X0014 |
TXR读出寄存器 |
TXR |
RO |
读取I2C发送时的TXR寄存器值 |
0X0000_0000 |
0X0018 |
CR读出寄存器 |
CR |
RO |
读取I2C控制寄存器的设定值CR |
0X0000_0000 |
时钟分频寄存器_1
位 |
访问 |
操作说明 |
复位值 |
[31: 8] |
保留 |
||
[7 : 0] |
RW |
时钟分频配置prescale的低8bit。 例如: apb_clk=40MHz, SCL=100KHz prescale = (40*1000) / (5*100) – 1 = 16’d79 apb_clk = 40M, SCL=400K prescale=(40*1000) / (5*400) – 1 = 16’d19 |
8’hff |
时钟分频寄存器_2
位 |
访问 |
操作说明 |
复位值 |
[31: 8] |
保留 |
||
[7 : 0] |
RW |
时钟分频配置prescale的高8bit。 例如: apb_clk=40MHz, SCL=100KHz prescale = (40*1000) / (5*100) – 1 = 16’d79 apb_clk = 40M, SCL=400K prescale = (40*1000) / (5*400) – 1 = 16’d19 |
8’hff |
控制寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:8] |
保留 |
||
[7] |
RW |
I2C使能控制, 1’b0:不使能 1’b1:使能 |
1’b0 |
[6] |
RW |
中断MASK, 1’b0:允许中断产生 1’b1:不允许中断产生 |
1’b1 |
[5:0] |
保留 |
数据寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:8] |
保留 |
||
[7:0] |
WR |
写该寄存器时,为发送寄存器TXR, 表示下一个要发送的字节, 当为设备地址时, [0]:1时表示读,0时表示写。 读该寄存器时,为接收寄存器RXR, 为最新从I2C上接收到的字节。 |
8’h0 |
收发控制寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:8] |
保留 |
||
[7:0] |
WR |
写该寄存器时,为CR,功能如下: [7]:STA,控制产生START时序; 1’b0:无效 1’b1:产生START时序 [6]:STO,控制产生STOP时序; 1’b0:无效 1’b1:产生STOP时序 [5]:RD,从SLAVE读; 1’b0:无效 1’b1:从SLAVE读 [4]:WR,向SLAVE写; 1’b0:无效 1’b1:向SLAVE写 [3]:控制向SLAVE送回ACK/NACK; 1’b0:回ACK 1’b1:回NAK [2:1]:保留; [0]:IACK,清除中断状态,1有效; 1’b0:无效 1’b1:清除中断标志 读该寄存器时,为SR,功能如下: [7]:RxACK,从SLAVE收到的ACK/NACK状态; 1’b0:从SLAVE收到ACK 1’b1:从SLAVE收到NAK [6]:BUSY; 1’b0:STO后置0 1’b1:STA后置1 [5]:AL,Arbitration Lost,此位保留; [4:2]:保留; [1]:TIP; 1’b0:无传输正在进行 1’b1:有传输正在进行 [0]:IF,中断状态位; 1’b0:无中断产生 1’b1:传输完成或者AL时置1 |
8’h0 |
TXR读出寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:8] |
保留 |
||
[7:0] |
RO |
只读,TXR寄存器的读出值, 功能描述见TXR_RXR寄存器; |
8’h0 |
CR读出寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:8] |
保留 |
||
[7:0] |
RO |
只读,CR寄存器的读出值, 功能描述见CR_SR寄存器; |
8’h0 |
I2S控制器
功能概述
I2S(Inter-IC Sound)是针对数字音频设备(如CD播放器、数码音效处理器、数字电视音响系统)之间的音频数据传输而制定的一种总线标准。它采用了独立的导线传输时钟与数据信号的设计,通过将数据和时钟信号分离,避免了因时差诱发的失真,为用户节省了购买抵抗音频抖动的专业设备的费用。标准的I2S总 线电缆是由3根串行导线组成的:1根是时分多路复用(简称TDM)数据线;1根是字选择线;1根是时钟线。
主要特性
实现I2S接口,支持I2S和PCM协议
支持amba APB总线接口,32bit single读写操作
支持主从模式
支持8,16,24,32位宽,最高采样频率为192KHz
支持单声道和立体声模式
兼容I2S和MSB justified数据格式,兼容PCM A/B格式
支持DMA请求读写操作,只支持按字操作
功能描述
多种模式支持
通过设置I2S Control寄存器的Bit[25:24]可以设置数据格式为I2S格式,MSB justified格式,PCM A格式,或者PCM B格式;通过设置I2S Control寄存器的Bit[22]可以选择单声道或者立体声模式。通过设置I2S Control寄存器的Bit[5:4]可以设置数据传输字的位宽,可以设置为8bit,16bit,24bit,32bit。
零交叉检测
通过设置I2S Control寄存器的Bit[17:16]可以设置是否启用左右声道的零交叉检测功能;通过设置I2S_IMASK寄存器的Bit[9:8]可以设置左右声道零交叉检测功能是否产生中断。若启用了检测功能,并且使了中断,则当检测到零交叉现象时,程序会执行中断子程序,同时I2S_INT_FLAG 寄存器的Bit[9:8]的相应位会被置1。
高效的数据传输
FIFO存储器是一个先入先出的双口缓冲器,即第一个进入其内的数据第一个被移出,其中一个存储器的输入口,另一个口是存储器的输出口。I2S控制器集成了两个(收发各一个)深度均为8个字的FIFO存贮器,以增加数据传输率、处理大量数据流、匹配具有不同传输率的系统,从而提高了系统性能。可以通过设置I2S Control寄存器的Bit[14:12]和Bit[11:9]可以设置RXFIFO和TXFIFO的trigger level,以满足不同传输速率下的性能要求。FIFO的trigger level被触发后,就可以触发中断或者DMA,将数据从内存移到TXFIFO或者将将数据从RXFIFO搬移至内存。
I2S/PCM时序图
本模块提供对4种协议的支持,标准I2S,MSB Justified,PCM-A,PCM-B. 通过配置寄存器0x00[25:24] 来选择使用哪种协议。具体每种协议的接口时序见Fig1至Fig4.

Fig1. I2S Bus Timing Diagram(PCM=0,Format=0)

Fig2. MSB Justified Timing Diagram(PCM=0,Format=1)

Fig3. PCM A Audio Diagram(PCM=1,Format=0)

Fig4. PCM B Audio Diagram(PCM=1,Format=1)
FIFO存储结构图

Fig 5. FIFO存储结构
I2S模块提供2个8x32bit 大小的FIFO,一个作为TX FIFO,一个作为RX FIFO。
FIFO内数据的存储结构根据工作模式的不同有所不同。当工作在单声道8bit模式时,FIFO内每个word可以存储4个sample 数据。当工作在双声道8bit模式时,左右声道数据交替存储于FIFO内,处于低位的byte存储右声道数据,处于高位的byte存储左声道数据。一个word可以存储2个samp le数据。单工16bit模式时,一个word可以存储2个sample,双工16bit模式时,一个word存储一个sample数据,低16位为右声道,高16位为左声道。24bit与32bit模式时每个word只能存储一个sample数据或者一个声道的数据,具体存储方式见图5所示。
I2S 模块工作时钟配置
I2S 模块的工作时钟配置通过设置在时钟与复位模块中 0x40000718寄存器可以配置时钟源选用外部时钟还是内部160MHz时钟,是否开启MCLK 时钟,以及MCLK和BCLK的工作频率。
通过设置寄存器0x40000718[0]可以选择使用内部160MHz时钟还是使用外部时钟作为I2S 模块时钟源。如果选用外部时钟,I2S 模块将使用从IO- I2S_M_EXTCLK(PA_5,Option 4)输入的时钟作为模块时钟源。
而0x40000718[1] 选择是否开启MCLK时钟。[7:2] 位为配置MCLK 分频比的区域。计算公式如下:
F_mclk=F_I2SCLK/MCLKDIV
F_mclk 为实际MCLK 频率;
F_I2SCLK 为I2S 模块的时钟源。如果选用内部时钟,则F_I2SCLK =160MHz;如果选用外部时钟,则F_I2SCLK 等于外部输入的时钟频率;
MCLKDIV 即为寄存器0x40000718[7:2] 配置的时钟分频比。需要注意的是MCLKDIV>=2;
寄存器0x40000718 的[17:8]位 为配置BLCK 时钟的分频比的区域。分频比计算公式如下:
F_BCLK=F_I2SCLK/BCLKDIV
F_BCLK 为BCLK 实际工作的频率;
F_I2SCLK为I2S 模块的时钟源。如果选用内部时钟,则F_I2SCLK =160MHz;如果选用外部时钟,则F_I2SCLK 等于外部输入的时钟频率;
BCLKDIV 即是需要配置的分频比。根据不同的工作模式需要选择不同的分频比。选择分频比的公式如下:
BCLKDIV=round (F_I2SCLK/(Fs*W*F))
Fs为I2S接口上音频数据的采样频率,最高支持192KHz;
W为采样位宽,8/16/24/32 bit 可以选择;
F为单声道/双声道选择。传输数据为单声道时F=1,传输数据为双声道时F=2;
最后计算出来的分频比进行四舍五入。
以下为根据实际工作模式选取BCLKDIV 的例子:
若选取内部时钟为模块时钟源,需要传输128KHz采样率,24bit双声道数据,则计算需要设置BCLKDIV 的过程如下:
BCLKDIV=round(160*10e6/128*10e3*24*2)=10’d26;
分频寄存器说明如下:
0x18 |
I2S_Clk_Ctrl |
[0] |
RW |
EXTAL_EN External clock select Select whether use External or Internal clock for I2S block 0=internal clk 1=external clk Note: When External clock is enabled, the external clk must be 2*N*256 fs, where fs is sample frequenc y and N must be integer. |
1’b0 |
[1] |
RW |
MCLKEN MCLK enable 0=MCLK disabled 1=MCLK enabled |
1’b0 |
||
[7:2] |
RW |
MCLKDIV MCLK divider If external clock is selected , this divider is used to produce proper MCLK frequency. F_mclk = F_I2SCLK / MCLKDIV Where MCLKDIV >=2 F_mclk = F_I2SCLK when MCLKDIV=0 Where F_I2SCLK is external clk. Note: F_mclk should be configur ed as 256 * fs where fs is sample frequency. |
6’d0 |
||
[17:8] |
RW |
BCLKDIV BCLK divider F_BCLK = F_I2SCLK / BCLKDIV Note: When EXTAL_EN is not selected , Internal PLL is used and F_I2SCLK = 160MHz When WXTAL_EN is enabled, F_I2SCLK = External crystal frequency BCLKDI V = round (F_I2SCL K / (Fs*W* F)) Where Fs is sample frequency of audio data and W is word width. F=2 when data is stereo and F=1 when data is mono. For example, if internal PLL is used and the data width is 24bit, Format is stereo format, sample frequenc y is 128KHz. Then the BCLKDIV should be configur ed as (160*10e 6/128*10 e3*24*2) =10’d26 |
10’d0 |
||
[31:18] |
RO |
RSV |
14’d0 |
其他功能说明:
过零检测:
为了避免数据损坏导致频率突然变化而产生的噪声,I2S 模块针对每个声道都提供了过零检测的功能。当发送的相邻两个数据符号位出现变化时,模块会产生中断,提醒MCU进行检测,处理;同时将后一个数据强制静音。
静音功能
当静音功能打开时,数据仍将发送,但输出的数据将被强制置为0;
中断
本模块提供发送/接收完成中断,左右声道过零检测中断,发送/接收 FIFO 的阈值中断(发送FIFO中数据低于阈值,接收FIFO中数据高于阈值),发送/接收FIFO的underflow/overflow中断。中断状态在寄存器0x08中查询。
FIFO状态查询
寄存器0x10提供CPU 对I2S 模块中发送/接收FIFO的状态查询功能。通过寄存器CPU 能够检查FIFO中剩余多少数据未处理。在接收FIFO中最后一个word中有几个byte是有效数据。
数据传输流程
主端发送音频数据
配置好使用的引脚, SDO, BCLK, LRCLK
参考Section 2.4 设置时钟与复位模块中寄存器0x40000718,配置好工作时钟频率;
设置I2S寄存器0x00,设置为master mode, 配置传输格式,声道选择,数据位宽,左右声道是否开启过零检测,并设置发射通路-txen开启。
设置寄存器0x4,使能想要使用的中断;
如果使用DMA传输数据,在DMA模块中选择使用的通道,配置好发射数据的地址,长度。并在I2S模块寄存器中0x0中使能DMA,并设置FIFO阈值。当FIFO中数据低于阈值范围即会自动请求DMA搬运数据。
向发射FIFO地址-寄存器0x10写入需要发射的数据,使能寄存器0x0[0], 模块即会自动从FIFO中取出数据送到I2S总线上。
当FIFO中数据小于设置的阈值时,模块将向DMA模块请求数据,或者发送TXTHIF中断。
当FIFO中数据全部取出后,TXDONE 中断将置位,当最后一帧发送完成,TXUDIF中断将置位,通知CPU发送完成,模块停止发送。
从端接收音频数据
配置好使用的引脚, SDI, BCLK, LRCLK
设置I2S寄存器0x00,设置为slave mode配置传输格式,声道选择,数据位宽,左右声道是否开启过零检测,并设置接收通路-rxen开启。
设置寄存器0x4,使能想要使用的中断;
如果使用DMA传输数据,在DMA模块中选择使用的通道,配置好发射数据的地址,长度。并在I2S模块寄存器中0x0中使能DMA,并设置FIFO阈值。当数据高于阈值范围即会自动请求DMA搬运数据。
使能寄存器0x0[0], 模块检测到有效的BCLK和LRCLK后即会自动从SDI上采集数据存储在FIFO中。当FIFO中数据高于设置的阈值时,模块将向DMA请求搬运数据到内存中,或者发送RXTHIF中断。当CPU关闭RXEN时RXDONE中断产生。CPU可以通过寄存器0x10查询接收FIFO中有多少 个数据,最后一个word中有多少个byte的有效数据。然后根据FIFO状态处理最后剩余的数据。
主端接收音频数据
配置好使用的硬件,SDI , SCLK, LRCLK
参考Section 2.4 设置时钟与复位模块中寄存器0x40000718,配置好工作时钟频率;
设置I2S寄存器0x00,设为master mode,配置传输格式,声道选择,数据位宽,左右声道是否开启过零检测,并设置接收通路rxen开启。
设置寄存器0x4,使能想要使用的中断;
如果使用DMA传输数据,在DMA模块中选择使用的通道,配置好发射数据的地址,长度。并在I2S模块寄存器中0x0中使能DMA,并设置FIFO阈值。当数据高于阈值范围即会自动请求DMA搬运数据。
使能寄存器0x0[0], 模块即会自动发送BCLK和LRCLK,同时从SDI上采集数据存储在FIFO中。当FIFO中数据高于设置的阈值时,模块将向DMA请求搬运数据到内存中,或者发送RXTHIF中断。当CPU关闭RXEN时RXDONE中断产生。CPU可以通过寄存器0x10查询接收FIFO中有多少个数 据,最后一个word中有多少个byte的有效数据。然后根据FIFO状态处理最后剩余的数据。
数据接收完成后关闭 i2s使能。
从端发送音频数据
配置好使用的引脚, SDO, BCLK, LRCLK
设置I2S寄存器0x00,设置为slave mode, 配置传输格式,声道选择,数据位宽,左右声道是否开启过零检测,并设置发射通路txen开启。
设置寄存器0x4,使能想要使用的中断;
如果使用DMA传输数据,在DMA模块中选择使用的通道,配置好发射数据的地址,长度。并在I2S模块寄存器中0x0中使能DMA,并设置FIFO阈值。当FIFO中数据低于阈值范围即会自动请求DMA搬运数据。
向发射FIFO地址-寄存器0x10写入需要发射的数据,使能寄存器0x0[0], 当模块检测到有效的BCLK和LRCLK时,模块即会自动从FIFO中取出数据送到SDO上。
当FIFO中数据小于设置的阈值时,模块将向DMA模块请求数据,或者发送TXTHIF中断。
当FIFO中数据全部取出后,TXDONE 中断将置位,当最后一帧发送完成,TXUDIF中断将置位,通知CPU发送完成,模块停止发送。
全双工模式
配置好使用的引脚,SDI, SDO, BCLK, LRCLK
如果是master模式,需要配置时钟分频。
设置I2S寄存器0x00,配置工作模式(主/从), 配置传输格式,声道选择,数据位宽,左右声道是否开启过零检测,并设置发射通路txen和接收通路rxen开启。
设置寄存器0x4,使能想要使用的中断;
如果使用DMA传输数据,在DMA模块中选择使用的通道,配置好发射数据的地址,长度。并在I2S模块寄存器中0x0中使能DMA,并设置FIFO阈值。当FIFO中数据低于阈值范围即会自动请求DMA搬运数据。
向发射FIFO地址-寄存器0x10写入需要发射的数据
如果是master模式,使能寄存器0x0[0], 模块会开始发送BCLK和LRCLK,从发送FIFO中取出数据开始从SDO端口送出,同时从SDI接收数据存入接收FIFO。
如果是slave模式,当模块检测到有效的BCLK和LRCLK时,模块即会自动从发送FIFO中取出数据送到SDO上,同时从SDI接收数据存入接收FIFO。
当发送FIFO中数据小于设置的阈值时,模块将向DMA模块请求数据,或者发送TXTHIF中断。
当FIFO中数据高于设置的阈值时,模块将向DMA请求搬运数据到内存中,或者发送RXTHIF中断。
当TXFIFO中数据全部取出后,TXDONE 中断将置位,当最后一帧发送完成,TXUDIF中断将置位,通知CPU发送完成,模块停止发送。
当CPU关闭RXEN时RXDONE中断产生。CPU可以通过寄存器0x10查询接收FIFO中有多少个数据,最后一个word中有多少个byte的有效数据。然后根据FIFO状态处理最后剩余的数据。
寄存器描述
寄存器列表
偏移地址 |
名称 |
缩写 |
访问 |
描述 |
复位值 |
0X0000 |
控制寄存器 |
I2S Control |
RW/RO |
控制I2S相关功能,详见下述章节; |
0X0000_4800 |
0X0004 |
中断屏蔽寄存器 |
I2S_IMASK |
RW |
控制开启或关闭I2S中所有的中断 |
0X0000_03FF |
0X0008 |
中断标志寄存器 |
I2S_INT _FLAG |
RW/RO |
中断标志位,可用于查询中断是否产生及清除相关中断 |
0X0000_0000 |
0X000c |
状态寄存器 |
I2S_STATUS |
RO |
用于查询I2S通信过程中FIFO的相关状态 |
0X0000_0000 |
0X0010 |
数据发送寄存器 |
I2S_TX |
WO |
控制器会将它里面的数据发送到总线上 |
0X0000_0000 |
0X0014 |
数据接收寄存器 |
I2S_RX |
RO |
控制器会将总线上的数据接收到它里面 |
0X0000_0000 |
控制寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:29] |
RO |
RSV |
7’h0 |
[28] |
RW |
模式选择 0 = master 模式 1 = slave 模式 |
1’b0 |
[27] |
RW |
双工模式选择 1 = 使能双工模式 0 = 关闭双工模式 |
1’b0 |
[26] |
RW |
超时计数控制位,当此位被置1并且传输进程被主设备强制停止时,将不发生接收完成(RXDONE)中断 |
1’h0 |
[25:24] |
RW |
FORMAT 数据格式选择 2’b00:I2S 数据格式 2’b01:MSB Justified 数据格式 2’b10:PCM A声音数据格式 2’b11:PCM B声音数据格式 |
2’b0 |
[23] |
RW |
RXLCH 声道接收使能控制位 1’b0:使能接收右声道数据 1’b1:使能接收左声道数据 注意:只有选择MONO_STEREO的单声道模式时,此位才有效 |
1’b0 |
[22] |
RW |
MONO_STEREO 单声道立体声选择位 1’b0:数据以立体声格式传输 1’b1:数据以单声道格式传输 |
1’b0 |
[21] |
RW |
RXDMAEN 接收DMA请求使能位 1’b0:不使能发送DMA请求 1’b1:使能发送DMA请求 注意:当使能传输DMA请求并且RXFIFO中的字的个数等于或者大于RXTH时,I2S控制器会向DMA发出传输请求 直至RXFIFO为空才停止DMA传输。 |
1’b0 |
[20] |
RW |
TXDMAEN 发送DMA请求使能位 1’b0:不使能发送DMA请求 1’b1:使能发送DMA请求 注意:当使能传输DMA请求并且TXFIFO中的字的个数小于TXTH时,I2S控制器会向DMA发出传输请求直至TXFIFO 满才停止DMA传输。 |
1’b0 |
[19] |
WO |
RXCLR 清空RXFIFO 1’b0:无效 1’b1:清空RXFIFO 注意:写1清空RXFIFO,由硬件自动清空。读此位永远返回0 |
1’b0 |
[18] |
WO |
TXCLR 清空TXFIFO 1’b0:无效 1’b1:清空TXFIFO 注意:写1清空TXFIFO,由硬件自动清空。读此位永远返回0 |
1’b0 |
[17] |
RW |
LZCEN 左声道零交叉检测使能控制位 1’b0:停止左声道零交叉检测 1’b1:使能左声道零交叉检测 |
1’b0 |
[16] |
RW |
RZCEN 右声道零交叉检测使能控制位 1’b0:停止右声道零交叉检测 1’b1:使能右声道零交叉检测 |
1’b0 |
[15] |
RW |
Rx_clk_phase_sel 接收时钟相位选择 1’b0:默认模式 以上面提及的I2S总线时序展示 1’b1:反转模式 以上面提及的I2S总线时序的反转形式展示 |
1’b0 |
[14:12] |
RW |
RXTH RXFIFO阙值 3’b000:设置阙值为0个字 3’b000:设置阙值为1个字 … 3’b111:设置阙值为7个字 注意:当RXFIFO中现有的字等于或者多于RXTH的值时,RXTHIF位会被置位。此时可以根据设置来选择触发RXDMA或者I2S中断 |
3’h4 |
[11:9] |
RW |
TXTH TXFIFO阙值 3’b000:设置阙值为0个字 3’b000:设置阙值为1个字 … 3’b111:设置阙值为7个字 注意:当TXFIFO中现有的字等于或者少于TXTH的值时,TXTHIF位会被置位。此时可以根据设置来选择触发TXDMA或者I2S中断 |
3’h4 |
[8] |
RW |
Tx_clk_phase_sel 选择发射时钟相位模式 1’b0:默认模式 以上面提及的I2S总线时序展示 1’b1:反转模式 以上面提及的I2S总线时序的反转形式展示 |
1’b0 |
[7:6] |
RW |
RSV |
2’h0 |
[5:4] |
RW |
WDWIDTH 传输字长设置位 2’b00:字长8 bit 2’b01:字长16 bit 2’b10:字长24 bit 2’b11:字长32 bit |
2’b0 |
[3] |
RW |
MUTE 传输哑声使能标志位 1’b0:从移位寄存器传输数据,正常操作模式 1’b1:将传输数据置 0,使声音静音 |
1’b0 |
[2] |
RW |
RXEN 接收使能标志位 1’b0:停止I2S数据接收 1’b1:使能I2S数据接收 |
1’b0 |
[1] |
RW |
TXEN 传输使能标志位 1’b0:停止I2S数据传输 1’b1:使能I2S数据传输 |
1’b0 |
[0] |
RW |
I2SEN I2S使能标志位 1’b0:不使能 1’b1:使能 |
1’b0 |
中断屏蔽寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:10] |
RO |
RSV |
22’h0 |
[9] |
RW |
LZCIMASK 左声道零交叉中断使能标志位 1’b0:中断不使能 1’b1:中断使能 当使能中断,并且检测到左声道上有零交叉时,产生中断 |
1’b1 |
[8] |
RW |
RZCIMASK 右声道零交叉中断使能标志位 1’b0:中断不使能 1’b1:中断使能 当使能中断,并且检测到右声道上有零交叉时,产生中断 |
1’b1 |
[7] |
RW |
TXDONEMASK 发送完成中断使能位 1’b0:中断不使能 1’b1:中断使能 当使能中断,并且TXFIFO为空时,产生中断 |
1’b1 |
[6] |
RW |
TXTHIMASK TXFIFO阙值中断使能位 1’b0:中断不使能 1’b1:中断使能 当使能中断,并且TXFIFO中的数据数等于或者小于TXTH时 ,产生中断 |
1’b1 |
[5] |
RW |
TXOVIMASK TXFIFO溢出中断使能位 1’b0:中断不使能 1’b1:中断使能 注意:当使能中断,TXFIFO满,CPU再向TXFIFO中写数据时,TXOVIF标志位将会被置位 |
1’b1 |
[4] |
RW |
TXUDIMASK TXFIFO下溢中断使能位 1’b0:中断不使能 1’b1:中断使能 注意:当使能TXFIFO下溢中断,并且检测到TXUDIF为1 时,将产生下溢中断 |
1’b1 |
[3] |
RW |
RXDONEMASK 接收完成中断使能标志位 1’b0:中断不使能 1’b1:中断使能 当使能接收完成中断,并且接收过程完成时,将产生接收完成中断 |
1’b1 |
[2] |
RW |
RXTHIMASK RXFIFO阙值中断使能标志位 1’b0:中断不使能 1’b1:中断使能 当使能RXFIFO阙值中断,并且RXFIFO中的数据个数等于或者多于阙值数时,产生生RX中断 |
1’b1 |
[1] |
RW |
RXOVIMASK RXFIFO溢出中断使能位 1’b0:中断不使能 1’b1:中断使能 注意:当使能RXFIFO流出中断,并且检测到TXOVIF为1 时,将产生溢出中断 |
1’b1 |
[0] |
RW |
RXUDIMASK RXFIFO下溢中断使能位 1’b0:中断不使能 1’b1:中断使能 注意:当使能RXFIFO下溢中断,并且检测到TXUDIF为1 时,将产生下溢中断 |
1’b1 |
中断标志寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:13] |
RO |
RSV |
19’h0 |
[12] |
RO |
TXIF I2S 发送中断标志 1’b0:未发生I2S中断 1’b1:I2S有发送中断产生 |
1’b0 |
[11] |
RO |
RXIF I2S 接收中断标志 1’b0:未发生I2S中断 1’b1:I2S有接收中断产生 |
1’b0 |
[10] |
RO |
I2SIF I2S 中断标志位 1’b0:未发生I2S中断 1’b1:I2S有中断产生 注意:只要RX或者TX之一有中断,此位就会置位 |
1’b0 |
[9] |
RW |
LZCIF 左声道零交叉检测标志 此位指示左通道下一个样本数据符号位改变或所有数据位为零。 1’b0:未检测到零交叉 1’b1:检测到零交叉 注意:写1来清除中断标志 |
1’b0 |
[8] |
RW |
RZCIF 右声道零交叉检测标志 此位指示右通道下一个样本数据符号位改变或所有数据位为零。 1’b0:未检测到零交叉 1’b1:检测到零交叉 注意:写1来清除中断标志 |
1’b0 |
[7] |
RW |
TXDONEIF 发送完成中断标志 1’b0:本次发送未完成 1’b1:本次发送完成 注意:写1来清除中断标志 |
1’b0 |
[6] |
RO |
TXTHIF RXFIFO中断标志 1’b0:TXFIFO中的字个数大于阙值 1’b1:TXFIFO中的字个数小于或等于于阙值. 注意:当TXFIFO中字的个数 (TXCNT)等于或者少于TXTH设置的阙值时,这个位会被置 1,直至向TXFIFO中的写入数据并且TXCNT的值大于TXTH的值后,它才会变回0。 |
1’b0 |
[5] |
RW |
TXOVIF TXFIFO溢出中断标志 1’b0:TXFIFO没有发生溢出中断 1’b1:TXFIFO发生了溢出中断 注意:写1来清除中断标志 |
1’b0 |
[4] |
RW |
TXUDIF TXFIFO下溢中断标志 1’b0:TXFIFO没有发生下溢中断 1’b1:TXFIFO发生了下溢中断 注意:写1来清除中断标志 |
1’b0 |
[3] |
RW |
RXDONEIF 接收完成中断标志 1’b0:本次接收未完成 1’b1:本次接收完成 注意:写1来清除中断标志 |
1’b0 |
[2] |
RO |
RXTHIF RXFIFO中断标志 1’b0:RXFIFO中的字个数小于阙值 1’b1:RXFIFO中的字个数等于或大于阙值. 注意:当RXFIFO中字的个数等于或者多于RXTH设置的阙值时,这个位会被置1,直至RXFIFO中的数据被读出并且RXCNT的值小于RXTH的值后,它才会变回0。 |
1’b0 |
[1] |
RW |
RXOVIF RXFIFO溢出中断标志 1’b0:RXFIFO没有发生溢出中断 1’b1:RXFIFO发生了溢出中断 注意:写1来清除溢出中断 |
1’b0 |
[0] |
RW |
RXUDIF RXFIFO下溢中断标志 1’b0:RXFIFO没有发生下溢中断 1’b1:RXFIFO发生了下溢中断 注意:写1来清除下溢中断 |
1’b0 |
状态寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:10] |
RO |
RSV |
22’h0 |
[9:8] |
RO |
VALIDBYTE 最后一个字中可用的字节数。 2’b00:接收完成后,RXFIFO中所有的字节都是可用的 2’b01:接收完成后,RXFIFO中有1个字节是可用的 2’b10:接收完成后,RXFIFO中有2个字节是可用的 2’b11:接收完成后,RXFIFO中有3个字节是可用的 |
2’h0 |
[7:4] |
RO |
TXCNT 记录当前时刻TXFIFO中字的个数。 4’b0000:没有数据 4’b0001:有1个字 … 4’b1000:有8个字 |
4’h0 |
[3:0] |
RO |
RXCNT 记录当前时刻RXFIFO中字的个数。 4’b0000:没有数据 4’b0001:有1个字 … 4’b1000:有8个字 |
4’h0 |
数据发送寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:0] |
WO |
TXFIFO I2S内置了8个字长度的FIFO用于存贮待发送的数据。每次向TXFIFO中写一个字,TXFIFO中的字就增加一个。I2S 控制器会自动将先进入TXFIFO中的字发送出去。 |
32’h0 |
数据接收寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:0] |
RO |
RXFIFO I2S内置了8个字长度的FIFO用于存贮接收到的数据。每次从RXFIFO中读取一个字,RXFIFO中的字就会少一个。 |
32’h0 |
UART模块
功能概述
UART是一种通用串行数据总线,用于异步通信。该总线支持双向通信,可以实现全双工传输和接收。
W800 共6组普通UART口,通过精细的时钟分频组合可以实现各种波特率的设置,最大可支持2Mbps的通信速率。W800 UART能和硬件DMA配合使用,实现数据的高效异步传输。
主要特性
符合APB总线接口协议,全双工异步通信方式
支持中断或轮询工作方式
支持DMA Byte传输模式,发送接收各32-byte FIFO
波特率可编程,最大支持2Mbps
5-8bit 数据长度,以及parity极性可配置
1或2个stop位可配置
支持RTS/CTS流控
支持Break帧发送与接收
支持Overrun,parity error,frame error,rx break frame中断指示
功能描述
UART波特率
异步通信因为两边没有同一时钟源作参考,需要通信双方按照协商好的波特率来发送和接收数据。W800可以通过波特率设置寄存器BAUD_RATE_CTRL寄存器来实现精细的波特率控制。BAUD_RATE_CTRL[15:0]命名为ubdiv,BAUD_RATE_CTRL[19:16]命名为ubdiv_fra c,需要设置的波特率baudrate,计算公式如下:
ubdiv = apbclk / (16 * baudrate) – 1 //取整数
ubdiv_frac = (apbclk % (baudrate * 16)) / baudrate //取整数
以APB时钟40MHz,波特率19200bps为例:
ubdiv = 40000000 / (16 * 19200) – 1 = 129
ubdiv_frac = (40000000 % (19200* 16)) / 19200 = 3
根据以上公式计算APB时钟40MHz,波特率19200bps的情况下,波特率寄存器应该设置为:BAUD_RATE _CTRL = (3<<16) | 129 = 0x0003_0081。
UART数据格式
数据长度
W800的UART支持支持5bit、6bit、7bit、8bit的数据长度可配置。关于数据长度的定义如下:

图 28 UART数据长度
正常的UART通信是由1bit起始位,1bit停止位再加中间的数据位,而中间的数据位是可以配置的,W800支持5bit、6bit、7bit、8bit 4种长度的数据位可配置,可根据实际应用来选择数据位长度。
停止位
W800的UART支持1bit 停止位和2bit 停止位可配置,可根据实际需要配置,如下:

图 29 UART 停止位
奇偶检验位
奇偶校验位的作用是为了校验数据的正确性,W800可以设置奇校验、偶校验和无校验。
奇校验的计算方法:如果当前数据位1的个数是奇数个,奇校验位为0,如果当前数据为1的个数是偶数个,奇校验位为1。总之保证奇数个1。
偶校验的计算方法:如果当前数据位1的个数是奇数个,偶校验位为1,如果当前数据为1的个数是偶数个,偶校验位为0。总之保证偶数个1。

图 30 UART奇偶校验位
UART硬件流控
W800 UART支持RTS/CTS方式的硬件流控。流控的主要目的是为了防止UART fifo里的数据因为软件来不及处理而造成丢失,RTS和CTS是对应使用的,如下图:

图 31 UART硬件流控连接
W800的硬件流控是通过AUTO_FLOW_CTRL寄存器来控制的。当硬件流控AUTO_FLOW_CTRL[0]为1时,W800会根据AUTO_FLOW_CTRL[4:2]设定的rxfifo中的数据个数来进行流控设置,大于设定个数,RTS拉高,其他设备则不再给W800发送数据,小于设定个数RTS拉低 ,其他设备继续给W800发送数据。当AUTO_FLOW_CTRL[0]为0时,软件通过AUTO_FLOW_CTRL[1]来设定RTS的高低。
W800发送数据时,可以通过中断判断当前CTS是否发生变化,并通过FIFO_STATUS[12]查询CTS状态,来决定是否继续给其他设备发送数据。
UART DMA传输
W800的UART支持DMA传输模式,DMA传输时需要配置UART寄存器列表里面的DMA_CTRL寄存器来打开UART的DMA使能。同时需要配置UART_FIFO_CTRL配置txfifo、rxfifo中剩余多少个字节触发DMA搬运。
DMA的源或目的地址设置为TX_DATA_WINDOW 或 RX_DATA_WIDNOW,其他DMA寄存器的设置参考DMA寄存器章节。
注意:UART DMA传输只能设置为Byte模式,不支持half_word和word传输模式。
UART中断
UART 支持中断操作模式,包括fifo空,fifo达到设定触发值,CTS变化,出错等都会产生UART中断,可以通过INT_MASK寄存器来设置需要的中断。
当UART中断产生后,可以通过INT_SRC来查询当前的中断状态,触发中断的原因。软件写1清0。
寄存器描述
寄存器列表
偏移地址 |
名称 |
缩写 |
访问 |
描述 |
复位值 |
0X0000 |
数据流控制寄存器 |
UART_LINE _CTRL |
RW |
uart通信的数据格式设置 |
0X0000_000B |
0X0004 |
自动硬件流控寄存器 |
AUTO_FLOW _CTRL |
RW |
uart rts/cts硬件流控设置 |
0X0000_0014 |
0X0008 |
DMA设置寄存器 |
DMA_CTRL |
RW |
uart dma传输模式设置 |
0X0000_0024 |
0X000C |
FIFO控制寄存器 |
UART_FIFO _CTRL |
RW |
设置 uart fifo触发等级 |
0X0000_0014 |
0X0010 |
波特率控制寄存器 |
BAUD_RATE _CTRL |
RW |
设置uart 通信波特率 |
0X0003_0081 |
0X0014 |
中断屏蔽寄存器 |
INT_MASK |
RW |
设置uart需要使用的中断 |
0X0000_01FF |
0X0018 |
中断状态寄存器 |
INT_SRC |
RW |
uart中断状态指示 |
0X0000_0000 |
0X001C |
FIFO状态寄存器 |
FIFO_STATUS |
RW |
fifo状态,cts状态查询 |
0X0000_1000 |
0X0020 |
TX起始地址寄存器 |
TX_DATA _WINDOW |
WO |
0X0000_0000 |
|
0X0024 |
保留 |
||||
0X0028 |
保留 |
||||
0X002C |
保留 |
||||
0X0030 |
RX起始地址寄存器 |
RX_DATA _WINDOW |
RO |
0X0000_0000 |
|
0X0034 |
保留 |
||||
0X0038 |
保留 |
||||
0X003C |
保留 |
数据流控制寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 8] |
保留 |
||
[7] |
RW |
uart_rx_enable 接收使能,高有效 |
1’b0 |
[6] |
RW |
uart_tx_enable 发送使能,高有效。 |
1’b0 |
[5] |
RW |
send break enable 发送break数据包。Uart 会在该为被置位后发送完一个break数据包,发送完成后自动清 0。 |
1’b0 |
[4] |
RW |
parity极性 1’b0:偶校验 1’b1:奇校验 |
1’b0 |
[3] |
RW |
parity en 奇偶检验使能,高有效 |
1’b1 |
[2] |
RW |
stop bit个数 1’b0:1个停止位 1’b1:2个停止位 |
1’b0 |
[1 : 0] |
RW |
uart比特长度。 2’h0:5bit 2’h1:6bit 2’h2:7bit 2’h3:8bit |
2’h3 |
自动硬件流控寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 5] |
保留 |
||
[4 : 2] |
RW |
RTS trigger level 在afc_enable有效时,决定何时需要将RTS置无效。| 3’h0:rxfifo有4个以上字节 3’h1:rxfifo有8个以上字节 3’h2:rxfifo有12个以上字节 3’h3:rxfifo有16个以上字节 3’h4:rxfifo有20个以上字节 3’h5:rxfifo有24个以上字节 3’h6:rxfifo有28个以上字节 3’h7:rxfifo有31个以上字节 |
3’h5 |
[1] |
RW |
RTS set 当AFC_enable无效时,软件可以通过设置此位来完成接收流量控制。当AFC_enable有效时,此位不关心。 |
1’b0 |
[0] |
RW |
afc enable 1’b1:有效,接收条件rts使用rts_trigger_level控制产生。 |
1’b0 |
DMA设置寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 8] |
保留 |
||
[7 : 3] |
RW |
rxfifo timeout num rxfifo 中存在数据小于 rxfifo _trigger _level 情况下,如果N个包的时间内,没有接收到新的数据时,产生 rxfifo timeout 中断。 该计时功能使能后,无论是第一次计时还是上一次计时完成,都只在接收到至少1个包后才开始计时 |
5’h04 |
[2] |
RW |
rxfifo timeout en rxfifo超时使能 |
1’b1 |
[1] |
RW |
rx dma enable 接收DMA使能,高有效。 0:表示接收过程使用中断。 |
1’b0 |
[0] |
RW |
tx dma enable 发送DMA使能,高有效。 0:表示发送过程使用中断。 |
1’b0 |
FIFO控制寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 6] |
保留 |
||
[5 : 4] |
RW |
rxfifo trigger level 当rxfifo中数据字节数大于等于该值时,触发中断,或者触发 rxdma req。 2’h0:1byte 2’h1:4byte 2’h2:8byte 2’h3:16byte |
2’h1 |
[3 : 2] |
RW |
txfifo trigger level 当txfifo中数据字节数小于等于该值时,触发中断,或者触发 txdma req。 2’h0:empty 2’h1:4byte 2’h2:8byte 2’h3:16byte |
2’h1 |
[1] |
RW |
rxfifo reset 复位rxfifo,将rxfifo状态清空 |
1’b0 |
[0] |
RW |
txfifo reset 复位txfifo,将txfifo状态清空 |
1’b0 |
波特率控制寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:20] |
保留 |
||
[19:16] |
RW |
ubdiv_frac 系统时钟除以16倍波特率时钟商的小数部分指示。具体值为frac×16。 (参考章节2.3.2,波特率计算方法) |
4’h3 |
[15: 0] |
RW |
ubdiv 系统时钟除以16倍波特率时钟商的整数部分减1。 默认系统时钟为40MHz,波特率为19200。 (参考章节2.3.2,波特率计算方法) |
16’h81 |
中断屏蔽寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 9] |
保留 |
||
[8] |
RW |
overrun error int mask,rxfifo溢出中断屏蔽位,高有效。 |
1’b1 |
[7] |
RW |
parity error int mask,奇偶检验中断屏蔽位,高有效。 |
1’b1 |
[6] |
RW |
frame error int mask,数据帧出错中断屏蔽位,高有效。 |
1’b1 |
[5] |
RW |
break detect int mask,break信号检测中断屏蔽位,高有效。 |
1’b1 |
[4] |
RW |
cts changed indicate mask,CTS信号变化中断屏蔽位,高有效。 |
1’b1 |
[3] |
RW |
rxfifo data timeout int mask,rxfifo接收数据超时中断屏蔽位,高有效。 |
1’b1 |
[2] |
RW |
rxfifo trigger level int mask,rxfifo达到触发值中断屏蔽位,高有效。 |
1’b1 |
[1] |
RW |
txfifo trigger level int mask,txfifo达到触发值中断屏蔽位,高有效。 |
1’b1 |
[0] |
RW |
txfifo empty int mask,txfifo为空中断屏蔽位,高有效。 |
1’b1 |
中断状态寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 9] |
保留 |
||
[8] |
RW |
overrun error rxfifo出现溢出。 软件主动写1清0。 |
1’b0 |
[7] |
RW |
parity error 接收到的包校验位错误。 DMA情况下,此中断仍会产生。 但DMA操作不关心此中断。 软件主动写1清0。 |
1’b0 |
[6] |
RW |
frame error 接收到的包停止位错误。 DMA情况下,此中断仍会产生。 但DMA操作不关心此中断。 软件主动写1清0。 |
1’b0 |
[5] |
RW |
break detect 接收到break包。 DMA情况下,此中断仍会产生。 但DMA操作不关心此中断。 软件主动写1清0。 |
1’b0 |
[4] |
RW |
cts changed cts信号变化则产生此中断。 软件主动写1清0。 |
1’b0 |
[3] |
RW |
rxfifo data timeout rxfifo中数据长度小于rx fifo trigger level但N个数据周期没有接收到任何数据,则产生中断。 软件主动写1清0。 |
1’b0 |
[2] |
RW |
rxfifo trigger level interrupt 当rxfifo中数据个数由小于 rxfifo trigger level中指定的数变成大于或等于该数时,产生此中断。 此时应该根据rxfifo count确定当前数据帧大小。 软件主动写1清0。 |
1’b0 |
[1] |
RW |
txfifo trigger level interrupt 当txfifo中数据个数由大于 txfifo trigger level中指定的数变成小于或等于该数时,产生中断。 软件主动写1清0。 |
1’b0 |
[0] |
RW |
tx fifo empty interrupt 当发送完成当前包,并且txfifo为空时,产生此中断。 软件主动写1清0。 |
1’b0 |
FIFO状态寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:13] |
保留 |
||
[12] |
RW |
cts status 当前cts的状态 |
1’b0 |
[11: 6] |
RW |
rxfifo count rxfifo中数据个数 |
6’h0 |
[5 : 0] |
RW |
txfifo count txfifo中数据个数 |
6’h0 |
TX起始地址寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 0] |
WO |
tx data window 发送数据起始地址。 注意:uart发送与接收数据只支持字节操作,当采用burst传输时,有可能使用字节地址递增的方式,设计中最多支持16-burst的操作,即16byte 。因此从发送/接收起始地址后共 16byte(4个字)都保留为发送/接收数据窗口。 |
32’h0 |
RX起始地址寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 0] |
RO |
rx data window 接收数据起始地址。 注意:uart发送与接收数据只支持字节操作,当采用burst传输时,有可能使用字节地址递增的方式,设计中最多支持16-burst的操作,即16byte 。因此从发送/接收起始地址后共 16byte(4个字)都保留为发送/接收数据窗口。 |
32’h0 |
UART&7816模块
功能概述
UART&7816模块兼容UART功能,同时兼容7816接口功能。
W800 支持1组UART&7816复用接口(uart2),作为UART使用时,可以通过精细的时钟分频组合可以实现各种波特率的设置,最大可支持2Mbps的通信速率。
W800 UART&7816接口能和硬件DMA配合使用,实现数据的高效传输。
主要特性
符合APB总线接口协议,支持UART异步全双工和7816异步半双工通信方式;
支持中断或轮询工作方式;
支持DMA Byte传输模式,发送接收各32-byte FIFO;
串口功能:
波特率可编程,最大支持2Mbps
5-8bit 数据长度,以及parity极性可配置
1或2个停止位可配置
支持RTS/CTS流控
支持Break帧发送与接收
支持Overrun,parity error,frame error,rx break frame中断指示
7816接口功能:
兼容 ISO-7816-3 T=0.T=1 模式
兼容EVM2000协议
可配置guard time(11 ETU-267 ETU)
正向/反向约定,可软件配置
支持发送/接收奇偶校验及重传功能
支持0.5和1.5个stop位可配置
UART功能描述
参考16章UART功能模块描述
7816功能描述
7816简介
ISO7816是国际标准的智能卡协议,协议规定了智能卡物理特性、尺寸和接口、电信号和传输协议、命令、安全等多方面信息。
W800主要实现了ISO 7816 -3 电信号和传输协议这部分,支持T0和T1卡。通过W800的7816接口,用户可以无法关心时钟和数据的信号通信逻辑,可以直接与智能卡进行数据和命令的交互。关于智能卡的数据和命令交互方式,用户需要自己参考ISO7816-4协议去实现。
7816接口
W800主要集成了智能卡的时钟和数据两个接口,来实现数据和命令的通信电信号逻辑。实际智能卡应用中,还有RST、VCC、GND这三个信号,RST可以通过普通GPIO来控制,主要是智能卡上电复位时使用。VCC可以直接连接3.3V电源,或者通过GPIO配合其他电路来控制智能卡VCC的通断。

图 32 7816 连接示意图
7816配置
作为7816接口使用时需要进行相关配置:
设置接口工作模式,UART_LIN_CTRL[24]设置为1,选择当前接口为7816模式;
设置7816 MSB或LSB传输模式,UART_LIN_CTRL[3]设置为1,通过UART_LIN_CTRL[3]来选择7816接口是MSB模式(bit7先传输),还是LSB模式(bit0先传输);
设置停止位,UART_LIN_CTRL[2]可选择智能卡0.5或者1.5个停止位;
选择卡片类型,UART_LIN_CTRL[8]可以选择T0卡或者T1卡;
配置智能卡通信超时时间,通过WAIT_TIME来设置超时时间,接收数据时超时未收到数据则产生超时中断。
7816时钟配置
智能卡时钟是指通过CLK引脚提供给智能卡的时钟,通过BAUD_RATE_CTRL[21:16]来设置,计算方法如下:
fsc_clk:需要给智能卡提供的CLK;
fclk_apb:系统APB总线时钟;
clk_div:需要设置给BAUD_RATE_CTRL[21:16]的时钟分频因子
因为clk_div只能取整数,为了减少误差,我们最好采取四舍五入的计算方法,C语言计算取整会丢掉小数部分,C语言采取四舍五入的转换方法如下:
clk_div = (fclk_apb + fsc_clk)/(2 * fsc_clk) - 1;
7816速率设置
智能卡中有一个时间单位ETU,智能卡按此时间单位来传输数据和命令。ETU的设置是通过BAUD_RATE_CTRL[15: 0]来设置的,计算方法如下:
f:即我们智能卡的CLK;
F和D均是有智能卡给出的参数。
其实我们需要设置的BAUD_RATE_CTRL[15: 0]的 ubdiv 就是F/D,上面的公式只是为了计算ETU供大家参考。我们实际设置的时候,只需要设置ubdiv = F/D即可。F和D可由下表进行查询。

表 148 7816速率设置 (参考协议文件ISO_IEC_FDIS_7816-3_(E).PDF)
7816上电复位

图 33 7816 上电复位时序
上图为智能卡上电复位的时序图。CLK和IO初始状态为低,需要我们配置成GPIO模式并拉低。VCC拉高后CLK和IO配置成7816模式后由7816控制即可。最后我们需要把RST引脚手动拉高,完成复位过程。配置步骤如下:
I/O、CLK、RST配置为普通GPIO模式并保持低电平;
设置7816为T=0模式;
通过GPIO控制VCC上电;
配置I/O、CLK为7816模式,由7816驱动时钟和数据;
配置7816时钟频率并允许时钟输出;
置位RST管脚,等待接收ATR数据,若40000个时钟内没有收到ATR数据,则执行失活流程,卡片失活。
7816热复位

图 34 7816热复位
如上图所示,热复位的过程很简单,正常工作模式,将RST引脚拉低400个周期即可。配置步骤如下:
保持VCC上电状态;
拉低RST引脚至少400个时钟周期;
拉高RST引脚,等待接收ATR数据,若40000个时钟内没有收到ATR数据,则执行失活流程,卡片失活。
7816 失活过程

图 35 7816 失活过程
如上图所示,RST拉低之后需要将CLK和IO配置成普通IO模式并拉低,最后关闭VCC电源,操作步骤如下:
保持VCC上电状态;
拉低RST引脚;
配置CLK和IO为GPIO模式,并拉低;
通过GPIO控制VCC掉电;
7816数据传输
7816的数据传输的时序已经有W800硬件完成,无需用户操作,用户如果想要了解此部分具体内容,请参考ISO7816-3协议中的规定。

图 36 7816数据传输
UART&7816 DMA传输
W800的UART&7816支持DMA传输模式,DMA传输时需要配置UART&7816寄存器列表里面的DMA_CTRL寄存器来打开UART的DMA使能。同时需要配置UART_FIFO_CTRL配置txfifo、rxfifo中剩余多少个字节触发DMA搬运。
DMA的源或目的地址设置为TX_DATA_WINDOW 或 RX_DATA_WIDNOW,其他DMA寄存器的设置参考DMA寄存器章节。
注意:UART&7816 DMA传输只能设置为Byte模式,不支持half_word和word传输模式。
UART&7816中断
UART&7816 支持中断操作模式,包括fifo空,fifo达到设定触发值,CTS变化,出错等都会产生UART&7816中断,可以通过INT_MASK寄存器来设置需要的中断。
当UART&7816中断产生后,可以通过INT_SRC来查询当前的中断状态,触发中断的原因。软件写1清0。
寄存器描述
寄存器列表
偏移地址 |
名称 |
缩写 |
访问 |
描述 |
复位值 |
0X0000 |
数据流控制寄存器 |
UART_LINE _CTRL |
RW |
uart&7816通信的数据相关设置 |
0X0033_520B |
0X0004 |
自动硬件流控寄存器 |
AUTO_FLOW _CTRL |
RW |
uart rts/cts 硬件流控设置 |
0X0000_0014 |
0X0008 |
DMA设置寄存器 |
DMA_CTRL |
RW |
uart&7816 dma传输模式设置 |
0X0000_0024 |
0X000C |
FIFO控制寄存器 |
UART_FIFO _CTRL |
RW |
设置 uart&7816 fifo触发等级 |
0X0000_0014 |
0X0010 |
波特率控制寄存器 |
BAUD_RATE _CTRL |
RW |
设置uart波特率、7816时钟 |
0X0003_0082 |
0X0014 |
中断屏蔽寄存器 |
INT_MASK |
RW |
设置 uart&7816 需要使用的中断 |
0X0000_03FF |
0X0018 |
中断状态寄存器 |
INT_SRC |
RW |
uart&7816中断状态指示 |
0X0000_0000 |
0X001C |
FIFO状态寄存器 |
FIFO_STATUS |
RW |
fifo状态,cts状态查询 |
0X0000_0000 |
0X0020 |
TX起始地址寄存器 |
TX_DATA _WINDOW |
WO |
0X0000_0000 |
|
0X0024 |
保留 |
||||
0X0028 |
保留 |
||||
0X002C |
保留 |
||||
0X0030 |
RX起始地址寄存器 |
RX_DATA _WINDOW |
RO |
0X0000_0000 |
|
0X0034 |
保留 |
||||
0X0038 |
保留 |
||||
0X003C |
保留 |
||||
0X0040 |
7816保护时间寄存器 |
GUARD_TIME |
RW |
7816数据间保护时间 |
0X0000_0000 |
0X0044 |
7816超时时间寄存器 |
WAIT_TIME |
RW |
7816接收数据超时时间 |
0X0007_8000 |
数据流控制寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:25] |
保留 |
||
[24] |
RW |
sc_mode 1’b0:uart模式 1’b1:7816模式 |
1’b0 |
[23] |
RW |
7816卡T0模式rx_retrans_en 1’b0:Rx自动重传无效 1’b1:Rx自动重传使能 |
1’b0 |
[22:20] |
RW |
7816卡T0模式rx_retrans_cnt |
3’h3 |
[19] |
RW |
7816卡T0模式tx_retrans_en 1’b0:Tx自动重传无效 1’b1:Tx自动重传使能 |
1’b0 |
[18:16] |
RW |
7816卡T0 模式tx_retrans_cnt tx自动重传次数 |
3’h3 |
[15:11] |
RW |
7816卡的最小MIN_BGT (Min Block Guard Time ) Min Block Guard Time计算:10+stop位(默认2位)+ 配置值MIN_BGT Note: T=0:在发送和接收的两个相反方向连续字符的起始位下降沿之间的最小时间间隔不能小于16个ETU。必须能够正确解释接收到的 其起始位下降沿和最后发送的字节起始位下降沿间隔为15个ETU的字符。 T=1:在发送和接收的两个相反方向连续字符的起始位下降沿之间的最小时间间隔(块保护时间,B GT)必须为22个ETU。必须能够正确解释接收到的其起始位下降沿和最后发送的字节起始位下降沿间隔为21个ETU以内接收到的字符。 |
5’ha |
[10] |
RW |
7816卡时钟控制配置 1’b0:在配置为卡模式时产生卡时钟输出,否则卡时钟输出无效 1’b1:时钟停止 |
1’b0 |
[9] |
RW |
7816卡的parity错误时是否接收数据 1’b0:不接收 1’b1:接收 |
1’b1 |
[8] |
RW |
7816卡的T0/T1模式配置 , 1’b0:T0模式 1’b1:T1模式 |
1’b0 |
[7] |
RW |
uart_rx_enable uart/7816模式下,接收使能,高有效 |
1’b0 |
[6] |
RW |
uart_tx_enable uart/7816模式下,发送使能,高有效。 |
1’b0 |
[5] |
RW |
send break enable 发送break数据包。Uart会在该为被置位后发送完一个break数据包,发送完成后自动清 0。 |
1’b0 |
[4] |
RW |
parity极性 (UART 模式) 1’b0:偶校验 1’b1:奇校验 正反向(7816 模式) 1’b0:LSB(b0 bit)先传输 1’b1:MSB(b7 bit)先传输 |
1’b0 |
[3] |
RW |
parity使能,高有效(UART模式) |
1’b1 |
[2] |
RW |
stop bit个数(UART模式) 1’b0:1个停止位 1’b1:2个停止位 stop bit个数(7816模式) 1’b0:0.5个停止位 1’b1:1.5个停止位 |
1’b0 |
[1 : 0] |
RW |
uart比特长度(UART模式 ) 2’h0:5bit 2’h1:6bit 2’h2:7bit 2’h3:8bit |
2’h3 |
自动硬件流控寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 5] |
保留 |
||
[4 : 2] |
RW |
RTS trigger level(UART模式) 在afc_enable有效时,决定何时需要将RTS置无效。 3’h0:rxfifo有4个以上字节 3’h1:rxfifo有8个以上字节 3’h2:rxfifo有12个以上字节 3’h3:rxfifo有16个以上字节 3’h4:rxfifo有20个以上字节 3’h5:rxfifo有24个以上字节 3’h6:rxfifo有28个以上字节 3’h7:rxfifo有31个以上字节 |
3’h5 |
[1] |
RW |
RTS set(UART模式) 当AFC_enable无效时,软件可以通过设置此位来完成接收流量控制。当AFC_enable有效时,此位不关心。 |
1’b0 |
[0] |
RW |
afc enable(UART模式) 接收条件rts使用rts_trigger_level控制产生 ,高有效。 |
1’b0 |
DMA设置寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 8] |
保留 |
||
[7 : 3] |
RW |
rxfifo timeout num(UART模式) rxfifo中存在数据小于 rxfifo _trigger _level情况下,如果N个包的时间内,没有接收到新的数据时,产生 rxfifo timeout 中断。 该计时功能使能后,无论是第一次计时还是上一次计时完成,都只在接收到至少1个包后才开始计时 |
5’h4 |
[2] |
RW |
rxfifo timeout en(UART&7816模式) rxfifo超时使能,高有效 |
1’b1 |
[1] |
RW |
rx dma enable(UART&7816模式) 接收DMA使能,高有效。 0表示接收过程使用中断。 |
1’b0 |
[0] |
RW |
tx dma enable(UART&7816模式) 发送DMA使能,高有效。 0表示发送过程使用中断。 |
1’b0 |
FIFO控制寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 6] |
保留 |
||
[5 : 4] |
RW |
rxfifo trigger level(UART&7816 模式) 当rxfifo中数据字节数大于等于该值时,触发中断,或者触发 rxdma req。 2’h0:1byte 2’h1:4byte 2’h2:8byte 2’h3:16byte |
2’h1 |
[3 : 2] |
RW |
txfifo trigger level(UART&7816 模式) 当txfifo中数据字节数小于等于该值时,触发中断,或者触发 txdma req。 2’h0:empty 2’h1:4byte 2’h2:8byte 2’h3:16byte |
2’h1 |
[1] |
RW |
rxfifo reset(UART&7816 模式) 复位rxfifo,将rxfifo状态清空 |
1’b0 |
[0] |
RW |
txfifo reset(UART&7816 模式) 复位txfifo,将txfifo状态清空 |
1’b0 |
波特率控制寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:20] |
保留 |
||
[19:16] |
RW |
ubdiv_frac UART模式: 系统时钟除以16倍波特率时钟商的小数部分指示。具体值为frac×16。 (参考章节波特率计算方法) 7816模式: ubdiv_frac = (fclk_apb + fsc_clk)/(2 * fsc_clk) - 1; (参考7816时钟计算方法) |
4’h3 |
[15: 0] |
RW |
ubdiv UART模式: 系统时钟除以16倍波特率时钟商的整数部分减1。 默认系统时钟为40MHz,波特率为19200。 (参考波特率计算方法) 7816模式: ubdiv=Fi/Di (Fi、Di为智能卡反馈的参数 ,edu频率:f_etuclk = fsc_clk/(ubdiv+ 1)) (参考章节7816速率计算方法 ) |
16’h82 |
中断屏蔽寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:10] |
保留 |
||
[9] |
RW |
7816卡发送时收到error signal错误信号。(7816模式) |
1’b1 |
[8] |
RW |
overrun error int mask,rxfifo溢出中断屏蔽位,高有效。(UART&7816模式 ) |
1’b1 |
[7] |
RW |
parity error int mask,奇偶检验中断屏蔽位, 高有效。(UART&7816模式) |
1’b1 |
[6] |
RW |
frame error int mask,数据帧出错中断屏蔽位 ,高有效。(UART模式) |
1’b1 |
[5] |
RW |
break detect int mask,break信号检测中断屏蔽位,高有效。(UART模式) |
1’b1 |
[4] |
RW |
cts changed indicate mask,CTS信号变化中断屏蔽位,高有效。(UART模式) |
1’b1 |
[3] |
RW |
rxfifo data timeout int mask,rxfifo接收数据超时中断屏蔽位,高有效。(UART&7816模式) |
1’b1 |
[2] |
RW |
rxfifo trigger level int mask,rxfifo达到触发值中断屏蔽位,高有效。(UART&7816模式) |
1’b1 |
[1] |
RW |
txfifo trigger level int mask,txfifo达到触发值中断屏蔽位,高有效。(UART&7816模式) |
1’b1 |
[0] |
RW |
txfifo empty int mask,txfifo为空中断屏蔽位,高有效。(UART&7 816模式) |
1’b1 |
中断状态寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 9] |
保留 |
||
[9] |
RW |
7816卡发送时收到error signal错误信号。(7816模式) |
|
[8] |
RW |
overrun error(UART&7816模式) rxfifo出现溢出。 软件主动写1清0。 |
1’b0 |
[7] |
RW |
parity error(UART&7816模式) 接收到的包校验位错误。 DMA情况下,此中断仍会产生。但DMA操作不关心此中断。 软件主动写1清0。 |
1’b0 |
[6] |
RW |
frame error(UART模式) 接收到的包停止位错误。 DMA情况下,此中断仍会产生。但DMA操作不关心此中断。 软件主动写1清0。 |
1’b0 |
[5] |
RW |
break detect(UART模式) 接收到break包。 DMA情况下,此中断仍会产生。但DMA操作不关心此中断。 软件主动写1清0。 |
1’b0 |
[4] |
RW |
cts changed(UART模式) cts信号变化则产生此中断。 软件主动写1清0。 |
1’b0 |
[3] |
RW |
rxfifo data timeout(UART&7816模式) rxfifo中数据长度小于rxfifo trigger level但N个数据周期没有接收到任何数据,则产生中断。 软件主动写1清0。 |
1’b0 |
[2] |
RW |
rxfifo trigger level interrupt(UART&7816模式) 当rxfifo中数据个数由小于 rxfifo trigger level中指定的数变成大于或等于该数时,产生此中断。 此时应该根据rxfifo count确定当前数据帧大小。 软件主动写1清0。 |
1’b0 |
[1] |
RW |
txfifo trigger level interrupt(UART&7816模式) 当txfifo中数据个数由大于 txfifo trigger level中指定的数变成小于或等于该数时,产生中断。 软件主动写1清0。 |
1’b0 |
[0] |
RW |
txfifo empty interrupt(UART& 7816模式) 当发送完成当前包,并且txfifo为空时,产生此中断。 软件主动写1清0。 |
1’b0 |
FIFO状态寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:13] |
保留 |
||
[12] |
RW |
cts status(UART模式) 当前cts的状态 |
1’b0 |
[11: 6] |
RW |
rxfifo count(UART&7816模式) rxfifo中数据个数 |
6’h0 |
[5 : 0] |
RW |
txfifo count(UART&7816模式) txfifo中数据个数 |
6’h0 |
TX起始地址寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 0] |
WO |
tx data window(UART&7816模式) 发送数据起始地址。 注意:uart发送与接收数据只支持字节操作,当采用burst传输时,有可能使用字节地址递增的方式,设计中最多支持16-burst的操作,即16byte。因此从发送/接收起始地址后共16byte(4个字)都保留为发送/接收数据窗口。 |
32’h0 |
RX起始地址寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 0] |
RO |
rx data window(UART&7816模式) 接收数据起始地址。 注意:uart发送与接收数据只支持字节操作,当采用burst传输时,有可能使用字节地址递增的方式,设计中最多支持16-burst的操作,即16byte 。因此从发送/接收起始地址后共 16byte(4个字)都保留为发送/接收数据窗口。 |
32’h0 |
7816保护时间寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 8] |
保留 |
||
[7 : 0] |
RW |
ex_gt_num 7816模式下,guard time计算:10+stop位+配置值ex_gt_num |
8’h0 |
7816超时时间寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:24] |
保留 |
||
[23: 0] |
RW |
wait time计数器(以ETU为单位 ) 7816模式下: CWT和BWT时间,配置为最大默认值。 (在T1模式下:BWT =(11 etu+ 2BWI*960*Fd/fsc )) |
24’h78000 |
Timer模块
功能概述
定时器包含一个32-bit自动加载的计数器,该计数器由系统时钟经过分频后驱动。W800有6路完全独立定时器。实现了精确的定时时间以及中断功能,可用于延时或者周期性事件处理。
主要特性
6路完全独立的定时器
32-bit自动加载计数器
定时单位可配置为ms、us
可实现单次定时或者重复定时功能
定时中断功能
可随时查询计时器计数值;
功能描述
定时器模块由6路完全独立的定时器组成,互不影响,6路可以同时工作。
系统时钟经过分频系数分频后得到us标准时钟,用于计数器的输入时钟。定时单位可配置为us、ms两种级别。
定时值是一个32-bit可配置的寄存器,可满足不同定时时长的需求。每一个定时器对应一个中断,当
定时时间满足后,如果使能了中断功能,则会产生一个中断请求,可以用于处理周期性事件。
定时功能
定时功能是指依据用户设定时间,当时间到产生硬件中断,通知用户实现特定的功能。定时触发支持单次和周期两种,一种可用于处理单次事件,一种可用于处理周期性事件。
用户依据系统时钟的分频系数获得APB总线时钟频率,设定定时器的基准微秒计数配置寄存器(TMR_CONFIG),设置定时值,配置定时单位,工作模式,使能中断,然后,启动定时功能。当定时时间到,程序进入定时器中断处理函数,清除中断。
延时功能
延时功能是指用户可以依据定时器的倒计时功能,让程序处于等待状态,直至计时完成,程序才继续运行。
寄存器描述
寄存器列表
偏移地址 |
名称 |
缩写 |
访问 |
描述 |
复位值 |
0X0000 |
标准us配置寄存器 |
TMR_CONFIG |
RW |
标准us定时分频值,由总线时钟分频得到标准us定时,该值等于APB总线频率(MHz)减一 |
0X0000_0027 |
0X0004 |
定时器控制寄存器 |
TMR_CSR |
RW |
定时器控制寄存器 |
0X0631_8C63 |
0X0008 |
定时器1定时值配置寄存器 |
TMR1_PRD |
RW |
Timer1定时值配置寄存器 |
0X0000_0000 |
0X000C |
定时器2定时值配置寄存器 |
TMR2_PRD |
RW |
Timer2定时值配置寄存器 |
0X0000_0000 |
0X0010 |
定时器3定时值配置寄存器 |
TMR3_PRD |
RW |
Timer3定时值配置寄存器 |
0X0000_0000 |
0X0014 |
定时器4定时值配置寄存器 |
TMR4_PRD |
RW |
Timer4定时值配置寄存器 |
0X0000_0000 |
0X0018 |
定时器5定时值配置寄存器 |
TMR5_PRD |
RW |
Timer5定时值配置寄存器 |
0X0000_0000 |
0X001C |
定时器6定时值配置寄存器 |
TMR6_PRD |
RW |
Timer6定时值配置寄存器 |
0X0000_0000 |
0X0020 |
定时器1当前计数值 |
TMR1_CNT |
RO |
Timer1当前计数值 |
0X0000_0000 |
0X0024 |
定时器2当前计数值 |
TMR1_CNT |
RO |
Timer2当前计数值 |
0X0000_0000 |
0X0028 |
定时器3当前计数值 |
TMR1_CNT |
RO |
Timer3当前计数值 |
0X0000_0000 |
0X002C |
定时器4当前计数值 |
TMR1_CNT |
RO |
Timer4当前计数值 |
0X0000_0000 |
0X0030 |
定时器5当前计数值 |
TMR1_CNT |
RO |
Timer5当前计数值 |
0X0000_0000 |
0X0034 |
定时器6当前计数值 |
TMR1_CNT |
RO |
Timer6当前计数值 |
0X0000_0000 |
标准us配置寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 7] |
保留 |
||
[6 : 0] |
RW |
时钟分频配置prescale。 例如: apb_clk=40MHz prescale = 40 – 1 = 8’d39 |
7’h27 |
定时器控制寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:30] |
RW |
保留 |
2’h0 |
[29:25] |
RW |
TMR6_CSR,同TMR1_CSR |
5’h3 |
[24:20] |
RW |
TMR5_CSR,同TMR1_CSR |
5’h3 |
[19:15] |
RW |
TMR4_CSR,同TMR1_CSR |
5’h3 |
[14:10] |
RW |
TMR3_CSR,同TMR1_CSR |
5’h3 |
[9 : 5] |
RW |
TMR2_CSR,同TMR1_CSR |
5’h3 |
[4 : 0] |
RW |
[4 : 0]为TMR1_CSR,具体如下: |
|
[4]:中断状态寄存器,写1清除 1’b0:Timer无中断产生; 1’b1:Timer产生中断; |
1’b0 |
||
[3]:中断使能寄存器 1’b0:定时时间完成后不产生中断; 1’b1:定时时间完成后产生中断; |
1’b0 |
||
[2]:定时器使能寄存器 1’b0:定时器不工作; 1’b1:使能定时器 |
1’b0 |
||
[1]:定时器工作模式 1’b0:定时器重复定时; 1’b1:定时器只定时一次,定时完成后自动关闭; |
1’b1 |
||
[0]:定时器定时单位 1’b0:定时单位为us; 1’b1:定时单位为ms; |
1’b1 |
定时器1定时值配置寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 0] |
RW |
配置定时器1的定时值 |
32’b0 |
定时器2定时值配置寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 0] |
RW |
配置定时器2的定时值 |
32’b0 |
定时器3定时值配置寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 0] |
RW |
配置定时器3的定时值 |
32’b0 |
定时器4定时值配置寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 0] |
RW |
配置定时器4的定时值 |
32’b0 |
定时器5定时值配置寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 0] |
RW |
配置定时器5的定时值 |
32’b0 |
定时器6定时值配置寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 0] |
RW |
配置定时器6的定时值 |
32’b0 |
定时器1当前计数值寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 0] |
RO |
读取定时器1当前计数值; |
32’b0 |
定时器2当前计数值寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 0] |
RO |
读取定时器2当前计数值; |
32’b0 |
定时器3当前计数值寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 0] |
RO |
读取定时器3当前计数值; |
32’b0 |
定时器4当前计数值寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 0] |
RO |
读取定时器4当前计数值; |
32’b0 |
定时器5当前计数值寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 0] |
RO |
读取定时器5当前计数值; |
32’b0 |
定时器6当前计数值寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 0] |
RO |
读取定时器6当前计数值; |
32’b0 |
电源管理模块
功能概述
PMU实现芯片硬件工作状态的切换,以及状态切换过程中的电源管理,同时提供定时器、实时时钟以及32K时钟。
主要特性
提供芯片电源控制
提供定时器功能
提供实时时钟控制
提供32K RC振荡器校准功能
提供唤醒功能;
功能描述
全芯片电源控制
PMU模块控制芯片的电源开关,包括40M起振电路,BandGap,数字PLL,电压检测电路,数字电路LDO。
在芯片上电时,PMU模块根据预设上电顺序引导各模块依次打开电源;
当软件配置寄存器进入休眠模式时,根据安全的下电顺序引导各功能模块依次关闭电源;
当软件配置寄存器进入睡眠模式时,根据顺序关闭时钟,晶体起振电路和相关电源;
在休眠/睡眠模式下提供三种唤醒模式:Timer定时唤醒,RTC定时唤醒或者通过将特殊WAKEUP管脚拉高唤醒。
低功耗模式
通过配置PMU寄存器芯片可以选择2种低功耗模式;
Standby 模式:
此模式下数字电源域的电源将被关断,全芯片只有PMU模块工作,提供唤醒与复位功能;此时全芯片功耗约15uA左右。电源关断后内存中存储数据与内容将全部丢失,唤醒后将重新载入固件,相当于重新启动;
Sleep模式:
此模式下数字电源域的电源将保留,只是关断DPLL与晶体起振电路,切断时钟,此时全芯片功耗约在1mA左右;内存中存储数据与代码仍会保留;唤醒后程序将继续运行;
唤醒模式
PMU支持3种唤醒模式,Timer唤醒,RTC唤醒和外部IO唤醒。
Timer唤醒
在软件设置休眠/睡眠模式之前,配置PMU中Timer0模块,设置好休眠时间。当系统进入休眠模式后,当Timer0 计时到达休眠时间后将会唤醒系统,并产生相应Timer中断。系统恢复运行后需要对中断状态寄存器中相应状态位写’1’清除中断状态,否则,下次进入休眠模式后将立即被中断唤醒;
RTC唤醒
在软件设置休眠/睡眠模式之前,配置PMU中RTC模块,设置好休眠时间。当系统进入休眠模式后,当RTC记时到达休眠时间后将会唤醒系统,并给出相应RTC中断。系统恢复运行后请对中断寄存器0x14中相应状态位写’1’清除中断状态,否则,下次进入休眠模式后将立即被中断唤醒;
外部IO唤醒
在软件休眠/睡眠后,PMU会检测特定Wakeup脚,外部控制器可通过将此IO拉高来唤醒系统,并给出相应IO唤醒中断。PMU在离开休眠模式后不再检测该IO状态。系统恢复运行后请对中断寄存器0x14中相应状态位写’1’清除中断状态,否则,下次进入休眠模式后将立即被中断唤醒;
Timer0定时器
通过AHB寄存器配置定时器使能信号和定时时间。首先设置定时值,然后设置定时器使能BIT启动定时器,当达到定时时间后,产生中断,软件通过写清状态寄存器的BIT0来清除中断标志。
实时时钟功能
参考实时时钟模块
32K时钟源切换与校准
W800芯片集成32K RC振荡器作为PMU 模块时钟来源。
因工作环境与温度变化,32K RC振荡器的输出频率可能会产生变化,造成计时偏差。因此,在PMU模块中引入32K RC振荡器校准功能,以及32K时钟的切换功能,以便矫正计时偏差。
32K时钟源的切换
32K时钟的切换可以通过设置PS_CR寄存器的bit3为1,从32K RC振荡器切换到由40M时钟分频得到的32K时钟。但是,当芯片进入休眠模式时,因为40M时钟将被关闭,bit3会自动清0。待唤醒以后若固件仍要使用精准计时功能,需重新设置bit3为1。
32K RC振荡电路的校准
首先设置PS_CR寄存器的bit2为0,然后再把PS_CR寄存器的bit2设置为1。
校准完成后,32K RC振荡器会相对准确。但是如果希望比较精准的计时,还是建议使用40M时钟分频得到的32K时钟,此时将得到精确的RTC时钟,偏差将只与晶体频偏相关。
寄存器描述
寄存器列表
偏移地址 |
名称 |
缩写 |
访问 |
描述 |
复位值 |
0X0000 |
PMU控制寄存器 |
PS_CR |
RW |
用于配置32K校准,配置32K时 钟源,设置芯片的 STANDBY功能 |
0X0000_0002 |
0X0004 |
PMU定时器0 |
TIMER0 |
RW |
配置定时值(单位为秒),使能定时器 |
0X0000_0000 |
0X0008 |
保留 |
||||
0X0014 |
PMU中断源寄存器 |
INT_SRC |
RW |
提供PMU中断标志 |
0X0000_0000 |
PMU控制寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 11] |
RO |
24’b0 |
|
[10] |
RW |
唤醒按键中断极性选择 0: 唤醒按键为高电平时置位中断; 1: 唤醒按键为高电平时置位中断; 只在 Sleep 中断有效。 |
1’b0 |
[9:6] |
RW |
按键唤醒最低保持时长数 单位:128ms。 |
4’d01 |
[5] |
RW |
DLDO_CORE 参考电压源选择 1: ABG 0: DBG |
1’b1 |
[4] |
RW |
32K 振荡电路 BYPASS 信号 高有效,置位为1后 32K 为 40M 时钟分频得到。 |
1’b0 |
[3] |
RW |
RC 32K振荡器校准电路启动开关 1’b0:校准电路复位; 1’b1:启动校准电路; 要启动校准功能,需要此位先置0 ,后置1。 |
1’b0 |
[2] |
RW |
使能按键触发进入睡眠功能 0:不使能; 1:在active模式时按下i o_wakeup 按键达到到阈值时间,将触发 io _sleep_flag 中断 ,上报给MCU。 |
1’b0 |
[1] |
RW |
Sleep使能信号,高有效。 1’b0:芯片唤醒状态 1’b1:芯片进入 Sleep 状态 如果 WAKEUP 脚为无效电平, 且没有配置 TIMER0/1 中断 唤醒,则该寄存器有效时,芯 片进入 Sleep 状态; 如果唤醒中断产生,则芯片会从 Sleep 状态切换到唤醒状态,唤 醒条件满足,该位自动 清0。 唤醒源:WAKEUP 脚,TIMER0/TIMER1,RTC
|
1’b1 |
[0] |
RW |
STANDBY 使能信号,高有效 1’b0:芯片唤醒状态; 1’b1:芯片进入 STANDBY 状态; 如果 WAKEUP 脚为无效电平, 且没有配置 TIMER0/1 中断 唤醒,则该寄存器有效时,芯片 进入 STANDBY 状态; 如果唤醒中断产生,芯片会从 STANDBY 状态切换到唤醒状态,唤醒条件满足,该位自动清0。 唤醒源:WAKEUP脚,TIMER0/TIMER1,RTC
|
1’B0 |
PMU定时器0
位 |
访问 |
操作说明 |
复位值 |
[31:17] |
RO |
保留 |
15’b0 |
[16] |
RW |
Timer0使能位 1’b0:位使能; 1’b1:使能。 |
1’b0 |
[15: 0] |
RW |
Timer0的定时值,单位:秒 |
16’b0 |
PMU中断源寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 9] |
RW |
保留 |
|
[8] |
RW |
显示当次上电状态 1’b0:上电或复位启动; 1’b1:从休眠状态唤醒,写1清除。 |
1’b0 |
[7] |
RO |
保留 |
1’b0 |
[6] |
RO |
保留 |
1’b0 |
[5] |
RW |
RTC定时中断标志位: 1’b0:有定时中断产生 1’b1:无定时中断产生,写1清除。 |
1’b0 |
[4] |
RW |
保留 |
1’b0 |
[3] |
RW |
保留 |
1’b0 |
[2] |
RW |
WAKEUP管脚唤醒中断标志位 1’b0:无WAKEUP唤醒中断产生; 1’b1:有WAEKUP唤醒中断产生,写1清除。 |
1’b0 |
[1] |
RW |
保留 |
1’b0 |
[0] |
RW |
Timer0定时中断标志位 1’b0:无Timer0中断产生; 1’b1:有Timer0中断产生,写1清除。 |
1’b0 |
实时时钟模块
功能概述
RTC是由PMU模块提供的BCD计数器/定时器,两个32位寄存器包含秒、分、时、日、月、年,以二进制编码的十进制格式表示(BCD),能自动对28、29(闰年)、30、31天的月份进行修正。
在相应软件配置下,RTC既可以提供时钟日历功能,又可以当作定时器使用,在定时器达到设置的时间后会产生一个RTC中断,可用来唤醒处于睡眠状态的系统。
RTC模块有两个时钟源可以配置:40M时钟分频和内部32K时钟。正常工作时可由软件配置具体使用哪个时钟源;睡眠状态时只能使用32K时钟。如果正常工作状态RTC时钟源由40M时钟分频所得,那么进入睡眠状态后会自动切换到32K时钟,系统被唤醒以后仍然保持使用32K时钟。所以只要电源电压保持在工作范围内,无论模块是正常工作状态还是睡眠状态,RTC模块都不会停止工作。
主要特性
提供计时功能
提供定时功能
提供定时中断
中断唤醒系统
功能描述
计时功能
在RTC配置寄存器1中可配置日、时、分、秒初始值,在RTC配置寄存器2中可配置年、月初始值,在RTC配置寄存器2可使能计时功能。
在RTC计时功能使能之后,读取RTC配置寄存器1可得到当前的日、时、分、秒数值,读取RTC配置寄存器2可得到当前的年、月数值。
定时功能
在RTC配置寄存器1中可配置日、时、分、秒定时值,在RTC配置寄存器2中可配置年、月定时值,在RTC配置寄存器1可使能定时功能。
当RTC定时器到达定时时间后会产生一个RTC中断,此时设置PMU中断源寄存器RTC中断位为1可清除中断状态。
当系统进入睡眠模式之后,RTC定时器产生的中断会唤醒系统。
寄存器描述
寄存器列表
RTC模块一共有2个32位专属寄存器,RTC中断状态需要查询PMU中断源寄存器。
偏移地址 |
名称 |
缩写 |
访问 |
描述 |
复位值 |
0X000C |
RTC配置寄存器 1 |
RTC_R1 |
RW |
配置 RTC 日时分秒值,配置使能定时 |
0X0000_0000 |
0X0010 |
RTC配置寄存器 2 |
RTC_R2 |
RW |
配置 RTC 年月值,配置使能计时 |
0X0000_0000 |
RTC配置寄存器1
位 |
访问 |
操作说明 |
复位值 |
[31] |
RW |
RTC定时中断功能使能 1’b0:不使能 1’b1:使能 |
1’b0 |
[30:29] |
保留 |
||
[28:24] |
RW |
日初值/日定时值 |
5’b0 |
[23:21] |
保留 |
||
[20:16] |
RW |
小时初值/小时定时值 |
5’b0 |
[15:14] |
保留 |
||
[13: 8] |
保留 |
||
[7 : 6] |
保留 |
||
[5 : 0] |
RW |
秒初值/秒定时值 |
6’b0 |
RTC配置寄存器2
位 |
访问 |
操作说明 |
复位值 |
[31:17] |
保留 |
||
[16] |
RW |
RTC计时功能使能位 1’b0:不使能 1’b1:使能 |
1’b0 |
[15] |
保留 |
||
[14: 8] |
RW |
年初值/年定时值 |
7’b0 |
[7 : 4] |
保留 |
||
[3 : 0] |
RW |
月初值/月定时值 |
4’b0 |
看门狗模块
功能概述
实现”看门狗”功能。设计用于系统崩溃时全局复位。
“看门狗”会产生一个周期性中断,系统软件在中断产生后要清除其中断标志,若超过其设定时间未清除,则会产生一个硬复位信号对系统进行复位。
主要特性
提供定时功能
提供复位功能
提供定时中断
功能描述
定时功能
设置定时值到寄存器WD_LD后,设置WDG_CTRL的BIT0为1启动定时器,WDG模块定时时间到会产生定时中断,通知程序处理。如果寄存器WD_CLR的BIT0不清除,则会周期产生定时中断。
WD_LD的值以APB时钟单位为基准,APB的时钟从160M时钟分频出来。
复位功能
设置芯片定时值WD_LD后,启动定时和复位功能(设置WDG_CTRL的BIT1/BIT0),WDG模块启动倒计时,定时时间到,WDG会产生定时中断,同时如果WD_CLR的BIT0不清除,则芯片会在定时时间的下一个周期产生复位信号。
寄存器描述
寄存器列表
偏移地址 |
名称 |
缩写 |
访问 |
描述 |
复位值 |
0X0000 |
WDG 定时加载寄存器 |
WD_LD |
RW |
配置定时值,用于重复加载 |
0XFFFF_FFFF |
0X0004 |
WDG 当前值寄存器 |
WD_VAL |
RO |
获取当前定时器的值 |
0XFFFF_FFFF |
0X0008 |
WDG 控制寄存器 |
WD_CTRL |
RW |
控制寄存器 |
0X0000_0000 |
0X000C |
WDG 中断清除寄存器 |
WD_CLR |
RO |
中断清除寄存器 |
0X0000_0000 |
0X0010 |
WDG 中断源寄存器 |
WD_SRC |
RO |
中断源寄存器 |
0X0000_0000 |
0X0014 |
WDG 中断输出寄存器 |
WD_STATE |
RO |
中断输出状态寄存器 |
0X0000_0000 |
WDG定时值加载寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 0] |
RW |
配置定时值,用于重复加载 此寄存器的值以 APB 时钟为计数 单位。 例如:以 APB 时钟为 40MHZ ,则定时值最大时长约107s左 右,即 0FFFFFFFF/40000000 |
32’hffff_ffff |
WDG当前值寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 0] |
RO |
获取当前定时器的值 要计算剩余时间,只要读取当前值即可。 要计算已经过去的时间,只要把寄 存器 WD_LD 的值减去寄存器 WD_VAL 的值即可 |
32’hffff_fff |
WDG控制寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 2] |
保留 |
30’h0 |
|
[1] |
RW |
复位使能位 1’b0:WDG复位条件产生时,不产生复位信号 1’b1:WDG复位条件产生时,产生复位信号 |
1’b |
[0] |
RW |
定时使能位 1’b0:定时器不工作 1’b1:定时器工作,产生周期性中断 |
1’b0 |
WDG中断清除寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 1] |
保留 |
31’h0 |
|
[0] |
WO |
中断状态清除位,写任意值清除当前中断状态 |
1’b0 |
WDG中断源寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 1] |
保留 |
31’h0 |
|
[0] |
RO |
中断源寄存器,定时器功能打开,会同时产生该中断 |
1’b0 |
WDG中断状态寄存器
位 |
访问 |
操作说明 |
复位值 |
[31: 1] |
保留 |
31’h0 |
|
[0] |
RO |
中断输出状态寄存器。该中断在定 时器关闭后不产生,WD_SRC 可能为1 |
1’b0 |
PWM控制器
功能概述
PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。
主要特性
支持2通道输入信号捕获功能(PWM0 和PWM4 两个通道)
输入信号捕获功能支持中断交互模式和DMA传输模式;DMA模式支持按字操作
支持5通道PWM信号生成功能
5通道PWM信号生成支持单次生成模式和自动装载模式
支持5通道制动功能
PWM输出频率范围:3Hz~160kHz
占空比最大精度:1/256,插入死区的计数器宽度:8bit
支持通道0 通道1同步功能,支持通道2 通道3同步功能
支持通道0 通道1的互补与非互补模式,支持通道2 通道3的互补与非互补模式
支持5通道同步功能
功能描述
输入信号捕获
PWM控制器支持两个通道的信号捕获功能,通过设置PWM_CTL寄存器的Bit24可以激活通道0的捕获功能,通过设置PWM_CAP2CTL寄存器的Bit1可以激活通道4的捕获功能。对捕获的信号的电平还可以设置是否翻转功能。通道捕获到相应的信号后,捕获数在更新到相应的捕获寄存器PWM_CAPDAT(通道0捕获数)和PWM_CAP2DAT(通道4捕获数)。
DMA传输捕获数
通道0或者通道4开启捕获功能后,捕获寄存器的计数可以通过DMA通道快速传输至内存,加速用户处理进程。
支持单次和自动装载模式
PWM控制器的五路输出通道均支持单次输出模式和自动装载模式。单次装载模式下,通道输出指定周期个波形后,就不再输出PWM波了;自动装载模式下,通道输出指定周期个波形后,会自动重新装载周期数,从而继续产生PWM波。
多种输出模式
PWM控制器支持独立输出模式,即每个通道独立输出,互不干预;支持双通道同步模式,即一个通道的输出完全与另一个通道输出一致;支持五通道同步模式,通道1至通道4的输出完全与通道0的输出一致;支持双通道互补输出,即一个通道输出的波形与另一个通道输出的波形完全相反;支持互补模式下常会用到的死区设置,死区长度最多可设置256个时钟周期;支持制动模式,当制动端口检测到指定电平后,输出通道会输出已经设置好的制动电平。
多种输出模式灵活可配,满足了使用者对PWM相关的各种应用场景。
寄存器描述
PWM寄存器列表
偏移地址 |
名称 |
缩写 |
访问 |
描述 |
复位值 |
0X0000 |
时钟分频寄存器_01 |
PWM_CLKD IV01 |
RW |
对通道0 和通道1 的时钟进行分频 |
0X0000_0000 |
0X0004 |
时钟分频寄存器_23 |
PWM_CLKD IV23 |
RW |
对通道 2 和通道 3 的时钟进行分频 |
0X0000_0000 |
0X0008 |
控制寄存器 |
PWM_CTL |
RW |
用以配置或者控制一些可配置项 |
0X0000_0000 |
0X000C |
周期寄存器 |
PWM_PERIOD |
RW |
用以设置通道 0 至通道 4 的周期 |
0X0000_0000 |
0X0010 |
周期数寄存器 |
PWM_PNUM |
RW |
用以设置通道 0 至通道 4 的信号生 成周期数 |
0X0000_0000 |
0X0014 |
比较寄存器 |
PWM_CMPDAT |
RW |
用以存放通道 0 至通道 4 的比较值 以产生不同的占空比 |
0X0000_0000 |
0X0018 |
死区控制寄存器 |
PWM_DTCTL |
RW |
用以配置或者控制死区相关的可配 置项 |
0X0000_0000 |
0X001C |
中断控制寄存器 |
PWM_INTEN |
RW |
用以对相关中断进行使能控制 |
0X0000_0000 |
0X0020 |
中断状态寄存器 |
PWM_INTSTS |
RW |
用以查询相关中断的状态 |
0X0000_0000 |
0X0024 |
通道0捕获寄存器 |
PWM_CAPDAT |
RO |
用以捕获并计数来到通道 0 的上升 沿和下降沿 |
0X0000_0000 |
0X0028 |
制动控制寄存器 |
PWM_BRKCTL |
RW |
用以对制动模式进行控制 |
0X0000_0000 |
0X002C |
时钟分频寄存器_4 |
PWM_CH4_reg1 |
RW |
对通道 4 的时钟进行分频 |
0X0000_0000 |
0X0030 |
通道4控制寄存器_1 |
PWM_CH4_reg2 |
RW |
对通道 4 的相关配置项进行设置 |
00X0000_0000 |
0X0034 |
通道4捕获寄存器 |
PWM_CAP2DAT |
RO |
用以捕获并计数来到通道 4 的上升 沿和下降沿 |
0X0000_0000 |
0X0038 |
通道4控制寄存器_2 |
PWM_CAP2CTL |
RW |
通道 4 的相关配置项进行设置 |
0X0000_0000 |
时钟分频寄存器_01
位 |
访问 |
操作说明 |
复位值 |
[31:16] |
RW |
CLKDIV1 CH1分频计数器 由计数器值决定分频数 注意:分频范围为(0~6553 5),如不需要分频,输入0或1 。 |
16’h0 |
[15:0] |
RW |
CLKDIV0 CH0分频计数器 同CH1 |
16’h0 |
时钟分频寄存器_23
位 |
访问 |
操作说明 |
复位值 |
[31:16] |
RW |
CLKDIV3 CH3分频计数器 同CH1 |
16’h0 |
[15:0] |
RW |
CLKDIV2 CH2分频计数器 同CH1 |
16’h0 |
控制寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:27] |
RW |
CNTEN 计数器计数使能 1’b0:停止计数 1’b1:开始计数 注意:每位分别控制每个通道,从 高到低依次控制 CH4、CH3、 CH2、CH1 和 CH0 |
5’b0 |
[26] |
– |
保留 |
1’b0 |
[25] |
RW |
CAPINV 捕获反向使能标识位 1’b0:捕获模式输入信号反向 无效 1’b1:捕获模式输入信号反向 有效,对输入信号取反 |
1’b0 |
[24] |
RW |
CPEN 捕获功能使能标识位 1’b0:CH0捕获功能无效, RCAPDAT 和 FCAPDAT 值不会被更新; 1’b1:CH0捕获功能有效, 捕获并锁存PWM计数器,分别存 储在 RCAPDAT(上升沿锁存 )和 FCAPDAT(下降沿锁存 ) |
1’b0 |
[23:22] |
RW |
CNTTYPE3 CH3计数器计数方式 2’b00:边缘对齐模式(计数 器计数方式为递增,仅针对捕获模 式) 2’b01:边缘对齐模式(计数 器计数方式为递减,仅针对 PWM 模式) 2’b10:中央对齐模式(仅针 对 PWM 模式) 注意:在 PWM 模式下,当计数器 被设置为沿对齐模式时,需要设置 计数方式为递减方式。 |
2’b0 |
[21:20] |
RW |
CNTTYPE2 CH2计数器计数方式 同CH3 |
2’b0 |
[19:18] |
RW |
CNTTYPE1 CH1计数器计数方式 同CH3 |
2’b0 |
[17:16] |
RW |
CNTTYPE0 CH0计数器计数方式 同CH3 |
2’b0 |
[15:14] |
RW |
TWOSYNCEN 2通道同步模式使能信号 1’b0:不允许2通道同步 1’b1:允许2通道同步, PWM_CH0 和 PWM_CH1 具有相同的相位,且相位由PWM _CH0决定;PWM_CH2 和 PWM_CH3 具有相同的相位, 且相位由 PWM_CH2 决定 15bit控制CH3和CH2 14bit控制CH1和CH0 |
2’b0 |
[13] |
– |
保留 |
1’b0 |
[12] |
RW |
POEN PWM管脚输出使能位 1’b0:PWM管脚置为输出状态 1’b1:PWM管脚置为三态状态 注意:只是针对 CH0 |
1’b0 |
[11:8] |
RW |
CNTMODE PWM生成循环方式 1’b0:单次模式 1’b1:自动装载模式 注意:CNTMODE 变化过程中 ,PWM_CMPDAT 归零;每 位分别控制每个通道,从高到低依 次控制 PW3、PW2、PW1 和 PW0 |
4’h0 |
[7] |
– |
保留 |
1’b0 |
[6] |
RW |
ALLSYNCEN 全通道同步模式使能信号 1’b0:不允许全部通道同步 1’b1:允许全部通道同步,PWM_CH0、PWM_CH1、 PWM_CH2 和 PWM_CH3 具有相同的相位,且相位由 PWM _CH0 决定 |
1’b0 |
[5:2] |
RW |
PINV PWM输出信号极性使能 1’b0:PWM输出极性翻转不使能 1’b1:PWM输出极性翻转使能 注意:每位分别控制每个通道,从高到低依次控制PW3、PW2、 PW1 和 PW0 |
4’h0 |
[1:0] |
RW |
OUTMODE 输出模式 1’b0:每两个通道非互补模式 1’b1:每两个通道组成互补模 式 BIT1 控制 CH2 和 CH3 BIT0 控制 CH0 和 CH1 |
2’b0 |
周期寄存器
周期寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:24] |
RW |
PERIOD3 CH3周期寄存器值(注意:period 不可以大于255) “沿对齐模式(计数器计数方式为 递减)”:
“中间对齐模式”:
无论选择哪种对齐模式,通道周期 均由分频数(N)和周期数(P) 共同决定,即:输入时钟为40M Hz,经分频后时钟频率f_div为:f_div = 40MHz/N,N为分频数(1 6bit)。输出频率f_output为:f_output = f_div / P,P为周期数。 注意:在PWM模式下,当计数器 被设置为沿对齐模式时,需要设置 计数方式为递减方式。 |
8’h0 |
[23:16] |
RW |
PERIOD2 CH2周期寄存器值(注意:period 不可以大于255) 同PERIOD3 |
8’h0 |
[15:8] |
RW |
PERIOD1 CH1周期寄存器值(注意:period 不可以大于255) 同PERIOD3 |
8’h0 |
[7:0] |
RW |
PERIOD0 CH0周期寄存器值(注意:period 不可以大于255) 同PERIOD3 |
8’h0 |
周期数寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:24] |
RW |
PNUM3 PWM3生成周期数 设置 PWM3 周期数 PNUM3, 当 PWM 产生 PNUM 3个 PWM 信号后,停止生成信号,同时触发 中断和置位中断状态字 |
8’h0 |
[23:16] |
RW |
PNUM2 PWM2 生成周期数 同PNUM3 |
8’h0 |
[15:8] |
RW |
PNUM1 PWM1 生成周期数 同PNUM3 |
8’h0 |
[7:0] |
RW |
PNUM0 PWM0 生成周期数 同PNUM3 |
8’h0 |
比较寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:24] |
RW |
CMP3 PWM3比较寄存器值 “沿对齐模式(计数器计数方式为 递减)”:
“中间对齐模式”:
无论选择哪种对齐模式,通道周期 均由分频数(N)和周期数(P) 共同决定,即:输入时钟为40M Hz,经分频后时钟频率f_div为:f_div = 40MHz/N,N为分频数(1 6bit)。输出频率f_output为:f_output = f_div / P,P为周期数。 注意:在PWM模式下,当计数器 被设置为沿对齐模式时,需要设置 计数方式为递减方式。 |
8’h0 |
[23:16] |
RW |
CMP2 PWM2 比较寄存器值 同 CMP3 |
8’h0 |
[15:8] |
RW |
CMP1 PWM1 比较寄存器值 同 CMP3 |
8’h0 |
[7:0] |
RW |
CMP0 PWM0 比较寄存器值 同 CMP3 |
8’h0 |
死区控制寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:22] |
– |
保留 |
0’h0 |
[21] |
RW |
DTEN23 通道2和通道3是否可以插入死区 有效标识 插入死区有效信号只有在通道的互 补模式打开后,才有效。并且,如 果插入有效信号为0,则两个通道 输出的互补信号没有死区的插入 1’b0:插入死区无效 1’b1:插入死区有效 |
1’b0 |
[20] |
RW |
DTEN01 通道0和通道1是否可以插入死区 有效标识 同DTEN23 |
1’b0 |
[19:18] |
– |
保留 |
2’b0 |
[17:16] |
RW |
DTDIV 死区时钟分频控制 2’b00:死区时钟等于基准时 钟(40MHz) 2’b01:死区时钟等于基准时 钟(40MHz)二分频 2’b10:死区时钟等于基准时 钟(40MHz)四分频 2’b11:死区时钟等于基准时 钟(40MHz)八分频 |
2’b0 |
[15:8] |
RW |
DTCNT23 通道3和通道2的死区间隔 8bit决定死区间隔值,死区时 钟由 DTDIV 决定 |
8’h0 |
[7:0] |
RW |
DTCNT01 通道1和通道0的死区间隔 8bit决定死区间隔值,死区时 钟由 DTDIV 决定 |
8’h0 |
中断控制寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:8] |
– |
保留 |
4’h0 |
[7] |
RW |
DMA_request_EN DMA_request 使能 1’b0:DMA_request 无效 1’b1:DMA_request 有效 |
1’b0 |
[6] |
RW |
FLIEN 下降沿缓存中断使能位 1’b0:下降沿缓存中断无效 1’b1:下降沿缓存中断有效 注意:针对 CH0 而言 |
1’b0 |
[5] |
RW |
RLIEN 上升沿缓存中断使能位 1’b0:上升缓存中断无效 1’b1:上升沿缓存中断有效 注意:针对 CH0 而言 |
1’b0 |
[4:0] |
RW |
PIEN PWM 周期中断使能位 1’b0:周期中断无效 1’b1:周期中断有效 注意:当计数器计数到0,且PW M周期个数满足PWM_PNUM 后,触发中断。 |
5’b0 |
中断状态寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:10] |
– |
保留 |
24’h0 |
[9] |
RW |
OVERFL 计数器溢出标志 1’b0:捕获模式,计数器计数 过程中,计数器未溢出 1’b1:捕获模式,计数器计数 过程中,计数器溢出 注意:当用户清除 CFLIF 或 CRLIF 时,本 bit 也同时被清除 |
1’b0 |
[8] |
RW |
FLIFOV 下降沿延迟中断标识过跑状态 1’b0:当 CFILF 为1时, 无下降沿延迟中断产生 1’b1:当 CFILF 为1时, 又一次发生下降沿延迟中断 注意:当用户清除 CFILF 时, 本 bit 也同时被清除 |
1’b0 |
[7] |
RW |
RLIFOV 上升沿延迟中断标识过跑状态 1’b0:当 CRILF 为1时, 无上升沿延迟中断产生 1’b1:当 RILF 为1时, 又一次发生上升沿延迟中断 注意:当用户清除 CRILF 时, 本 bit 也同时被清除 |
1’b0 |
[6] |
RW |
CFLIF 捕获下降沿中断标识 1’b0:没有捕获到下降沿 1’b1:当捕获到下降沿,本位 被设置为1 注意:通过写入1,清除该标识位 注意:针对 CH0 而言 |
1’b0 |
[5] |
RW |
CRLIF 捕获上升沿中断标识 1’b0:没有捕获到上升沿 1’b1:当捕获到上升沿,本位 被设置为1 注意:通过写入1,清除该标识位 注意:针对 CH0 而言 |
1’b0 |
[4:0] |
RW |
PIF PWM 周期中断标识 当 PWM 产生指定周期 PWM 信号 后,该标识位置1;通过软件写入 1,清除该标识 注意:每位分别标识每个通道,从 高到低依次控制 PW4、PW3、 PW2、PW1 和 PW0 |
5’b0 |
通道0捕获寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:16] |
RO |
PWM_FCAPDAT 捕获下降沿寄存器 当输入信号存在下降沿时,存储当前计数器值 |
16’h0 |
[15:0] |
RO |
PWM_RCAPDAT 捕获上升沿寄存器 当输入信号存在上升沿时,存储当前计数器值 |
16’h0 |
制动控制寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:16] |
– |
保留 |
16’h0 |
[15:11] |
RW |
BRKCTL 制动模式使能 1’b0:制动模式禁止 1’b1:制动模式启动 [7:3]分别对应 CH4、CH3、CH2、CH1 和 CH0 |
5’b0 |
[10:8] |
– |
保留 |
3’b0 |
[7:3] |
RW |
BKOD 制动输出控制寄存器 1’b0:当制动模式有效时,PWM输出低电平 1’b1:当制动模式有效时,PWM输出高电平 [7:3]分别对应CH4、CH3、CH2、CH1 和 CH0 |
5’b0 |
[2:0] |
– |
保留 |
3’b0 |
时钟分频寄存器_4
位 |
访问 |
操作说明 |
复位值 |
[31:16] |
RW |
CLKDIV4 CH4分频计数器 由计数器值决定分频数 注意:分频范围为(0~65535),如不需要分频,输入0或1 。 |
16’h0 |
[15:8] |
RW |
PERIOD4 CH4 周期寄存器值(注意:period不可以大于255) “沿对齐模式(计数器计数方式为 递减)”
“中间对齐模式”:
无论选择哪种对齐模式,通道周期 均由分频数(N)和周期数(P) 共同决定,即:输入时钟为 40MHz,经分频后时钟频率 f_div 为:f_div = 40MHz/N,N为分频数(1 6bit)。输出频率f_output为:f_output = f_div / P,P为周期数。 注意: 在 PWM 模式 下,当计数器被设置为沿对齐模式 时,需要设置计数方式为递减方式 。 |
8’h0 |
[7:0] |
RW |
CH4生成周期数 设置PWM4周期数为PNUM4 ,当PWM产生PNUM4个PW M信号后 停止生成信号,同时触发中断和置 位中断状态字 |
8’h0 |
通道4控制寄存器_1
位 |
访问 |
操作说明 |
复位值 |
[31:16] |
– |
保留 |
16’h0 |
[15:8] |
RW |
CMP4 CH4周期寄存器值 “沿对齐模式(计数器计数方式为 递减)”:
“中间对齐模式”:
无论选择哪种对齐模式,通道周期 均由分频数(N)和周期数(P) 共同决定,即:输入时钟为40M Hz,经分频后时钟频率f_div为:f_div = 40MHz/N,N为分频数(1 6bit)。输出频率f_output为:f_output = f_div / P,P为周期数。 注意: 在 PWM 模式 下,当计数器被设置为沿对齐模式 时,需要设置计数方式为递减方式 。 |
8’h0 |
[7:5] |
– |
保留 |
3’b0 |
[4:3] |
RW |
CNTTYPE4 CH4计数器计数方式 2’b00:边缘对齐模式(计数 器计数方式为递增,仅针对捕获模 式) 2’b01:边缘对齐模式(计数 器计数方式为递减,仅针对PWM 模式) 2’b10:中央对齐模式(仅针 对PWM模式) 注意: 在 PWM 模式 下,当计数器被设置为沿对齐模式 时,需要设置计数方式为递减方式 。 |
2’b0 |
[2] |
– |
保留 |
1’b0 |
[1] |
RW |
CNTMODE4 CH4生成循环方式 1’b0:单次模式 1’b1:自动装载模式 注意:CNTMODE 变化过程中 ,PWM_CMPDAT 归零 |
1’b0 |
[0] |
RW |
PINV4 CH4输出信号极性使能 1’b0:PWM 输出极性翻转不使能 1’b1:PWM 输出极性翻转使能 |
1’b0 |
通道4捕获寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:16] |
RO |
PWM_FCAP2DAT 捕获下降沿寄存器 当输入信号存在下降沿时,存储当前计数器值 |
16’h0 |
[15:0] |
RO |
PWM_RCAP2DAT 捕获上升沿寄存器 当输入信号存在上升沿时,存储当前计数器值 |
16’h0 |
通道4控制寄存器_2
位 |
访问 |
操作说明 |
复位值 |
[31:11] |
– |
保留 |
21’h0 |
[10] |
RW |
DMA_request2_ma sk DMA_request2使能 1’b0:DMA_request2无效 1’b1:DMA_request2有效 注意:只是针对 CH4 |
1’b0 |
[9] |
RW |
FLIEN2 下降沿缓存中断使能位 1’b0:下降沿缓存中断无效 1’b1:下降沿缓存中断有效 注意:只是针对 CH4 |
1’b0 |
[8] |
RW |
RLIEN2 上升沿缓存中断使能位 1’b0:上升缓存中断无效 1’b1:上升沿缓存中断有效 注意:只是针对 CH4 |
1’b0 |
[7] |
RW |
OVERFL2 计数器溢出标志 1’b0:捕获模式,计数器计数 过程中,计数器未溢出 1’b1:捕获模式,计数器计数 过程中,计数器溢出 注意:当用户清除 CFLIF 或 CRLIF 时,本 bit 也同时被清 除 注意:只是针对 CH4 |
1’b0 |
[6] |
RW |
FLIFOV2 下降沿延迟中断标识过跑状态 1’b0:当 CFILF 为1时, 无下降沿延迟中断产生 1’b1:当 CFILF 为1时, 又一次发生下降沿延迟中断 注意:当用户清除 CFILF 时, 本 bit 也同时被清除 注意:只是针对 CH4 |
1’b0 |
[5] |
RW |
RLIFOV2 上升沿延迟中断标识过跑状态 1’b0:当 CRILF 为1时, 无上升沿延迟中断产生 1’b1:当 CRILF 为1时, 又一次发生上升沿延迟中断 注意:当用户清除 CRILF 时, 本 bit 也同时被清除 注意:只是针对 CH4 |
1’b0 |
[4] |
RW |
CFLIF2 捕获下降沿中断标识 1’b0:没有捕获到下降沿 1’b1:当捕获到下降沿,本位被设置为1 注意:通过写入1,清除该标识位 注意:只是针对 CH4 |
1’b0 |
[3] |
RW |
CRLIF2 捕获上升沿中断标识 1’b0:没有捕获到上升沿 1’b1:当捕获到上升沿,本位被设置为1 注意:通过写入1,清除该标识位 注意:只是针对 CH4 |
1’b0 |
[2] |
RW |
POEN2 PWM 管脚输出使能位 1’b0:PWM 管脚置为输出状态 1’b1:PWM 管脚置为三态状态 注意:只是针对CH4 |
1’b0 |
[1] |
RW |
CPEN2 捕获功能使能标识位 1’b0:CH4 捕获功能无效, RCAPDAT 和 FCAPDAT 值不会被更新; 1’b1:CH4 捕获功能有效, 捕获并锁存 PWM 计数器,分别存储在 RCAPDAT(上升沿锁存 )和 FCAPDAT(下降沿锁存 ) 注意:只是针对CH4 |
1’b0 |
[0] |
RW |
CAPINV2 捕获反向使能标识位 1’b0:捕获模式输入信号反向无效 1’b1:捕获模式输入信号反向有效,对输入信号取反 注意:只是针对 CH4 |
1’b0 |
QFLASH控制器
功能概述
W800内置QFLASH的控制器,提供总线方式的QFLASH读写擦操作,提供系统总线和数据总线的访问仲裁,实现CACHE方式的QFLASH读操作。
主要特性
提供总线访问FLASH接口
支持通过寄存器配置的方式对FLASH直接发送SPI命令进行访问
支持对FLASH进行24位或32位地址访问
支持对存储在FLASH中的代码和数据自动解密后读取
功能描述
总线访问
FLASH在系统中地址从0x08000000开始,可以直接对该地址空间进行读操作。
寄存器访问
通过对寄存器的配置可以直接向FLASH发送SPI命令,以实现对FLASH更灵活的访问,支持大部分FLASH的控制命令。
命令的配置和启动
Flash的控制命令码写入寄存器FLASH_CMD的command位,同时根据命令格式配置该寄存器的其它位,例如,如果命令中有地址位,要将address位置1。如果命令中有数据,要将DAT位置1,具体参考寄存器说明。
命令配置完成后,将CMD_START寄存器的command_b位置1,则控制器开始向FLASH发送该命令。
通信模式的及配置
首先向FLASH发送命令将FLASH配置为QIO或QPI模式,然后将FLASH控制器的QIOM或QPIM位置为1,即可使用QIO模式或QPI模式与FLASH进行通信。
数据缓存
通过寄存器对FLASH进行数据读写时,使用0x4000 0000 ~ 0x4000 03ff地址的存储空间作为数据缓存,该段地址空间同时也作为RSA加解密模块使用的数据缓存。即读数据时,控制器将从FLASH读出的数据顺序存储在从0x4000 0000开始的地址空间进行缓存。向FLASH写数据时也是从0x4000 0000开始读取数据后发送给flash。
读操作
每次读操作最多可读取256字节数据,可读取QFlash任意位置的数据。
读操作命令启动后,数据就存放在缓存中了,无需等待或查询。
操作流程如图所示。

写操作
以下命令均为写操作:
WRSR:写状态寄存器
PP:页编程
SE:sector擦除
BE:32K block擦除
HBE:64K block 擦除
CE:全芯片擦除
擦除命令不需要数据,直接将命令寄存器配置为相应命令,然后启动就可以了。
编程命令过程如下

寄存器描述
寄存器列表
偏移地址 |
名称 |
缩写 |
描述 |
默认值 |
0X0000_0000 |
命令信息寄存器 |
CMD_INFO |
QFLASH 操作所需命令及数据字节 |
0X0000_0000 |
0X0000_0004 |
命令启动寄存器 |
CMD_START |
命令启动 |
0X0000_0000 |
0X0000_0008 |
Flash控制寄存器 |
Flash_CR |
QFLASH 操作模式控制 |
0X0000_0000 |
0X0000_000C |
Remap寄存器 |
Remap |
Remap 选项控制 |
0X0000_0000 |
0X0000_0010 |
ADDR寄存器 |
Flash_ADDR |
操作地址 |
0X0000_0000 |
0X0000_0014 |
解密控制寄存器 |
DECRYPT_CR |
固件机密模式控制 |
0X0000_0000 |
0X0000_0018 |
解密状态寄存器 |
DECRYPT_STA |
固件解密状态 |
0X0000_0000 |
0X0000_0200 … 0X0000_0600 |
读写数据缓存区 |
RSA_BUF |
用于缓存 QFLASH 读写的数据或者 RSA 的加解密数据。 此内存为 QFLASH 控制器和 RSA模块共用,因此 ,QFLASH 读写与 RSA操作不能同时使用, 需要在驱动实现时增加互斥操作保护 |
0X0000_0000 |
命令信息寄存器
位 |
访问 |
操作说明 |
复位值 |
[31] |
RW |
1:指示 CMD_START 携带 Address,CMD_START 寄存器中存有该Address的低20位,该 Address 的高4为固定为0,共计24位 |
1’b0 |
[30] |
RW |
1:指示 CMD_START 寄存 器中 CRM 携带有内容 |
1’b0 |
[29] |
RW |
1:指示 CMD_INFO 携带 Dummy 周期 |
1’b0 |
[28:26] |
RW |
其内容+1后指示 CMD_INFO 携带多少 Dummy 周期 |
3’b0 |
[25:16] |
RW |
其内容+1后指示 CMD_INFO 携带多少字节的数据 |
10’b0 |
[15] |
RW |
1:表示 CMD_INFO 携带数据 |
1’b0 |
[14] |
RW |
1:表示当前 CMD_INFO 命令域填写的命令为读命令,命令包含 RDSR、FR、QIOFR、 RDPDRID、RSR 等 |
1’b0 |
[13] |
RW |
1:表示当前 CMD_INFO 命令域填写的命令为 WRSR 命令 |
1’b0 |
[12] |
RW |
1:表示当前 CMD_INFO 命令域填写的命令为 PP 命令 |
1’b0 |
[11] |
RW |
1:表示当前 CMD_INFO命令域填写的命令为 SE 命令 |
1’b0 |
[10] |
RW |
1:表示当前 CMD_INFO 命令域填写的命令为 BE 命令 |
1’b0 |
[9] |
RW |
1:表示当前 CMD_INFO 命令域填写的命令为 HBE 命令 |
1’b0 |
[8] |
RW |
1:表示当前 CMD_INFO 命令域填写的命令为 CE 命令 |
1’b0 |
[7 : 0] |
RW |
CMD_INFO 命令域,填写 QFlash 的命令,可参考 QFlash 芯片手册。 |
8’b0 |
命令启动寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:29] |
RO |
Reserved |
3’b0 |
[28] |
RW |
置1表示启动命令,命令操作完成后,由硬件清零。 |
1’b0 |
[27: 8] |
RW |
Address[19:0]:若命令寄存器中的 A 标记为为1,则此处存储 Address 低20位内容。 |
20’b0 |
[7 : 0] |
RW |
CRM[7:0]:若命令寄存器中的 CRM 标记为为1,则此处存储 CRM 内容。 |
8’b0 |
QFLASH的常用指令
命令名称 |
令字 |
命令缩 |
Write Enable |
06H |
WREN |
Write Disable |
04H |
WRDI |
Read Status |
05H |
RDSR |
Write Status |
01H |
WRSR |
Fast Read |
0BH |
FR |
Quad IO Fast Read |
EBH |
QIOFR |
Page Program |
02H |
PP |
Sector Erase |
20H |
SE |
其它命令参见QFLASH的相关手册。
PSRAM接口控制器
功能概述
W800内置SPI/QSPI接口的PSRAM控制器,支持外置PSRAM设备访问,提供总线方式的PSRAM读写擦操作。最高读写速度80MHz。
主要特性
支持对外置PSRAM的读写访问
可配置为SPI和QSPI
SPI/QSPI时钟频率可配置
支持BURST INC模式访问
支持PSRAM的半休眠模式
功能描述
PSRAM 全称为Pseudo static random access memory,指的是伪静态随机存储器。与传统SRAM相比,具备封装小,容量大,成本低等优势,在物联网应用中主要用于数据缓存方向。接口多为SPI,QSPI等。接口引脚主要有时钟信号SCK,片选信号CS及4根双向数据IO。W800提供的PSRAM控制器可以支持SPI/QSPI接口的PSRAM的总线方式访问,工作时钟最高速率80MHz,最大容量支持64Mb。
引脚说明
SCLK:SPI接口时钟,SCLK周期由PSRAM_CTRL[7:4]设置,可设置的分频值最小为3,默认为AHB时钟的4分频。
CS:SPI接口片选信号
SIO0:SPI模式数据输入,QSPI模式SD[0]
SIO1:SPI模式数据输出,QSPI模式SD[1]
SIO2:QSPI模式SD[2]
SIO3:QSPI模式SD[3]
访问模式设置
PSRAM控制器支持对外置PSRAM的SPI和四线的QSPI两种访问模式,默认为SPI。通过设置PSRAM_CTRL[1]配置SPI的模式。
PSRAM_CTRL[1]默认为0,即SPI模式,此时完成一次写操作需要64个SCLK周期,完成一次读操作需要72个SCLK周期。
如果PSRAM工作在SPI模式下,此时向PSRAM_CTRL[1]写入1时,控制器会向PSRAM发送命令35H,当读取PSRAM_CTRL[1]为1时,表示命令发送完成,PSRAM进入QPI模式,此时完成一次写操作需要16个SCLK周期,完成一次读操作需要22个SCLK周期。
如果PSRAM工作在QPI模式下,此时向PSRAM_CTRL[1]写入0时,控制器会向PSRAM发送命令F5H,当读取PSRAM_CTRL[1]为0时,表示命令发送完成,PSRAM进入SPI模式。
设置PSRAM工作模式必须在初始化操作完成后,不能同时设置。
PSRAM初始化
第一次使用前需要在PSRAM上电稳定后,向寄存器PSRAM_CTRL[0]写入1,启动PSRAM复位初始化操作,即向PSRAM发送66H和99H命令。默认使用 SPI模式发送,即需要8个SCLK + tCPH + 8个SCLK的时间。初始化完成后,硬件自动将PSRAM_CTRL[0]清零。
初始化操作会将PSRAM恢复成SPI模式。
推荐的初始化流程为:
⑴ 将PSRAM_CTRL[0]写入1
⑵ 等待,直到PSRAM_CTRL[0]自动清零
⑶ 通过软复位使PSRAM控制器复位
⑷ 重新设置PSRAM_CTRL的其它需要参数
PSRAM的访问方法
对PSRAM进行读写的方式与普通SRAM相同,即向相应的总线地址写入/读出数据。
BURST功能
通过设置PSRAM_CTRL[2]可以使控制器支持AHB总线发起的BURST,即当AHB总线上HBURST为1/3/5/7时,表示AHB总线启动一次地址递增的连续读/写,此时为了提高PSRAM的访问速度,控制器在完成一个word的读/写后并不会将CS拉高,而是直接读/写下一个word的数据。
OVERTIMER寄存器用于设置CS为低的最大时间,单位为HCLK的周期数,每开始一次BURST操作,内部计数器从0开始计数,当计数器值大于设定数值时,完成当前word的读/写后,控制器就自动停止BURST操作,直接将CS变为高电平,如果此时AHB总线上还有数据需要读/写则会当成单独的WORD进行。
PSRAM控制器不支持WRAP形式的BURST,如果访问PSRAM会用到WRAP BURST,请将PSRAM_CTRL[2]设为0。
寄存器描述
寄存器列表
偏移地址 |
名称 |
缩写 |
描述 |
默认值 |
0X0000_0000 |
控制寄存器 |
PSRAM_CTRL |
PSRAM 控制器设置 |
0X0000_0000 |
0X0000_0004 |
超时控制寄存器 |
OVERTIMER |
CS 超时控制 |
0X0000_0000 |
命令信息寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:12] |
RO |
RSV |
1’b0 |
[11] |
RW |
HSM,Halfsleep mode 使能 1:使能 PSRAM 半休眠模式 0:清除半休眠模式 |
1’b0 |
[10:8] |
RW |
tCPH,CS 高电平最短时间设置,单位为 AHB 时钟周期数,必须大于1,具体时间根据不同的 psram 手册中说明进行设置,不清楚可以不修改默认值 |
3’d6 |
[7:4] |
RW |
SPI分频设置 只能配置为2以上数值,写入的数 值就是分频的倍数 |
4’d4 |
[3] |
RO |
RSV |
|
[2] |
RW |
INC_EN BURST功能使能 1:支持 AHB 总线上的 BURST 功能 0:不支持 BURST 功能 |
1’b0 |
[1] |
RW |
QUAD 写1使能 PSRAM 的 QPI 模式 ,写0使能 SPI 模式 读该标志位可知道当前 PSRAM 为哪种模式。 |
1’b0 |
[0] |
RW |
PSRAM复位 写1启动对 PSRAM 的复位操作,复位完成自动清零。 |
’b0 |
超时控制寄存器
位 |
访问 |
操作说明 |
复位值 |
[11:0] |
RW |
超时寄存器设置,设置 CS 为低的最大时间,用于 BURST 模式 |
12’d0 |
ADC
ADC功能概述
基于 Sigma-Delta ADC的采集模块,完成最多4路模拟信号的采集,采样率通过外部输入时钟控制,可采集输入电压,也可采集芯片温度,支持输入校准和温度补偿校准。
ADC主要特性
支持最多4路数据采集
支持DMA模块用于数据缓冲;
支持中断交互模式;
支持采集数据与输入数据比较功能
最高采样频率1KHz;
支持单端输入模式和差分输入模式;
ADC功能描述
模块基本结构
ADC模块为PGA+SDADC结构,输入信号经过PGA进行预放大后,输入到SDADC处理,SDADC设计为16bit ADC。需要注意的是,芯片内ADC采用2.5V LDO供电,为保护内部电路,输入信号必须要满足Vinmax<2.5V,其他限制条件,详见26.3.8节。
通道选择
寄存器0x04[11:8] 提供通道选择功能。W800的ADC提供4通道信号的采集功能。通过设置寄存器0x04[11:8]可以选择4个通道中任一通道进行单端信号数据采集,或者选择4通道中预先配对的2对差分通道进行差分信号数据采集。具体通道选择可以参见寄存器描述。
除了4个通道以外,ADC模块还提供了温度检测,电压检测以及offset校准功能。分别对应通道选择的4’b1100,4’b1101,4’b1110.
如果需要使用对应功能,将通道选择配置为对应的通道,然后按照以上使用说明的流程操作即可。
数据比较
ADC模块提供数据比较功能,可通过配置寄存器0x10的BIIT[5] 设置此功能的开关。
用户可通过结果寄存器0x18的BIT[17:0] 配置希望比较的数值。此数值需要转换为18bit有符号数,最高位为符号位。ADC配置寄存器0x10的BIT[6] 可以设置数据比较的方向,当此位为0时,如果ADC采集的值大于或者等于Comp_data,则INT_CMP会被置1,并且会产生一个中断;当此位为1时,只有当ADC采集的值的小于Comp_data,则INT_CMP 会被置1,并且产生一个中断。
PGA增益调整说明
寄存器地址0X08的BIT[8:4],5位增益控制信号,其中
0X08[8:7]=GAIN_CTRL_PGA<4:3>(对应GAIN2)
0X08[6:4]=GAIN_CTRL_PGA<2:0>(对应GAIN1,110和111不使用)
PGA整体增益GAIN_PGA=GAN1*GAIN2
[8:7][6:4] |
00 |
01 |
10 |
11 |
000 |
1 |
2 |
3 |
4 |
001 |
16 |
32 |
48 |
64 |
010 |
32 |
64 |
96 |
128 |
011 |
64 |
128 |
192 |
256 |
100 |
128 |
256 |
384 |
512 |
101 |
256 |
512 |
768 |
1024 |
根据仿真结果,同样的放大倍数,建议优先采用其中GAIN2放大倍数较大的配置。
单端模式VCMIN调整说明
PGA内部VCMIN电压,在单端模式下,作为运放输入负端。
调整VCMIN的目的是适应各种不同偏置点的信号源,防止在某些过高或者过低的偏置点下PGA输出饱和。
寄存器地址0X40000D20的BIT[16:11],默认100000,即VCMIN default=1.311V, step≈39.1mV

图 37 单端工作模式原理
Bypass模式
Bypass_pga寄存器地址0X08的BIT[3],默认0,不旁路,PGA正常工作;若为1,此时PGA被旁路,外部信号源直接连接到SDADC输入端,主要用于内部模块测试,正常使用时不需要bypass。
Bypass_ref寄存器地址0X08的BIT[2],默认0,不旁路,SDADC正常工作;若为1,此时SDADC内部ref被旁路,需要通过测试脚添加外部基准电压,主要用于内部模块测试,正常使用时不需要bypass。
SDADC输出码补充说明
SDADC输出结果保存在ADC_RESULT寄存器中,寄存器地址0X00 BIT[17:0]。
SDADC本身输出码为无符号数,由于数字对SDADC的输出码进行了处理(最高位取反),变为有符号数,而SDADC输出码的0码并不固定(且不是正好为10 0000 0000 0000 0000),所以直接采用寄存器的数值进行后续计算,是错误的。
对SDADC的输出结果进行计算时,寄存器ADC_RESULT[17:0]的值(读取值是16进制数),需要软件先转换回无符号数(2进制数最高位ADC_RESULT[17]取反),再进行后续计算。
此次设计的SDADC为12bit ADC,设计中对ADC转换数据做了处理,实际有效寄存器位数为16bit,而寄存器数据为18bit,通过数字滤波器增加了最低两位,16bit数转为18bit数(18bit数≈16bit数*4),所以有效位数为高16bit(即ADC_RESULT[17:2])。
在将读取值转回无符号数之后,涉及LSB的计算,还需要软件将18bit数据转为16bit数据,即舍去最低两位数据(ADC_RESULT[1:0]),只保留高16bit(转回无符号数的ADC_RESULT[17:2]),然后用16bit数据进行后续计算,此时LSB的仿真结果约等于68.5uV(还需测试确定芯片实际LSB)。
输入信号电压范围
因为NTO版本PGA和SDADC采用2.5V LDO供电,为防止内部电路饱和,对输入信号电压范围有限制。
假定输入差分信号为Vinp和Vinn(单端模式时,信号Vinn为VCMIN),则输入差分电压Vdiff=Vinp-Vinn,输入共模电压Vcm=(Vinp+Vinn)/2。PGA第一级增益GAIN1,第二级增益GAIN2,PGA整体增益GAIN_PGA=GAN1*GAIN2(详见2.2.2节)。
输入信号需同时满足下列限制条件:
0V < Vinp < 2.5V,0V < Vinn < 2.5V;
0V < Vcm - (Vdiff*GAIN1)/2;
Vcm + (Vdiff*GAIN1)/2 < 2.5V;
0V < 1.2V- (Vdiff*GAIN_PGA)/2;
1.2V + (Vdiff*GAIN_PGA)/2 < 2.5V;
对于已知输入信号大致范围的,可以直接代入上面的式子计算,选取可用增益设置。
对于未知输入信号,可先用x1增益设置,判断出大致范围,再代入上面的式子计算,选取可用增益设置。
典型使用情况的寄存器配置
以下配置字都为16进制数,高位的0已省略。
Offset测量
1. 设置模块工作状态,将寄存器0X04设置为0xE03,打开信道选择(offset检测)/SDADC_CHOP 使能/SDADC使能/LDO使能
2. 设置模块寄存器0X08=0x3,PGA为x1增益配置/PGA_CHOP使能/PGA使能。其中,增益配置0X08 BIT[8:4]要根据所进行测试的要求,进行相应的修改(即后面测试用的什么增益配置,offset测量时也要采用相同的增益配置)
1. 设置时钟状态0X40000E14 BIT[15:8]=0x28,确认SDADC时钟配置为1MHz。芯片上电后默认值即为0x28,若无改动,此步骤可省略
4. 等待2ms,读出ADC_RESULT寄存器的输出结果,参照26.3.7节,需要软件先转换回无符号数(最高位ADC_RESULT[17]取反),再舍去最低两位,只保留高16bit数据。重复读取共10次,读数间隔2ms,算出码数平均值记为code_offset
差分输入模式
先按照26.4.1节进行offset测量,得出code_offset
2. 设置模块寄存器0X04=0x803,信道选择(正channel 0,负channel 1)/SDADC_CHOP 使能/SDADC使能/LDO使能。其中信道选择0X04[11:8],可配置成其他channel的差分输入,参考26.3.2节;
3. 设置模块寄存器0X08=0x3,PGA为x1增益配置/PGA_CHOP使能/PGA使能。其中,增益配置0X08[8:4]根据输入信号电压范围,选取合适的配置,参考26.3.4和26.3.8节
4. 设置时钟状态0X40000E14[15:8]=0x28,确认SDADC时钟配置为1MHz。芯片上电后默认值即为28,若无改动,此步骤可省略
5. 等待2ms,读出ADC_RESULT寄存器的输出结果,寄存器地址0X00[17:0]。参照26.3.7节,需要软件先转换回无符号数(最高位ADC_RESULT[17]取反),再舍去最低两位,只保留高16bit数据。6. 重复读取共10次,读数间隔2ms,算出码数平均值记为code_out
7. 差分输入信号Vindiff=(code_out-code_offset)*LSB/GAIN_PGA,其中LSB根据仿真结果约等于68.5uV
单端输入模式
先按照26.4.1节进行offset测量,得出code_offset;
2. 设置模块寄存器0X04=0x3,信道选择(正channel 0,负VCMIN)/SDADC_CHOP 使能/SDADC使能/LDO使能。其中信道选择0X04[11:8],可配置成其他channel的单端输入,参考26.3.2节
设置模块寄存器0X408=0x3,PGA为x1增益配置/PGA_CHOP使能/PGA使能。其中,VCMIN配置0X40000D20[16:11]和增益配置0X08[8:4],根据输入信号电压范围,选取合适的配置,参考26.3.4、26.3.5和26.3.8节
3. 设置时钟状态0X40000E14[15:8]=0x28,确认SDADC时钟配置为1MHz。芯片上电后默认值即为28,若无改动,此步骤可省略;
4. 等待2ms,读出ADC_RESULT寄存器的输出结果,寄存器地址0X00[17:0]。参照26.3.7节,需要软件先转换回无符号数(最高位ADC_RESULT[17]取反),再舍去最低两位,只保留高16bit数据。重复读取共10次,读数间隔2ms,算出码数平均值记为code_out;
5. 单端模式输入信号vin_single=(code_out-code_offset)*LSB/ GAIN_PGA+VCMIN,其中LSB根据仿真结果约等于68.5uV,VCMIN 默认值1.311V;
温度检测模式
1. 设置模块寄存器0X04=0xC03,信道选择(温度检测)/SDADC_CHOP 使能/SDADC使能/LDO使能;
设置模块寄存器0X08=0x183,PGA为x4增益配置/PGA_CHOP使能/PGA使能;
3. 设置时钟状态0X40000E14[15:8]=0x28,确认SDADC时钟配置为1MHz。芯片上电后默认值即为28,若无改动,此步骤可省略;
4. 设置tempsensor模块工作状态0X0C=0x1,TempSensor使能/cal_offset_temp12=0,TempSensor为x2增益配置;
5. 等待2ms,读取ADC_RESULT寄存器的输出结果,参照26.3.7节,需要软件先转换回无符号数(最高位ADC_RESULT[17]取反),记为输出码code_out1;
6. 设置tempsensor模块工作状态0X0C=0x3,TempSensor使能/cal_offset_temp12=1,TempSensor为x2增益配置;
7. 等待2ms,读取ADC_RESULT寄存器的输出结果,参照26.3.7节,需要软件先转换回无符号数(最高位ADC_RESULT[17]取反),记为输出码code_out2;
8. 重复步骤4到步骤7,共10次,分别算出code_out1和code_out2的平均值code_out1avg和code_out2avg;
9. 由上面步骤算出Vtemp=(code_out1avg-code_out2avg)/16,而TempSensor输出电压=Vtemp码数*(LSB/4),其中LSB根据仿真结果约等于68.5uV(此LSB是按16bit的仿真结果,温度检测上面的步骤5和7里,读取都是18bit数据,18bit数≈16bit数*4,则18bit对应的最低有效位≈LSB/4)
根据测试结果,目前整理出了拟合公式,可直接估算芯片温度
Vtemp码=(15.548*芯片温度)+4444.1
将步骤9算出的Vtemp代入上面的公式,得出芯片温度。(注意,拟合公式采用的是十进制)
另外,补充一个提高精度的可选措施:
对不同芯片,假定拟合公式y=kx+b中的系数k不变(都为15.548),不同芯片的系数b有一定差别。可按照上面的使用说明,先在已知环境温度下(例如室温25℃),算出Vtemp码数,代入Vtemp码=(15.548*(已知环境温度+11.8))+b,得出不同芯片的系数b,保存在rom或flash中,替换上面公式的4444.1。然后,按照新公式的系数计算温度,可在一定程度上提高不同芯片的温度检测精度。
电压检测模式
先按照26.4.1节进行offset测量,得出code_offset;
2. 设置模块寄存器0X04=0xD03,信道选择(电压检测)/SDADC_CHOP 使能/SDADC使能/LDO使能
设置模块寄存器0X08=0x83,PGA为x2增益配置/PGA_CHOP使能/PGA使能。
4. 设置时钟状态0X40000E14[15:8]=28,确认SDADC时钟配置为1MHz。芯片上电后默认值即为28,若无改动,此步骤可省略
5. 等待2ms,读出ADC_RESULT寄存器的输出结果,参照26.3.7节,需要软件先转换回无符号数(最高位ADC_RESULT[17]取反),再舍去最低两位,只保留高16bit数据。重复读取共10次,读数间隔2ms,算出码数平均值记为code_out;
6. 芯片电源电压Vpower=(code_out-code_offset)*LSB/2+1.2V,其中LSB根据仿真结果约等于68.5uV
ADC寄存器描述
寄存器列表
偏移地址 |
名称 |
缩写 |
描述 |
复位值 |
0X0000 |
ADC 结果寄存器 |
ADC_RESUL |
存放 ADC 采集值及数据比较值 |
0X0000_0000 |
0X0004 |
ADC 模拟寄存器 |
ADC_ANA_CTRL |
配置 ADC 相关功能 |
0X0000_0004 |
0X0008 |
PGA 配置寄存器 |
PGA_CTRL |
配置 PGA 相关功能 |
0x0000_0000 |
0X000c |
TempSensor 配置寄存器 |
TEMP_CTRL |
配置温度传感器相关功能 |
0x0000_0000 |
0x0010 |
ADC 配置寄存器 |
ADC_CTRL |
配置 ADC 模块功能 |
0x0050_0500 |
0x0014 |
ADC 中断寄存器 |
ADC_INT _STATUS |
ADC 模块中断状态寄存器 |
0x0000_0000 |
0x0018 |
比较值寄存器 |
CMP_VALUE |
比较阈值设置 |
0x0000_0000 |
ADC结果寄存器
位 |
访问 |
操作说明 |
复位值 |
[17:0] |
RW |
ADC 转换结果值,有效 bit 位宽18bits。有符号数,最高位为符号位。 |
1’b0 |
ADC模拟配置寄存器
位 |
访问 |
操作说明 |
复位值 |
[11 : 8] |
RW |
ADC工作通道选择信号: 4’b0000:AIN0 通道工 作。DMA 模式下,对应 DMA 通道0工作 4’b0001:AIN1 通道工 作。DMA 模式下,对应 DMA 通道1工作 4’b0010:AIN2 通道工 作。DMA 模式下,对应 DMA 通道2工作 4’b0011:AIN3 通道工 作。DMA 模式下,对应 DMA 通道3工作 4’b0100:RSV 4’b0101:RSV 4’b0110:RSV 4’b0111:RSV 4’b1000:AIN0/AIN1 差分信号输入。DMA 模式下,对应 DMA 通道0工作 4’b1001:AIN2/AIN3 差分信号输入。DMA 模式下,对应 DMA 通道2工作 4’b1010:RSV 4’b1011:RSV 4’b1100:温度传感器输入,对应 DMA 通道2 4’b1101:电压检测模块输入,对应 DMA 通道3 4’b1110:offset 检测输入 4’b1111:RSV |
4’b1000 |
[7] |
RO |
RSV |
1’b0 |
[6:5] |
RW |
chop_enr LDO 斩波信号 PD 信号 |
2’b00 |
[4] |
RW |
Chop_ens sdadc 斩波信号 PD 信号 0:使能 1:不使能 |
1’b0 |
[3] |
RO |
RSV |
1’b0 |
[2] |
RW |
Pd_sdadc sdadc 模拟模块掉电使能 1:掉电 0:工作 |
1’b1 |
[1] |
RW |
Rstn_sdadc 模拟模块数字逻辑部分复位信号 0:复位 1:正常工作 |
1’b0 |
[0] |
RW |
en_ldo_sdadc ADC LDO 使能 0:掉电1:工作 |
1’b0 |
PGA配置寄存器
位 |
访问 |
操作说明 |
复位值 |
[8:4] |
RW |
Gain_ctrl_pga PGA 增益配置; BIT[8:7] 配置 GAIN2,BIT[6:4 ] 配置 GAIN1,具体增益表参考 Section26.3.4 |
5’d0 |
[3] |
RW |
Bypass_pga pga旁路信号 1:旁路pga 0:不旁路 |
1’b0 |
[2] |
RW |
Bypass_ref 内部参考电压旁路信号 1:旁路内部参考电压 0:不旁路 |
1’b0 |
[1] |
RW |
Chop_enp PGA斩波使能信号 1:使能 0:不使能 |
1’b0 |
[0] |
RW |
En_pga Pga使能信号 1:使能 0:不使能 |
1’b0 |
TEMP配置寄存器
位 |
访问 |
操作说明 |
复位值 |
[5:4] |
RW |
Gain_temp temp 增益控制 编码 Gain 00 – 2 01 – 4 10 – 6 11 – 8 |
2’d0 |
[3:2] |
RO |
RSV |
2’b0 |
[1] |
RW |
Cal_offset_temp12 TEMPSEN offset 校准功能 |
1’b0 |
[0] |
RW |
ON_TEMP 1:temp 使能 0:temp 不使能 |
1’b0 |
ADC功能配置寄存器
位 |
访问 |
操作说明 |
复位值 |
[29:20] |
RW |
ana_swth_time 软件切换数据通道之后,模拟电路保持稳定需要的时间,默认为80个 pclk,即2us |
10’h050 |
[19:18] |
RO |
RSV |
2’b0 |
[17:8] |
RW |
ana_init_time 软件启动 adc_start 后,模拟电路保持稳定需要的时间,默认为80个 pclk,即2us |
10’h050 |
[7] |
RO |
RSV |
1’b0 |
[6] |
RW |
Cmp_pol 0: adc_result >= cmp_value 时产生中断 1:adc_result < cm p_value 时产生中断 |
1’b0 |
[5] |
RW |
Cmp_int_ena 1:比较中断使能 0:比较中断不使能 |
1’b0 |
[4] |
RW |
Adc_cmp_enable 1:adc 比较功能使能 0:adc 比较功能不使能 |
1’b0 |
[3:2] |
RO |
Reserved |
2‘b0 |
[1] |
RW |
Adc_int_ena 1:ADC 数据转换中断使能 0:ADC 数据转换中断不使能 |
1’b0 |
[0] |
RW |
Adc_dma_enable 1:dma使能 0:dma不使能 |
1’b0 |
ADC中断状态寄存器
位 |
访问 |
操作说明 |
复位值 |
[1] |
RW |
Cmp_int 比较中断标志位,硬件置位,软件写1清零 |
1’b0 |
[0] |
RW |
Adc_int 数据转换完成中断,硬件置位,软件写1清零 |
1’b0 |
比较阈值寄存器
位 |
访问 |
操作说明 |
复位值 |
[17:0] |
R/W |
Cmp_value 要比较的数值 |
18‘h00000 |
Touch Sensor
模块功能概述
模块基本功能如下:
支持最多16路Touch Sensor扫描;
记录每路Touch Sensor 扫描结果;
通过中断上报扫描结果;
功能使用说明
W800系统中集成触摸按键模块,基本原理是当按键被触摸时,按键上电路的电容值会发生变化,从而影响模块中输出时钟频率。通过检测模块的输出时钟的频率,可以判断电容值是否发生变化,从而判断按键的状态。
此数字模块的基本功能为每隔一定时间逐次扫描每个触摸按键的状态,在设定的时间窗口内计数并记录下每个按键的状态。如果超过设定的阈值,则判断该按键被触摸,通过中断上报给MCU系统。

基本工作流程
1. 设置Touch_CR 寄存器,配置扫描周期,扫描窗口,以及选择需要扫描的IO。Touch_CR中scan_period为每次扫描的间隔周期,单位为16ms。即如果寄存器设置为10,则每160ms将会逐次扫描16个触摸按键。CAPDET_CNT 为扫描每个IO状态时计数的窗口,即上图的N。需要注意的是,为避免切换通道导致的抖动,每次切换扫描IO后在第三个脉冲开始才会开始计数,因此如过该寄存器设置为N,则实际计数窗口为N-2。
2. 设置每个Touch IO 对应的计数阈值。如果扫描的结果超过基数+阈值,则可认为该按键被触摸;
使能Touch_CR[0], 模块开始工作。
4. 在使能触摸按键模块后,硬件会先逐次扫描选中的IO,并将各个IO的计数值存储下来,作为基数。然后每隔一个scan_period 逐次扫描选中的IO,将当前扫描的值存储下来。所有IO扫描完毕以后会将每个IO的计数值与基数做比较,如果当前值>基数+阈值,则认为此按键被触摸,寄存器0x44中PAD_STATUS中对应位会被置位为1,并通过中断上报给系统。PAD_STAUS写1 清0。
寄存器列表:
偏移地址 |
名称 |
缩写 |
描述 |
默认值 |
0X0000_0000 |
控制寄存器 |
Touch_CR |
Touch Sensor 控制器设置 |
0X0000_0000 |
0X0000_0004 ~ 0X0000_0040 |
触控按键单路控制 |
Touch_Sensor x |
每路触控按键阈值控制与计数值 |
0X0000_0000 |
0x0000_0044 |
中断控制器 |
Int_Source |
中断控制 |
0X0000_0000 |
Touch Sensor控制寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:26] |
RW |
Scan_period 扫描周期,单位为16ms;例如 scan_period 设置为6’d10, 则每160ms扫描一次按键状态 |
6’d10 |
[25:20] |
RW |
CAPDET_CNT 选择CAPDET 输出脉冲数作为计数窗口。 注: 为避免切换通道导致的抖动,在第三个脉冲开始才会开始计数,因此如此寄存器设置为N,则实际计数 窗口为N-2。例如设置为6’d20 ,则以18个 CAPDET 脉冲的周期为计数窗口。 |
6’d20 |
[19:4] |
RW |
Touch Sensor 按键选择;扫描对应 bit 的触摸按键状态。 0x0000:不扫描 0x0001:扫描第一个按键 0x0002:扫描第二个按键 0x0003: 扫描第一个和第二个按键 … 0xFFFF: 扫描所有16个按键 |
16’d0 |
[3:1] |
RW |
RSV |
3’d0 |
[0] |
RW |
触摸按键控制器使能 1’b0 1:使能触摸按键扫描 0:关闭触摸按键扫描 |
1’b0 |
触摸按键单路控制寄存器
位 |
访问 |
操作说明 |
复位值 |
[22:8] |
RO |
Touch Senor 1 计数值 |
16’d0 |
[7] |
RO |
RSV |
1’b0 |
[6:0] |
RW |
Touch Senor 1 阈值 |
7’d50 |
中断控制寄存器
位 |
访问 |
操作说明 |
复位值 |
[31:16] |
RW |
INT_EN 对应 bit 为1时表示对应 IO 被触发会产生中断 对应 bit 为1时表示对应 IO 被触发不会产生中断 |
16’d0 |
[15:0] |
RW |
PAD_STATUS / INT_SOURCE bit 为1时表示对应 PAD 被触发 bit 为0时表示对应 PAD 未触发 写1清0 |
16‘d0 |
W800安全架构设计
功能概述
XT804通过HPROT信号表示总线访问的安全特性
0 |
1 |
|
HPROT[3] |
uncacheable |
cacheable |
HPROT[2] |
un-security |
security |
HPROT[1] |
User |
super |
HPROT[0] |
Code |
data |
W800对安全架构的支持分为对sram的安全访问控制和对外设的访问控制。
SRAM安全访问控制器(SASC)
一级总线SRAM,二级总线SRAM和FLASH各有一个安全访问控制器,每个SASC控制的存储空间都有如下的安全特性
8个可配置的安全区域
每个安全区域最小可配置为4个字节
Security-super可以对所有区域进行没有限制的访问
如果CPU通过AHB总线上的访问被拒绝会产生错误的应答信号(HRESP=1),从而引发访问异常。
如果是总线上其它主设备比如DMA等访问被拒绝不会产生异常。
可信IP控制器(TIPC)
挂在APB总线上,用于配置包括一级总线,二级总线和APB总线上所有外设的信任权限。如果外设被配置为可信设备(ip_trust_vld=1),则只有总线上的访问是security(HPROT[2]=1 或PPROT[2]=1)时,才能正常访问外设,否则读写都会被拒绝。
安全架构框图


寄存器说明
SASC寄存器列表
名称 |
移地址 |
位阈 |
说明 |
复位值 |
CAR |
0x0 |
[31:16] |
保留未用 |
– |
[15:14] |
sram region7 配置属性,同 region0 |
2’b00 |
||
[13:12] |
sram region6 配置属性,同 region0 |
2’b00 |
||
[11:10] |
sram region5 配置属性,同 region0 |
2’b00 |
||
[9:8] |
sram region4 配置属性,同 region0 |
2’b00 |
||
[7:6] |
sram region3 配置属性,同 region0 |
2’b00 |
||
[5:4] |
sram region2 配置属性,同 region0 |
2’b00 |
||
[3:2] |
sram region1 配置属性,同 region0 |
2’b00 |
||
[1:0] |
sram region0 配置属性 00: un-security - user 01: un-security - super 10: security-user 11: security-super |
2’b00 |
||
CR |
0x4 |
31:8 |
未用保留 |
– |
7 |
region7属性控制寄存器,同 region0 |
|||
6 |
region6属性控制寄存器,同 region0 |
|||
5 |
region5属性控制寄存器,同 region0 |
|||
4 |
region4属性控制寄存器,同 region0 |
|||
3 |
region3属性控制寄存器,同 region0 |
|||
2 |
region2属性控制寄存器,同 region0 |
|||
1 |
region1属性控制寄存器,同 region0 |
|||
0 |
region0属性控制寄存器 0:属性无效 1:属性有效 |
|||
AP0 |
0x8 |
[31:16] |
保留未用 |
|
[15:14] |
region7 AP配置,适用于 un-security - user |
|||
[13:12] |
region6 AP配置,适用于 un-security - user |
|||
[11:10] |
region5 AP配置,适用于 un-security - user |
|||
[9:8] |
region4 AP配置,适用于 un-security - user |
|||
[7:6] |
region3 AP配置,适用于 un-security - user |
|||
[5:4] |
region2 AP配置,适用于 un-security - user |
|||
[3:2] |
region1 AP配置,适用于 un-security - user |
|||
[1:0] |
region0 AP配置,适用于 un-security - user 00:R/W 01:RO 10:WO 11: No Access |
|||
CD0 |
0xC |
[31:16] |
保留未用 |
|
[15:14] |
region7 CD配置,适用于 un-security - user |
|||
[13:12] |
region6 CD配置,适用于 un-security - user |
|||
[11:10] |
region5 CD配置,适用于 un-security - user |
|||
[9:8] |
region4 CD配置,适用于 un-security - user |
|||
[7:6] |
region3 CD配置,适用于 un-security - user |
|||
[5:4] |
region2 CD配置,适用于 un-security - user |
|||
[3:2] |
region1 CD配置,适用于 un-security - user |
|||
[1:0] |
region0 CD配置,适用于 un-security - user 00: Date Access , Opcode Feche 01: Data Access 10: Opcode Feche 11: Data, Opcode all deny |
|||
AP1 |
0x10 |
[31:16] |
保留未用 |
|
[15:14] |
region7 AP配置,适用于un-security -super |
|||
[13:12] |
region6 AP配置,适用于un-security -super |
|||
[11:10] |
region5 AP配置,适用于un-security -super |
|||
[9:8] |
region4 AP配置,适用于un-security -super |
|||
[7:6] |
region3 AP配置,适用于un-security -super |
|||
[5:4] |
region2 AP配置,适用于un-security -super |
|||
[3:2] |
region1 AP配置,适用于un-security -super |
|||
[1:0] |
region0 AP配置,适用于un-security -super 00:R/W 01:RO 10:WO 11: No Access |
|||
CD1 |
0x14 |
[31:16] |
保留未用 |
|
[15:14] |
region7 CD配置,适用于un-security -super |
|||
[13:12] |
region6 CD配置,适用于un-security -super |
|||
[11:10] |
region5 CD配置,适用于un-security -super |
|||
[9:8] |
region4 CD配置,适用于un-security -super |
|||
[7:6] |
region3 CD配置,适用于un-security -super |
|||
[5:4] |
region2 CD配置,适用于un-security -super |
|||
[3:2] |
region1 CD配置,适用于un-security -super |
|||
[1:0] |
region0 CD配置,适用于un-security -super 00: Date Access , Opcode Feche 01: Data Access 10: Opcode Feche 11: Data, Opcode all deny |
|||
AP2 |
0x18 |
[31:16] |
保留未用 |
|
[15:14] |
region7 AP配置,适用于 security-user |
|||
[13:12] |
region6 AP配置,适用于 security-user |
|||
[11:10] |
region5 AP配置,适用于 security-user |
|||
[9:8] |
region4 AP配置,适用于 security-user |
|||
[7:6] |
region3 AP配置,适用于 security-user |
|||
[5:4] |
region2 AP配置,适用于 security-user |
|||
[3:2] |
region1 AP配置,适用于 security-user |
|||
[1:0] |
region0 AP配置,适用于 security-user 00:R/W 01:RO 10:WO 11: No Access |
|||
CD2 |
0x1C |
[31:16] |
保留未用 |
|
[15:14] |
region7 CD配置,适用于 security-user |
|||
[13:12] |
region6 CD配置,适用于 security-user |
|||
[11:10] |
region5 CD配置,适用于 security-user |
|||
[9:8] |
region4 CD配置,适用于 security-user |
|||
[7:6] |
region3 CD配置,适用于 security-user |
|||
[5:4] |
region2 CD配置,适用于 security-user |
|||
[3:2] |
region1 CD配置,适用于 security-user |
|||
[1:0] |
region0 CD配置,适用于 security-user 00: Date Access , Opcode Feche 01: Data Access 10: Opcode Feche 11: Data, Opcode all deny |
|||
REGION0 |
0x20 |
31:n+1 |
保留 |
0 |
n:8 |
BAddr0,region0基地址,n与sram大小相关, sram=32kB,n=20 sram=64kB, n=21 |
|||
7:5 |
保留 |
3’b000 |
||
4:0 |
RSize,region0 size 00101: 4B 00110: 8B …… 10001: 16KB 10010: 32KB …… |
|||
REGION1 |
0x24 |
31:n+1 |
保留 |
0 |
n:8 |
Baddr1,region1基地址 |
|||
7:5 |
保留 |
3’b000 |
||
4:0 |
region1 size |
|||
REGION2 |
0x28 |
31:n+1 |
保留 |
0 |
n:8 |
region2基地址 |
|||
7:5 |
保留 |
3’b000 |
||
4:0 |
region2 size |
|||
REGION3 |
0x2C |
31:n+1 |
保留 |
0 |
n:8 |
region3基地址 |
|||
7:5 |
保留 |
3’b000 |
||
4:0 |
region3 size |
|||
REGION4 |
0x30 |
31:n+1 |
保留 |
0 |
n:8 |
region4基地址 |
|||
7:5 |
保留 |
3’b000 |
||
4:0 |
region4 size |
|||
REGION5 |
0x34 |
31:n+1 |
保留 |
0 |
n:8 |
region5基地址 |
|||
7:5 |
保留 |
3’b000 |
||
4:0 |
region5 size |
|||
REGION6 |
0x38 |
31:n+1 |
保留 |
0 |
n:8 |
region6基地址 |
|||
7:5 |
保留 |
3’b000 |
||
4:0 |
region6 size |
|||
REGION7 |
0x3C |
31:n+1 |
保留 |
0 |
n:8 |
region7基地址 |
|||
7:5 |
保留 |
3’b000 |
||
4:0 |
region7 size |
TIPC寄存器
名称 |
移地址 |
位阈 |
说明 |
复位值 |
ip_trust_vld0 |
0x0 |
31:18 |
未用 |
0 |
17 |
BT modem可信属性 1:可信 0:不可信 |
0 |
||
16 |
I2S可信属性 |
0 |
||
15 |
PWM可信属性 |
0 |
||
14 |
LCD driver可信属性 |
0 |
||
13 |
RF controller可信属性 |
0 |
||
12 |
timer可信属性 |
0 |
||
11 |
watch dog可信属性 |
0 |
||
10 |
PORTB可信属性 |
0 |
||
9 |
PORTA可信属性 |
0 |
||
8 |
UART5可信属性 |
0 |
||
7 |
UART4可信属性 |
0 |
||
6 |
UART3可信属性 |
0 |
||
5 |
UART2可信属性 |
0 |
||
4 |
UART1可信属性 |
0 |
||
3 |
UART0可信属性 |
0 |
||
2 |
SPI MASTER可信属性 |
0 |
||
1 |
SAR ADC可信属性 |
0 |
||
0 |
I2C可信属性 |
0 |
||
ip_trust_vld1 |
0x4 |
31:18 |
未用 |
0 |
17 |
RF BIST可信属性配置 1:可信 0:不可信 |
0 |
||
16 |
SDIO Wrapper可信属性 |
|||
15 |
SPI_HS可信属性 |
0 |
||
14 |
SDIO可信属性 |
0 |
||
13 |
未用 |
0 |
||
12 |
SEC可信属性 |
0 |
||
11 |
MAC可信属性 |
0 |
||
10 |
BBP可信属性 |
0 |
||
9 |
MMU可信属性 |
0 |
||
8 |
时钟复位控制模块可信属性 |
0 |
||
7 |
PMU可信属性 |
0 |
||
6 |
BT可信属性 |
0 |
||
5 |
GPSEC可信属性 |
0 |
||
4 |
DMA可信属性 |
0 |
||
3 |
RSA可信属性 |
0 |
||
2 |
PSRAM控制器可信属性 |
0 |
||
1 |
FLASH控制器可信属性 |
0 |
||
0 |
SDIO HOST 可信属性 |
0 |
使用说明
内存安全访问(SASC)
寄存器的访问权限
SASC 寄存器的访问按照以下原则:
CAR 寄存器只能在 cpu 为 security-super 时进行读写。
当 cpu 处于 un-security -super 时,可以访问被配置为 un-security - user 的 region 相关寄存器位。
当 cpu 为 security-super 时,可以读写所有寄存器。
其它情况下寄存器都不可访问
例如当CAR设为16’he4e4时,表示 region0 和 region4 被设为 un-security - user,此时如果 cpu 处于 un-security -super,则 cpu 可以读写寄存器 REGION0 和 REGION4,以及CR[0], CR[4], APx[1:0], APx[9:8], CDx[1:0], CDx[9:8]。
保护区间地址的设置
每个 ASC 都支持8个可配置的存储器保护区间 region,REGIONx[31:8]中的基地址为想要配置的存储区间实际物理地址的25到2位,同时,Size 的大小和基地址需要满足下面的要求:
SIZE
00101: 4B;
00110: 8B; Baddrx[0] = 0
00111: 16B; Baddrx[1:0] = 0
01000: 32B; Baddrx[2:0] = 0
01001: 64B; Baddrx[3:0] = 0
01010: 128B; Baddrx[4:0] = 0
01011: 256B; Baddrx[5:0] = 0
01100: 512B; Baddrx[6:0] = 0
01101:1KB; Baddrx[7:0] = 0
01110: 2KB; Baddrx[8:0] = 0
01111:4KB; Baddrx[9:0] = 0
10000: 8KB; Baddrx[10:0] = 0
10001: 16KB; Baddrx[11:0] = 0
例如,如果将20000100作为region0的基地址,那么region0最大可以设为256B,如果想将region0设为128B,REGION0寄存器应填入0x0000400a。如果将20040000作为基地址,则该region最大可设为64KB,如果就要定义一个64KB的region,则该寄存器应填入0x01000013。
存储器的访问权限

根据上图
security-super 的总线访问可以随意访问 sram
un-security -super 的总线访问可以随意访问被配置为 un-security - user 的 region
security-user 的总线访问只能按当前 AP 和 CD 属性访问 security-user 的 region
un-security -super 的总线访问可以按当前 AP 和 CD 属性访问 un-security -super 的 region
un-security - user 的总线访问只能按当前 AP 和 CD 属性访问 un-security - user 的 region
APx 和 CDx 寄存器用于设置每个 region 对应于不同权限时的访问属性,其中 CDx 寄存器只在总线访问时读操作时有效,也就是设置是否允许读数据和读指令。APx寄存器用于设置是否允许读/写操作。
例如如果 CAR[1:0]设为00,并且 CR[0]为1,表示 REGION 0 为 un-security - user,并且使能权限保护,此时如果总线访问为 security-super 或 un-security -super,则可以随意访问 REGION 0;如果总线访问为 Security- user,则任何访问都会被拒绝;如果总线访问为 un-security - user,AP0[1:0]为01,表示只读,CD0[1:0]为01,表示数据访问,则 REGION 0允许总线读数据,其它操作均被拒绝。
如果AHB总线的访问了不能访问的区域或权限不对,则sasc模块会给出read deny或write deny信号,从而返回错误的HRESP应答信号,如果发起总线访问的是CPU,则会产生硬件异常中断,如果是其它设备,则只会拒绝访问。
外设的可信访问
TIPC模块只有PROT[2]信号为1时才能写入,即只有在可信世界才能写入各个IP的可信属性配置寄存器。Ip_trust_vld寄存器默认都为0,即所有外设都是不可信的,此时外设可以随意访问,如果外设对应的ip_trust_vld被置位,也就是把外设设为可信设备,则只有可信世界的命令可以访问该外设。

附录1. 芯片引脚定义
芯片引脚分布

图 38 W800芯片引脚分布
芯片引脚复用关系
编号 |
名称 |
类型 |
复位后管脚功能 |
复用功能 |
最高频率 |
上下拉能力 |
驱动能力 |
1 |
PB_20 |
I/O |
UART_RX |
UART0_RX / PWM 1 / UART1 _CTS / I²C_SCL |
10MHz |
UP/DOWN |
12mA |
2 |
PB_19 |
I/O |
UART_TX |
UART0_TX / PWM 0 / UART1 _RTS / I²C_SDA |
10MHz |
UP/DOWN |
12mA |
3 |
WAKEUP |
I |
WAKEUP 唤醒功能 |
DOWN |
|||
4 |
RESET |
I |
RESET 复位 |
UP |
|||
5 |
XTAL_OUT |
O |
外部晶振输出 |
||||
6 |
XTAL_IN |
I |
外部晶振输入 |
||||
7 |
AVDD33 |
P |
芯片电源,3.3V |
||||
8 |
ANT |
I/O |
射频天线 |
||||
9 |
AVDD33 |
P |
芯片电源,3.3V |
||||
10 |
AVDD33 |
P |
芯片电源,3.3V |
||||
11 |
AVDD33 _AUX |
P |
芯片电源,3.3V |
||||
12 |
TEST |
I |
测试功能配置管脚 |
||||
13 |
BOOTMO DE |
I/O |
BOOTMO DE |
I²S_MCLK / LSPI_CS / PWM2 / I²S_DO |
20MHz |
UP/DOWN |
12mA |
14 |
PA_1 |
I/O |
JTAG_CK |
JTAG_CK / I²C_SCL / PWM3 / I²S _LRCK / ADC0 |
20MHz |
UP/DOWN |
12mA |
15 |
PA_4 |
I/O |
JTAG_SWO |
JTAG_SWO / I²C_SDA / PWM4 / I²S_BCK / ADC1 |
20MHz |
UP/DOWN |
12mA |
16 |
PA_7 |
I/O |
GPIO,输 入,高阻 |
PWM4 / LI_MO SI / I²S_MCK / I²S_DI / Touch0 |
20MHz |
UP/DOWN |
12mA |
17 |
VDD33IO |
P |
IO电源,3.3V |
||||
18 |
PB_0 |
I/O |
GPIO,输 入,高阻 |
PWM0 / LI_MISO / UART3 _TX / PSRAM_CK / Touch3 |
80MHz |
UP/DOWN |
12mA |
19 |
PB_1 |
I/O |
GPIO,输 入,高阻 |
PWM1 / LI_CK / UART3 _RX / PSRAM_CS / Touch4 |
80MHz |
UP/DOWN |
12mA |
20 |
PB_2 |
I/O |
GPIO,输 入,高阻 |
PWM2 / LI_CK / UART2 _TX / PSRAM_D0 / Touch5 |
80MHz |
UP/DOWN |
12mA |
21 |
PB_3 |
I/O |
GPIO,输 入,高阻 |
PWM3 / LI_MISO / UART2 _RX / PSRAM_D1 / Touch6 |
80MHz |
UP/DOWN |
12mA |
22 |
PB_4 |
I/O |
GPIO,输 入,高阻 |
LSPI _CUART2 _RTS / UART4_TX / PSRAM_D2 / Touch7 |
80MHz |
UP/DOWN |
12mA |
23 |
PB_5 |
I/O |
GPIO,输 入,高阻 |
LSPI_MI / UART2 _CTS / UART4_RX / PSARM_D3 / TouCh8 |
80MHz |
UP/DOWN |
12mA |
24 |
VDD33IO |
P |
IO电源,3.3V |
||||
25 |
CAP |
I |
外接电容,1µF |
||||
26 |
PB_6 |
I/O |
GPIO,输 入,高阻 |
UART1_TX / MMC_CLK / hSPI_CK / SDIO_CK / Touch9 |
50MHz |
UP/DOW |
12mA |
27 |
PB_7 |
I/O |
GPIO,输 入,高阻 |
UART1_TX / MMC_CMD / hSPI_INT / SDIO _CMD / Touch10 |
50MHz |
UP/DOW |
12mA |
28 |
PB_8 |
I/O |
GPIO,输 入,高阻 |
I²S _BCMMC _D0 / PWM _BREAK /SDIO_D0 / Touch11 |
50MHz |
UP/DOWN |
12mA |
29 |
PB_9 |
I/O |
GPIO,输入,高阻 |
I²S_LR / MMC_D1 / HSPI _CS / SDIO_D1 / Touch12 |
50MHz |
UP/DOWN |
12mA |
30 |
PB_10 |
I/O |
GPIO,输 入,高阻 |
I²S _DIMC _D2 / HSPI_DI / SDIO_D2 |
50MHz |
UP/DOWN |
12mA |
31 |
VDD33IO |
P |
IO电源,3.3V |
||||
32 |
PB_11 |
I/O |
GPIO,输 入,高阻 |
I²S _DOMC _D3 / HSPI_DO / SDIO_D3 |
50MHz |
UP/DOWN |
12mA |
33 |
GND |
P |
接地 |
声明
北京联盛德微电子有限责任公司保留随时修改、更新联盛德微电子产品或者各种文档、资料的权利。所有更新会通过联盛德微电子官方渠道进行发布。使用者必须确保通过官方渠道获取正确的信息。联盛德微电子不承诺将更新信息对所有人进行通知。