Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32f103 USB double buffer
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Utyff
Я переделал стандартный пример VirtualComport_Loopback на работу с USB double buffer.
Но скорость передачи не изменилась ~550 кб/сек.
Нормального примера на Endpoint_IN Double buffer я не смог найти.
Кто имел опыт с double buffer, подскажите что не так делаю?

Изменил три файла. В usb_conf.h добавил один буфер и сдвинул остальные
Код
///// usb_conf.h
//#define ENDP1_TXADDR        (0xC0)
#define ENDP1_BUF0ADDR      (0xC0)
#define ENDP1_BUF1ADDR      (0x100)
#define ENDP2_TXADDR        (0x140)
#define ENDP3_RXADDR        (0x150)

В usb_prop.c заменил инициализацию EP1
Код
///// usb_prop.c
  /* Initialize Endpoint 1
  SetEPType(ENDP1, EP_BULK);
  SetEPTxAddr(ENDP1, ENDP1_TXADDR);
  SetEPTxStatus(ENDP1, EP_TX_NAK);
  SetEPRxStatus(ENDP1, EP_RX_DIS);*/

  /* Initialize Endpoint 1 (TX) (IN) (EP1_IN)*/
  SetEPType(ENDP1, EP_BULK);
  SetEPDoubleBuff(ENDP1);
  SetEPDblBuffAddr(ENDP1, ENDP1_BUF0ADDR, ENDP1_BUF1ADDR);
  SetEPDblBuffCount(ENDP1, EP_DBUF_IN, Device_Property.MaxPacketSize); // 0x40
  ClearDTOG_TX(ENDP1);             // USB PERIPHERAL
  ClearDTOG_RX(ENDP1);             // SW_BUF for APPLICATION
  ToggleDTOG_RX(ENDP1);            // NOT TX ie SW_BUF
  SetEPTxStatus(ENDP1, EP_TX_NAK);
  SetEPRxStatus(ENDP1, EP_RX_DIS); // NOT TX DISABLE

В hw_config.c переписал CDC_Send_DATA.
Код
////// hw_config.c
/*uint32_t CDC_Send_DATA (uint8_t *ptrBuffer, uint8_t Send_length)
{
  //if max buffer is Not reached
  if(Send_length <= VIRTUAL_COM_PORT_DATA_SIZE)
  {
    packet_sent = 0;    //Sent flag
    // send  packet to PMA
    UserToPMABufferCopy((unsigned char*)ptrBuffer, ENDP1_TXADDR, Send_length);
    SetEPTxCount(ENDP1, Send_length);
    SetEPTxValid(ENDP1);
  }
  else
  {   return 0;  }
  return 1;
} */

uint32_t CDC_Send_DATA(uint8_t* ptrBuffer, uint8_t Send_length)
{
  if(Send_length > VIRTUAL_COM_PORT_DATA_SIZE) return 0;

  if (GetENDPOINT(ENDP1) & EP_DTOG_RX) // NOT TX ie SW_BUF
  {
    UserToPMABufferCopy(ptrBuffer, ENDP1_BUF0ADDR, Send_length);
    SetEPDblBuf0Count(ENDP1, EP_DBUF_IN, Send_length);
  }
  else
  {
    UserToPMABufferCopy(ptrBuffer, ENDP1_BUF1ADDR, Send_length);
    SetEPDblBuf1Count(ENDP1, EP_DBUF_IN, Send_length);
  }

  FreeUserBuffer(ENDP1, EP_DBUF_IN); // Toggles EP_DTOG_RX / SW_BUF
  SetEPTxValid(ENDP1);
  packet_sent = 0;

  return 1;
}

В main.c заменил главный цикл что бы он постоянно отправлял данные
Код
#define BUF_SIZE 64
  uint8_t Send_Buf[BUF_SIZE], j=0, i;
  for( i=0; i<BUF_SIZE; i++ ) Send_Buf[i]=j++;

while (1)
  {
    if (bDeviceState == CONFIGURED)
    {
      if ( packet_sent == 1 )
      {
        CDC_Send_DATA( (unsigned char*)Send_Buf, BUF_SIZE );
        for( i=0; i<BUF_SIZE; i++ )  Send_Buf[i]=j++;
      }
    }
  }
misyachniy
Цитата(Utyff @ Jan 24 2014, 21:19) *
Я переделал стандартный пример VirtualComport_Loopback на работу с USB double buffer.
Но скорость передачи не изменилась ~550 кб/сек.
Нормального примера на Endpoint_IN Double buffer я не смог найти.
Кто имел опыт с double buffer, подскажите что не так делаю?



Позволю себе включить телепатические способности :-)
Очевидно автор хотел поднять скорость обмена?

На сколько я помню классс устройств CDC имеет ограничение на скорость передачи 64КБ в секунду.
Если умножить 64К на 8 то получиться около 550 кб/сек.
И количество буферов не поможет.
Utyff
Цитата(misyachniy @ Jan 25 2014, 21:52) *
На сколько я помню класс устройств CDC имеет ограничение на скорость передачи 64КБ в секунду.
Если умножить 64К на 8 то получиться около 550 кб/сек.
И количество буферов не поможет.


По моему ты что-то путаешь. FT232 стабильно тянет больше 2 мбит/сек (256 кбайт/с)
У меня скорость 580 кбайт/сек или 4,6 мбит/сек.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.