usb2.0协议学习——usb_istr.c(转)

本文介绍了使用massstorage例程修改SPIFLASH模拟U盘代码的过程,并在此基础上增加BULK传输功能,实现USB复合设备。详细分析了usb_istr.c中与中断处理相关的函数,包括端点IN和OUT的回调函数,以及如何将这些函数与usb_endp.c和usb_int.c关联起来。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

做usb复合设备,用mass storage的例程修改了一个SPI FLASH模拟U盘的代码,还算顺利能够正常工作。工作要求再加一个功能利用BULK传输数据,实现一个composite device。设备复合好之后,也能枚举出两个设备来,U盘功能能够正常使用,而自定义的设备无法安装驱动。查找下是否下位机代码的问题,之前移植模拟U盘代码的时候是移植的,也没怎么分析各个文件。利用这个机会逐个分析下。

usb_istr.c主要由3部分组成:
第一部分:
void (*pEpInt_IN[7])(void) =
  {
    EP1_IN_Callback,
    EP2_IN_Callback,
    EP3_IN_Callback,
    EP4_IN_Callback,
    EP5_IN_Callback,
    EP6_IN_Callback,
    EP7_IN_Callback,
  };
这里是7个端点IN的调用函数,这7个函数实现于usb_endp.c中。
第二部分:
void (*pEpInt_OUT[7])(void) =
  {
    EP1_OUT_Callback,
    EP2_OUT_Callback,
    EP3_OUT_Callback,
    EP4_OUT_Callback,
    EP5_OUT_Callback,
    EP6_OUT_Callback,
    EP7_OUT_Callback,
  };
这里是7个端点OUT的调用函数,这7个函数实现于usb_endp.c中。
第三部分:
void USB_Istr(void)
{
  wIstr = _GetISTR() //读取USB中断状态寄存器
 。。。。。。 // 各种各样的中断处理函数
}
这里是对USB8种中断的处理。最常用的就是传输正确中断(CTR)。当然还有挂起中断,唤醒中断,复位请求,错误等。

usb_istr.c的的中断是如何与我们的ENx_XX_Callback()的函数结合起来的呢?我只看了最常用的正确传输中断
。中断传输正确时候 调用CTR_LP();(在usb_istr.c)。而CTR_LP()得函数在usb_int.c中实现。CTR_LP()函数则调用了pEpInt_IN【7】 ,pEpInt_OUT【7】中定义的函数入口。pEpInt_IN【7】 ,pEpInt_OUT【7】中定函数的定义在usb_endp.c种显示。以EP1_OUT_Callback()为例,它的实现又跑到了usb_bot.c中实现。

这样这3个文件就可以关联起来了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值