Перейти к содержанию
    

STM32f103 USB double buffer

Я переделал стандартный пример 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++;
      }
    }
  }

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я переделал стандартный пример VirtualComport_Loopback на работу с USB double buffer.

Но скорость передачи не изменилась ~550 кб/сек.

Нормального примера на Endpoint_IN Double buffer я не смог найти.

Кто имел опыт с double buffer, подскажите что не так делаю?

 

 

Позволю себе включить телепатические способности :-)

Очевидно автор хотел поднять скорость обмена?

 

На сколько я помню классс устройств CDC имеет ограничение на скорость передачи 64КБ в секунду.

Если умножить 64К на 8 то получиться около 550 кб/сек.

И количество буферов не поможет.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На сколько я помню класс устройств CDC имеет ограничение на скорость передачи 64КБ в секунду.

Если умножить 64К на 8 то получиться около 550 кб/сек.

И количество буферов не поможет.

 

По моему ты что-то путаешь. FT232 стабильно тянет больше 2 мбит/сек (256 кбайт/с)

У меня скорость 580 кбайт/сек или 4,6 мбит/сек.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...