Код: /** * @brief USB_EPStartXfer : setup and starts a transfer over an EP * @param USBx : Selected device * @param ep: pointer to endpoint structure * @retval HAL status */ HAL_StatusTypeDef USB_EPStartXfer(USB_TypeDef *USBx , USB_EPTypeDef *ep) { uint16_t pmabuffer = 0; uint32_t len = ep->xfer_len; /* IN endpoint */ if (ep->is_in == 1) { /*Multi packet transfer*/ if (ep->xfer_len > ep->maxpacket) { len=ep->maxpacket; ep->xfer_len-=len; } else { len=ep->xfer_len; ep->xfer_len =0; } /* configure and validate Tx endpoint */ if (ep->doublebuffer == 0) { USB_WritePMA(USBx, ep->xfer_buff, ep->pmaadress, len); PCD_SET_EP_TX_CNT(USBx, ep->num, len); } else { /* Write the data to the USB endpoint */ if (PCD_GET_ENDPOINT(USBx, ep->num)& USB_EP_DTOG_TX) { /* Set the Double buffer counter for pmabuffer1 */ PCD_SET_EP_DBUF1_CNT(USBx, ep->num, ep->is_in, len); pmabuffer = ep->pmaaddr1; } else { /* Set the Double buffer counter for pmabuffer0 */ PCD_SET_EP_DBUF0_CNT(USBx, ep->num, ep->is_in, len); pmabuffer = ep->pmaaddr0; } USB_WritePMA(USBx, ep->xfer_buff, pmabuffer, len); PCD_FreeUserBuffer(USBx, ep->num, ep->is_in); } PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_VALID); } else /* OUT endpoint */ { /* Multi packet transfer*/ if (ep->xfer_len > ep->maxpacket) { len=ep->maxpacket; ep->xfer_len-=len; } else { len=ep->xfer_len; ep->xfer_len =0; } /* configure and validate Rx endpoint */ if (ep->doublebuffer == 0) { /*Set RX buffer count*/ PCD_SET_EP_RX_CNT(USBx, ep->num, len); } else { /*Set the Double buffer counter*/ PCD_SET_EP_DBUF_CNT(USBx, ep->num, ep->is_in, len); } PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_VALID); } return HAL_OK; }
|