Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: f4 usb cdc замирает передача.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
diwil
здравствуйте.

Задача такая:
у stm32f405 поднят SPI в SLAVE режиме.
Он принимает по 64 бита 32000 раза в секунду, т.е. 2048000 бит/сек.

Это надо передать в комп.

Из доступных интерфейсов есть только 2 уарта и USB.
Я воспользовался кубом и сгенерил код для USB CDC.
Использую стандартные драйверы.

Передавать данные пытаюсь так -

8 миллисекунд накапливаю данные из spi (2048 байт), затем пытаюсь передать их в комп стандартной функцией.
Я пытался подпихнуть стандартной функции передачи и сразу весь буфер и пачками по 64 байта, а потом ждал окончания передачи, но результат всегда один - через секунду передача останавливается.

Я снизил скорость передачи до 128кБит - результат тот же - функция передачи через некоторое время возвращает USB_BUSY.

кто-нибудь сталкивался с такой проблемой?
А по CDC вообще можно передать 2МБит/сек?
Если нет, то в какую сторону смотреть?
Aner
"Я воспользовался кубом" ... в ж..у его как можно быстрее! Сами пришите предварительо разобравшись с USB и как его реализовать, как HID или со своими дровами, проблем меньше будет. ... Да, там кучка оч разных в F4xx ... А VID, PID чей?
Golikov A.
Цитата
кто-нибудь сталкивался с такой проблемой?

Много кто замечал что со стороны винды в CDC драйвере есть какие-то проблемы из-за которых иногда не с того не с сего возникает пауза в передачи данных. Если на это наложена какая-то кривость в драйверах от STM куба, может все быть печально, смотрите реакции на ошибки и задержки в шине как реализованы.
diwil
Цитата(Aner @ Jul 11 2015, 01:21) *
"Я воспользовался кубом" ... в ж..у его как можно быстрее! Сами пришите предварительо разобравшись с USB и как его реализовать, как HID или со своими дровами, проблем меньше будет. ... Да, там кучка оч разных в F4xx ... А VID, PID чей?


вид пид от ST
Corvus
Похожая проблема и решение
http://habrahabr.ru/post/248729/
diwil
Цитата(Corvus @ Jul 11 2015, 08:52) *
Похожая проблема и решение
http://habrahabr.ru/post/248729/


Спасибо за ссылку.
Ну тут я посмотрю позже.
Я под гнутым или кейлом, а тим ИАР - зверь мне неведомый.

Частично проблемма решена...

1. Ошибкой было использовать QSerialPort в качестве приемника со стороны PC.
Насколько я понял, он сильно тормозит и тупо перестает передавать данные из буфера ядра в мой буфер, a первый оч быстро переполняется.
Так же он , как мне кажется, не совсем адекватно работает с буферами большого размера.

За сим, чисто виндовыми средствами (ReadFile, WriteFile) пользуюсь теперь. Опять же в MinGW QT для простоты.

2. С передающей стороны я передаю по 64 байта за раз, а потом жду окончания передачи вот так:
Код
                                GPIOB->BSRR = GPIO_PIN_8;
                int k = 0;
                char *a = (char *)l1;
                
                while( k < 512*4)
                {
                    CDC_Transmit_FS(a,64);
                    while(USBD_CDC_Busy());
                    a += 64;
                    k += 64;
                }

                dsaved += 2048;
                
                GPIOB->BSRR =  (uint32_t)GPIO_PIN_8 << 16;

////
....

int  USBD_CDC_Busy()
{      
  USBD_CDC_HandleTypeDef   *hcdc = (USBD_CDC_HandleTypeDef*) hUsbDevice_0->pClassData;
  
    return hcdc->TxState;
}


При тактовой ~168 МГц (у меня клок проца 4096кГц. так надо.) передача 2048 байт пакетами по 64 байта занимает 2.5мс (смотрю осциллом на порту Б пин 8).
это значит, что реально скорость передачи получается 2048 * 8 * (1/0.0025) =~ 6.5 МБит/сек.
При этом ничего не теряется и не сбивается, что радует.



Ну и, если кому вдруг интересно (сие позволило измерить), у pcm3500 кросс-талк получается около -92дБ.
diwil
а вот еще обновление:
обновление библиотек ф4 куба до 1.6.0 и увеличение размера буфера до 8192 в виндовом приемнике позволило передавать по 2к как
CDC_Transmit_FS(a,2048);
без замираний и ошибок
Make_Pic
Цитата(diwil @ Jul 12 2015, 12:33) *
...
1. Ошибкой было использовать QSerialPort в качестве приемника со стороны PC.
Насколько я понял, он сильно тормозит и тупо перестает передавать данные из буфера ядра в мой буфер, a первый оч быстро переполняется.
...


А вы в отдельном потоке надеюсь запускали Qserialport?
Так ошибок и тормозов не должно быть
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.