Здравствуйте!

Переделываю пример usbbulk-1-0-3-lpc214x.zip для работы как CDC. Размер дескриптора 67 байтов и не может быть передан за раз.

Код
void tn_usb_lpc_cmd(int cmd)
{
   rUSBDevIntClr = CDFULL | CCEMTY;            // clear CDFULL/CCEMTY
   rUSBCmdCode = 0x00000500 | (cmd << 16);     // write command code
   while(!(rUSBDevIntSt & CCEMTY));
   rUSBDevIntClr = CCEMTY;
}


int tn_usb_ep0_write(int ep_num_logical,BYTE * buf,int nbytes)
{
   union
   {
      BYTE b[4];
      unsigned int w;
   }data;

   ep_num_logical &= 0x8F;
   rUSBCtrl = WR_EN | ((ep_num_logical & 0x0F)<< 2); // set write enable for specific endpoint
   rUSBTxPLen = nbytes;  // set packet length

   if(nbytes > 0)
   {
      while(rUSBCtrl & WR_EN)  // write data
      {
         data.b[0] = *buf++;
         data.b[1] = *buf++;
         data.b[2] = *buf++;
         data.b[3] = *buf++;
         rUSBTxData = data.w;
      }
   }

   rUSBCtrl = 0;

   tn_usb_lpc_cmd(CMD_EP_SELECT | ep_num_lg2ph(ep_num_logical));
   tn_usb_lpc_cmd(CMD_EP_VALIDATE_BUFFER);

   return nbytes;
}


Можно ли для передачи вызвать 2 раза подряд эту процедуру с nbytes=64 и 3
или требуется проверка получения SETUP пакета как в примере от филлипса?

Код
    // Validate buffer
    USB_ValidateBuffer(CTRL_ENP_IN);
    // Wait until data is send or overwrite by setup packet
    while ((ENDPINTS & (1<<CTRL_ENP_IN)) == 0)
    {
      if ((USB_Cmd(CMD_USB_SET_EP_STAT + CTRL_ENP_IN,0) & 1) == 0)
      {
        if((ENDPINTS & (1<<CTRL_ENP_IN)) == 0)
        {
          USB_Cmd(CMD_USB_SEL_CLR_INT_EP + CTRL_ENP_IN,0);
          return;
        }
      }
    }

    USB_Cmd(CMD_USB_SEL_CLR_INT_EP + CTRL_ENP_IN,0);
    ENDPINTCLR = (1<<CTRL_ENP_IN);


Спасибо!



только что нашел в коде, где это должно обрабатываться

Код
void tn_usb_st_DATAIN(USB_EP_STATUS * eps)
{
   int bytes;

   if(eps->nbytes > USB_MAX_PACKET0)
      bytes = USB_MAX_PACKET0;
   else
      bytes = eps->nbytes;

   bytes = tn_usb_ep0_write(0x80,(BYTE*)eps->pdata, bytes); //-- Tx EP0
   eps->nbytes -= bytes;
   eps->pdata  += bytes;
}



Оказывается eps->nbytes -= bytes; это (unsigned int*), смещение на bytes считалось неправильно