Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: scmRTOS+usb-device
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > scmRTOS
Legath
Добрый день.
Как я обмолвился в соседней теме, хочу создать устройство комбинированного локатора которое взаимодействует с ПК посредством usb.
За основу взял шаблон проекта usb cdc из набора с сайта st. недостающие файлы (usbd_desc.c usbd_desc.h usbd_usr.c ) взял оттуда же, из демонстрации. Функции инициализации не менял.
Но при подключении к ПК в dmesg упоминаний нет. Грешу на то, что конфликтует инициализация, т.к. она от ОС. Подскажите в какую сторону начать отладку?
В отладчике пока не могу посмотреть, st-util не прошивает файл больше 40кб, openocd не работает с eclipse из-за ошибки в тулчейне.
Разъем исправен точно, проверял демонстрационной прошивкой. В проекте есть лишние файлы для host библиотеки, они выключены из сборки в eclipse.
AHTOXA
А программа-то работает вообще? Лампочкой, например, мигает?
Legath
Нет, шим не генерируется
AHTOXA
Что-то я не вижу обработчика прерывания USB (OTG_FS_IRQHandler()).
Legath
Добавил обработчик со следующим текстом
Код
void OTG_FS_IRQHandler(void)
{
  USBD_OTG_ISR_Handler (&USB_OTG_dev);
}


Шим генерируется, но usb не инициализируется. в dmesg нет упоминания. и в прерывание по usb не уходит.
_Артём_
Цитата(Legath @ Nov 5 2012, 18:35) *
Добавил обработчик со следующим текстом
Шим генерируется, но usb не инициализируется. в dmesg нет упоминания. и в прерывание по usb не уходит.

А куда уходит?
Флаги прерывания устанавливаются? Или usb совсем не проинициализирован?
AHTOXA
На всякий случай напомню, что в cpp-файлах обработчик прерывания должен быть объявлен как
Код
extern "C" void OTG_FS_IRQHandler(void)
{
...

Сравните процедуры инициализации (init_clocks() в sysinit.cpp и SetSysClock() в system_stm32f4xx.c). Убедитесь, что частоты совпадают (что частота USB правильная).
_Артём_
Цитата(AHTOXA @ Nov 5 2012, 19:09) *
На всякий случай напомню, что в cpp-файлах обработчик прерывания должен быть объявлен как
Код
extern "C" void OTG_FS_IRQHandler(void)
{
...

В STM-ских хидерах С++ не поддержан?
AHTOXA
Нет, не поддержан.
Legath
Extern не нужен, обработчик в C файле. Процедуры инициализации почти одинаковые и , насколько вижу, USB не затрагивают.
Не может быть из-за того что USB_OTG_BSP_EnableInterrupt пустая? Прерывание получается не прописано.

А слона то я и не заметил, USB_OTG_BSP_Init не перетащил из примера/

Но чего то все еще не хватает.
Legath
Получил заветную строку
usb 3-1: new full speed USB device number 11 using ohci_hcd

Дело было в void USB_OTG_BSP_Init(USB_OTG_CORE_HANDLE *pdev) , ID pin неправильно инициализировал.

Но устройство в /dev не появляется. Буду разбираться дальше.

UPD: выставил гарантированно работающие VID/PID - результата нет.

П.С. заранее прошу прощения за то что превратил тему в блог
AHTOXA
Цитата(Legath @ Nov 6 2012, 17:03) *
П.С. заранее прошу прощения за то что превратил тему в блог

Ничего-ничего, нам тоже интересно, мы все за вас болеемsm.gif
Legath
Вновь занялся проблемой, раскопал что ядро отвергает устройство с ошибкой 110 (ETIMEDOUT - Connection timed out ). Посему делаю вывод что при подключении что то не отсылается.

upd: что странно, если запускать в отладчике то все работает.

разрешил idle hook с телом __NOP() и девайс определился, вечером буду проверять на работу с данными.
AHTOXA
idle hook с телом __NOP() - это даже не шаманство, это чистое плацебоsm.gif
Я в том смысле, что это абсолютно ничего не меняет в работе оси. Вспоминайте, что ещё поменяли вместе с этим хуком.
Legath
так без него то не работает. сам в шоке был когда заметил.
Legath
Не пойму почему еще (возможно плохо смотрел мануал), если ставлю sleep с аргументом, то все время нахожусь в первом процессе, и соответственно получаю usb timeout, а если ставлю параметр по умолчанию то выполняется один раз и все время в idle.

Точнее в отладчике все время нахожусь в цикле
Код
        do
        {
            enable_context_switch();
            DUMMY_INSTR();
            disable_context_switch();
        }


Поэтому, вероятно, прерывание USB игнорируется?
AHTOXA
Если вызвать sleep с аргументом по умолчанию (0), то процесс уснёт насовсем. Таким образом, похоже, что вы усыпили все процессыsm.gif
Почему не вызывается прерывание USB - не знаю, напомню лишь, что если вы хотите использовать сервисы оси в прерывании, то вы должны объявить при входе в прерывание объект типа TISRW.
Legath
Объект TISRW есть. таймауты ненулевые поставил, для отладки в процессах моргаю диодом. Заметил что при подключении USB ось парализуется, при этом USB-девайс определяется, стоит выдернуть шнур и ось работает.
Нашел, кажется, частичный ответ на свой вопрос, теперь паралич наступает чуть позже втыкания кабеля.
Legath
Передачу запустил, пока правда не понял как. Осталось разобраться с приемом, DataRx почему то не вызывается.
Прикладываю проект с продвижениями. Нажмите для просмотра прикрепленного файла
Посторонним В...
Цитата(AHTOXA @ Nov 19 2012, 15:35) *
idle hook с телом __NOP() - это даже не шаманство, это чистое плацебоsm.gif
Я в том смысле, что это абсолютно ничего не меняет в работе оси. Вспоминайте, что ещё поменяли вместе с этим хуком.


бывало такое в кейле что проект не работал...
и диагноз такой же.... добавил строку - работает... убрал не работает или наоборот...

необходимо было лишь выровнять структуры данных или там код то ли по 2 то ли оп 4
demiurg_spb
Может быть дело в отсутствии барьеров?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.