问答

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

21ic问答首页 - LPC1788 usb无法触发批量端点中断

NXP、LPC1788 LPC1788 触发 USB ST IO

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

mojingjian2021-07-07
如题,刚上手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;
}
      
      下载视频         
回答 +关注 6
4581人浏览 0人回答问题 分享 举报
0 个回答

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