EZ-USB开发笔记(五)——中断(下)

来源:互联网 发布:sql分页查询 编辑:程序博客网 时间:2024/05/21 15:02

一、各个USB中断介绍

EZ-USB包含一个Resume中断和一个USB总中断,其中USB总中断支持32个中断源,但是32个中断源中有5个保留中断,只有27个可用中断源。这里具体介绍27USB中断源。有些涉及到USB枚举,传输和端点的概念,可以参阅相关笔记。

27USB中断源根据其各自使能的比特位所在的寄存器不同,可分为两类:

1. 与枚举等USB控制类有关的中断,其使能比特位在USBIE寄存器中。包括SUDAVSUTOKSOFsuspendHISPEEDEP0ACK

2. 与端点有关的中断,其使能比特位在EPIE寄存器中。包括EPx(IN/OUT)EPxPINGEPxISOERRIBNERRLIMIT

1.1 SUDAVSUTOK中断

这两个中断都是在端点0的控制传输时的建立过程产生,只不过,SUTOK在接收到SETUP令牌包后产生,SUDAV在接收全8字节的数据包,并将他们保存到SETUPDAT后产生。


固件程序可以响应SUDAV中断,以解码8字节的设备请求。

1.2 SOF中断

EZ-USB收到主机发送的SOF包时,会将该包的11比特的帧号复制到USBFRAMEH/L两个寄存器中,然后触发SOF中断。

等时传输的端点需要响应SOF中断。

1.3 挂起中断(SUSP

当主机发送挂起信号时,触发挂起中断。

挂起和唤醒,参见《笔记八——电源管理》

1.4 复位中断(URES

当主机同时下拉USB总线的D+D-数据线,并持续至少10ms时,会触发URES中断。

1.5 高速中断(HISPEED

当主机开始使用高速(480Mbps)模式时,触发HISPEED中断。

1.6 端点0应答中断(EP0ACK

EZ-USB识别了控制传输的状态过程时,触发此中断。

1.7  EPxIN/OUT

这些中断包括:


对于输出端点,该中断表示EZ-USB已经接收到主机发送的OUT数据,并已经保存到端点的buffer中。

对于输入端点,该中断表示主机已经读取了EZ-USB IN端点buffer中的数据,该端点的buffer可以更新数据。

1.8 EPxPING中断

在高速传输(480Mbps)时,当主机需要发送数据时,会先发送一个PING令牌包,查询设备是否准备好。当设备没有准备好时(比如没有空闲buffer)则会返回NAK包;如果准备好则返回ACK包。

当主机发送PING令牌包时,如果EZ-USB没有空闲,会返回NAK包,并触发EPxPING中断。

1.9 EPxISOERR中断

ISO传输中,如果丢失包,缓冲区溢出时触发此中断。

1.10 IN-BULK-NAK中断(IBN

当主机请求输入数据,而对应的输入端点的buffer没有数据时,EZ-USB返回一个NAK包,并触发该中断。

1.11 ERRLIMIT中断 

1.12附:唤醒中断

唤醒中断不与上述中断共享一个USB总中断,而是独占最高优先级中断。

有关唤醒中断和挂起中断,参见《笔记八——电源管理》。

二、USB中断程序实现

2.1 安排二次跳转向量表

放置二次跳转向量表,只需要向工程中添加“USBJmpTb.a51”源文件,或者“USBJmpTb.obj”目标文件即可,同时,各个USB中断的函数名要与框架程序中的中断名一致。

USBJmpTb.a51文件中可以清楚的看到,在0x43地址处安排了一条ljmp指令,和二次跳转向量表的入口地址:

      CSEG   AT 43HUSB_Int2AutoVector   equ   $ + 2      ljmp   USB_Jump_Table   ; Autovector will replace byte 45

而中断向量表USB_Jump_Table中也是各个中断的入口以及一条ljmp指令:

USB_Jump_Table:         ljmp  ISR_Sudav            ;(00) Setup Data Available      db   0      ljmp  ISR_Sof              ;(04) Start of Frame      db   0      ....


2.2 中断程序实现

安排好二次跳转向量表后,就可以编写真正的USB中断程序。要使能一个USB中断,需要以下步骤:

1. 使能USB总中断:EIE.0EUSB比特位)置1

   唤醒中断使能为:EICON.51

2. 使能USB中断二次跳转:INTSETUP.3 1

3. 使能需要的USB中断:USBIE寄存器,EPIE寄存器相应比特位置1

进入一个USB中断服务程序后,需要以下步骤:

1. 清除USB总中断请求:EXIF.40

2. 清除该USB中断请求:USBIRQ寄存器,EPIRQ寄存器相应比特位清0

具体代码实现如下:

1. 使能USB中断:

// Enable USB interrupt (INT2)EZUSB_IRQ_ENABLE();  // EUSB = 1;// Wake-up interruptEZUSB_ENABLE_RSMIRQ();   // EICON |= 0x20     // Enable INT 2 autovectoring      INTSETUP |= bmAV2EN;   // INTSETUP |= bmBIT3;// Enable selected interruptsUSBIE |= bmSUDAV | bmSUTOK | bmSUSP | bmURES | bmHSGRANT; 


2. 中断服务程序(以SUDAV中断为例):

// Clear USB IRQEZUSB_IRQ_CLEAR();// EXIF &= ~0x10;// Clear SUDAV IRQUSBIRQ = bmSUDAV;         // USBIRQ = bmBIT0


原创粉丝点击