问答

汇集网友智慧,解决技术难题

21ic问答首页 - TAG - NXP、LPC1788
  • LPC1788 usb无法触发批量端点中断 sos

    如题,刚上手LPC1788开发usb功能,做hid 设备,在rt-thread的usb框架下参考stm32f4 的usb驱动文件实现了hid设备,成功枚举的情况下进行批量传输时,主机显示“Bulk wirite failed ...”(没记全),板子仿真调试下没看到有触发批量端点的中断。请教各位大咖这种问题是什么原因? 部分代码: static struct ep_id _ep_pool[] = { {0x0, USB_EP_ATTR_CONTROL, USB_DIR_OUT, 64, ID_ASSIGNED }, {0x1, USB_EP_ATTR_CONTROL, USB_DIR_IN, 64, ID_UNASSIGNED}, {0x2, USB_EP_ATTR_INT, USB_DIR_OUT, 64, ID_UNASSIGNED}, {0x3, USB_EP_ATTR_INT, USB_DIR_IN, 64, ID_UNASSIGNED}, {0x4, USB_EP_ATTR_BULK, USB_DIR_OUT, 64, ID_UNASSIGNED}, {0x5, USB_EP_ATTR_BULK, USB_DIR_IN, 64, ID_UNASSIGNED}, {0xFF, USB_EP_ATTR_TYPE_MASK, USB_DIR_MASK, 0, ID_ASSIGNED }, }; static void _usb_hw_init(void) { // USB_DEV_CLK_EN,USB_AHB_CLK_EN,USB_OTG_CLK_EN rt_uint32_t ulClkCtrl = 0x1A ; LPC_SC->PCONP |= 0x80000000; // 给USB控制器提供电源 LPC_USB->USBClkCtrl = ulClkCtrl; // 配置USB时钟控制寄存器 while ((LPC_USB->USBClkSt & ulClkCtrl) != ulClkCtrl); LPC_USB->StCtrl |= 0x03; // U1 HOST, U2 devices // LPC_IOCON->P0_29 &= ~0x07; // P0.29 D1+, P0.30 D1- // LPC_IOCON->P0_29 |= 0x01; // LPC_IOCON->P0_30 &= ~0x07; // LPC_IOCON->P0_30 |= 0x01; LPC_IOCON->P0_31 &= ~0x07; LPC_IOCON->P0_31 |= 0x01; LPC_IOCON->P0_14 &= ~0x07; LPC_IOCON->P0_14 |= 0x01; } static void _usb_inturrupt_init(void) { rt_uint32_t intTmp = 0x04; // ep_slow LPC_USB->DevIntClr = 0x01; // 禁止同步传输帧中断 LPC_USB->DevIntEn = intTmp; // 使能复位中断, 低速中断 LPC_USB->DevIntPri = 0; // 使能端点中断为低优先级中断 intTmp = (0x01 << 0) + (0x01 << 1) + (0x01 << 4) + (0x01 << 5); // 使能端点 0,1,4,5 从机中断 LPC_USB->EpIntEn = intTmp; LPC_USB->EpIntPri &= ~intTmp; // 设置为低优先级中断 LPC_SC->USBIntSt = 0x80000000; // 允许USB中断 } static void _usb_endpoint_config(void) { // 配置各物理端点的最大包大小 #if 0 usbd_devConfigMaxPaketSize(EP0_CTR_OUT, USBD_PACKET_SIZE_64BYTE); usbd_devConfigMaxPaketSize(EP0_CTR_IN, USBD_PACKET_SIZE_64BYTE); usbd_devConfigMaxPaketSize(EP2_BULK_OUT, USBD_PACKET_SIZE_64BYTE); usbd_devConfigMaxPaketSize(EP2_BULK_IN, USBD_PACKET_SIZE_64BYTE); #else rt_uint8_t idx = 0; while(_ep_pool[idx].addr != 0xFF) { usbd_devConfigMaxPaketSize(_ep_pool[idx].addr, _ep_pool[idx].maxpacket); idx++; } #endif } // 初始化usb设备控制器 static rt_err_t _init(rt_device_t device) { // TODO:PLL1的配置要统一到原时钟配置的位置上 // PLL1时钟配置,提供48MHz的usbclk LPC_SC->PLL1CFG = 0x23; LPC_SC->PLL1CON = 0x01; // PLL1 Enable LPC_SC->PLL1FEED = 0xAA; LPC_SC->PLL1FEED = 0x55; while (!(LPC_SC->PLL1STAT & (1<<10))); // Wait for PLOCK1 // USBCLKSEL.USBDIV=1,output 48MHz USBCLKSEL.USBSEL=2,Alt PLL LPC_SC->USBCLKSEL = (0x00000001|(0x02<<8)); // Setup USB Clock Divider NVIC_SetPriority(USB_IRQn, 5); NVIC_EnableIRQ(USB_IRQn); // usb hw init _usb_hw_init(); // interrupt config _usb_inturrupt_init(); // endpoint config _usb_endpoint_config(); // set mode usbd_devSetMode(0); // 成功传输才产生中断 return RT_EOK; } 下载视频

    NXP、LPC1788 LPC1788 触发 USB ST IO

    4582浏览量 0回复量 关注量