Builder 0 29 сентября, 2015 Опубликовано 29 сентября, 2015 · Жалоба Тестирую проект полученный от STM32CubeMX для STMF207VG. Использую демоброду TE-STM32F207 Как-то странно работает. Проблему с замиранием передачи нашел как решить - в ф-ии USBD_CDC_TransmitPacket переместить код hcdc->TxState = 1; до вызова USBD_LL_Transmit. Вроде заработало, но споткнулся на том, что если за раз передаю меньше 4-х байт, то передается бред - каша из ранее переданных байт. Под отладчиком нашел место где данные пишутся в регистры - всё пишется правильно (ф-я USB_WritePacket). Такое впечатление что что-то с инициализацией, но с ходу ошибки не вижу. Если передаю 4 и более байт за раз - проблем вроде пока не вижу. Кто-то с таким сталкивался? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Still Enemy 0 29 сентября, 2015 Опубликовано 29 сентября, 2015 · Жалоба Код в студию(лучше всего usb_cdc_if.c). Я не давно разбирался именно с CDC и я уверен, что я вам могу помочь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Builder 0 29 сентября, 2015 Опубликовано 29 сентября, 2015 · Жалоба Код в студию(лучше всего usb_cdc_if.c). Я не давно разбирался именно с CDC и я уверен, что я вам могу помочь. Вечером отпишу, тестовую платформу дома гоняю - не с собой код. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Builder 0 29 сентября, 2015 Опубликовано 29 сентября, 2015 · Жалоба Код в студию(лучше всего usb_cdc_if.c). Я не давно разбирался именно с CDC и я уверен, что я вам могу помочь. Проект и файл. Проект перегенерил и убрал почти всё свое. Оставил только тестовый код, передающий данные. И моего: тестовый код в функции StartDefaultTask, отмечено в комментариях, какой вариант работает, а какой - нет. Исправлена ошибка библиотеки в ф-и USBD_CDC_TransmitPacket Stack_Size и Heap_Size увеличен до 0x400 usbd_cdc_if.c - оставил как был после генерации кода из STM32CubeMX. ArmSTM32F2.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smalcom 0 29 сентября, 2015 Опубликовано 29 сентября, 2015 · Жалоба 4 байта? подозрительно похоже на int, Это не может быть связано где-то с выравниванием данных? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Builder 0 29 сентября, 2015 Опубликовано 29 сентября, 2015 · Жалоба 4 байта? подозрительно похоже на int, Это не может быть связано где-то с выравниванием данных? не похоже - нашел место, где идет запись в регистр. На первый взгляд всё читается из буфера и пишется в регистр правильно. Похоже или какая-то особенность реализации у STM32CubeMX, которую не учитываю или ошибка в инициализации железа. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Still Enemy 0 30 сентября, 2015 Опубликовано 30 сентября, 2015 · Жалоба Сделайте буфферы глобальными или статическими. За время пока по нескольким прерываниям произойдёт передача данных в стек USB, ваши ЛОКАЛЬНЫЕ данные прога может потереть раз 5. То что, у вас одна последовательность прокатывает, это вам просто повезло - просто этот участок памяти не затёрся. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Builder 0 30 сентября, 2015 Опубликовано 30 сентября, 2015 · Жалоба Сделайте буфферы глобальными или статическими. За время пока по нескольким прерываниям произойдёт передача данных в стек 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 */ } По буферам - буфера хоть и локальные, но статичны по сути, т.к. в функции бесконечный цикл задачи ОС. Сделайте буфферы глобальными или статическими. За время пока по нескольким прерываниям произойдёт передача данных в стек USB, ваши ЛОКАЛЬНЫЕ данные прога может потереть раз 5. То что, у вас одна последовательность прокатывает, это вам просто повезло - просто этот участок памяти не затёрся. Если есть возможность - попробуйте у себя передавать данные по 1 байту с паузой, как в моем тестовом примере, будет ли работать и на каком процессоре? Добавлю: проблемы наблюдаю, если посылки делаю по 1 или 2 байта, 3 байта вроде уходят нормально, возможно сразу не так что-то посмотрел. Я понимаю, что по USB отправлять пакеты по 1-2 байта не есть гуд, но при малых объемах так удобнее, чем собирать данные в пакет и отправлять пакетом... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Builder 0 3 октября, 2015 Опубликовано 3 октября, 2015 · Жалоба В общем плюнул на код, который с генерировал CubeMX, взял для теста пример - с ходу заработал. На первый взгляд библиотеки/функции используются те-же самые. Как будет время - сравню, чем отличаются/где ошибка. Добавлю, кажется нашел. Не нравились мои настройки частот в функции SystemClock_Config. Перенес настройки из работающего примера в неработающий - вроде всё заработало. А CubeMX на мои совсем и не ругался, хотят он проверяет корректность. Вот такой вот забавный эффект от некорректной настройки частот, будьте внимательны... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 5 6 октября, 2015 Опубликовано 6 октября, 2015 · Жалоба Добавлю, кажется нашел. Не нравились мои настройки частот в функции SystemClock_Config. Оно? 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 Или что-то ещё? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Builder 0 6 октября, 2015 Опубликовано 6 октября, 2015 · Жалоба Оно? http://www.st.com/web/en/resource/technica.../DM00027213.pdf Или что-то ещё? Вроде не оно, я это видел, в CubeMX пишет что 25MHz у меня шина, но я не перепроверил что оно там генерировало. Нет времени разбираться, пока работает, это пока для тестов сделано, протестирую как будет себя вести. Если интересно - в архиве почти "голый проект" от CubeMX, ничего лишнего, есть и от CubeMX файл. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться