LPC1788 usb无法触发批量端点中断

[复制链接]
 楼主| mojingjian 发表于 2021-7-7 22:06 | 显示全部楼层 |阅读模式
如题,刚上手LPC1788开发usb功能,做hid 设备,在rt-thread的usb框架下参考stm32f4 的usb驱动文件实现了hid设备,成功枚举的情况下进行批量传输时,主机显示“Bulk wirite failed ...”(没记全),板子仿真调试下没看到有触发批量端点的中断。请教各位大咖这种问题是什么原因?

  1. 部分代码:

  2. static struct ep_id _ep_pool[] =

  3. {

  4.     {0x0,  USB_EP_ATTR_CONTROL,     USB_DIR_OUT,    64, ID_ASSIGNED  },

  5.     {0x1,  USB_EP_ATTR_CONTROL,     USB_DIR_IN,     64, ID_UNASSIGNED},

  6.     {0x2,  USB_EP_ATTR_INT,         USB_DIR_OUT,    64, ID_UNASSIGNED},

  7.     {0x3,  USB_EP_ATTR_INT,         USB_DIR_IN,     64, ID_UNASSIGNED},

  8.     {0x4,  USB_EP_ATTR_BULK,        USB_DIR_OUT,    64, ID_UNASSIGNED},

  9.     {0x5,  USB_EP_ATTR_BULK,        USB_DIR_IN,     64, ID_UNASSIGNED},

  10.     {0xFF, USB_EP_ATTR_TYPE_MASK,   USB_DIR_MASK,   0,  ID_ASSIGNED  },

  11. };



  12. static void _usb_hw_init(void)

  13. {

  14.     // USB_DEV_CLK_EN,USB_AHB_CLK_EN,USB_OTG_CLK_EN

  15.     rt_uint32_t ulClkCtrl = 0x1A ;

  16.    

  17.     LPC_SC->PCONP |= 0x80000000;        // 给USB控制器提供电源

  18.     LPC_USB->USBClkCtrl = ulClkCtrl;    // 配置USB时钟控制寄存器

  19.     while ((LPC_USB->USBClkSt & ulClkCtrl) != ulClkCtrl);

  20.     LPC_USB->StCtrl |= 0x03;           // U1 HOST, U2 devices

  21. //    LPC_IOCON->P0_29 &= ~0x07;          // P0.29 D1+, P0.30 D1-

  22. //    LPC_IOCON->P0_29 |= 0x01;

  23. //    LPC_IOCON->P0_30 &= ~0x07;

  24. //    LPC_IOCON->P0_30 |= 0x01;

  25.     LPC_IOCON->P0_31 &= ~0x07;

  26.     LPC_IOCON->P0_31 |= 0x01;

  27.     LPC_IOCON->P0_14 &= ~0x07;

  28.     LPC_IOCON->P0_14 |= 0x01;

  29. }



  30. static void _usb_inturrupt_init(void)

  31. {

  32.     rt_uint32_t intTmp = 0x04;  // ep_slow

  33.    

  34.     LPC_USB->DevIntClr = 0x01;  // 禁止同步传输帧中断

  35.     LPC_USB->DevIntEn = intTmp; // 使能复位中断, 低速中断

  36.     LPC_USB->DevIntPri = 0;     // 使能端点中断为低优先级中断

  37.     intTmp = (0x01 << 0) + (0x01 << 1) + (0x01 << 4) + (0x01 << 5);   // 使能端点 0,1,4,5 从机中断

  38.     LPC_USB->EpIntEn = intTmp;

  39.     LPC_USB->EpIntPri &= ~intTmp;   // 设置为低优先级中断

  40.     LPC_SC->USBIntSt = 0x80000000;  // 允许USB中断

  41. }



  42. static void _usb_endpoint_config(void)

  43. {

  44.     // 配置各物理端点的最大包大小

  45. #if 0

  46.     usbd_devConfigMaxPaketSize(EP0_CTR_OUT, USBD_PACKET_SIZE_64BYTE);

  47.     usbd_devConfigMaxPaketSize(EP0_CTR_IN, USBD_PACKET_SIZE_64BYTE);



  48.     usbd_devConfigMaxPaketSize(EP2_BULK_OUT, USBD_PACKET_SIZE_64BYTE);

  49.     usbd_devConfigMaxPaketSize(EP2_BULK_IN, USBD_PACKET_SIZE_64BYTE);

  50. #else

  51.     rt_uint8_t idx = 0;

  52.    

  53.     while(_ep_pool[idx].addr != 0xFF)

  54.     {

  55.         usbd_devConfigMaxPaketSize(_ep_pool[idx].addr, _ep_pool[idx].maxpacket);

  56.         idx++;

  57.     }

  58. #endif

  59. }



  60. // 初始化usb设备控制器

  61. static rt_err_t _init(rt_device_t device)

  62. {

  63.     // TODO:PLL1的配置要统一到原时钟配置的位置上

  64.     // PLL1时钟配置,提供48MHz的usbclk

  65.     LPC_SC->PLL1CFG   = 0x23;

  66.     LPC_SC->PLL1CON   = 0x01;                   // PLL1 Enable

  67.     LPC_SC->PLL1FEED  = 0xAA;

  68.     LPC_SC->PLL1FEED  = 0x55;

  69.     while (!(LPC_SC->PLL1STAT & (1<<10)));      // Wait for PLOCK1

  70.     // USBCLKSEL.USBDIV=1,output 48MHz  USBCLKSEL.USBSEL=2,Alt PLL

  71.     LPC_SC->USBCLKSEL = (0x00000001|(0x02<<8)); // Setup USB Clock Divider

  72.    

  73.     NVIC_SetPriority(USB_IRQn, 5);

  74.     NVIC_EnableIRQ(USB_IRQn);

  75.    

  76.     // usb hw init

  77.     _usb_hw_init();

  78.     // interrupt config

  79.     _usb_inturrupt_init();

  80.     // endpoint config

  81.     _usb_endpoint_config();

  82.    

  83.     // set mode

  84.     usbd_devSetMode(0);     // 成功传输才产生中断

  85.    

  86.     return RT_EOK;

  87. }


您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

65

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部