EZ-USB开发笔记(五)——中断(下)
来源:互联网 发布:sql分页查询 编辑:程序博客网 时间:2024/05/21 15:02
一、各个USB中断介绍
EZ-USB包含一个Resume中断和一个USB总中断,其中USB总中断支持32个中断源,但是32个中断源中有5个保留中断,只有27个可用中断源。这里具体介绍27个USB中断源。有些涉及到USB枚举,传输和端点的概念,可以参阅相关笔记。
27个USB中断源根据其各自使能的比特位所在的寄存器不同,可分为两类:
1. 与枚举等USB控制类有关的中断,其使能比特位在USBIE寄存器中。包括SUDAV,SUTOK,SOF,suspend,HISPEED,EP0ACK。
2. 与端点有关的中断,其使能比特位在EPIE寄存器中。包括EPx(IN/OUT),EPxPING,EPxISOERR,IBN,ERRLIMIT。
1.1 SUDAV和SUTOK中断
这两个中断都是在端点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 EPx(IN/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.0(EUSB比特位)置1
唤醒中断使能为:EICON.5置1
2. 使能USB中断二次跳转:INTSETUP.3 置1
3. 使能需要的USB中断:USBIE寄存器,EPIE寄存器相应比特位置1
进入一个USB中断服务程序后,需要以下步骤:
1. 清除USB总中断请求:EXIF.4清0
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
- EZ-USB开发笔记(五)——中断(下)
- EZ-USB开发笔记(四)——中断(上)
- EZ-USB开发笔记(九)——USB传输
- EZ-USB开发笔记(一)——EZ-USB概述
- EZ-USB开发笔记(零)——背景介绍
- EZ-USB开发笔记(二)——CPU介绍
- EZ-USB开发笔记(三)——内存安排
- EZ-USB开发笔记(六)——CPU外设
- EZ-USB开发笔记(七)——复位
- EZ-USB开发笔记(八)——电源管理
- EZ-USB开发笔记(十)——枚举与重枚举
- EZ-USB 68013学习笔记(一)——USB协议之描述符
- EZ-USB 68013学习笔记(二)——USB协议之传输的基本单元--包
- Linux USB 驱动开发(五)—— USB驱动程序开发过程简单总结
- Linux USB 驱动开发(五)—— USB驱动程序开发过程简单总结
- Linux USB 驱动开发(五)—— USB驱动程序开发过程简单总结
- Linux USB 驱动开发(五)—— USB驱动程序开发过程简单总结
- Linux驱动开发(五)——中断和时钟
- C++复合数据类型数组学习笔记
- C语言中定义结构体的几种方法
- 关于大端模式与小端模式
- 差分约束笔记
- .h跟.c的区别
- EZ-USB开发笔记(五)——中断(下)
- 容器适配器:stack、queue、priority_queue
- EZ-USB开发笔记(六)——CPU外设
- jibx进行xml数据绑定的binging.xml配置
- “五险一金”详解!
- n从1开始,每个操作可以选择对n加1或者对n加倍。若想获得整数2013,最少需要多少个操作
- EZ-USB开发笔记(七)——复位
- 实现商家google地图标注功能
- EZ-USB开发笔记(八)——电源管理