您好,欢迎来到华佗小知识。
搜索
您的当前位置:首页第11章 USB设备控制器

第11章 USB设备控制器

来源:华佗小知识
目录

· ·····················································································1第11章 USB 设备控制器

11.111.211.311.411.511.611.711.811.9

11.10

11.1111.1211.1311.1411.1511.16

如何阅读本章················································································································1基本配置························································································································1简介································································································································1特性································································································································2固定的端点配置·············································································································2功能描述························································································································3操作概述························································································································4引脚描述························································································································5时钟和功率管理·············································································································5寄存器描述····················································································································6中断处理······················································································································27串行接口引擎命令描述·······························································································28USB设备控制器的初始化··························································································36从模式操作··················································································································37DMA操作····················································································································38双缓冲的端点操作·······································································································47

LPC1700用户手册IIII第 11 章

第11章USB设备控制器

11.1如何阅读本章

本章描述了所有LPC1700系列Cortex-M3微控制器器件上的USB设备控制器。

11.2基本配置

使用下列寄存器来配置USB控制器:a)功率:在PCONP寄存器中置位PCUSB。

注:复位时,USB模块被禁止(PCUSB=0)。

b)时钟:USB模块与特定的PLL(或主PLL)一起使用来获得USB时钟(见\"PLL1寄存

器描述\")。

c)管脚:使用PINSEL0~PINSEL5和PINMODE0~PINMODE5来选择USB管脚及其模式,

见\"引脚连接模块\"章节的\"寄存器描述\"小节。

d)唤醒:USB总线端口上的活动可将微控制器从掉电模式中唤醒,见\"计时和功率控制\"

章节的\"从低功耗模式中唤醒\"小节。

e)中断:使用相关的中断设置使能寄存器在NVIC中将中断使能。f)初始化:见本章的\"USB设备控制器初始化\"描述。

11.3简介

通用串行总线(USB)为4线总线,支持一个主机与一个或多个外设(高达127个)之间的通信。主控制器通过一个基于令牌的协议为连接的设备分配USB带宽。USB总线支持设备的热插拔与动态配置。主控制器启动所有的事务处理。

SOF)标记和与设备端点进行往返主机将事务安排在1ms的帧中。每帧都包含一个帧开始(

数据传输的事务。每一个设备最多可以具有16个逻辑端点或32个物理端点。针对端点定义了4种传输类型。控制传输可用来对设备进行配置。中断传输则用于周期数据传输。批量传输在对传输速率没有严格要求时使用。同步传输保证了传输时间,但没有纠错功能。

通用串行总线的详细信息请参考USB规范制订者论坛(USBImplementersForum)的网站。LPC1700系列Cortex-M3微控制器的USB设备控制器使能与USB主控制器之间的全速(12Mb/s)数据交换。

表11.1

缩写词AHBATLEATXDDDDPDMAEOPEP先进的高性能总线自动传输长度提取模拟收发器DMA描述符DMA描述指针直接存储器访问信息包结束端点本章用到的与USB相关的首字母缩写词、简写以及定义

定义LPC1700用户手册11第 11 章续上表

缩写词EP_RAMFSLEDLSMPSNAKPLLRAMSOFSIESRAMUDCAUSB端点RAM全速发光二极管低速最大信息包容量否定应答锁相环随机访问存储器帧开始串行接口引擎同步RAMUSB设备通信区域通用串行总线定义11.4特性

?????????

完全兼容USB2.0全速规范;

支持32个物理(16个逻辑)端点;

支持控制、批量、中断和同步端点;运行时,可调整使用的端点;

运行时,可通过软件选择端点最大包长度(可达到USB规范规定的最大长度);支持SoftConnect和GoodLink特性;所有非控制端点支持DMA传输;

允许CPU控制和DMA模式之间的动态切换;实现了批量端点和同步端点上的双缓冲。

11.5固定的端点配置

表11.2列出了所支持的端点配置。端点在运行时利用端点使用寄存器来使用端点并进行配置,见\"端点使用寄存器\"的描述。

表11.2

逻辑端点00112233445LPC1700用户手册22物理端点0123456710端点类型控制控制中断中断批量批量同步同步中断中断批量固定的端点配置

方向OutInOutIn数据包长度(字节)8,16,32,8,16,32,1~1~双缓冲无无无无有有有有无无有OutInOutIn8,16,32,8,16,32,1~10231~1023OutIn1~1~Out8,16,32,第 11 章续上表

逻辑端点56677101011111212131314141515物理端点111213141516171819202122232425262728293031端点类型批量同步同步中断中断批量批量同步同步中断中断批量批量同步同步中断中断批量批量批量批量方向InOutIn数据包长度(字节)8,16,32,1~10231~1023双缓冲有有有无无有有有有无无有有有有无无有有有有OutIn1~1~OutInOutIn8,16,32,8,16,32,1~10231~1023OutIn1~1~OutInOutIn8,16,32,8,16,32,1~10231~1023OutIn1~1~OutInOutIn8,16,32,8,16,32,8,16,32,8,16,32,11.6功能描述

USB设备控制器的结构如图11.1所示。

图11.1USB设备控制器方框图

11.6.1模拟收发器

USB设备控制器有一个内置的模拟收发器(ATX)。USBATX发送/接收USB总线的双向D+和D-信号。

LPC1700用户手册33第 11 章

11.6.2

串行接口引擎(SIE)

SIE实现全速USB协议层。从速度角度来看,它完全是线缆硬连接的(hardwired),不需要任何固件干涉。SIE对EP_RAM中的端点缓冲区与USB总线之间的数据传输进行处理。该模块的功能包括:同步模式识别,并行/串行转换,位填充/解除填充、CRC校验/产生、PID验证/生成、地址识别和握手信号的评估/生成。11.6.3

端点RAM(EP_RAM)

SRAM称作EP_RAM。每个端点缓冲区都以基于FIFO的SRAM形式实现。专用于此用途的

EP_RAM空间由使用的端点数、每个已实现的端点在EP_RAM中都有一个保留空间。所需的总的端点的最大包长度以及端点是否支持双缓冲来决定。11.6.4

EP_RAM访问控制

EP_RAM访问控制逻辑对EP_RAM和能够访问EP_RAM的3个源之间的数据传输进行处

理。这3个源指的是CPU(通过寄存器接口进行访问)、SIE和DMA引擎。11.6.5

DMA引擎和总线主机接口

当某个端点的DMA引擎使能时,它在AHB总线上的RAM与EP_RAM中的端点缓冲区之间传输数据。所有端点共用一个DMA通道。在传输数据时,DMA引擎通过总线主机接口作为AHB总线上的主机运行。11.6.6

寄存器接口

寄存器接口允许CPU来控制USB设备控制器的操作。而且在将发送数据写入控制器以及从控制器中读取接收数据时也会用到寄存器接口。11.6.7

SoftConnect

USB连接可通过一个1.5kΩ上拉电阻将D+(对于全速设备)拉为高电平来实现。在确立与USB连接之前,软件可以使用SoftConnect特性来完成其初始化序列。该特性还可以在无需拔下电缆的情况下执行USB总线连接的重新初始化。

在使用SoftConnect特性时,CONNECT信号应控制一个外部开关,这个开关与D+和+3.3V之间的1.5kΩ电阻相连。然后,通过使用SIE设置设备状态命令来对CON位执行写操作,从而实现软件对CONNECT信号的控制。11.6.8

GoodLink

GoodLink技术可用于指示USB连接是否良好。在成功地对设备进行清点和配置之后,LED指示器将永久接通。在挂起期间,LED是关闭的。

该特性对USB设备的状态提供一个用户友好的指示。它是一个非常有用的区域诊断工具,可以将故障设备分离出来。

在使用GoodLink特性时,UP_LED信号用于控制LED。UP_LED信号使用SIE配置设备命令来控制。

11.7操作概述

USB总线事务在设备端点和主机之间传输数据。事务的方向由主机一方定义。OUT事务指的是将数据从主机传送到设备。IN事务指的是将数据从设备传送主机。所有的事务都由主控制器启动。

LPC1700用户手册44第 11 章

对于OUT事务,USBATX接收USB总线的双向D+和D-信号。串行接口引擎(SIE)从ATX中接收串行数据并将它转换为并行数据流。并行数据会被写入EP_RAM的对应的端点缓冲区中。

对于IN事务,SIE从EP_RAM的端点缓冲区中读取并行数据,将它转换为串行数据,并使用USBATX将它传输到USB总线上。

一旦数据接收或发送完成,我们就可以对端点缓冲区进行读和写操作。这一点该如何实现由端点的类型和工作模式决定。每个端点有两种工作模式:从(CPU控制的)模式和DMA模式。在从模式中,CPU使用寄存器接口在RAM和端点缓冲区之间传输数据。从模式的详细描述请参考\"从模式操作\"章节。

在DMA模式中,DMA在RAM和端点缓冲区之间传输数据。DMA模式的详细描述请参考\"DMA操作\"章节。

11.8引脚描述

表11.3

名称VBUSUSB_CONNECTUSB_UP_LEDUSB_D+USB_D-方向IOOI/OI/OUSB外部接口

描述VBUS状态输入。在没有通过对应的PINSEL寄存器将功能使能时,它在内部驱动为高电平SoftConnect控制信号GoodLinkLED控制信号正向差分数据反向差分数据11.9时钟和功率管理

本小节描述了USB设备控制器的时钟和功率管理特性。11.9.1

功率要求

USB协议坚决要求对USB设备进行功率管理。如果USB设备从总线中汲取功率(总线供电设备),则功率管理将变得非常重要。一个由总线供电的设备应满足下面的约束条件:

a)一个处于未配置状态的设备从总线中汲取的最大电流应为100mA。

b)一个已配置好的设备能够汲取的电流最高只能达到配置描述符的MaxPower字段中规定

的值。这个最大值为500mA。c)处于挂起状态的设备能够汲取的最大电流为500µA。11.9.2

时钟

表11.4所示为USB设备控制器的时钟。

表11.4

时钟源AHB主机时钟AHB从机时钟usbclkAHB主机总线接口和DMA的时钟AHB从机接口的时钟来自USB特定PLL或主PLL的48MHz时钟,用于恢复来自USB总线的12MHz时钟USB设备控制器时钟源

描述11.9.3功率管理支持

LPC1700用户手册55第 11 章

为了节省功率,USB设备控制器在没有使用时自动禁止AHB主时钟和usbclk。

当USB设备控制器进入挂起状态时(总线在3ms内保持空闲),设备控制器的usbclk输入将自动禁能,有助于节省功率。但如果软件希望访问设备控制器的寄存器,则usbclk必须有效。若想在设备处于挂起状态时对设备控制器的寄存器进行访问,则必须使用USBClkCtrl寄存器和USBClkSt寄存器。

当软件希望访问设备控制器的寄存器时,首先,它应该通过置位USBClkCtrl寄存器中的DEV_CLK_EN以保证usbclk使能,然后查询USBClkSt寄存器中对应的DEV_CLK_ON位,直到该位置位。一旦DEV_CLK_ON置位,在软件将DEV_CLK_EN清零之前,usbclk会一直保持使能。

在进行DMA传输时,设备控制器自动开启AHB主时钟。一旦AHB主时钟启动,它将在至少2ms(2帧)内保持有效,这样有助于确保DMA吞吐量不受到AHB主时钟关闭的影响。在上一次DMA访问之后2ms,AHB主时钟自动禁能以节省功率。如有需要,软件还可以使用USBClkCtrl寄存器强制该时钟保持使能。

需要注意的是只要PCONP的PCUSB位置位,AHB从时钟将始终是使能的。如果没有使用设备控制器,则将PCUSB清零即可以将该控制器的所有时钟禁能。

使用USB_NEED_CLK信号可使芯片进入掉电模式或从掉电模式中唤醒变得非常容易。如果USBClkSt寄存器中的任何一个位有效,则USB_NEED_CLK有效。

当设备在DEV_CLK_EN和AHB_CLK_EN均为清零的情况下进入挂起状态之后,DEV_CLK_ON和AHB_CLK_ON在对应的时钟关闭时将清零。当这两个位都为0时,

PCON寄存器将芯片置于掉电模式。USB_NEED_CLKUSB_NEED_CLK为低电平,表示可通过写

的状态可以从USBIntSt寄存器中读取。

USB挂起状态下的任何总线活动都将使USB_NEED_CLK信号有效。当芯片处于掉电模式,

中断使能时,USB_NEED_CLK有效将会使芯片从掉电模式中唤醒。11.9.4

远程唤醒

USB设备控制器支持软件启动的远程唤醒功能。远程唤醒会恢复USB总线上由设备启动的信号。远程唤醒通过将SIE设置设备状态寄存器中的SUS位清零来实现。在写寄存器之前,必须使用USBClkCtrl寄存器将设备控制器的所有时钟使能。

11.10寄存器描述

SIE)含有通过SIE表11.5显示了CPU可直接访问的USB设备控制器寄存器。串行接口引擎(

命令寄存器进行间接访问的其它寄存器。详细信息请参考\"串行接口引擎命令描述\"。

LPC1700用户手册66第 11 章

表11.5

名称时钟控制寄存器USBClkCtrlUSBClkSt设备中断寄存器USBIntStUSBDevIntStUSB设备寄存器映射

描述访问R/WROR/WRO复位值[1]地址0x5000CFF40x5000CFF80x400FC1C00x5000C200USB时钟控制USB时钟状态USB中断状态USB设备中断状态USB设备中断使能USB设备中断清零USB设备中断设置USB设备中断优先级USB端点中断状态USB端点中断使能USB端点中断清零USB端点中断设置USB端点优先级USB使用端点USB端点索引USB最大包长度USB接收数据USB接收包长度USB发送数据USB发送包长度USB控制USB命令代码USB命令数据USBDMA请求状态USBDMA请求清零USBDMA请求设置USBUDCAHeadUSB端点DMA状态USB端点DMA使能USB端点DMA禁能USBDMA中断状态USBDMA中断使能USB传输结束中断状态0x000000000x000000000x800000000x00000010USBDevIntEnUSBDevIntClrUSBDevIntSetUSBDevIntPri端点中断寄存器USBEpIntStR/WWOWOWO0x000000000x000000000x000000000x000x5000C2040x5000C2080x5000C20C0x5000C22CRO0x000000000x5000C230USBEpIntEnUSBEpIntClrUSBEpIntSetUSBEpIntPri端点使用寄存器USBReEpUSBEpIndUSBMaxPSizeUSB传输寄存器USBRxDataUSBRxPLenUSBTxDataUSBTxPLenUSBCtrlR/WWOWOWO[2]R/WWO[2]R/W0x000000000x000000000x000000000x000000000x5000C2340x5000C2380x5000C23C0x5000C2400x000000030x000000000x000000080x5000C2440x5000C2480x5000C24CRORO0x000000000x000000000x5000C2180x5000C220WO[2]WO[2]R/WWO[2]RO0x000000000x000000000x000000000x000000000x000000000x5000C21C0x5000C2240x5000C2280x5000C2100x5000C214SIE命令寄存器USBCmdCodeUSBCmdDataDMA寄存器USBDMARStUSBDMARClrUSBDMARSetUSBUDCAHUSBEpDMAStUSBEpDMAEnUSBEpDMADisUSBDMAIntStUSBDMAIntEnUSBEoTIntStRO0x000000000x5000C250WO[2]WO[2]R/WRO0x000000000x000000000x000000000x000000000x5000C2540x5000C2580x5000C2800x5000C284WO[2]WO[2]RO0x000000000x000000000x000000000x5000C2880x5000C28C0x5000C290R/WRO0x000000000x000000000x5000C2940x5000C2A0LPC1700用户手册77第 11 章

续上表

名称USBEoTIntClrUSBEoTIntSetUSBNDDRIntStUSBNDDRIntClrUSBNDDRIntSetUSBSysErrIntStUSBSysErrIntClrUSBSysErrIntSet[1][2]

描述USB传输结束中断清除USB传输结束中断设置USB新DD请求中断状态USB新DD请求中断清除USB新DD请求中断设置USB系统错误中断状态USB系统错误中断清除USB系统错误中断设置访问WO[2]WO[2]ROWO[2]WO[2]RO复位值[1]地址0x5000C2A40x5000C2A80x000000000x000000000x000000000x000000000x000000000x000000000x000000000x5000C2AC0x5000C2B00x5000C2B40x5000C2B80x5000C2BCWO[2]WO[2]0x000000000x5000C2C0复位值只反映使用到的位中的数据。它不包括保留位的内容。读取WO寄存器将返回一个无效值。

11.10.1时钟控制寄存器

1. USB时钟控制寄存器(USBClkCtrl-0x5000CFF4)

该寄存器用于控制USB设备控制器的时钟。任何时候只要软件想访问设备控制器的寄存器,DEV_CLK_EN和AHB_CLK_EN必须置位。只有在访问USBPortSel寄存器时才需要将PORTSEL_CLK_EN位置位。

假设USBClkCtrl的对应位已经置位,软件不需要在每次寄存器访问时重复执行置位操作。需要注意的是该寄存器只有在PCONP中的PCUSB位置位时才起作用;当PCUSB清零时,不管该寄存器的内容如何,设备控制器的所有时钟都是禁止的。USBClkCtrl是一个读/写寄存器。

表11.6USBClkCtrl寄存器位描述

位01符号-DEV_CLK_EN描述保留,用户软件不应该向保留位写入1。从保留位读取的值是未定义的设备时钟使能。使能设备控制器的usbclk输入保留,用户软件不应该向保留位写入1。从保留位读取的值是未定义的端口选择寄存器的时钟使能AHB时钟使能保留,用户软件不应向保留位写入1。从保留位读出的值未被定义复位值NA0NANA0NA23431:5-PORTSEL_CLK_ENAHB_CLK_EN-2. USB时钟状态寄存器(USBClkSt-0x5000CFF8)

该寄存器用于保持时钟可用的状态。将该寄存器的位相或可以形成USB_NEED_CLK信号。当通过USBClkCtrl将一个时钟使能时,软件应该查询USBClkSt中的对应位。如果该位是置位的,则软件能够进一步进行寄存器访问。假如USBClkCtrl寄存器中的位没受到打扰,则软件不需要在每次访问时重复查询操作。USBClkSt为只读寄存器。

LPC1700用户手册88第 11 章

表11.7

位0123431:5-DEV_CLK_ON-PORTSEL_CLK_ONAHB_CLK_ON-符号USB时钟状态寄存器位描述

描述保留,用户软件不应该向保留位写入1。从保留位读取的值是未定义的设备时钟开启。设备控制器的usbclk输入有效保留,用户软件不应该向保留位写入1。从保留位读取的值是未定义的端口选择寄存器的时钟开启AHB时钟开启保留,用户软件不应向保留位写入1。从保留位读出的值未被定义复位值NA0NANA0NA11.10.2设备中断寄存器

1. USB中断状态寄存器(USBIntSt-0xE01FC1C0)

USB设备控制器有3条中断线。USB中断状态寄存器允许软件对其执行一次读操作来确定这3条中断线的状态。所有3条中断线相\"或\",连接到向量中断控制器的一个通道。该寄存器还包含USB_NEED_CLK状态位和EN_USB_INTS控制位。USBIntSt为读/写寄存器。

表11.8

位0127:3符号USB_INT_REQ_LPUSB_INT_REQ_HPUSB_INT_REQ_DMA-USB中断状态寄存器位描述

描述低优先级中断线的状态。该位为只读位高优先级中断线的状态。该位为只读位DMA中断线的状态。该位为只读位保留,用户软件不应该向保留位写入1。从保留位读取的值是未定义的USB需要时钟指示器。当检测到USB活动或检测到USB数据管脚上的状态发生改变时,该位被设置为1,而且它表示需要一个48MHz的PLL支持时钟。一旦该位为1,它就在接收到/发送最后包的5ms后或在挂起改变(SUS_CH)中断发生的2ms后复位为0。如果选择USB复位值000NA8USB_NEED_CLK总线上的活动从掉电模式中唤醒器件,那么该位从0到1的变化可唤醒微控制器。(详细信息请参考\"时钟和功率控制\"章节中的\"从低功耗模式中唤醒\"小节)。有关PLL和请求掉电模式的描述也可参考\"时钟和功率控制\"章节中的\"PLL0和掉电模式\"和\"外设功率控制寄存器(PCONP-0x400FC0C4)\"。该位为只读位保留,用户软件不应向保留位写入1。从保留位读出的值未被定义使能所有USB中断。当该位清零时,向量中断控制器将无法检测到USB中断线相或后的输出130:931-EN_USB_INTSNA1LPC1700用户手册99第 11 章

2. USB设备中断状态寄存器(USBDevIntSt-0x5000C200)

USBDevIntSt寄存器记录着各个中断的状态。'0'表示未产生中断,'1'表示中断已经出现。USBDevIntSt为只读寄存器。

表11.9

复位值:0x00000000

位符号位符号位符号位符号31-23-15-7TxENDPKT30-22-14-6RxENDPKT29-21-13-5CDFULL28-20-12-4CCEMPTY27-19-11USB设备中断状态寄存器位分配

26-18-10-2EP_SLOW25-17-9ERR_INT1EP_FAST24-16-8EP_RLZED0FRAME-3DEV_STAT表11.10

位0123456731:10符号FRAMEEP_FASTEP_SLOWDEV_STATCCEMPTYCDFULLRxENDPKTTxENDPKTEP_RLZEDERR_INT-USB设备中断状态寄存器位描述

描述每隔1ms产生一次帧中断。该位用在同步包的传输中端点的快速中断传输。如果端点中断在端点中断优先级寄存器(USBEpIntPri)中相应的位被置位,则该端点中断与EP_FAST位相关USBEpIntPri)端点的慢速中断。如果端点中断在端点中断优先级寄存器(中相应的位未置位,则该端点中断与EP_SLOW位相关该位在USB总线复位、USB挂起改变或连接改变时置位。请参考\"设置设备状态(命令:0xFE,数据:写1字节)\"小节命令代码寄存器(USBCmdCode)为空(可写入新的命令)命令数据寄存器(USBCmdData)已满(现在可以读取数据)在端点缓冲区中的当前数据包已传送给CPU传输到端点缓冲区的数据字节数与TxPacket长度寄存器(USBTxPLen)中编程设定的字节数相等端点被使用。该位在使用端点寄存器(USBReEp)或MaxPacketSize寄存器(USBMaxPSize)更新且相应的操作完成时置位错误中断。USB设备的任何总线错误中断。请参考\"读错误状态(命令:0xFB,数据:读1字节)\"保留,用户软件不应该向保留位写入1。从保留位读取的值未定义复位值0000100000NA3. USB设备中断使能寄存器(USBDevIntEn-0x5000C204)

向该寄存器中的某个位写入1时,如果USBDevIntSt中的对应位置位,则可以在其中一条中

USBDevIntPri断线上产生中断。默认是将中断发送到USB_INT_REQ_LP中断线。另外,通过改变

的值,也可以将EP_FAST或FRAME中断发送到USB_INT_REQ_HP中断线。USBDevIntEn为读/写寄存器。

LPC1700用户手册1010第 11 章

表11.11

复位值:0x00000000

位符号位符号位符号位符号31-23-15-7TxENDPKT30-22-14-6RxENDPKT29-21-13-5CDFULL28-20-12-4CCEMPTY27-19-11USB设备中断使能寄存器位分配

26-18-10-2EP_SLOW25-17-9ERR_INT1EP_FAST24-16-8EP_RLZED0FRAME-3DEV_STAT表11.12

位符号值0见上表31:0USBDevIntEn的位分配1USB设备中断使能寄存器位描述

描述没有中断产生当设备中断状态(USBDevIntSt)寄存器(表11.9)中的对应位置位时,中断产生。默认是将中断发送到USB_INT_REQ_LP中断线。另外,通过改变USBDevIntPri的值,也可以将EP_FAST或FRAME中断发送到USB_INT_REQ_HP中断线复位值04. USB设备中断清除寄存器(USBDevIntClr-0x5000C208)

向该寄存器的某个位写入1可将USBDevIntSt中的对应位清零;写入0无效。

注:在将EP_SLOW或EP_FAST中断位清零之前,USBEPIntSt中对应的端点中断也应该清零。

USBDevIntClr为只写寄存器。

表11.13

复位值:0x00000000

位符号位符号位符号位符号31-23-15-7TxENDPKT30-22-14-6RxENDPKT29-21-13-5CDFULL28-20-12-4CCEMPTY27-19-11USB设备中断清除寄存器位分配

26-18-10-2EP_SLOW25-17-9ERR_INT1EP_FAST24-16-8EP_RLZED0FRAME-3DEV_STAT表11.14

位31:0见上表USBDevIntClr的位分配符号值01USB设备中断清零寄存器位描述

描述无效USBDevIntSt寄存器(见\"USB设备中断状态寄存器\")中的相应位被清零复位值0LPC1700用户手册1111第 11 章

5. USB设备中断设置寄存器(USBDevIntSet-0x5000C20C)

向该寄存器的某个位写入1可将USBDevIntSt中的对应位置位;写入0无效。USBDevIntSet为只写寄存器。

表11.15

复位值:0x00000000

位符号位符号位符号位符号31-23-15-7TxENDPKT30-22-14-6RxENDPKT29-21-13-5CDFULL28-20-12-4CCEMPTY27-19-11USB设备中断设置寄存器位分配

26-18-10-2EP_SLOW25-17-9ERR_INT1EP_FAST24-16-8EP_RLZED0FRAME-3DEV_STAT表11.16

位31:0见上表USBDevIntSet的位分配符号值01USB设备中断设置寄存器位描述

描述无效USBDevIntSt寄存器(见\"USB设备中断状态寄存器\")中的相应位被置位复位值06. USB设备中断优先级寄存器(USBDevIntPri-0x5000C22C)

向该寄存器的某个位写入1将使对应的中断发送到USB_INT_REQ_HP中断线;写入0时将中断发送到USB_INT_REQ_LP中断线。EP_FAST或FRAME中断中的任何一个都可以发送到USB_INT_REQ_HP,但不能同时进行。如果软件试图将这两个位置位,则不向USB_INT_REQ_HP发送任何中断。USBDevIntPri为只写寄存器。

表11.17

位01符号FRAMEEP_FAST值0101-USB设备中断优先级寄存器位描述

描述FRAME中断将进入USB_INT_REQ_LPFRAME中断将进入USB_INT_REQ_HPEP_FAST中断将进入USB_INT_REQ_LPEP_FAST中断将进入USB_INT_REQ_HP保留,用户软件不应向保留位写入1。从保留位读出的值未被定义复位值007:2-NA11.10.3端点中断寄存器

该组寄存器可以简化端点中断的处理。端点中断在从模式操作中使用。1. USB端点中断状态寄存器(USBEpIntSt-0x5000C230)

每个物理非同步端点在USB端点中断状态寄存器都对应一个位,用来指示端点产生的中断。当准确接收到一个数据包时,所有异步OUT端点产生一个中断。当成功发送一个数据包或NAK握手信号发送到总线上(如果NAK中断已使能)时,所有异步IN端点也产生一个中断(参考\"设置模式\"(命令:0xF3,数据:写1字节)。该寄存器中的某个位为1时会导致USBDevIntSt寄存器中的EP_FAST或EP_SLOW位置位,具体是哪个位置位将由USBEpDevIntPri寄存器的

LPC1700用户手册1212第 11 章

对应位的值决定。USBEpIntSt为只读寄存器。需要注意的是对于同步端点,在出现FRAME中断时对数据包进行处理。

表11.18

复位值:0x00000000

位符号位符号位符号位符号31EP15TX23EP11TX15EP7TX7EP3TX30EP15RX22EP11RX14EP7RX6EP3RX29EP14TX21EP10TX13EP6TX5EP2TX28EP14RX20EP10RX12EP6RX4EP2RX27EP13TX19EP9TX11USB端点中断状态寄存器位分配

26EP13RX18EP9RX10EP5RX2EP1RX25EP12TX17EP8TX9EP4TX1EP0TX24EP12RX16EP8RX8EP4RX0EP0RXEP5TX3EP1TX表11.19

位0123456710111213141516171819202122232425符号EP0RXEP0TXEP1RXEP1TXEP2RXEP2TXEP3RXEP3TXEP4RXEP4TXEP5RXEP5TXEP6RXEP6TXEP7RXEP7TXEP8RXEP8TXEP9RXEP9TXEP10RXEP10TXEP11RXEP11TXEP12RXEP12TXUSB端点中断状态寄存器位描述

描述端点0,接收完数据中断位端点0,发送完数据中断位或发送一个NAK端点1,接收完数据中断位端点1,发送完数据中断位或发送一个NAK端点2,接收完数据中断位端点2,发送完数据中断位或发送一个NAK端点3,同步端点端点3,同步端点端点4,接收完数据中断位端点4,发送完数据中断位或发送一个NAK端点5,接收完数据中断位端点5,发送完数据中断位或发送一个NAK端点6,同步端点端点6,同步端点端点7,接收完数据中断位端点7,发送完数据中断位或发送一个NAK端点8,接收完数据中断位端点8,发送完数据中断位或发送一个NAK端点9,同步端点端点9,同步端点端点10,接收完数据中断位端点10,发送完数据中断位或发送一个NAK端点11,接收完数据中断位端点11,发送完数据中断位或发送一个NAK端点12,同步端点端点12,同步端点复位值000000NANA0000NANA0000NANA0000NANALPC1700用户手册1313第 11 章续上表

位262728293031符号EP13RXEP13TXEP14RXEP14TXEP15RXEP15TX描述端点13,接收完数据中断位端点13,发送完数据中断位或发送一个NAK端点14,接收完数据中断位端点14,发送完数据中断位或发送一个NAK端点15,接收完数据中断位端点15,发送完数据中断位或发送一个NAK复位值0000002. USB端点中断使能寄存器(USBEpIntEn-0x5000C234)

该寄存器通过置位某个位来使USBEpIntSt中的对应位在出现与该端点相关的中断时置位;写入0将使USBDMARSt中的对应位在出现与该端点相关的中断时置位。USBEpIntEn为读/写寄存器。

表11.20

复位值:0x00000000

位符号位符号位符号位符号31EP15TX23EP11TX15EP7TX7EP3TX30EP15RX22EP11RX14EP7RX6EP3RX29EP14TX21EP10TX13EP6TX5EP2TX28EP14RX20EP10RX12EP6RX4EP2RX27EP13TX19EP9TX11USB端点中断使能寄存器位分配

26EP13RX18EP9RX10EP5RX2EP1RX25EP12TX17EP8TX9EP4TX1EP0TX24EP12RX16EP8RX8EP4RX0EP0RXEP5TX3EP1TX表11.21

位符号值01USB端点中断使能寄存器位描述

描述USBDMARSt中的对应位在出现该端点的中断时置位USBEpIntSt中的对应位在出现该端点的中断时置位。暗示该端点处于从模式复位值31:0见上表USBEpIntEn的位分配03. USB端点中断清除寄存器(USBEpIntClr-0x5000C238)

向该寄存器的某个位写入'1'时,将针对对应的物理端点执行SIE选择端点/清除中断命令(表11.65);写入0无效。在执行选择端点/清除中断命令之前,硬件会把USBDevIntSt寄存器中的CDFULL位清零。在执行完命令时,CDFULL位置位,USBCmdData包含端点的状态,并且USBEpIntSt中的对应位清零。

注意事项:???

在使用USBEpIntClr寄存器将中断清除时,软件必须等待CDFULL位置位,从而确保对应的中断在能够继续发生之前已清零;

虽然可以同时将USBEpIntClr寄存器中的多个位置位,但建议不要这样做;当操作结束时,在所有清零的多个位中,只有最低有效位对应的端点状态是可用的;

另外,SIE选择端点/清除中断命令可以使用SIE命令寄存器直接调用,但建议使用USBEpIntClr寄存器,因为它的使用更加方便。

LPC1700用户手册1414第 11 章

在该寄存器中,每个物理端点都有自己的保留位。该寄存器的位字段定义与表11.18中显示的USBEpIntSt的位定义是相同的。USBEpIntClr为只写寄存器。

表11.22

复位值:0x00000000

位符号位符号位符号位符号31EP15TX23EP11TX15EP7TX7EP3TX30EP15RX22EP11RX14EP7RX6EP3RX29EP14TX21EP10TX13EP6TX5EP2TX28EP14RX20EP10RX12EP6RX4EP2RX27EP13TX19EP9TX11USB端点中断清除寄存器位分配

26EP13RX18EP9RX10EP5RX2EP1RX25EP12TX17EP8TX9EP4TX1EP0TX24EP12RX16EP8RX8EP4RX0EP0RXEP5TX3EP1TX表11.23

位31:0见上表USBEpIntClr的位分配符号值01USB端点中断清除寄存器位描述

描述无效通过执行对应端点的SIE选择端点/清除中断命令,可令USBEpIntSt中的对应位清零复位值04. USB端点中断设置寄存器(USBEpIntSet-0x5000C23C)

向该寄存器中的某位写入'1'会置位USBEpIntSt寄存器中的对应位;写入'0'无影响。每个端点在该寄存器中都有相应的位。USBEpIntSet为只写寄存器。

表11.24

复位值:0x00000000

位符号位符号位符号位符号31EP15TX23EP11TX15EP7TX7EP3TX30EP15RX22EP11RX14EP7RX6EP3RX29EP14TX21EP10TX13EP6TX5EP2TX28EP14RX20EP10RX12EP6RX4EP2RX27EP13TX19EP9TX11USB端点中断设置寄存器位分配

26EP13RX18EP9RX10EP5RX2EP1RX25EP12TX17EP8TX9EP4TX1EP0TX24EP12RX16EP8RX8EP4RX0EP0RXEP5TX3EP1TX表11.25

位31:0见上表USBEpIntSet的位分配符号值01USB端点中断设置寄存器位描述

描述无效将USBEpIntSt中的对应位置位复位值05. USB端点中断优先级寄存器(USBEpIntPri-0x5000C240)

该寄存器决定一个端点中断是进入USBDevIntSt寄存器的EP_FAST还是EP_SLOW位。如果将该寄存器中的某位置位,相应的端点中断进入EP_FAST;反之,则进入EP_SLOW。也可以有多个端点的中断进入EP_FAST或EP_SLOW。

LPC1700用户手册1515第 11 章

需要注意的是USBDevIntPri寄存器确定是让EP_FAST中断进入USB_INT_REQ_HP还是USB_INT_REQ_LP中断线。

USBEpIntPri为只写寄存器。

表11.26

复位值:0x00000000

位符号位符号位符号位符号31EP15TX23EP11TX15EP7TX7EP3TX30EP15RX22EP11RX14EP7RX6EP3RX29EP14TX21EP10TX13EP6TX5EP2TX28EP14RX20EP10RX12EP6RX4EP2RX27EP13TX19EP9TX11USB端点中断优先级寄存器位分配

26EP13RX18EP9RX10EP5RX2EP1RX25EP12TX17EP8TX9EP4TX1EP0TX24EP12RX16EP8RX8EP4RX0EP0RXEP5TX3EP1TX表11.27

位31:0见上表USBEpIntPri的位分配符号值01USB端点中断优先级寄存器位描述

描述对应中断进入USBDevIntSt寄存器的EP_SLOW位对应中断进入USBDevIntSt寄存器的EP_FAST位复位值011.10.4端点使用寄存器

端点使用寄存器组主要用于在运行时使用端点以及对端点进行配置。1. EPRAM要求

USB设备控制器使用一个基于FIFO的RAM作为端点缓冲区。专用于此用途的RAM称作端点RAM(EP_RAM)。每个端点在EP_RAM中都有保留空间。每个端点所需的EP_RAM空

USB设备使用32个字的EP_RAM来存放间由MaxPacketSize的值以及是否具有双缓冲来决定。

EP_RAM为字对齐,但MaxPacketSize是按字节定义的,因此,必须将RAM端点缓冲区的指针。

深度调整到下一个字边界。并且,每个缓冲区都有一个字的头信息(header),用于显示接收到的包的长度。

物理端点所需的EP_RAM空间(以字为单位)如下所示:EPRAMspace?(

(MaxPacketSize?)3

)1??dbstatus

4

这里,单缓冲端点的dbstatus为1,双缓冲端点的dbstatus为2。所有已使用的端点都占据EP_RAM空间,因此,总的EP_RAM要求为:TotalEPRAMspace?32?

?

N

EPRAMspace)n(

?0n

这里的N为已使用的端点的数目。总的EP_RAM空间不应该超出4096个字节(4kB,1k字)。

2. USB使用端点寄存器(USBReEp-0x5000C244)

向该寄存器的某个位写入1可使用对应的端点;写入0时不能使用对应的端点。当总线复位时,该寄存器回到其复位状态。USBReEp为读/写寄存器。

LPC1700用户手册1616第 11 章

表11.28

复位值:0x00000003

位符号位符号位符号位符号31EP31USB使用端点寄存器位分配

30EP3029EP2928EP2827EP2726EP2625EP2524EP2423EP2322EP2221EP2120EP2019EP191118EP1817EP1716EP1615EP1514EP1413EP1312EP1210EP109EP98EP8EP117EP76EP65EP5表11.29

4EP43EP32EP21EP10EP0USB使用端点寄存器位描述

位0符号EP0值010101不使用控制端点EP0使用控制端点EP0不使用控制端点EP1使用控制端点EP1不使用端点EPxx使用端点EPxx描述复位值11EP1131:2EPxx0复位时只使用了控制端点。其它端点如有必要可通过对USBReEp寄存器中的相应位进行设置来使用。如果想计算使用端点所需的EP_RAM空间,请参考\"EPRAM要求\"小节。

端点使用是多周期操作。其伪代码如下所示:

将USBDevIntSt中的EP_RLZED位清零;对于即将被使用的每个端点,{

/*将使用端点寄存器中已有的值进行\"或\"操作USBReEp|=(UInt32)((0x1</*检验设备中断状态寄存器中的EP_RLZED位是否置位*/while(!(USBDevIntSt&EP_RLZED)){

/*等待,直到端点使用完成*/}

/*清除EP_RLZED位*/

将USBDevIntSt中的EP_RLZED位清零;}

*/

USB设备不会响应任何未使用端点的事务。SIE配置设备命令只会令使用的且使能的端点响应事务。详细信息请参考表11.60。

LPC1700用户手册1717第 11 章

3. USB端点索引寄存器(USBEpIn-0x5000C248)

每个端点都含有一个寄存器,用来记录端点的最大包长度值。这个寄存器实际上是一个寄存器数组。因此,在执行写操作之前,应通过USBEpIn寄存器来'寻址'该寄存器。

USBEpIn寄存器保存着物理端点的编号。写USBMaxPSize寄存器就是通过端点索引寄存器来设置寄存器阵列组成元素的值。USBEpIn为只写寄存器。

表11.30

位4:031:5-符号PHY_EP物理端点的编号(0~31)保留,用户软件不应该向保留位写入1。从保留位读取的值是未定义的USB端点索引寄存器位描述

描述复位值0NA4. USBMaxPacketSize寄存器(USBMaxPSize-0x5000C24C)

复位时,控制端点的最大包长度指定为8字节;其它端点指定为0。若修改USBMaxPSize的值,则需要重新计算EP_RAM中的端点缓冲区地址。这是一个多周期处理操作。在结束时,USBDevIntSt(表11.9)中的EP_RLZED位将置位。USMaxPSize数组索引如图11.2所示。USBMaxPSize为读/写寄存器。

表11.31USBMaxPacketSize寄存器位描述

位9:031:10-符号MPS最大包长度值保留,用户软件不应该向保留位写入1。从保留位读取的值是未定义的描述复位值0x008[1]NA[1]该值为EP0和EP1的复位值。其它所有端点的复位值为0x0。

端点索引通过USBEpIn寄存器进行设置。MPS_EP0~MPS_EP31通过USBMaxPSize寄存器进行访问。

图11.2USBMaxPacketSize寄存器数组索引

11.10.5 USB传输寄存器

在从模式中操作时,该组寄存器用于在端点缓冲区和RAM之间传输数据。详见\"从模式操作\"小节。

1. USB接收数据寄存器(USBRxData-0x5000C218)

在OUT数据传输中,CPU从该寄存器中读出端点缓冲区的数据。在读取该寄存器之前,应该对USBCtrl寄存器中的RD_EN位和LOG_ENDPOINT字段进行适当的设置。该寄存器的读操作将提取来自所选的端点缓冲区的数据。数据采用小端格式:从USB总线上接收到的第一个字节将是USBRxData寄存器的最低有效字节。USBRxData为只读寄存器。

表11.32

位31:0符号RX_DATA接收数据USB接收数据寄存器位描述

描述复位值0x00000000LPC1700用户手册1818第 11 章

2. USB接收包长度寄存器(USBRxPLen-0x5000C220)

该寄存器给出了正在传输的当前数据包剩余在端点缓冲区(当前通过USBRxData寄存器读取的数据包所在的端点缓冲区)的字节数,并判定数据包是否有效。在读取该寄存器之前,应该对USBCtrl寄存器中的RD_EN位和LOG_ENDPOINT字段进行适当的设置。每一次读取USBRxData寄存器时都会对该寄存器进行更新。USBRxPLen为只读寄存器。

表11.33

位9:0符号PKT_LNGTH值-USB接收包长度寄存器位描述

描述可以从当前所选的缓冲区中读出的剩余字节数。当该字段的值减少到0时,在USBDevIntSt寄存器中的复位值0RxENDPKT位将置位数据有效。该位对于同步端点非常有用。非同步端点在接收到错误的数据包时不会产生中断。但是无效数据包可能和总线复位一同产生。对于同步端点,即使接收到10DV011131:12PKT_RDY---错误的数据包,数据传输仍可继续进行。这种情况下数据包的DV位不能置位数据无效数据有效PKT_LNGTH字段有效,并且数据包准备就绪可以读出保留,用户软件不应该向保留位写入1。从保留位读取的值是未定义的0NA03. USB发送数据寄存器(USBTxData-0x5000C21C)

在IN数据传输中,CPU将端点数据写入该寄存器。在对该寄存器执行写操作之前,应该对USBCtrl寄存器中的WR_EN位和LOG_ENDPOINT字段进行适当的设置,并且应将数据包长度写入USBTxPlen寄存器。在对该寄存器执行写操作时,数据被写入所选的端点缓冲区。数据采用小端格式:USB总线上发送的第一个字节为USBTxData的最低有效字节。USBTxData为只写寄存器。

表11.34

位31:0符号TX_DATA发送数据USB发送数据寄存器位描述

描述复位值0x000000004. USB发送包长度寄存器(USBTxPLen-0x5000C224)

该寄存器包含从CPU传输到所选的端点缓冲区的数据的字节数。在将数据写入USBTxData之前,软件应先将数据包长度(≤MaxPacketSize)写入该寄存器。在每次对USBTxData进行写操作之后,硬件将USBTxPLen寄存器中的值减去4。在开始处理之前,应该将USBCtrl寄存器中的WR_EN位和LOG_ENDPOINT字段设置以选择所需的端点缓冲区。

MaxPacketSize当数据缓冲区的长度大于端点的MaxPacketSize时,软件应提交数据包长度为

的数据,并在最后一个包中发送剩余附加的字节。例如,如果MaxPacketSize为字节,即将发送的数据缓冲区长度为130字节,则软件将发送两个位数据包并在最后一个包中发送剩余的两个字节。因此,总共在USB上发送了3个数据包。USBTxPLen为只写寄存器。

LPC1700用户手册1919第 11 章

表11.35

位9:0符号PKT_LNGTH值-USB发送包长度寄存器位描述

描述可以写入所选的端点缓冲区的剩余字节数。每次写USBTxData寄存器,该域的值由硬件减4。当该字域减到0时,在USBDevIntSt寄存器中的TxENDPKT位被置位保留,用户软件不应向保留位写入1。从保留位读出的值未被定义复位值0x00031:10--NA5. USB控制寄存器(USBCtrl-0x5000C228)

该寄存器控制USB设备的数据传输操作。它选择在执行USBRxData和USBTxData寄存器访问时的端点缓冲区,并使能缓冲区的读和写操作。USBCtrl为读/写寄存器。

表11.36

位符号值USB控制寄存器位描述

描述读模式控制。使能使用USBRxData寄存器从OUT端点缓冲区中读取数据,端点由本寄存器的LOG_ENDPOINT域指定。在从USBRxData寄存器中读取当前数据包的最后一个字时,硬件将该位清零复位值0RD_EN010读模式禁能读模式使能写模式控制。使能使用USBTxData寄存器将数据写入IN端点缓冲区。端点由本寄存器的LOG_ENDPOINT指定。当USBTxLen中的字节数已发送完时,硬件将该位清零1WR_EN010写模式禁能写模式使能逻辑端点编号保留,用户软件不应向保留位写入1。从保留位读出的值未被定义0x0NA5:231:6LOG_ENDPOINT---11.10.6 SIE命令代码寄存器

SIE命令代码寄存器用于与串行接口引擎进行通信。详细信息请参考\"串行接口引擎命令描述\"小节。

1. USB命令代码寄存器(USBCmdCode-0x5000C210)

该寄存器用于将命令和写数据发送到SIE。此处写入的命令将传输到SIE并在SIE中执行。USBDevIntSt寄存器中的CCEMPTY位置位。详细信息请在执行了命令之后,该寄存器变成空,

参考\"串行接口引擎命令寄存器\"小节。USBCmdCode为只写寄存器。

LPC1700用户手册2020第 11 章

表11.37

位7:0-符号值-USB命令代码寄存器位描述

描述保留,用户软件不应向保留位写入1。从保留位读出的值未被定义命令阶段:复位值NA15:8CMD_PHASE0x010x020x05读写命令这是一个多用途域。当CMD_PHASE为命令或读状态CMD_CODE)。当0x0023:16CMD_CODE/CMD_WDATA时,该域包含着命令代码((CMD_WDATA)CMD_PHASE为写状态时,该域包含着命令写数据保留,用户软件不应向保留位写入1。从保留位读出的值未被定义0x0031:24--NA2. USB命令数据寄存器(USBCmdData-0x5000C214)

USBDevIntSt寄存器中的该寄存器包含执行SIE命令之后获得的数据。当准备读取该数据时,

CD_FULL位是置位的,详细信息见表11.9。USBCmdData为只读寄存器。

表11.38

位7:031:8符号CMD_RDATA-命令读数据保留,用户软件不应该向保留位写入1。从保留位读取的值是未定义的USB命令数据寄存器位描述

描述复位值0x00NA11.10.7 DMA寄存器

该组寄存器用于DMA模式操作(详见\"DMA操作\")。1. USBDMA请求状态寄存器(USBDMARSt-0x5000C250)

当出现端点中断(见USBEpIntSt的描述)并且USBEpIntEn中的对应位为0时,该寄存器

USBEpIntEn中的对应位为0并且出现FRAME中断时,中与非同步端点相关的位由硬件置位。当

与同步端点相关的位置位。如果DMA对于USBEpDMASt寄存器中的对应端点来说是使能的,则该寄存器中为1的位可用作DMA引擎开始数据传输的标志。对于控制端点(EP0和EP1),不可以使能DMA。USBDMARSt为只读寄存器。

表11.39USBDMA请求状态寄存器位分配

复位值:0x00000000

位符号位符号位符号位符号31EP3130EP3029EP2928EP2827EP2726EP2625EP2524EP2423EP2322EP2221EP2120EP2019EP191118EP1817EP1716EP1615EP1514EP1413EP1312EP1210EP109EP98EP8EP117EP76EP65EP54EP43EP32EP21EP10EP0LPC1700用户手册2121第 11 章

表11.40USBDMA请求状态寄存器位描述

位0131:2符号EP0EP1EPxx值0001描述控制端点OUT(对于这个端点,DMA不可以使能,EP0位必须为0)控制端点IN(对于这个端点,DMA不可以使能,EP1位必须为0)端点xx(2≤xx≤31)的DMA请求端点xx没有请求DMA端点xx请求DMA0复位值00[1]对于这个端点,DMA不可以使能,USBDMARSt中的对应位必须为0。

2. USBDMA请求清除寄存器(USBDMARClr-0x5000C254)

向该寄存器的某个位写入1将把USBDMARSt寄存器中的对应位清零;写入0无效。该寄存器用于在使能端点的DMA操作之前进行初始化。当端点的DMA操作使能时,硬件在完成一次数据包传输时将USBDMARSt寄存器中的对应位清零。因此,当端点的DMA操作使能时,软件不应该使用该寄存器进行清零操作。

USBDMARClr为只写寄存器。

USBDMARClr寄存器的位分配与USBDMARSt寄存器相同(表11.39)。

表11.41USBDMA请求清除寄存器位描述

位0131:2符号EP0EP1EPxx值0001描述控制端点OUT(对于这个端点,DMA不可以使能,EP0位必须为0)控制端点IN(对于这个端点,DMA不可以使能,EP1位必须为0)清除端点xx(2≤xx≤31)的DMA请求无影响清除USBDMARSt中的相应位0复位值003. USBDMA请求设置寄存器(USBDMARSet-0x5000C258)

向该寄存器的某位写入1将把USBDMARSt寄存器中的对应位置位;写入0无效。该寄存器允许软件提出DMA请求。这一特性在端点的操作由从模式切换到DMA模式时非常有用:如果即将在DMA模式中处理的数据包在USBEpIntEn中的对应位清零之前到达,则硬件不会提出DMA请求,此时软件可以使用该寄存器手动地启动DMA传输。

软件也可以使用该寄存器来启动DMA传输,以便在从主机接收到IN令牌包之前,预先积极地填充IN端点缓冲区。

USBDMARSet为只写寄存器。USBDMARSet寄存器的位分配与USBDMARSt寄存器是相同的(表11.39)。

表11.42USBDMA请求设置寄存器位描述

位0131:2符号EP0EP1EPxx值0001描述控制端点OUT(对于这个端点,DMA不可以使能,EP0位必须为0)控制端点IN(对于这个端点,DMA不可以使能,EP1位必须为0)设置端点xx(2≤xx≤31)的DMA请求无影响设置USBDMARSt中的相应位0复位值00LPC1700用户手册2222第 11 章

4. USBUDCAHead寄存器(USBUDCAH-0x5000C280)

UDCA(USB设备通信区域)Head寄存器保留UDCA在USBRAM中的地址。UDCA和DMA描述符的详细信息请参考\"USB设备通信区域\"和\"DMA描述符\"。USBUDCAH为读/写寄存器。

表11.43USBUDCAHead寄存器位描述

位6:031:7符号-UDCA_ADDRUDCA的起始地址描述保留,用户软件不应向保留位写入1。UDCA以128字节为边界对齐复位值0x0005. USBEPDMA状态寄存器(USBEpDMASt-0x5000C284)

该寄存器中的位表示对应端点的DMA操作是否使能。只有当该寄存器中的相应位置位时,端点的DMA传输才能启动。USBEpDMASt为只读寄存器。

表11.44USBEPDMA状态寄存器位描述

位01符号EP0_DMA_ENABLEEP1_DMA_ENABLE值00描述控制端点OUT(对于这个端点,DMA不可以使能,EP0_DMA_ENABLE位必须为0)控制端点IN(对于这个端点,DMA不可以使能,EP1_DMA_ENABLE位必须为0)表示端点xx(2≤xx≤31)的DMA是否使能31:2EPxx_DMA_ENABLE复位值0001禁止端点EPxx的DMA操作使能端点EPxx的DMA操作06. USBEPDMA使能寄存器(USBEpDMAEn-0x5000C288)

向该寄存器的某个位写入1将使能对应端点的DMA操作;写入0无效。控制端点EP0和EP1的DMA操作不可以使能。USBEpDMAEn为只写寄存器。

表11.45USBEPDMA使能寄存器位描述

位01符号EP0_DMA_ENABLEEP1_DMA_ENABLE值00控制端点描述OUT(对于这个端点,IN(对于这个端点,DMA不可以使能,DMA不可以使能,EP0_DMA_ENABLE位必须为0)控制端点EP1_DMA_ENABLE位必须为0)端点xx(2≤xx≤31)的DMA使能控制位31:2EPxx_DMA_ENABLE复位值0001无效使能端点EPxx的DMA操作07. USBEPDMA禁能寄存器(USBEpDMADis-0x5000C28C)

向该寄存器的某个位写入1将把USBEpDMASt中的对应位清零;写入0对于USBEpDMASt中的对应位将无效。而只要对该寄存器进行写操作,不管写入的值如何,内部DMA_PROCEED标志都会清零。有关DMA_PROCEED标志的详细信息请参考\"优化的描述符读取操作\"。如果当寄存器中的对应位清零时正在处理端点的DMA传输,那么在DMA禁能之前该传输完成。当在DMA传输过程中检测到错误条件时,对应位由硬件清零。USBEpDMADis为只写寄存器。

LPC1700用户手册2323第 11 章

表11.46USBEPDMA禁能寄存器位描述

位01符号EP0_DMA_DISABLEEP1_DMA_DISABLE值00描述控制端点OUT(对于这个端点,DMA不可以使能,EP0_DMA_DISABLE位必须为0)控制端点IN(对于这个端点,DMA不可以使能,EP1_DMA_DISABLE位必须为0)端点xx(2≤xx≤31)的DMA禁能控制位31:2EPxx_DMA_DISABLE复位值0001无效禁能端点EPxx的DMA操作08. USBDMA中断状态寄存器(USBDMAIntSt-0x5000C290)

该寄存器中的每个位反映对应的中断状态寄存器中的每个位是否置位。USBDMAIntSt为只读寄存器。

表11.47USBDMA中断状态寄存器位描述

位0符号EOT值传输结束中断位011NDDR012ERR0131:3-USBEoTIntSt寄存器中的所有位都为0USBEoTIntSt寄存器中至少有一个位为1新的DD请求中断位USBNDDRIntSt寄存器中的所有位都为0USBNDDRIntSt寄存器中至少有一个位为1系统错误中断位USBSysErrIntSt寄存器中的所有位都为0USBSysErrIntSt寄存器中至少有一个位为1保留,用户软件不应向其写入1。从保留位读出的值未被定义NA000描述复位值9. USBDMA中断使能寄存器(USBDMAIntEn-0x5000C294)

向该寄存器中的某个位写入1时,如果USBDMAIntSt中的对应位置位,则将在USB_INT_REQ_DMA中断线上产生一个中断。USBDMAIntEn为读/写寄存器。

表11.48USBDMA中断使能寄存器位描述

位0符号EOT值传输结束中断使能位011NDDR012ERR0131:3-传输结束中断禁能传输结束中断使能新的DD请求中断使能位新的DD请求中断禁能新的DD请求中断使能系统错误中断使能位系统错误中断禁能系统错误中断使能保留,用户软件不应向其写入1。从保留位读出的值未被定义NA000描述复位值LPC1700用户手册2424第 11 章

10.

USB传输结束中断状态寄存器(USBEoTIntSt-0x5000C2A0)

如果当前DMA描述符的DMA传输完成,则该寄存器中与端点对应的位将置位(可以是正常结束也可以是因为一个错误而置位)。产生中断的原因在描述符的DD_status区域记录。USBEoTIntSt为只读寄存器。

表11.49

位31:0符号EPxx值01USB传输结束中断状态寄存器位描述

描述端点xx(2≤xx≤31)的传输结束中断请求没有端点xx的传输结束中断请求有端点xx的传输结束中断请求复位值011.USB传输结束中断清零寄存器(USBEoTIntClr-0x5000C2A4)

向该寄存器的某个位写入1可清除USBEoTIntSt寄存器中的对应位;写入0无效。USBEoTIntClr为只写寄存器。

表11.50

位31:0符号EPxx值01USB传输结束中断清零寄存器位描述

描述清除端点xx(2≤xx≤31)的传输结束中断请求无效清除USBEoTIntSt寄存器中EPxx传输结束的中断请求复位值012.USB传输结束中断置位寄存器(USBEoTIntSet-0x5000C2A8)

向该寄存器的某个位写入1可将USBEoTIntSt寄存器中的对应位置位;写入0无效。USBEoTIntSet为只写寄存器。

表11.51

位31:0符号EPxx值01USB传输结束中断置位寄存器位描述

描述设置端点xx(2≤xx≤31)的传输结束中断请求无效将USBEoTIntSt寄存器中EPxx传输结束的中断请求置位复位值013.USB新DD请求中断状态寄存器(USBNDDRIntSt-0x5000C2AC)

当从USB设备中请求一次传输并且对应的端点没有检测到有效的DD时,该寄存器中的位置位。USBNDDRIntSt为只读寄存器。

表11.52

位31:0符号EPxx值01没有端点xx的新DD中断请求有端点xx的新DD中断请求USB新DD请求中断状态寄存器位描述

描述端点xx(2≤xx≤31)的新DD中断请求复位值014.USB新DD请求中断清零寄存器(USBNDDRIntClr-0x5000C2B0)

向该寄存器中的某个位写入1可清除USBNDDRIntSt寄存器中的对应位;写入0无效。USBNDDRIntClr为只写寄存器。

LPC1700用户手册2525第 11 章

表11.53

位31:0符号EPxx值01USB新DD请求中断清零寄存器位描述

描述清除端点xx(2≤xx≤31)的新DD中断请求无效清除USBNDDRIntSt寄存器中的端点xx的新DD中断请求复位值015.USB新DD请求中断置位寄存器(USBNDDRIntSet-0x5000C2B4)

向该寄存器中的某个位写入1可置位USBNDDRIntSt寄存器中的对应位;写入0无效。USBNDDRIntSet为只写寄存器。

表11.54

位31:0符号EPxx值01USB新DD请求中断置位寄存器位描述

描述设置端点xx(2≤xx≤31)的新DD中断请求无效置位USBNDDRIntSt寄存器中的端点xx的新DD中断请求复位值016.USB系统错误中断状态寄存器(USBSysErrIntSt-0x5000C2B8)

如果在传输数据或者在获取或更新DD时出现系统错误(AHB总线错误),则该寄存器中的对应位置位。USBSysErrIntSt为只读寄存器。

表11.55

位31:0符号EPxx值01USB系统错误中断状态寄存器位描述

描述端点xx(2≤xx≤31)的系统错误中断请求没有端点xx的系统错误中断请求有端点xx的系统错误中断请求复位值017.USB系统错误中断清零寄存器(USBSysErrIntClr-0x5000C2BC)

向该寄存器中的某个位写入1可清除USBSysErrIntSt寄存器中的对应位;写入0无效。USBSysErrIntClr为只写寄存器。

表11.56

位31:0符号EPxx值01USB系统错误中断清零寄存器位描述

描述清除端点xx(2≤xx≤31)的系统错误中断请求无效清除USBSysErrIntSt寄存器中的端点xx的系统错误中断请求复位值018.USB系统错误中断置位寄存器(USBSysErrIntSet-0x5000C2C0)

向该寄存器中的某个位写入1可置位USBSysErrIntSt寄存器中的对应位;写入0无效。USBSysErrIntSet为只写寄存器。

表11.57

位31:0符号EPxx值01USB系统错误中断置位寄存器位描述

描述设置端点xx(2≤xx≤31)的系统错误中断请求无效将USBSysErrIntSt寄存器中的端点xx的系统错误中断请求置位复位值0LPC1700用户手册2626第 11 章

11.11中断处理

本节描述了如何将任意端点上的一个中断事件发送到嵌套的向量中断控制器(NVIC)。中断事件处理如图11.3所示。

所有的非同步OUT端点(控制、批量和中断端点)在成功地接收到一个信息包时产生中断。所有的非同步IN端点在成功地发送一个信息包时,或者在发送一个NAK信号并且通过SIE设置模式命令将NAK上的中断使能时产生中断,详见\"设置模式\"的描述。对于同步端点,每1ms产生一个帧中断。

从模式和DMA模式的中断处理是不同的。(1)从模式

如果在端点上出现一个中断事件并且该端点中断在USBEpIntEn寄存器中是使能的,则USBEpIntSt寄存器中的对应状态位将置位。对于非同步端点,根据对应的USBEpIntPri[n]寄存器,我们将所有的端点中断事件划分为两种类型:快速端点中断事件和慢速端点中断事件。所有快速端点中断事件相或并发送到USBDevIntSt寄存器中的EP_FAST位。所有慢速端点中断事件相或并发送到USBDevIntSt中的EP_SLOW位。

对于同步端点,USBDevIntSt寄存器中的FRAME位每1ms置位一次。

USBDevIntSt寄存器保存所有端点中断事件的状态以及其它各种中断的状态(见\"USB设备中断状态寄存器\")。默认情况下,将所有中断(如果已在USBDevIntEn寄存器中使能)发送到USBIntSt寄存器中的USB_INT_REQ_LP位,请求低优先级中断处理。而利用USBDevIntPri寄存器,也可以将FRAME或EP_FAST位发送到USBIntSt寄存器中的USB_INT_REQ_HP位。EP_FAST和FRAME中断中只有一个能够发送到USB_INT_REQ_HP位。如果试图将这两个位都发送到USB_INT_REQ_HP,则这两个中断事件会都发送到USB_INT_REQ_LP。

慢速端点中断事件始终直接发送到USB_INT_REQ_LP位,通过软件请求低优先级中断处理。发送到NVIC的最后一个中断信号由USBIntSt寄存器中的EN_USB_INTS位控制。只有当EN_USB_INTS位置位时,USB中断才会发送到NVIC。

(2)DMA模式

如果在非控制端点上出现中断事件并且该端点中断在USBEpIntEn寄存器中没有使能,则USBDMARSt寄存器中对应的状态位由硬件置位。如果DMA传输对于USBEpDMASt寄存器中的对应端点是使能的,则USBDMARSt中置位的位可作为DMA引擎传输数据的标志。每个端点在DMA模式中传输数据时可产生3种类型的中断:传输结束中断、新DD请求中断和系统错误中断。这些中断事件会分别把USBEoTIntSt、USBNDDRIntSt和USBSysErrIntSt寄存器中与各个端点对应的位置位。然后,来自所有端点的传输结束中断相或并发送到USBDMAIntSt中的EOT位。同样,所有的新DD请求中断和系统错误中断事件分别发送到USBDMAStInt寄存器中的NDDR位和ERR位。

EOT、NDDR和ERR位(如果已在USBDMAIntEn寄存器中使能)相或来将USBIntSt寄存器中的USB_INT_REQ_DMA位置位。如果USBIntSt中的EN_USB_INTS位是置位的,则将中断发送到NVIC。

LPC1700用户手册2727第 11 章

图11.3中断事件处理

11.12串行接口引擎命令描述

串行接口引擎(SIE)的函数和寄存器使用命令来访问。命令由命令代码组成,后面是可选的数据字节(可以是读操作或写操作)。在执行上述访问时将使用USBCmdCode(见\"USB命令代码寄存器\"表)和USBCmdData(见\"USB命令数据寄存器\"表)寄存器。

一次完整的访问包含两个阶段:?

(命命令阶段:对USBCmdCode寄存器执行写操作,将CMD_PHASE字段设置为0x05

CMD_CODE字段设置为所需的命令代码。在命令执行完时,USBDevIntSt寄存器令),

中的CCEMPTY位置位;

?

USBCmdCode寄存器中的CMD_PHASE字数据阶段(可选):如果执行写操作,则将

CMD_WDATA字段设置为所需的写数据。写操作完成时,段设置为0x01(写),

USBDevIntSt寄存器中的CCEMPTY位置位。如果执行读操作,则将USBCmdCode寄

LPC1700用户手册2828第 11 章

CMD_CODE字段利用读对应的命令代存器中的CMD_PHASE字段设置为0x02(读),

码来设置。读操作完成时,USBDevIntSt寄存器中的CDFULL位将置位,表示USBCmdData寄存器中的数据在执行读操作时是可用的。在寄存器为多字节的情况下,首先访问的是最低有效字节。

在表11.58中列出了可用的命令。下面是读取当前帧编号的命令的例子(读2个字节):

USBDevIntClr=0x30;USBCmdCode=0x00F50500;while(!(USBDevIntSt&0x10));USBDevIntClr=0x10;USBCmdCode=0x00F50200;while(!(USBDevIntSt&0x20));USBDevIntClr=0x20;

CurFrameNum=USBCmdData;

//将CCEMPTY和CDFULL清零

//CMD_CODE=0xF5,CMD_PHASE=0x05(命令)//等待CCEMPTY.//清除CCEMPTY中断位.

//CMD_CODE=0xF5,CMD_PHASE=0x02(读)//等待CDFULL.//清除CDFULL.

//读帧编号的LSB字节

USBCmdCode=0x00F50200;while(!(USBDevIntSt&0x20));Temp=USBCmdData;USBDevIntClr=0x20;

//CMD_CODE=0xF5,CMD_PHASE=0x02(读)//等待CDFULL.//读帧编号的MSB字节//清除CDFULL中断位

CurFrameNum=CurFrameNum|(Temp<<8);

下面是设置地址命令的例子(写1个字节):

USBDevIntClr=0x10;USBCmdCode=0x00D00500;while(!(USBDevIntSt&0x10));USBDevIntClr=0x10;USBCmdCode=0x008A0100;while(!(USBDevIntSt&0x10));USBDevIntClr=0x10;

//清除CCEMPTY

//CMD_CODE=0xD0,CMD_PHASE=0x05(命令)//等待CCEMPTY//清除CCEMPTY

//CMD_WDATA=0x8A(DEV_EN=1,DEV_ADDR=0xA),//CMD_PHASE=0x01(写)//等待CCEMPTY//清除CCEMPTY

表11.58

命令名称设备命令设置地址配置设备设置模式读取当前帧号读测试寄存器设置设备状态获得设备状态获得错误代码读错误状态设备设备设备设备设备设备设备设备设备D0D8F3F5FDFEFEFFFB写1个字节写1个字节写1个字节读1或2个字节读2个字节写1个字节读1个字节读1个字节读1个字节接受者SIE命令代码表

代码(Hex)数据阶段LPC1700用户手册2929第 11 章

续上表

命令名称端点命令端点0选择端点端点1端点xx端点0选择端点/清除中断端点1端点xx端点0设置端点状态端点1端点xx清空缓冲区确认缓冲区所选的端点所选的端点0001xx4041xx+404041xx+40F2FA接受者代码(Hex)数据阶段读1个字节(可选)读1个字节(可选)读1个字节(可选)读1个字节读1个字节读1个字节写1个字节写1个字节写1个字节读1个字节(可选)无11.12.1设置地址(命令:0xD0,数据:写1个字节)

设置地址命令用于设置USB分配的地址并使能(内含的)函数。设备中的地址设置将在控制处理的状态阶段之后生效。总线复位之后,DEV_ADDR设置为0x00,DEV_EN设置为1。设备将响应函数地址0x00,端点0(默认端点)的信息包。

表11.59

位6:07符号DEV_ADDRDEV_EN设备设置地址寄存器位描述

描述由软件设置的设备地址。总线复位之后,该字段的值为0x00设备使能。总线复位之后,该位为10:设备不会响应任何包1:设备将响应函数地址为DEV_ADDR的信息包0复位值0x0011.12.2配置设备(命令:0xD8,数据:写1个字节)

向寄存器写入1表示对设备进行配置并且所有已使能的非控制端点将作出响应。在默认状态下,即使设备没有配置,控制端点也始终是使能的并作出响应。

表11.60

位07:1符号CONF_DEVICE-配置设备寄存器位描述

描述对设备进行配置。所有使能的非控制端点将作出响应。在总线复位时,SUS=0),该位由硬件清零。当该位置位时,如果设备不是在挂起状态(则UP_LED信号被驱动为低电平保留,用户软件不应向保留位写入1。从保留位读出的值未被定义NA复位值LPC1700用户手册3030第 11 章

11.12.3设置模式(命令:0xF3,数据:写1个字节)

表11.61

位符号值始终是PLL时钟00AP_CLK1USB_NEED_CLK有效;当设备进入挂起状态时,可以将48MHz时钟停止USB_NEED_CLK固定为1;当设备进入挂起状态时,不可以将48MHz时钟停止控制IN端点的NAK中断1INAK_CI012INAK_CO013INAK_II014INAK_IO[1]015INAK_BI016INAK_BO[2]017[1][2]

--只有在成功处理时才产生中断当IN处理成功完成以及得到NAK应答时都产生中断控制OUT端点的NAK中断只有成功处理时才产生中断当OUT处理成功完成以及获得NAK应答时都产生中断中断IN端点的NAK中断只有成功处理时才产生中断当IN处理成功完成以及获得NAK应答时都产生中断中断OUT端点的NAK中断只有成功处理时才产生中断当OUT处理成功完成以及获得NAK应答时都产生中断批量IN端点的NAK中断只有成功处理时才产生中断当IN处理成功完成以及获得NAK应答时都产生中断批量OUT端点的NAK中断只有成功处理时才产生中断当OUT处理成功完成以及获得NAK应答时都产生中断保留,用户软件不应向保留位写入1。从保留位读出的值未被定义NA0000000设置模式寄存器位描述

描述复位值如果DMA对于任何的中断OUT端点来说都是使能的,则该位应复位为0。如果DMA对于任何的批量OUT端点来说都是使能的,则该位应复位为0。

11.12.4读当前帧编号(命令:0xF5,数据:读1个或2个字节)

返回上一次成功接收到的SOF的帧编号。帧编号为11位宽,首先返回最低有效字节。如果

用户只需要帧编号的低8位,则只需要读第一个字节。

??

如果在一帧信息的开始处没有接收到SOF,则返回的帧编号为上一次成功接收到SOF的帧编号。

如果SOF帧编号含有CRC错误,则在设备接收帧编号时,返回的帧编号是被破坏的。

11.12.5读测试寄存器(命令:0xFD,数据:读2个字节)

测试寄存器为16位宽。如果USB时钟(usbclk和AHB从机时钟)正在运行,则它将返回0xA50F的值。

11.12.6设置设备状态(命令:0xFE,数据:写1个字节)

LPC1700用户手册3131第 11 章

设置设备状态命令将对设备状态寄存器中的位进行设置。

表11.62

位符号值设置设备状态寄存器位描述

描述连接位表示设备的当前连接状态。它对用于0CON0101SoftConnect的0CONNECT输出管脚进行控制。读取连接位时将返回当前的连接状态。当VBUS状态输入为低电平并持续3ms以上时,该位由硬件清零向该位写入0将使CONNECT管脚变为高电平向该位写入1将使CONNECT管脚变为低电平连接发生改变1CON_CH该位在读操作时清零当设备的上拉电阻由于VBUS消失而断开连接时,该位置位。当该位为1时,产生DEV_STAT中断挂起:挂起位表示当前的挂起状态。当设备被挂起(SUS=1)并且CPU向SUS位写入0时,该设备将产生一个远程唤醒。这只有在设备被连接时(CON=1)才发生。当设备没有连接或没有挂起时,向2SUS01该位写入0是无效的。向该位写入1也无效出现任何活动时,该位复位为0当设备在其上行端口(upstreamport)上,持续3ms以上都没有看到任何活动时,该位置位挂起位(SUS)变化指示器。SUS位在以下情况下会翻转:??3SUS_CH01?设备进入挂起状态设备断开连接设备在其上行端口上接收到恢复信号000复位值该位在读操作时清零SUS位没有改变SUS位发生改变。同时产生一个DEV_STAT中断总线复位位。在总线复位时,设备将自动进入默认状态。在默认状态下:????4RST????017:5-设备没有配置将对地址0作出响应控制端点将处于暂停状态除了控制端点EP0和EP1以外,所有端点都没有实现所有端点的数据切换(datatoggling)均被复位所有缓冲区被清零端点中断状态没有发生改变产生DEV_STAT中断0注:当设备没有被连接(CON=0)时将忽略总线复位该位在读操作时清零在设备接收到总线复位时,该位置位。产生DEV_STAT中断保留,用户软件不应向保留位写入1。从保留位读出的值未被定义NALPC1700用户手册3232第 11 章

11.12.7获得设备状态(命令:0xFE,数据:读1个字节)

获得设备状态命令将返回设备状态寄存器的值。读取设备状态时将返回1个字节的数据。这个设备状态寄存器的位字段定义与设置设备状态寄存器是相同的,如表11.62所示。

注:为确保操作正确,在执行获得设备状态命令之前必须将USBDevIntSt寄存器中的DEV_STAT位清零。

11.12.8获得错误代码(命令:0xFF,数据:读1个字节)

SIE中可能会出现不同的错误状态。获得错误代码命令可返回上一个已发生的错误代码。错误代码由4个最低有效位构成。

表11.63

位符号值错误代码00000001001000110100010101103:0EC0111获得错误代码寄存器位描述

描述复位值无错误PID编码错误未知的PID意外的信息包-任何违反规范的包序列令牌CRC中的错误数据CRC中的错误超时错误多路串扰(Babble)信息包结束时的错误发送/接收NAK发送暂停缓冲区溢出错误发送空包(只针对ISO端点)位填充错误同步时的错误数据PID中的Toggle位错误,数据无效一旦读该寄存器,ErrorActive位将被复位保留,用户软件不应向保留位写入1。从保留位读出的值未被定义NA0x01000100110101011110011011110111147:5EA--11.12.9读错误状态(命令:0xFB,数据:读1个字节)

该命令从USB设备中读取8位错误寄存器。该寄存器记录了最近在SIE中发生的错误事件。如果该寄存器中的任何一位置位,则USBDevIntSt寄存器中的ERR_INT位置位。在对该寄存器执行读操作之后,错误位清零。

表11.

位0123符号PID_ERRUEPKTDCRCTIMEOUT读错误状态寄存器位描述

描述PID编码错误、未知的PID或未知的令牌CRC意外的信息包-任何违反规范的信息包序列数据CRC错误超时错误复位值0000LPC1700用户手册3333第 11 章续上表

位4567符号EOPB_OVRNBTSTFTGL_ERR信息包结束错误缓冲区溢出位填充错误数据PID中的错误翻转位(togglebit),数据无效描述复位值000011.12.10选择端点(命令0x00-0x1F,数据:读1个字节(可选))

选择端点命令将一个内部指针初始化为指向EP_RAM中的所选缓冲区的起始字节。该命令后面可跟着一个读数据操作,从而在端点缓冲区的信息包上返回一些附加信息。选择端点命令的命令代码与物理端点编号是相同的。在单缓冲端点的情况下B_2_FULL位无效。

表11.65

位符号值选择端点寄存器位描述

描述/空状态。对于IN端点,FE位是B_1_FULL满/空。该位表示端点缓冲区的满和B_2_FULL位相与的结果。对于OUT端点,FE位是B_1_FULL和0FE复位值B_2_FULL位相或的结果。对于单缓冲端点,该位只简单地反映B_1_FULL的状态0101对于IN端点,至少有一个端点写缓冲区是空的对于OUT端点,至少有一个端点读缓冲区是满的暂停的端点指示器01ST所选的端点没有暂停所选的端点被暂停SETUP位:该位的值在每次成功地接收到信息包(即在所选物理端点上获得ACK应答的封包)之后更新02STP01在所选端点上执行选择端点/清除中断命令时,STP位清零所选端点上一次接收到的包为SETUP包包覆盖(over-written)位PO位由\"选择端点/清除中断\"命令来清零之前接收到的包被SETUP包覆盖EPNAKed位表示发送一个NAK。如果主机向已满的OUT缓冲区发送一个OUT包,则设备返回NAK。如果主机向空的IN缓冲区发送一个IN令牌包,则设备返回NAK03PO0104EPN01当设备在接收到OUT包之后发送一个ACK,或者当设备在发送IN包之后看到一个ACK时,EPN位复位当设备发送一个NAK并且NAK特性的中断使能时,EPN位置位缓冲区1的状态缓冲区1为空缓冲区1为满缓冲区2的状态缓冲区2为空缓冲区2为满保留,用户软件不应向保留位写入1。从保留位读出的值未被定义05B_1_FULL0106B_2_FULL0107-NALPC1700用户手册3434第 11 章

11.12.11选择端点/清除中断(命令:0x40-0x5F,数据:读1个字节)

命令0x40-0x5F对于各个选择端点来说是相同的,不同的地方在于:???

该命令将USBEpIntSt寄存器中与端点对应的位清零。

如果是控制OUT端点,则该命令把对应的选择端点寄存器中的STP和PO位清零。必须读取一个字节。

注:可通过使用USBCmdCode和USBCmdData寄存器,或者将USBEpIntClr中对应的位置位来调用该命令。为方便起见,建议使用USBEpIntClr寄存器。

11.12.12设置端点状态(命令:0x40-0x55,数据:写1个字节(可选))

设置端点状态命令用于对端点的状态位7:5和位0进行设置。设置端点状态的命令代码等于0x40与十六进制物理端点编号的和。对于各种类型的端点来说,并不是所有的位都是可设置的。

表11.66

位符号值设置端点状态寄存器位描述

描述暂停的端点位。当一个暂停的端点接收到SETUP令牌时,不管接收到的SETUP包的内容如何,该端点都会自动退出暂停状态。如果端点应该停留在其暂停状态,则CPU可以通过将该位置位使得该端点再次暂停。当一个暂停的端点由于设置端点状态命令或接收到一个SETUP令牌而退出暂停状态时,该端点也会被重新初始化。这样可以将缓冲区清空:如果是0ST复位值DATA0PID;如果是IN缓冲区,则它会写OUT缓冲区,则它将等待DATA0PID。端点的中断状态不会发生改变。若端点已经退出暂停状态,则向该位写入0将对端点进行初始化。若通过置位端点状态命令将端点暂停,则该端点也会被重新初始化01端点没有暂停端点被暂停保留,用户软件不应向保留位写入1。从保留位读出的值未被定义禁能端点位04:15-DA-0101NA端点使能端点禁能速率反馈(ratefeedback)模式中断端点位于翻转模式(Togglemode)中datatogglebit)中断端点位于速率反馈模式中。这意味着无需数据翻转位(就可以进行传输条件暂停位06RF_MO07CND_ST01两个控制端点都没有暂停将两个控制端点暂停,除非选择端点寄存器中的STP位是置位的。该位只是针对控制OUT端点而定义的011.12.13清空缓冲区(命令:0xF2,数据:读1个字节(可选))

在成功接收到主机发出的OUT包时,内部硬件FIFO状态Buffer_Full标志置位。通过返回

一个NAK应答,设备将拒绝后面的所有信息包。当设备软件读取数据时,它应该通过发出清空缓冲区命令来将缓冲区清空。这样可将内部Buffer_Full标志清零。当缓冲区为空时,设备可以

LPC1700用户手册3535第 11 章

接收新的信息包。

over-written)。Packet当可选数据字节的位0为1时,前面接收到的信息包被SETUP包覆盖(

over-written位只在控制传输中使用。根据USB规范,不管缓冲区的状态如何,都应该接受SETUP包。在读取SETUP数据之后,软件应该一直检查PO位的状态。如果该位是置位的,则软件应该丢弃之前读取的数据,通过发出选择端点/清除中断命令将PO位清零,读取新的SETUP数据并再次检查PO位的状态。

该命令使用情况的详细描述请参考\"从模式操作\"。

表11.67

位0符号PO值017:1--清空缓冲区寄存器位描述

描述Packetover-written位。该位只适用于控制端点EP0之前接收到的信息包保持完好之前接收到的信息包被后面的SETUP包覆盖保留,用户软件不应向保留位写入1。从保留位读出的值未被定义NA0复位值11.12.14确认缓冲区(命令:0xFA,数据:无)

当CPU已将数据写入IN缓冲区时,软件应发出一个确认缓冲区命令。该命令告知硬件,缓冲区准备在USB总线上进行发送操作。当接收到下一个IN令牌包时,硬件将会发送缓冲区中的内容。

在内部有一个称作Buffer_Full的硬件FIFO状态标志。该标志由确认缓冲区命令置位并当数据已在USB总线上发送完成时清零,缓冲区为空。

当控制IN端点对应的OUT缓冲区的PacketOver-written(PO)位置位,或者包含一个挂起

IN缓冲区有效。对于控制端点,已确认的缓冲区将在接收到SETUP的SETUP包时,不能确认控制包时无效。

该命令使用情况的详细描述请参考\"从模式操作\"。

11.13USB设备控制器的初始化

LPC1700系列Cortex-M3微控制器USB设备控制器的初始化步骤如下所示:a)通过置位PCONP的PCUSB位来使能设备控制器;

b)配置和使能PLL和时钟分频器以提供48MHz的usbclk和所需的cclk频率。为了使设备

控制器中的同步逻辑能够正确操作,最小的cclk频率为18MHz。确定PLL设置和配置的步骤请参考\"确定PLL0设置的过程\";

c)通过置位USBClkCtrl寄存器中DEV_CLK_EN和AHB_CLK_EN位来使能设备控制器时

钟。查询USBClkSt寄存器中对应的时钟位直到它们被置位;d)通过向对应的PINSEL寄存器执行写操作来使能USB管脚功能;e)使用对应的PINMODE寄存器将VBUS管脚上的上拉电阻禁能;

f)针对EP0和EP1设置USBEpIn和USBMaxPSize寄存器,并等待直到USBDevIntSt寄存

器中的EP_RLZED位置位,表示端点EP0和EP1已实现;g)使能端点中断(从模式):

---

使用USBEpIntClr将所有端点中断清零;使用USBDevIntClr将所有设备中断清零;

通过置位USBEpIntEn中的对应位,使能所需端点的从模式操作;

LPC1700用户手册3636第 11 章

--

使用USBEpIntPri设置每个已使能的中断的优先级;使用SIE设置模式命令对所需的中断模式进行配置;

-使用USBDevIntEn(通常是DEV_STAT,EP_SLOW,也可能是EP_FAST)使能设

备中断。h)配置DMA(DMA模式):

--

使用USBEpDMADis禁止所有端点的DMA操作;使用USBDMARClr清除所有挂起的DMA请求;在系统存储器中准备UDCA;

将所需的UDCA地址(例如,0x7FD00000)写入USBUDCAH;使用USBEpDMAEn将所需端点的DMA操作使能;置位USBDMAIntEn中的EOT、DDR和ERR位。

-使用USBEoTIntClr、USBNDDRIntClr和USBSysErrIntClr清除所有的DMA中断;----

i)通过将对应的地址写入相关的向量表单元并使能NVIC中的USB中断,来安装NVIC中

的USB中断处理器;j)使用SIE设置地址命令将默认的USB地址设置为0x0,DEV_EN设为1。总线复位也可

以实现上述设置;

k)使用SIE设置设备状态命令将CON位设为1,以便将CONNECT激活。

端点的配置根据软件应用程序进行更改。默认情况下,除了控制端点EP0和EP1外,所有的端点都是禁能的。其它端点在从主机中接收到SET_CONFIGURATION或SET_INTERFACE设备请求之后使用软件使能和配置。

11.14从模式操作

在从模式中,CPU使用寄存器接口在RAM和端点缓冲区之间传输数据。11.14.1中断的产生

RAM和端点缓冲区之间的数据包传输可以在出现端点中断时启动来响应中断。在从模式中,

端点中断使用USBEpIntEn寄存器来使能,并从USBEpIntSt寄存器中进行查询。

所有非同步的OUT端点在成功地接收到一个信息包时产生端点中断。所有非同步的IN端点在成功地发送一个信息包时,或者在总线上发送了一个NAK握手信号并且NAK特性的中断使能时产生中断。

对于同步端点,在出现FRAME中断(在USBDevIntSt中)时进行数据传输。11.14.2 OUT端点的数据传输

当软件想从端点缓冲区中读取数据时,它应该将USBCtrl寄存器中的RD_EN位置位并将LOG_ENDPOINT字段设置为所需的端点编号。控制逻辑将获取信息包长度输入到USBRxPLen寄存器,并将PKT_RDY位置位(见表11.33)。

USBRxData寄存器(RD_EN现在,软件可以从表11.32)中读取数据。当到达信息包的结尾时,

位清零,并且USBDevSt寄存器中的RxENDPKT位置位。此时,软件可发出清空缓冲区命令(表

OUT同步端点来说,不管缓冲区是否已清空,它都会11.67),端点准备接受下一个信息包。对于

接收下一个包。因此,在帧结束之前没有从缓冲区中读出的数据将丢失。详细信息请参考\"双缓冲的端点操作\"。

LPC1700用户手册3737第 11 章

如果软件在读取整个包之前将RD_EN清零,则读操作中止,数据保留在端点缓冲区中。当该端点的RD_EN位再次置位时,数据将从起始处读起。11.14.3 IN端点的数据传输

当向端点缓冲区写入数据时,WR_EN位(\"USB控制寄存器(USBCtrl-0x5000C228)\"置位,并且软件将信息包中即将被发送的字节数写入USBTxPLen寄存器(见\"USB发送包长度寄存器\"的描述)。然后,它可以向USBTxData寄存器连续地写入数据。

WR_EN位如果向USBTxData写入的数据量已达到USBTxPLen寄存器中设置的字节数,则

清零,并且USBDevIntSt寄存器中的TxENDPKT位置位。软件发出一个确认缓冲区(\"确认缓

IN同步端点来说,冲区(命令:0xFA,数据:无)\")命令。现在,端点准备发送信息包。对于

只有在下一个FRAME中断出现之前对缓冲区进行了确认,缓冲区中的数据才会被发送;否则,下一帧将发送一个空包。如果软件在写入整个包之前将WR_EN清零,则在下一次该端点的WR_EN位置位时,写操作将再次从缓冲区的起始处执行。

interleaved)对于同一个逻辑端点,RD_EN和WR_EN可以同时为高电平,因此,可以间隔(

执行读和写操作。

11.15DMA操作

在DMA模式中,DMA在RAM和端点缓冲区之间传输数据。

DMA操作的背景信息在\"USB设备通信区域\"和\"触下面将对DMA模式的操作进行描述。

发DMA引擎\"中描述。DMA描述符的字段在\"DMA描述符\"中描述。最后3个小节描述了DMA操作:\"非同步端点的操作\"、\"同步端点操作\"和\"自动长度传输提取(ATLE)模式操作\"。11.15.1传输术语

本小节提到了3种传输类型:

a)USB传输:在USB总线上进行的数据传输。USB2.0规范将USB传输简单地称作传输。

在本小节中,我们把它称作USB传输以便与DMA传输相区分。USB传输由多个事务

处理组成,每个事务处理又由信息包组成。

b)DMA传输:端点缓冲区和系统存储器(RAM)之间的数据传输。

c)信息包传输:在本小节中,信息包传输指的是端点缓冲区和系统存储器(RAM)之间的

信息包传输。DMA传输由一个或多个信息包传输组成。11.15.2 USB设备通信区域

CPU和DMA控制器通过一个公共的存储器区域进行通信,这个公共区域称作USB设备通信区域,即UDCA。UDCA为32字的DMA描述符指针(DDP)数组,每个DDP对应一个物理端点。如果针对端点定义了一个这样的数组,数组中的每个DDP均指向DMA描述符的起始地址。未实现的端点和DMA操作禁能的端点的DDP将被忽略并且可以设置为NULL(0x0)。UDCA的起始地址存放在USBUDCAH寄存器中。UDCA可以位于RAM的任意128字节边界,由CPU和DMA控制器访问。

图11.4显示了UDCA以及UDCAHead(USBUDCAH)寄存器和DMA描述符之间的关系。

LPC1700用户手册3838第 11 章

UDCA

012DDP-EP2

DD-EP2-a

DD-EP2-b

DD-EP2-c

NULLNULL

NULL

Next_DD_pointer

Next_DD_pointer

Next_DD_pointer

NULL

UDCAHEAD寄存器

Next_DD_pointer

16

DDP-EP16

DD-EP16-a

DD-EP16-bNext_DD_pointer

NULL

31

DDP-EP31

图11.4UDCAHead寄存器和DMA描述符

11.15.3触发DMA引擎

当通过将USBEpIntEn寄存器中的某个位设置为0(见\"USB端点中断使能寄存器\")来禁止从模式操作时,对应的端点发出一个DMA请求,然后端点中断产生(见\"USBDMA请求状态寄存器(USBDMARSt-0xFFE0C250)\"的描述)。

当在USBEpDMASt寄存器中使能端点的DMA操作时,该端点的DMA传输开始,USBDMARSt中的对应位置位,并且找到了该端点的一个有效的DD。

所有端点共用一个DMA通道以降低硬件开销。如果在USBDMARSt中有多个DMA请求是有效的,则最先处理物理端点编号最小的端点。

在DMA模式中,应该使用SIE设置模式命令(见\"设置模式\"的描述)将与批量中断OUT端点的NAK中断对应的位(INAK_BO和INAK_IO)设置为0。11.15.4 DMA描述符

DMA传输通过一个称作DMA描述符(DD)的数据结构来描述。

USBRAM中。这些描述符可以位于USBRAM的任何字对齐的DMA描述符(DD)存 放 在

地址中。USBRAM作为USB用途的系统存储器的一部分。它从地址0x7FD00000开始,大小为8KB。

用于非同步端点的DMA描述符为4个字长,用于同步端点的DMA描述符为5个字长。与DMA传输相关的参数如下所示:??????

DMA缓冲区的起始地址;DMA缓冲区的长度;

下一个DMA描述符的起始地址;控制信息;

计数信息(已传输的字节数);状态信息。

OUT和

表11.68列出了DMA描述符的各个字段。

LPC1700用户手册3939第 11 章

表11.68

字的位置0访问(H/W)RRR-1RRR/W[1]2R/WR/W访问(S/W)R/WR/WR/W-R/WR/WR/WR/WR/IDMA描述符

位的位置31:01:023415:531:1631:00描述Next_DD_pointer(USBRAM地址)DMA_mode(00为正常模式;01为ATLE模式)Next_DD_valid(1为有效;0为无效)保留Isochronous_endpoint(1为同步端点;0为非同步端点)Max_packet_sizeDMA_buffer_length对于非同步端点,该值表示的是字节数;对于同步端点,该值表示的是包的个数DMA_buffer_start_addrDD_retired(初始化为0)DD_status(初始化为0000):0000:NotServiced0001:BeingServicedWR/I4:10010:NormalCompletion0011:DataUnderrun(短包)1000:DataOverrun1001:SystemError3WWWR-R/WR/IR/IR/IW-R/I56713:815:1431:16Packet_valid(初始化为0)LS_byte_extracted(ATLE模式)(初始化为0)MS_byte_extracted(ATLE模式)(初始化为0)Message_length_position(ATLE模式)保留Present_DMA_count(初始化为0)4R/WR/W31:0Isochronous_packetsize_memory_address[1]在ATLE模式中,该字段的访问属性为只写。表注:R-读;W-写;I-初始化。

1. Next_DD_pointer

该字段是一个指针,存放的是可以提取下一个DMA描述符的存储单元。2. DMA_mode

该字段指定DMA操作的模式。DMA操作定义了两种模式:正常模式和自动传输长度提取

(ATLE)模式。在正常模式中,软件对OUT端点的DMA_buffer_length进行初始化。在ATLE

DMA_buffer_length从输入的数据中提取。详细信息请参考\"自动长度传输提取(ATLE)模式中,

模式操作\"的描述。

3. Next_DD_Valid

该位表示软件是否已准备下一个DMA描述符。如果该位置位,则DMA引擎会在用完当前描述符时提取下一个描述符。

LPC1700用户手册4040第 11 章

4. Isochronous_endpoint

该位置位表示描述符属于同步端点,因此,在提取描述符时必须读取5个字。5. Max_packet_size

IN端点从存储器中传输数据时使用该参数。OUT该字段表示端点的最大信息包容量。在针对

Max_packet_size的值应该与使用端点使用它来检测短包。该参数只适用于非同步端点。

USBMaxPSize寄存器分配给端点的MPS值相同。

6. DMA_buffer_length

该字段表示传输数据时分配的DMA缓冲区的深度。在达到缓冲区长度时,DMA引擎将停止使用这个描述符并寻找下一个描述符。

在正常模式中操作时,软件针对IN端点和OUT端点设置该值。在ATLE模式中,软件只对IN端点设置该值。对于OUT端点,硬件使用从数据流中提取的长度来设置该值。

对于同步端点,DMA_buffer_length指的是包的个数;对于非同步端点,该字段的值用字节数表示。

7. DMA_buffer_start_addr

该字段为执行数据读取操作或写入操作的地址。DMA引擎每完成一次信息包传输就会对该字段进行一次更新。

8. DD_retired

当DMA引擎用完当前描述符时,该位由硬件置位。在到达缓冲区末端、传输一个短包(非同步端点)或检测到一个错误条件时该位置位。

9. DD_status

DMA传输的状态在该字段中编码。其编码定义如下:?????

NotServiced:没有传输信息包。

BeingServiced:至少传输一个信息包。NormalCompletion:DMA描述符是在达到缓冲区末端并且没有出现错误的情况下退出的。DD_retired位也置位。

DataUnderrun:在到达DMA缓冲区末端之前,USB传输由于接收到一个短包而结束。DD_retired位也置位。

DataOverrun:当信息包正在传输时,DMA缓冲区到达末尾。这是一个错误情况。DD_retired位也是置位的。当前的DMA计数字段的值等于DMA_buffer_length的值。这个信息包必须在下一次DMA传输时从端点缓冲区重新发送。USBEpDMASt中对应的EPxx_DMA_ENABLE位清零。

SystemError:正在处理的DMA传输由于AHB总线上的错误而中止。此时,DD_retired位不置位。USBEpDMASt中对应的EPxx_DMA_ENABLE位清零。由于更新DD的同时会发生系统错误,因此,RAM中的DD字段可能是不可靠的。

Packet_valid

?

10.

该位用于同步端点。它表示上一次传输到存储器中的包是否是在无错误的情况下接收到的。如果信息包有效,则该位置位,即它是在无错误的情况下接收的。同步端点的操作详见\"同步端点操作\"。

该位对于非同步端点是不需要的,因为只有当信息包没有错误时才产生DMA请求,因此,在产生DMA请求时,Packet_valid将始终置位。

LPC1700用户手册4141第 11 章

11.

LS_byte_extracted

在ATLE模式中使用。该位置位表示提取了传输长度的最低有效字节(LSB)。提取的长度在DMA_buffer_length字段的位23:16中指示。

12.

MS_byte_extracted

在ATLE模式中使用。该位置位表示提取了传输长度的最高有效字节(MSB)。提取的长度在DMA_buffer_length字段的位31:24中指示。当LS_byte_extracted和MS_byte_extracted位置位时,提取操作停止。

13.

Present_DMA_count

该字段表示DMA引擎传输的字节数。DMA引擎在每完成一个信息包传输之后对该字段进行更新。

对于同步端点,Present_DMA_count为传输的信息包的个数;对于非同步端点,Present_DMA_count为字节数。

14.

Message_length_position

在ATLE模式中使用。该字段给出了嵌入到输入数据包中的消息长度位置的偏移量。该字段只适用于OUT端点。偏移量0表示消息长度从第一个包的第一个字节开始。

15.

Isochronous_packetsize_memory_address

该字段为即将进行传输或被提取的信息包容量信息以及帧编号所在的存储器缓冲区的地址,见图11.5。该字段只适用于同步端点。11.15.5非同步端点操作

1.设置DMA传输

DD都在USBRAM软件为那些即将使能DMA传输的物理端点准备DMA描述符(DD)。这些

中。我们将第一个DD的起始地址写入UDCA中对应端点的DMA描述指针(DDP)单元。然后,软件将USBEpDMAEn寄存器(见\"USBEPDMA使能寄存器\"的描述)中对应端点的

EPxx_DMA_ENABLE位置位。描述符中的DMA_mode字段设置为\"00\",采用正常模式。描述符的其它所有字段按表11.68的规定进行初始化。

物理端点0和1(默认的控制端点)不支持DMA操作。2.查找DMA描述符

当某个端点的DMA传输被触发时,DMA引擎将首先确定是否必须提取一个新的描述符。如果上一次传输的包与这次传输是针对相同的端点并且DD没有处于退出状态,则不需要提取一个新的描述符。上述条件可使用一个内部标志DMA_PROCEED来识别(见\"优化的描述符读取操作\")。

如果必须读取一个新的描述符,则DMA引擎将计算该端点的DDP的位置并从该位置取出DD的起始地址。DD起始地址如果在位置0,则该地址看作是无效的。此时将出现NDDR中断。所有其它字对齐的地址都看作是有效的。

在提取DD时,首先读取DD状态字(字3)并且检查DD_retired位的状态。如果该位没有置位,则DDP指向一个有效的DD。如果DD_retired置位,则DMA引擎将读取DD的控制字(字1)。

如果Next_DD_valid位置位,则DMA引擎将取出DD的Next_DD_pointer字段(字0)并将它加载到DDP中,这个新的DDP就被写入UDCA区域。

DD将给出即将进行的DMA传输然后,从DDP中的地址处提取整个DD(4个字)。这个

LPC1700用户手册4242第 11 章

的详细情况。DMA引擎把从该DD中提取的信息(起始地址、DMA计数等)加载到它的硬件资源中。

如果Next_DD_valid没有置位,而DD_retired位置位,则DMA引擎唤起该端点的NDDR中断并将对应的EPxx_DMA_ENABLE位清零。

3.传输数据

DMA引擎从EP_RAM中读取当前包并传输到从DMA_buffer_start_addr开对于OUT端点,

始的USBRAM存储单元中。对于IN端点,数据从DMA_buffer_start_addr开始的USBRAM中提取并写入EP_RAM中。DMA_buffer_start_addr和Present_DMA_count字段在每传输一个包之后进行更新。

4.优化的描述符读取操作

DMA传输通常都是多包传输。硬件将不会再从存储器中读取新的DD,除非端点发生改变。硬件将内部标志DMA_PROCEED置位来指示多包传输正在进行中。

当DMA_buffer_length字段中规定的字节数已经传输完成之后,DMA_PROCEED标志被清零。当软件对USBEpDMADis寄存器执行写操作时,该标志也会被清零。可以清除

DD以进行下个信息包的传输。向DMA_PROCEED标志的功能允许软件强制再次读取

USBEpDMADis寄存器写入全0可以在无需禁止任何端点的DMA操作的情况下将DMA_PROCEED标志清零。

5.结束信息包传输

在执行信息包传输时,DMA引擎把带有更新后的状态信息的DD写回到读操作时的相同存储单元。DD中的DMA_buffer_start_addr、Present_DMA_count以及DD_status字段被更新。

DMA描述符在退出时可以有以下几种类型:

正常结束:如果当前包完全传输并且Present_DMA_count字段等于DMA_buffer_length,则DD正常结束。DD将被写回到存储器中,此时的DD_retired位置位,DD_status设置为NormalCompletion。该端点的EOT中断产生。

USB 传输结束:如果当前包已完全传输,包的容量小于Max_packet_size字段,并且仍然没有到达DMA缓冲区的末尾,则USB传输结束。DD将被写回到存储器中,此时的DD_retired位置位,DD_Status设置为DataUnderrun。该端点的EOT中断产生。

错误结束:如果当前包没有完全传输,即在信息包传输过程中达到DMA缓冲区的末尾,则

DD被写回到存储器中,此时的DD_retired位置位,DD_status设置为DataOverrun错误情况出现。

状态代码。该端点的EOT中断产生,并且USBEpDMASt寄存器中的对应位清零。当使用USBEpDMAEn寄存器再次将对应的EPxx_DMA_ENABLE位置位时,没有完全传输的信息包将会从端点缓冲区重新发送。

6. No_PacketDD

对于IN传输,如果系统暂时没有任何数据要发送,则通过设置No_PacketDD,系统可以响应NDDR中断。这可以通过将DD中的Max_packet_size和DMA_buffer_length字段设置为0来实现。在处理No_PacketDD时,DMA引擎在没有传输信息包的情况下将USBDMARSt中对应端点的DMA请求清零。DD退出,此时的状态代码为NormalCompletion。No_PacketDD可以根据需要进行多次设置。设备将在USB总线上以NAK响应IN令牌包,直到带有一个数据包的DD被设置并且DMA将数据包传输到端点缓冲区中。

LPC1700用户手册4343第 11 章

11.15.6同步端点操作

对于同步端点,每个包的长度都可以不同。每传输一帧信息,每个同步端点均有一个信息包。1.设置DMA传输

软件将DD中的同步端点位设置为1,并设置Isochronous_packetsize_memory_address字段的初始值。所有其它字段的初始化与非同步端点相同。

对于同步端点,DMA_buffer_length和Present_DMA_count字段的值用帧数目而不是字节数来表示。

2.查找DMA描述符

查找描述符的方法与查找非同步端点的方法相同。

DMA使能的同步端点可以在每个FRAME中断时产生DMA请求。在处理DMA请求时,DMA引擎将读取描述符,并且如果Isochronous_endpoint位置位,则DMA引擎将从DD的第5个字中读取Isochronous_packetsize_memory_address。

3.传输数据

DMA_buffer_start_addr中进行传输。在传输完信息包的末尾后,数据在存储单元

Present_DMA_count的值加1。

同步包的容量存放在存储器中。信息包容量存储器中的每个字均被划分为下面几个字段:Frame_number(位31~17),Packet_valid(位16)以及Packet_length(位15~0)。对于一个给定的DD,分配给信息包容量的存储器的空间应该是DMA_buffer_length个字,一个字可供一个包进行传输。

(1)OUT端点

在传输完每帧信息之后,软件将信息包容量写入Isochronous_packet_size_memory_address指示的地址单元中,并且Isochronous_packet_size_memory_address的值加4。

(2)IN端点

在同步信息包容量中,我们只需要使用Packet_length字段。在传输每帧信息时,USB设备将传输一个端点数据包到主机,该数据包的容量在Packet_length字段中指定,并在数据包传输结束时将Isochronous_packetsize_memory_address的值加4。如果Packet_length为0,则USB设备将发送一个空包。

4. DMA描述符结束

用于同步端点的DD只能以NormalCompletion的状态代码结束。因为同步端点上没有短包,并且USB传输在没有出现系统错误时将继续进行,所以不会出现同步端点的DataOverrun检测。

5.同步OUT端点操作举例

假设将同步端点设置为传输10帧,当帧编号为21时,传输开始。在传输了4个信息包长度分别为10、15、8和20字节的帧信息之后,描述符和存储器映射如图11.5所示。

The_total_number_of_bytes_transferred=0x0A+0x0F+0x08+0x14=0x35。信息包长度存储器中的所有字的Packet_valid位(位16)被设置为1。

LPC1700用户手册4444第 11 章

图11.5同步OUT端点的操作举例

11.15.7自动长度传输提取(ATLE)模式操作

有些主机驱动程序例如NDIS(网络驱动程序接口规范)主机驱动程序可以将多个小容量的USB传输(delta传输)连接起来形成一个大容量的USB传输。对于OUTUSB传输,设备硬件必须将这个已连接的传输分解开,返回到原来的多个小容量传输,并将它们传输到的DMA缓冲区中。通过将DMA描述符中的DMA模式设置为自动传输长度提取(ATLE)模式来实现上述操作。只有批量端点支持ATLE模式。

LPC1700用户手册4545第 11 章

1.ATLE模式中的OUT传输

USB上看到的数据包

bytes

即将被DMA引擎存储到USBRAM中的数据

160bytes

DMA_buffer_start_addrofDD1

主机驱动程序即将发送的数据

160bytes

bytes

32bytes32bytes

100bytes

100bytes

bytes

DMA_buffer_start_addrofDD2

4bytes

图11.6ATLE模式中的数据传输

图11.6显示了ATLE模式中的一个典型的OUTUSB传输。在图中,主机分别将160字节和100字节的两个USB传输连接起来。假定MaxPacketSize为,则设备硬件将这个USB传输解释为4个字节的数据包和一个4字节的短包。第3和第4个数据包被连接起来。注:在正常模式中,该USB传输将被解释为、、32、和36字节。

DMA引擎需要将这两个USB传输分解开并将它们放在DMA描述符1DMA现在,(DD1)和

描述符2(DD2)的DMA_buffer_start_addr字段指示的存储单元中。

硬件在Message_length_position指定的偏移量(从USB传输的起始字节开始)处读取两字

DD的DMA_buffer_length字段中。如果节宽的DMA_buffer_length,并将它写入

DMA_buffer_length的两个字节分在两个包中,而为了确保在此情况下提取这两个字节,那么硬件会在提取了各个字节后将LS_byte_extracted和MS_byte_extracted标志置位。在提取了MS字节之后,DMA传输继续进行,与在正常模式中相同。

在准备一个新的DD时,LS_byte_extracted和MS_byte_extracted标志由软件清零。因此,一旦DD退出,硬件就必须为下一个DD再次提取传输长度。

如果在传输一个连接包(例如图11.6中的第3个包)的过程中DD1退出,并且没有设置DD2

DD1退出时,DD_status被设置为DataOverrun状态代(DD1中的Next_DD_valid字段为0),则在

码。这将被看作为一种错误情况,并且USBEpDMASt中对应的EPxx_DMA_ENABLE位由硬件清零。

在ATLE模式中,即将传输的最后一个缓冲区长度始终以一个短包或空包结束,表示USB

NDIS)主机将发送一个空包传输结束。如果相连的传输长度以MaxPacketSize包边界结束,则(

来标记USB传输结束。

2.ATLE模式中的IN传输

对于从设备到主机的INUSB传输,DMA_buffer_length由设备软件设置,与正常模式相同。在ATLE模式中,设备将来自多个DD的数据连接起来形成一个USB传输。如果在信息包(包容量小于MaxPacketSize)传输过程中DD退出,则提取由Next_DD_pointer指示的下一个DD,并且由剩余的字节所构成的MaxPacketSize信息包将从下一个DD的缓冲区中传输。DD的DMA缓冲区如果没有设置下一个DD(即DD中的Next_DD_valid为0),并且当前

长度在到达MaxPacketSize包边界之前没有结束,则当前DD中的可用字节作为短包在USB上

LPC1700用户手册46第 11 章

发送,这标志着主机的USB传输结束。

如果最后一个缓冲区长度以MaxPacketSize包边界结束,则设备软件必须将下一个DD的DMA_buffer_length字段设置为0,这样,设备就发送一个空包来标志主机的USB传输结束。

3.设置DMA传输

对于OUT端点,主机硬件需对DD中的Message_length_position字段进行设置。它表示消息长度在输入数据包中的起始位置。而且,设备软件必须将DMA_buffer_length字段设置为0,因为该字段是在提取了缓冲区长度之后由设备硬件进行更新的。

对于IN端点,描述符的设置与正常模式相同。

由于一个包可以分在两个DD中,因此,软件应始终准备好两个DD,以短包或空包结束的最后一次DMA传输除外。

4.查找DMA描述符

DMA描述符的查找操作与正常模式相同。5.传输数据(1)OUT端点

如果状态字段中的LS_byte_extracted和MS_byte_extracted位没有置位,则硬件将从数据流中提取传输长度并对DMA_buffer_length进行设置。一旦完成提取,LS_byte_extracted和MS_byte_extracted将置位。

(2)IN端点

IN端点的DMA传输处理与在正常模式下的处理相同,该操作持续进行直到已传输的字节数等于DMA_buffer_length字段的值。

6.结束包传输

DMA引擎持续与USBRAM进行传输,直到传输的字节数已达到DMA_buffer_length中指定的值。然后,EOT中断产生。如果在信息包中间出现这种情况,则加载相连的DD并且该包中的剩余字节将针对新DD指向的地址进行传输。

(1)OUT端点

DD将以设置如果链接的DD无效,并且包中已有一部分信息传输到了存储器中,则

DataOverrun状态代码结束,并且该端点的DMA将被禁止。否则DD_status将更新为NormalCompletion状态代码。

(2)IN端点

如果链接的DD无效,并且包中已有一部分信息传输到了USB,则DD将以DD_status字段的NormalCompletion的状态代码结束。这种情况与USB传输结束一致,信息包将作为一个短包发送。当链接的DD有效并且缓冲区长度为0时,将发送一个空包表示USB传输结束。

11.16双缓冲的端点操作

USB设备控制器的批量端点和同步端点采用双缓冲功能来增加数据吞吐量。

当某个具有双缓冲属性的端点实现时,设备将在EP_RAM中自动分配两个端点缓冲区的空间。见\"EPRAM要求\"。

在下面的讨论中,当前可由CPU或DMA引擎进行读和写访问的端点缓冲区被看作是有效缓冲区。

LPC1700用户手册4747第 11 章

11.16.1批量端点

对于批量端点,有效的端点缓冲区通过SIE清空缓冲区命令或确认缓冲区命令来切换。下面的例子阐述了在从模式中,批量OUT端点的双缓冲是如何工作的。

假定缓冲区1(B_1)和缓冲区2(B_2)为空,并且有效缓冲区为B_1。

a)主机发送一个数据包到端点。设备硬件将该数据包放入B_1,并产生一个端点中断。b)软件清除端点中断并开始从B_1中读取包中的数据。当正在读B_1时,主机发送第2个

数据包,设备硬件将它放入B_2,并产生一个端点中断。c)当主机试图发送第3个包时软件仍在读B_1。由于B_1和B_2都是满的,所以设备硬件

以NAK响应。d)软件完成第1个包的读取操作,并发送SIE清空缓冲区命令将B_1释放以接收其它的包。

B_2变为有效缓冲区。e)软件发送SIE选择端点命令来读取选择端点寄存器并测试FE位。软件发现有效缓冲区

B_2的内容。(B_2)中已经有数据(FE=1)。软件清除端点中断并开始读取f)主机重新发送第3个包,设备硬件将它放入B_1中。端点中断产生。

g)软件完成第2个包的读取操作,并发送SIE清空缓冲区命令来释放B_2以接收其它的包。

B_1变为有效缓冲区。软件等待下一个端点中断出现(它已经在步骤6中产生)。h)软件将端点中断清零作为对它的响应并开始从B_1中读取第3个包。

i)软件完成第3个包的读取操作,并发送SIE清空缓冲区命令来释放B_1以接收其它包。

B_2变为有效缓冲区。j)软件测试FE位,并发现有效缓冲区(B_2)为空(FE=0)。

k)B_1和B_2都为空。软件等待下一个端点中断的发生。现在有效缓冲区为B_2。主机发

送的下一个数据包将放在B_2中。下面的例子阐述了在从模式中,批量IN端点的双缓冲是如何工作的。

假定缓冲区1(B_1)和缓冲区2(B_2)都为空,并且有效缓冲区为B_1。NAK特性的中断被使能。

a)主机通过发送IN令牌包来请求一个数据包。设备以NAK作为应答并产生一个端点中断。b)软件清除端点中断。设备有3个包要发送。软件将第1个包填入B_1并发送SIE确认缓冲区命令。有效缓冲区切换为B_2。c)软件发送SIE选择端点命令来读取选择端点寄存器并测试FE位。软件发现B_2为空(FE=0),它用第2个数据包来填充B_2。软件发送SIE确认缓冲区命令,有效缓冲区切换为B_1。d)软件等待端点中断的产生。

e)设备成功地发送B_1中的包并清空缓冲区。端点中断产生。

f)软件清除端点中断。软件将第3个包填充到B_1中并使用SIE确认缓冲区命令来激活它。

有效缓冲区切换为B_2。g)设备成功地发送了B_2中的第2包并产生一个端点中断。h)软件没有其它包要发送,因此只简单地将中断清除。i)设备成功地发送了B_1中的第3个包并产生一个端点中断。j)软件没有其它包要发送,因此只简单地将中断清除。

LPC1700用户手册4848第 11 章

k)B_1和B_2均为空,有效缓冲区为B_2。下一个由软件写入的包将进入B_2。

在DMA模式中,有效缓冲区的切换自动在硬件中处理。对于批量IN端点,通过使用USBDMARSet寄存器手动地开始一个包的传输,可以提前对一个端点缓冲区进行填充,从而充分利用双缓冲的功能。11.16.2同步端点

对于同步端点,有效数据缓冲区在出现FRAME中断时由硬件切换。SIE清空缓冲区命令和确认缓冲区命令不会引起有效缓冲区的切换。

当正在总线上发送或接收另一个缓冲区中的数据包时,双缓冲允许软件充分利用帧间隔将一个包写入有效缓冲区或从有效缓冲区中读取一个包。

对于OUT同步端点,任何没有在帧结束之前从有效缓冲区中读出的数据都将在有效缓冲区切换时丢失。

对于IN同步端点,如果没有在帧结束之前对有效缓冲区进行确认,则当有效缓冲区切换时将在总线上发送一个空包,并且当该缓冲区再次变为有效时,它的内容将被覆盖。

LPC1700用户手册4949

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务