реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> STMF207VG + HAL +CDC (STM32CubeMX), с ошибками передаёт если посылаю 1,2 или 3 байта, 4 и более - работает
Builder
сообщение Sep 29 2015, 06:52
Сообщение #1


iBuilder©
****

Группа: Свой
Сообщений: 519
Регистрация: 14-07-04
Из: Минск
Пользователь №: 322



Тестирую проект полученный от STM32CubeMX для STMF207VG.
Использую демоброду TE-STM32F207
Как-то странно работает.
Проблему с замиранием передачи нашел как решить - в ф-ии USBD_CDC_TransmitPacket переместить код hcdc->TxState = 1; до вызова USBD_LL_Transmit.
Вроде заработало, но споткнулся на том, что если за раз передаю меньше 4-х байт, то передается бред - каша из ранее переданных байт.
Под отладчиком нашел место где данные пишутся в регистры - всё пишется правильно (ф-я USB_WritePacket).
Такое впечатление что что-то с инициализацией, но с ходу ошибки не вижу.
Если передаю 4 и более байт за раз - проблем вроде пока не вижу.
Кто-то с таким сталкивался?
Go to the top of the page
 
+Quote Post
Still Enemy
сообщение Sep 29 2015, 10:14
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 29-01-15
Из: Нижний Новгород
Пользователь №: 84 817



Код в студию(лучше всего usb_cdc_if.c). Я не давно разбирался именно с CDC и я уверен, что я вам могу помочь.
Go to the top of the page
 
+Quote Post
Builder
сообщение Sep 29 2015, 10:31
Сообщение #3


iBuilder©
****

Группа: Свой
Сообщений: 519
Регистрация: 14-07-04
Из: Минск
Пользователь №: 322



Цитата(Still Enemy @ Sep 29 2015, 13:14) *
Код в студию(лучше всего usb_cdc_if.c). Я не давно разбирался именно с CDC и я уверен, что я вам могу помочь.

Вечером отпишу, тестовую платформу дома гоняю - не с собой код.
Go to the top of the page
 
+Quote Post
Builder
сообщение Sep 29 2015, 18:28
Сообщение #4


iBuilder©
****

Группа: Свой
Сообщений: 519
Регистрация: 14-07-04
Из: Минск
Пользователь №: 322



Цитата(Still Enemy @ Sep 29 2015, 13:14) *
Код в студию(лучше всего usb_cdc_if.c). Я не давно разбирался именно с CDC и я уверен, что я вам могу помочь.

Проект и файл. Проект перегенерил и убрал почти всё свое.
Оставил только тестовый код, передающий данные.
И моего: тестовый код в функции StartDefaultTask, отмечено в комментариях, какой вариант работает, а какой - нет.
Исправлена ошибка библиотеки в ф-и USBD_CDC_TransmitPacket
Stack_Size и Heap_Size увеличен до 0x400
usbd_cdc_if.c - оставил как был после генерации кода из STM32CubeMX.
Прикрепленные файлы
Прикрепленный файл  ArmSTM32F2.rar ( 1.04 мегабайт ) Кол-во скачиваний: 10
 
Go to the top of the page
 
+Quote Post
smalcom
сообщение Sep 29 2015, 20:10
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



4 байта? подозрительно похоже на int, Это не может быть связано где-то с выравниванием данных?
Go to the top of the page
 
+Quote Post
Builder
сообщение Sep 29 2015, 21:02
Сообщение #6


iBuilder©
****

Группа: Свой
Сообщений: 519
Регистрация: 14-07-04
Из: Минск
Пользователь №: 322



Цитата(smalcom @ Sep 29 2015, 23:10) *
4 байта? подозрительно похоже на int, Это не может быть связано где-то с выравниванием данных?

не похоже - нашел место, где идет запись в регистр. На первый взгляд всё читается из буфера и пишется в регистр правильно.
Похоже или какая-то особенность реализации у STM32CubeMX, которую не учитываю или ошибка в инициализации железа.
Go to the top of the page
 
+Quote Post
Still Enemy
сообщение Sep 30 2015, 06:48
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 29-01-15
Из: Нижний Новгород
Пользователь №: 84 817



Сделайте буфферы глобальными или статическими. За время пока по нескольким прерываниям произойдёт передача данных в стек USB, ваши ЛОКАЛЬНЫЕ данные прога может потереть раз 5. То что, у вас одна последовательность прокатывает, это вам просто повезло - просто этот участок памяти не затёрся.
Go to the top of the page
 
+Quote Post
Builder
сообщение Sep 30 2015, 07:38
Сообщение #8


iBuilder©
****

Группа: Свой
Сообщений: 519
Регистрация: 14-07-04
Из: Минск
Пользователь №: 322



Цитата(Still Enemy @ Sep 30 2015, 09:48) *
Сделайте буфферы глобальными или статическими. За время пока по нескольким прерываниям произойдёт передача данных в стек USB, ваши ЛОКАЛЬНЫЕ данные прога может потереть раз 5. То что, у вас одна последовательность прокатывает, это вам просто повезло - просто этот участок памяти не затёрся.
Попробовать можно, но если прочитаете первое сообщение - я дошел до функции USB_WritePacket, в которой идет перезапись из буфера в регистры USB. Так там всё вычитывается правильно, я вижу младшим байтом то, что должна передаться. А реально приходит не тот байт. Уже думал на программу со стороны PC, но потестил древней простой MTTTY.exe из старых примеров VS, много используемой ранее.
Привожу куски, как отправляю:
Если так отправляю, работает
Код
void StartDefaultTask(void const * argument)
{
  /* init code for USB_DEVICE */
  MX_USB_DEVICE_Init();

  /* USER CODE BEGIN 5 */
    uint8_t buf_add1[]="-";
    uint8_t buf_add2[]="123;";
    osDelay(10000);
    
  for(int i=0;1;i++)
  {
        // Этот код работает ---------------------------------------
            while(CDC_Transmit_FS(buf_add1, 1)!=USBD_OK) osDelay(1);
            osDelay(100);
            while(CDC_Transmit_FS(buf_add2+2, 2)!=USBD_OK) osDelay(1);
            osDelay(100);
            while(CDC_Transmit_FS(buf_add2+1, 3)!=USBD_OK) osDelay(1);
            osDelay(100);
            while(CDC_Transmit_FS(buf_add2, 4)!=USBD_OK) osDelay(1);
            osDelay(100);
        }  /* USER CODE END 5 */
}

А если так, не работает - кашу получаю
Код
void StartDefaultTask(void const * argument)
{
  /* init code for USB_DEVICE */
  MX_USB_DEVICE_Init();

  /* USER CODE BEGIN 5 */
    uint8_t buf_add1[]="-";
    uint8_t buf_add2[]="123;";
    osDelay(10000);
    
  for(int i=0;1;i++)
  {
    // Этот код НЕ работает - передает "кашу"    
    while(CDC_Transmit_FS(buf_add2, 1)!=USBD_OK) osDelay(1);
    osDelay(100);
    while(CDC_Transmit_FS(buf_add2+1, 1)!=USBD_OK) osDelay(1);
    osDelay(100);
    while(CDC_Transmit_FS(buf_add2+2, 1)!=USBD_OK) osDelay(1);
    osDelay(100);
    while(CDC_Transmit_FS(buf_add2+3, 1)!=USBD_OK) osDelay(1);
    osDelay(100);
}  /* USER CODE END 5 */
}

По буферам - буфера хоть и локальные, но статичны по сути, т.к. в функции бесконечный цикл задачи ОС.

Цитата(Still Enemy @ Sep 30 2015, 09:48) *
Сделайте буфферы глобальными или статическими. За время пока по нескольким прерываниям произойдёт передача данных в стек USB, ваши ЛОКАЛЬНЫЕ данные прога может потереть раз 5. То что, у вас одна последовательность прокатывает, это вам просто повезло - просто этот участок памяти не затёрся.

Если есть возможность - попробуйте у себя передавать данные по 1 байту с паузой, как в моем тестовом примере, будет ли работать и на каком процессоре?

Добавлю: проблемы наблюдаю, если посылки делаю по 1 или 2 байта, 3 байта вроде уходят нормально, возможно сразу не так что-то посмотрел. Я понимаю, что по USB отправлять пакеты по 1-2 байта не есть гуд, но при малых объемах так удобнее, чем собирать данные в пакет и отправлять пакетом...
Go to the top of the page
 
+Quote Post
Builder
сообщение Oct 3 2015, 22:57
Сообщение #9


iBuilder©
****

Группа: Свой
Сообщений: 519
Регистрация: 14-07-04
Из: Минск
Пользователь №: 322



В общем плюнул на код, который с генерировал CubeMX, взял для теста пример - с ходу заработал.
На первый взгляд библиотеки/функции используются те-же самые.
Как будет время - сравню, чем отличаются/где ошибка.

Добавлю, кажется нашел. Не нравились мои настройки частот в функции SystemClock_Config.
Перенес настройки из работающего примера в неработающий - вроде всё заработало.
А CubeMX на мои совсем и не ругался, хотят он проверяет корректность.
Вот такой вот забавный эффект от некорректной настройки частот, будьте внимательны...
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Oct 6 2015, 08:23
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Цитата(Builder @ Oct 4 2015, 01:57) *
Добавлю, кажется нашел. Не нравились мои настройки частот в функции SystemClock_Config.


Оно?
Цитата(Errata)
In order to guarantee correct operation of the USB OTG FS peripheral, the AHB frequency should be configured to be not less than 14.2 MHz.

http://www.st.com/web/en/resource/technica.../DM00027213.pdf

Или что-то ещё?


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
Builder
сообщение Oct 6 2015, 20:27
Сообщение #11


iBuilder©
****

Группа: Свой
Сообщений: 519
Регистрация: 14-07-04
Из: Минск
Пользователь №: 322



Цитата(esaulenka @ Oct 6 2015, 11:23) *
Вроде не оно, я это видел, в CubeMX пишет что 25MHz у меня шина, но я не перепроверил что оно там генерировало.
Нет времени разбираться, пока работает, это пока для тестов сделано, протестирую как будет себя вести.
Если интересно - в архиве почти "голый проект" от CubeMX, ничего лишнего, есть и от CubeMX файл.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th July 2025 - 02:33
Рейтинг@Mail.ru


Страница сгенерированна за 0.01432 секунд с 7
ELECTRONIX ©2004-2016