Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

USB HID комуникация. 1-ви байт
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=18814
Страница 1 от 1

Автор:  RM [ Съб Апр 22, 2023 4:31 pm ]
Заглавие:  USB HID комуникация. 1-ви байт

Здравейте
От към PC (това не мога да го променя, и не мога да преминавам на нови библиотеки) приемам 65 байта данни от контролера, като първия байт обикновено е 0 , игнорирам го и записвам другите 64 като данни.
Сега искам ако е възможно първия байт да мога да го манипулирам от контролера и да го използвам като ID на 64-те байта който ще приемам в PC-то.

тука в тези кодове не мога да разбера как се предава първия байт който приемам в PC-то (до сега не е имало нужда да знам, защото съм го игнорирал без да му миля)
Кода е на stm32f1xx_hal_pcd.c
Код:
HAL_StatusTypeDef HAL_PCD_EP_Transmit(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len)
{
  PCD_EPTypeDef *ep = NULL;   // дефинира ми указател към съответния ендпоинт
 
  ep = &hpcd->IN_ep[ep_addr & 0x7F];  // проверка за валиндност на ep адреса макс 127
 
  /*setup and start the Xfer */
  ep->xfer_buff = pBuf; 
  ep->xfer_len = len;                                     // настройки за предаване на данните
ep->xfer_count = 0;
  ep->is_in = 1;
  ep->num = ep_addr & 0x7F;
 
  __HAL_LOCK(hpcd);                                  // заключва усб
 
  if ((ep_addr & 0x7F) == 0 )                       // ако ep е нула   използва USB_EP0StartXfer
  {
    USB_EP0StartXfer(hpcd->Instance , ep);
  }
  else
  {
    USB_EPStartXfer(hpcd->Instance , ep);         // ако не е 0 използва  USB_EPStartXfer
  }
 
  __HAL_UNLOCK(hpcd);
 
  return HAL_OK;
}



Ако преди всяко предаване променям ep от 0 до 126 и предавам само данни от контролера към PC двете функции USB_EP0StartXfer и USB_EPStartXfer ще ми предават ли вярно данните.
Тези неща не съм ги знаел никога добре.

после забравих ... има някакво мазало дето не ми е много ясно и защо е така.
Код:
/* ENDPOINT transfer */
#define USB_EP0StartXfer                          USB_EPStartXfer






Код:
/**
  * @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;
}



Автор:  TheWizard [ Съб Апр 22, 2023 5:58 pm ]
Заглавие:  Re: USB HID комуникация. 1-ви байт

на ЕР0 обикновено последния байт(65) е нула (мисля че стойноста е без значение, просто иска 65)
и що сменяш ЕР-етата от 0 до 126?
приемаш и предаваш само по ЕР0 или друго ЕРх ( зависи как си конфиг )

Автор:  RM [ Съб Апр 22, 2023 6:21 pm ]
Заглавие:  Re: USB HID комуникация. 1-ви байт

Не мога да го разбера добре.
Когато е USB_EP0StartXfer и има Zero Length Packet настройва някакви регистри на USB ... след това активира прекъсвания на празен FIFO ...
Никъде не пише дали преди предаване на мултипакетно предаване на данни трябва да се предаде един празен пакет ep=0, за да се настроят регистрите на USB.
след това да се предадат пакети с ep=1. Остави това но са предефинирали USB_EP0StartXfer на USB_EPStartXfer . Не мога да го разбера.

Код:
HAL_StatusTypeDef USB_EP0StartXfer(USB_OTG_GlobalTypeDef *USBx , USB_OTG_EPTypeDef *ep)
{
  /* IN endpoint */
  if (ep->is_in == 1)
  {
    /* Zero Length Packet? */
    if (ep->xfer_len == 0)
    {
      USBx_INEP(ep->num)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_PKTCNT);
      USBx_INEP(ep->num)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_PKTCNT & (1 << 19));
      USBx_INEP(ep->num)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_XFRSIZ);
    }
    else
    {
      /* Program the transfer size and packet count
      * as follows: xfersize = N * maxpacket +
      * short_packet pktcnt = N + (short_packet
      * exist ? 1 : 0)
      */
      USBx_INEP(ep->num)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_XFRSIZ);
      USBx_INEP(ep->num)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_PKTCNT);
     
      if(ep->xfer_len > ep->maxpacket)
      {
        ep->xfer_len = ep->maxpacket;
      }
      USBx_INEP(ep->num)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_PKTCNT & (1 << 19));
      USBx_INEP(ep->num)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_XFRSIZ & ep->xfer_len);
    }
   
    /* Enable the Tx FIFO Empty Interrupt for this EP */
    if (ep->xfer_len > 0)
    {
      USBx_DEVICE->DIEPEMPMSK |= 1 << (ep->num);
    }
   
    /* EP enable, IN data in FIFO */
    USBx_INEP(ep->num)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA);   
  }
  else /* OUT endpoint */
  {
    /* Program the transfer size and packet count as follows:
    * pktcnt = N
    * xfersize = N * maxpacket
    */
    USBx_OUTEP(ep->num)->DOEPTSIZ &= ~(USB_OTG_DOEPTSIZ_XFRSIZ);
    USBx_OUTEP(ep->num)->DOEPTSIZ &= ~(USB_OTG_DOEPTSIZ_PKTCNT);
   
    if (ep->xfer_len > 0)
    {
      ep->xfer_len = ep->maxpacket;
    }
   
    USBx_OUTEP(ep->num)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_PKTCNT & (1 << 19));
    USBx_OUTEP(ep->num)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_XFRSIZ & (ep->maxpacket));
   
    /* EP enable */
    USBx_OUTEP(ep->num)->DOEPCTL |= (USB_OTG_DOEPCTL_CNAK | USB_OTG_DOEPCTL_EPENA);
  }
 
  return HAL_OK;
}



Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/