Отговори на тема  [ 3 мнения ] 
USB HID комуникация. 1-ви байт 
Автор Съобщение
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Нед Окт 19, 2008 7:26 pm
Мнения: 672
Мнение 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;
}



_________________
Вниманиене съмвишист....ИЙ.


Съб Апр 22, 2023 4:31 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 12:48 pm
Мнения: 6094
Мнение Re: USB HID комуникация. 1-ви байт
на ЕР0 обикновено последния байт(65) е нула (мисля че стойноста е без значение, просто иска 65)
и що сменяш ЕР-етата от 0 до 126?
приемаш и предаваш само по ЕР0 или друго ЕРх ( зависи как си конфиг )

_________________
main[-1u]={1};


Съб Апр 22, 2023 5:58 pm
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Нед Окт 19, 2008 7:26 pm
Мнения: 672
Мнение 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;
}



_________________
Вниманиене съмвишист....ИЙ.


Съб Апр 22, 2023 6:21 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 3 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 2 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни