Jump to content

    

kostya-m

Участник
  • Content Count

    193
  • Joined

  • Last visited

Community Reputation

0 Обычный

About kostya-m

  • Rank
    Частый гость

Recent Profile Visitors

1762 profile views
  1. Супер! Спасибо, все заработало
  2. Регистры процессора - да. А мне нужно поработать с регистрами периферии. Суббота, вечер....
  3. Поскольку не удается разобраться с некоторыми тонкостями встроенной аппаратуры, хотелось бы просматривать регистры. Вопрос по решениею задачи. Может можно инсталлировать определение чипа из более новой версии, если да - поделитесь. Может более новая версия 8.4 согласиться работать с той же лицензией от 7.5?
  4. Реализаций USB Audio Class 1 с асинхронной передачей и точкой обратной связи достаточно в Интернете и оно работает, обычно на FS. Захотелось реализовать версию 2 и на HS. Поскольку хочется иметь поддержку высоких скоростей без значительных процессорных затрат, первично отлаженный протокол положенный на стандартный Cebu код стал перекладывать на DMA и отдельные EP1 прерывания. Так же код Cube был творчески переработан под решение конкретной задачи. Все бы хорошо и работает.... кроме одного. Не работает обратная связь. Прим данные идет через OUTEP1, а обратная связь на INEP1. С приемом никаких проблем нет. А вот с отправкой неожиданная проблема. Точка открывается нормально с обеих сторон. Хост шлет запросы каждые 8 SOF, как указано в дескрипторе. Это видно и по Device Monitoring Studio и по прерываниям на INEP1 - постоянное прерывание NAK, сигнализирующее о том, что был отправлен пустой пакет, вместо данных (In case of isochronous IN endpoints the interrupt gets generated when a zero length packet is transmitted due to unavailability of data in the Tx FIFO.) При этом DIEPCTL, DIEPSIZ и DIEPDMA запрограммированы корректно, но DMA не начинает заполнять Fifo данными. Бывают разовые случаи передачи одного первого пакета, но после все равно данные не забираются. Это видно не только по пустым отправкам, но и по тому, что DIEPSIZ не модифицируется, а должен был бы считать назад. Без DMA все работало, но, к сожалению, нельзя указать DMA по отдельным точкам, а так FeedBack - 4 байта и проще было бы засунуть в Fifo руками, но контроллер не дает и вызывает HarFault при такой попытке. Особенность всего в том, что и прием и передача делаются изохронными точками. Четность при посылке учитывается, но я даже пытался с ней играть - не помогало. Да и не могло, четность работает уже когда данные в Fifo, а я не могу их туда засунуть. Уже ходят мысли перенести FeedBack точку на INEP2 и вернуть обработку на основное прерывание. Может кто сталкивался с таким? Процессор конкретно 32F745VG, ULPI chip USB3320C. Хостом работает комп с Win10, поскольку в них есть встроенные драйвера USB Audio Class 2. Устройство распознается и работает, включая ASIO в Foobar2000. Но поскольку не работает FB, то буфер достаточно быстро опустошается, на 44/48 кГц где-то за пару минут, а на 352/384 кГц за секунды.
  5. Есть пара разработанных и работающих плат управления для аудио устройств. Платы управления на чипах серии STM32F7. USB c внешней физикой. Прошивки на основе FreeRTOS 9 базово собраны в Cube и доделаны. Они работают. Я начал сам писать USB Audio 2.0 и компьютер даже видит устройство, которое не работает. Но времени катастрофически не хватает. Надо написать протокол, что бы он нормально жил с Win10 (желательно и Win7) на хотя бы двух режимах 352/16 и 384/16. Это не USB Audio 1.0, реализация которого есть в Cube. Во втором протоколе надо реализовывать асинхронный режим. Описание протокола есть у меня и на сайте USB. Код должен быть на С без ++. Заплатить готов 25 тр. Работа не срочная, может время от времени встречаться в Москве на Авиамоторной в МТУСИ. Связь со мной по мылу Musatoff @ mail . ru Получится, есть темы для продолжения.
  6. Спасибо про ремапинг. Но вот и еще один вариант :)
  7. Условия: Плата с STM32F745VET (100 pin) Схема спроектирована с помощью CubeMX и им же сделан базовый код. Проблема: Не работает дисплей Анализ: Исследования с помощью многоканального осциллоскопа показало белиберду в управляющих сигналах. Безуспешные попытки: Пробовал изменять режимы работы FMC, тайминги, настройки. Ничего принципиально не помогает. Если код исполнять пошагово, то работает, если непрерывно - не работает. Промежуточным решением оказалось вставить после каждого обращения к LCD задержку на 400-500 нс. Но скорость записи сильно страдает. Решение: Похоже, в FMC, в отличие от FSMC есть логика кеширования. Запись в дисплей ведется по двум адресам ((__IO uint16_t*)0x60000000) и ((__IO uint16_t*)0x60020000). Данные потоком пишутся по второму адресу и FMC начинает пропускать циклы записи, оставляя последний. Отключение FIFO не помогает. Решением оказалось инкрементирование адреса в рамках до A16, которым проводится разделение команда-данные. void LCD_CMD( uint16_t cmd ) { static volatile uint16_t *Cmd = ((__IO uint16_t*)0x60000000); *(Cmd++) = cmd; if( Cmd >= ((__IO uint16_t*)0x6000FFF) ) Cmd = ((__IO uint16_t*)0x60000000); } void LCD_DATA( uint16_t data ) { static volatile uint16_t *Data = ((__IO uint16_t*)0x60020000); *(Data++) = data; if( Data >= ((__IO uint16_t*)0x6002FFFF)) Data = ((__IO uint16_t*)0x60020000); } Так все заработало
  8. Имя, с которым возникала неоднозначность сборки: .itcmram , а имена без точки дают однозначную сборку
  9. Искал. Кроме нескольких указанных функций никого не было. Но это уже неактуально, перешел на дефолтные название. Там не может какой-либо особенности по использованию точки в начале названия секции? Без точки работает.
  10. Кроме функций я туда ничего не пихаю. Однако, пришлось отказаться от этого названия, при дефолтном названии .textrw такого не происходит.
  11. Разобрался с вопросом. Нужная технология называется static overlay Описана тут и там есть хороший пример в архиве, по которому все становится понятно https://www.iar.com/support/tech-notes/link...-example-v5.50/
  12. Думал что в сказку попал. Ан нет. Так, все же, какие можете предложить решения?
  13. Буфер выровненный. Пробовал его делать более широкий, uint16_t - не помогло. 32 бита не стал делать - код в функциях THUMB - 16-и битный. Обратил внимание, что указатель на функцию, смотрит не на ее первый байт с четным номером, а на второй, с нечетным. Сделал копирование с адреса на 1 меньше - теперь буфер точно копирует данные в функции. Пробую запустить так же по нечетному адресу - пока не помогает.
  14. Есть толпа функций обработки данных, из которых работает только одна, в зависимости от настроек. При этом матобработка критична по скорости, потому им бы лежать в ОЗУ. Но их много и хчется сэкономить место в ОЗУ. У всех функций один и тот же программный интерфейс. typedef void (*DataTransfer_t)( uint32_t ); После компиляции всех функций я посмотрел в мэп файле наиболее длинную из них и сделал с небольшим запасом буфер char FuncBuffer[512] @ ".itcmram"; Потом копирую в буфер тело функции memcpy( FuncBuffer, (char*)DataTransfer1, 512 ); После чего пытаюсь запустить ((DataTransfer_t)FuncBuffer)( FirAskSlot ); Но не тут то было, вываливаюсь в Hard_fault. Что я сделал неправильно?
  15. Разрешил вопрос. Это все же глюк IAR-а Перестал использовать указание на секцию @ ".itcmram" А только префикс __ramfunc И добавил в ICF place in ITCMRAM_region {section .itcmram, section .textrw }; Теперь все функции залазят в ОЗУ