This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

怎么使用52840的ep0端口获取pc端的数据

SDK版本:15.2.0

工程例子:usbd

目的:使用52840 usb ep0端口与pc端进行通信。pc端为host,52840为Device。

pc端使用libusb驱动,自定义通信协议。在usbd_event_handler函数里面通过setup.bmRequest值来判断读写方向。

的判断为pc端接收数据的时候,直接调用

respond_setup_data(
        p_setup,
        get_descriptor_report_interface_0,
        p_setup->wLength);

函数可以成功发送数据到pc端。

该函数原型如下:

static void respond_setup_data(
    nrf_drv_usbd_setup_t const * const p_setup,
    void const * p_data, size_t size)
{
    /* Check the size against required response size */
    if (size > p_setup->wLength)
    {
        size = p_setup->wLength;
    }
    ret_code_t ret;
    nrf_drv_usbd_transfer_t transfer =
    {
        .p_data = {.tx = p_data},
        .size = size
    };
    ret = nrf_drv_usbd_ep_transfer(NRF_DRV_USBD_EPIN0, &transfer);
    if (ret != NRF_SUCCESS)
    {
        NRF_LOG_ERROR("Transfer starting failed: %d", (uint32_t)ret);
    }
    ASSERT(ret == NRF_SUCCESS);
    UNUSED_VARIABLE(ret);
}

我照着该函数修改部分参数作为发送模式:

static void respond_get_data(
    nrf_drv_usbd_setup_t const * const p_setup,
    void  * data, size_t size)
{
    /* Check the size against required response size */
    if (size > p_setup->wLength)
    {
        size = p_setup->wLength;
    }
    ret_code_t ret;
    nrf_drv_usbd_transfer_t transfer =
    {
        .p_data = {.rx = data},
        .size = size,
    };
    ret = nrf_drv_usbd_ep_transfer(NRF_DRV_USBD_EPOUT0, &transfer);
    if (ret != NRF_SUCCESS)
    {
        NRF_LOG_ERROR("Transfer starting failed: %d", (uint32_t)ret);
    }
    ASSERT(ret == NRF_SUCCESS);
    UNUSED_VARIABLE(ret);
}

函数返回值均正确,但是pc端提示写失败,52840这边没有获取到任何数据。

源码太长,我贴一下主要的使用流程:

static void usbd_event_handler(nrf_drv_usbd_evt_t const * const p_event)
{
    switch (p_event->type)
    {
   ......
    case NRF_DRV_USBD_EVT_SETUP:
    {
        nrf_drv_usbd_setup_t setup;
        nrf_drv_usbd_setup_get(&setup);
        switch (setup.bmRequest)
        {
       ......

        case 0xFE: // send to pc
            send_data_to_pc(&setup);
            break;

        case 0xFF: // get from pc
            get_data_from_pc(&setup);
            break;

        default:
            NRF_LOG_ERROR("Unknown request: 0x%2x", setup.bmRequest);
            nrf_drv_usbd_setup_stall();
            return;
        }
        break;
    }
    default:
        break;
    }
}

static void  send_data_to_pc(nrf_drv_usbd_setup_t const * const p_setup)
{
    respond_setup_data(
        p_setup,
        get_descriptor_report_interface_0,
        p_setup->wLength);
}

static void  get_data_from_pc(nrf_drv_usbd_setup_t const * const p_setup)
{
      int length = p_setup->wLength;
      int length2 = (p_setup->wIndex)&0xFFF;
      NRF_LOG_INFO("length = %d length2 = %d" , length , length2); //打印值与pc端发送值一致。
    respond_get_data(   //见前面定义
        p_setup,
        get_data,
        p_setup->wLength);
}

目前读是没有问题的,pc端正常获取52840发送的数据。写出异常,pc端报错,52840不报任何错误。

找了好多天没发现问题原因在哪,有知道的大佬麻烦指教一下,万分感谢。

Related