打印

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

[复制链接]
8629|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mojingjian|  楼主 | 2021-7-7 22:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题,刚上手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;

}


使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

60

帖子

1

粉丝