lpc2378_lpc2378厂家_lpc1788(2)

电脑杂谈  发布时间:2017-03-10 16:12:59  来源:网络整理

这个文件不用做任何修改,它包含了一个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

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...