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

nRF52840 USB EPOUT data buffer

Hi All!

I use "examples\peripheral\usbd\" example Project as reference to implement my own HID protocol.

I use only EP1 in/out 64 bytes both.

faced with  a question, there is a DATA BUFFER for NRF_DRV_USBD_EPOUT1 when I receive NRF_DRV_USBD_EVT_EPTRANSFER ?

case NRF_DRV_USBD_EVT_EPTRANSFER:
if (NRF_DRV_USBD_EPIN1 == p_event->data.eptransfer.ep)
{
muENV.cnt_ep1_in++;
m_send_mouse_position = false;
}
else
if (NRF_DRV_USBD_EPOUT1 == p_event->data.eptransfer.ep)
{
muENV.cnt_ep1_out++;
muENV.ep1out_rcvd = 1;
}
else



Thansk you!

  • I find solution, the problem is NRF_USBD_EP_WAITING event processing.

    this code works SUCCESS, now I can SEND / RECEIVE EPxIN/EPxOUT of 64 bytes to/from HOST (FS USB)

        
        case NRF_DRV_USBD_EVT_EPTRANSFER:
            if (NRF_DRV_USBD_EPIN1 == p_event->data.eptransfer.ep)
            {
            	NRF_LOG_INFO("EPTRANSFER EPIN1 status: %x",p_event->data.eptransfer.status);
            	muENV.cnt_ep1_in++;
                m_send_pending = false;
            }
            else
            if (NRF_DRV_USBD_EPOUT1 == p_event->data.eptransfer.ep)
            {// EPxOUT DATA READ Algorithm
            	NRF_LOG_INFO("EPTRANSFER EPOUT1 status: %x",p_event->data.eptransfer.status);
                muENV.cnt_ep1_out++;
            	if(p_event->data.eptransfer.status == NRF_USBD_EP_WAITING)
            	{// STAGE_0: WAITING for EPxOUT DATA READ, do Prepare the BUFFER to READ !
            		m_urx_bf.p_data.rx = (void*)urx_bf_w; //< raw buffer to rx data
            		m_urx_bf.size = nrf_drv_usbd_epout_size_get(NRF_DRV_USBD_EPOUT1); //< EPxOUT data sz to be rx
            		// REQUEST: READ EPxOUT DATA
            		nrf_drv_usbd_ep_transfer(NRF_DRV_USBD_EPOUT1,(void*)&m_urx_bf);
            	}
            	else
            	if(p_event->data.eptransfer.status == NRF_USBD_EP_OK)
            	{// STAGE_1: DATA READ OK , set FLAG !
                	muENV.ep1out_rcvd++;
            	}
            	else
            	if(p_event->data.eptransfer.status == NRF_USBD_EP_OVERLOAD || p_event->data.eptransfer.status == NRF_USBD_EP_ABORTED)
            	{// ERROR CASE processing... resolve this issue later in CORE.
            		muENV.ep1out_err++;
                    nrf_drv_usbd_ep_stall(NRF_DRV_USBD_EPOUT1);
            	}
            }
            else
            {
            // EP0 processing
            ...
            }

Related