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不报任何错误。
找了好多天没发现问题原因在哪,有知道的大佬麻烦指教一下,万分感谢。