NXP

LPC1788 USB调试

2019-07-12 12:10发布

USB协议要点 1、每个端点号对应两个端点地址,每个端点地址对应一个管道。 2、USB主设备枚举是首先检测从设备的描述信息,解析出要使用的管道号以便后续设置

USB主模式 1、在枚举设备获取描述符时,USB指示灯才会亮,也就是只有 TD 传输时才会亮。

使用LPC1788官方例程 1、查看端口号是否是否一致,若不一致,需要重新配置引脚服用、LPC_USB->StCtrl等参数。 2、配置5V供电引脚、指示灯引脚,时钟部分不需要做修改。 3、特别注意的是,和USB相关的变量地址要在 0x20000000 到 0x20008000 范围中。       例程中使用 __attribute__ ((section("USB_RAM")))  实现这点,此时需要在LINK 选项中的SCT文件中添加   RW_IRAM2 0x20000000 0x00008000  {
   *.o (USB_RAM)
  }
     USB_RAM就是申请到制定范围内的节,每次定义变量时,在后面加上__attribute__ ((section("USB_RAM"))) 就可以使变量地址在这片区域中。 4、U盘多次拔插不能识别可能是缓冲区没有释放的原因,官方程序中有相关的处理函数,并且再次连接是要重新枚举。



USB从模式 1、从模式的官方例程没有给出完整源码, extern const  USBD_HW_API_T hw_api;
extern const  USBD_CORE_API_T core_api;
extern const  USBD_CDC_API_T cdc_api;
这三个变量的定义和初始化部分没有,直接把 extern 去掉会内存溢出,进 HardFault_Handler , 所以直接使用 usbd_177x_8x_lib 这个库。 2、根据硬件修改 Board_USBD_Init 函数。 3、从机模式也出现了无法热拔插的情况,       调试过程中并未发现和连接相关的变量,按常理应该是检测到新连接,运行初始化函数。于是利用 P1.22 脚来检测 USB 电源是否存在,以判断连接状况。      在 while 中加入 if (!Chip_GPIO_GetPinState(LPC_GPIO, 1, 22))
{
printf("device disconncted ");
while (!Chip_GPIO_GetPinState(LPC_GPIO, 1, 22));

ret = USBD_API->hw->Init(&g_hUsb, &desc, &usb_param);

ret = vcom_init(g_hUsb, &desc, &usb_param);
if (ret == LPC_OK) 
{
printf("vcom init ok ");
USBD_API->hw->Connect(g_hUsb, 1);
}
}
这样重新连接后运行两个初始化函数,该设备就能再次被 PC 枚举,支持热拔插。 奇怪的是电脑枚举设备时,设备应该在中断中返回描述信息,和硬件初始化似乎没什么关系,现在没有源码,初始化到底做了什么也不清楚,猜想可能和主模式一样, 程序在某个地方释放了与描述符相关的缓存,所以要在初始化中重新申请。 4、由于使用CDC例程,PC端的驱动选择了 JLink CDC UART Port ,好像是 WINDOWS 自带的,或者装 JLINK 驱动的时候自动安装的,目前使用未发现问题。