这个文件不用做任何修改,它包含了一个0端点函数(控制端点)USB_EndPoint0,用于响应控制传输,其他端点的响应函数都放在usbuser.c中。lpc2378
(3)usbdesc.c
这里放置的是各种描述符,你可以根据需要,改为你自己的设备描述,至于描述符的定义和写法,参考USB协议(1.0和2.0都可以)的第9章。
(4)usbhw.c
这个文件的函数都与硬件相关,就是和MCU的USB模块有关,包括寄存器初始化,读写缓冲区,中断函数等,
USB_Init配置了USB寄存器,因为这个工程本来就只使能了端口2并使用BULK传输,因此你什么都不用改,如果你想讲其他端口配置为BULK或其他,你就对着手册自己改了。lpc2378
个人觉得它的ISR那里虽然通用性强但是写得有点啰嗦,自己改了一下,因为只用到端口0和端口2(这里的端口指的是逻辑端点,就是一个逻辑端点有2个物理端点),因此ISR的代码改为如下:
void USB_ISR (void) __irq {
U32 disr, val, n, m;
U32 episr, episrCur;
disr = DEV_INT_STAT; /* Device Interrupt Status 获得设备中断状态*/
/* Device Status Interrupt (Reset, Connect change, Suspend/Resume) */
//如果是总线状态改变:包括设备复位,连接改变,挂起/唤醒
if (disr & DEV_STAT_INT) {
DEV_INT_CLR = DEV_STAT_INT;//清该中断标志
WrCmd(CMD_GET_DEV_STAT); //发送获得设备状态命令
val = RdCmdDat(DAT_GET_DEV_STAT); /* Device Status */
if (val & DEV_RST) { /* Reset */
USB_Reset();
USB_Reset_Event();
}
goto isr_end; //不允许同时2个中断置位
}
/* Endpoint's Slow Interrupt */
if (disr & EP_SLOW_INT) {
episr = EP_INT_STAT; //获得端点中断状态
if(episr & EP0RX)//端口0 OUT
{
EP_INT_CLR = 1; //清端点中断,相当于发送了清端点中断指令
while ((DEV_INT_STAT & CDFULL_INT) == 0); //判断命令寄存器是否可读出数据
val = CMD_DATA;//获得选择端点寄存器的内容
if (val & EP_SEL_STP) { // 如果所选端点上一次接收到的包为 SETUP 包
USB_P_EP[0](USB_EVT_SETUP);// 调用函数USB_EndPoint0
}
else
{
USB_P_EP[0](USB_EVT_OUT);
}
}
else if(episr & EP2RX)//端口2 OUT
{
EP_INT_CLR = 0x10; //清端点中断,相当于发送了清端点中断指令
while ((DEV_INT_STAT & CDFULL_INT) == 0); //判断命令寄存器是否可读出数据
USB_P_EP[2](USB_EVT_OUT);
}
isr_end:
VICVectAddr = 0; /* Acknowledge Interrupt */
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-36858-2.html
----