USB

32-разрядные микроконтроллеры разработки АО "НИИЭТ"

Модераторы: ea, dav, bkolbov, Alis, pip, _sva_

Сергей
Сообщения: 20
Зарегистрирован: 25 янв 2018, 15:10
Предприятие: АО "Корпорация "ВНИИЭМ"

USB

Сообщение Сергей »

На основе проекта, выложенного в репозитории, работы с USB, сделал вот такую инициализацию USB контроллера.

void Usb_Init(void)
{
NT_COMMON_REG->PER_RST0 |= 1 << COMMON_REG_PER_RST0_USBPHYRST_Pos;

// NT_COMMON_REG->USB_CTRL = 0x05;
//выберем частоту 24 МГц
//тактируется от входа CLK_USB
//разрешим синхронизацию
NT_COMMON_REG->USB_CTRL = (1 << COMMON_REG_USB_CTRL_FSEL_Pos) | (1 << COMMON_REG_USB_CTRL_CLKEN_Pos);

NT_USBDevice->USB_IRQ_ENB = (1 << USBDevice_USB_IRQ_ENB_SOFINTEN_Pos) | \
(1 << USBDevice_USB_IRQ_ENB_RESSTATUSINTEN_Pos) | \
(1 << USBDevice_USB_IRQ_ENB_RESUMEINTEN_Pos) | \
(1 << USBDevice_USB_IRQ_ENB_SUSPENDINTEN_Pos);

NT_USBDevice->IRQ_ENB_L = 1 << USBDevice_IRQ_ENB_L_USBBUSINTEN_Pos;

NT_USBDevice->USB_OPER = 0x00;
NT_USBOTG->OTG_IRQ_STAT &= ~(1 << USBOTG_OTG_IRQ_STAT_A_BUSREQ_Pos);
NT_USBOTG->OTG_IRQ_STAT |= 1 << USBOTG_OTG_IRQ_STAT_B_BUSREQ_Pos;

Энвик_ClearPendingIRQ(USBOTG_IRQn);
Энвик_EnableIRQ(USBOTG_IRQn);
}
При подключении отладочной платы к компьютеру ничего не происходит. Компьютер даже не определяет, что к нему что-то подключилось.
Что нужно сюда добавить или что-то исправить, чтобы компьютер определил, что к нему по USB подключилось неизвестное устройство.
Аватара пользователя
Лашкевич
Сообщения: 372
Зарегистрирован: 13 май 2015, 13:10
Предприятие: ООО "НПФ Вектор"
Откуда: Москва
Контактная информация:

Re: USB

Сообщение Лашкевич »

У нас USB заработал на основе примера, смотрите исходники проекта https://bitbucket.org/niietcm4/motorcontroldemo
Может быть тактирование запрещено или в аппаратной части проблемы.
С уважением,
Лашкевич Максим.
Инженер-программист ООО "НПФ Вектор", Москва.
http://motorcontrol.ru/
Сергей
Сообщения: 20
Зарегистрирован: 25 янв 2018, 15:10
Предприятие: АО "Корпорация "ВНИИЭМ"

Re: USB

Сообщение Сергей »

Почему в Вашем примере в функции
void USB_enable_peripheral (void)
Вы используете такую запись
NT_COMMON_REG->PER_RST1 |= (1<<3); //clear reset from usb phy
когда как usb phy согласно документации находится в регистре PER_RST0
Аватара пользователя
Лашкевич
Сообщения: 372
Зарегистрирован: 13 май 2015, 13:10
Предприятие: ООО "НПФ Вектор"
Откуда: Москва
Контактная информация:

Re: USB

Сообщение Лашкевич »

Сложно сказать, давно это было. Выглядит как ошибка по Вашим словам, однако наш программист, который это писал, сказал что не помнит уже ничего.
С уважением,
Лашкевич Максим.
Инженер-программист ООО "НПФ Вектор", Москва.
http://motorcontrol.ru/
bkolbov
Сообщения: 248
Зарегистрирован: 14 дек 2015, 11:37
Предприятие: АО НИИЭТ
Откуда: Воронеж

Re: USB

Сообщение bkolbov »

Сергей писал(а): 21 май 2018, 12:54 Почему в Вашем примере в функции
void USB_enable_peripheral (void)
Вы используете такую запись
NT_COMMON_REG->PER_RST1 |= (1<<3); //clear reset from usb phy
когда как usb phy согласно документации находится в регистре PER_RST0
Возможно пример писался под совсем старую версию хедера и по старой документации, еще до массовой правки имен регистров, когда сделали, чтобы все регистры с номером вели нумерацию с нуля. Регистры PER_RST1, PER_RST2 стали впоследствии PER_RST0, PER_RST1.
Аватара пользователя
Disona
Сообщения: 81
Зарегистрирован: 06 дек 2016, 11:18
Предприятие: НПФ Вектор
Откуда: Москва
Контактная информация:

Re: USB

Сообщение Disona »

Добрый день, я вспомнил.
Как уже было сказано выше, работа с USB основана на готовом примере от НИИЭТ - многие операции были скопированы из примера не глядя. Поэтому, действительно, ошибки могут присутствовать и, возможно, это одна из них.
Пример, на основе которого мы внедрили USB - https://bitbucket.org/niietcm4/example_ ... T/GCC/USB/
Конкретный файл, имитирующий Virtual COM Port:
https://bitbucket.org/niietcm4/example_ ... VCP/main.c

Там тоже сброс осуществляется через регистр RST1 в функции "SystemInit()". Я предполагаю, что это действительно неверно, но пример работает, т.к. где-то в других местах происходит этот сброс.

Касательно последнего поста от bkolbov:
Возможно пример писался под совсем старую версию хедера и по старой документации, еще до массовой правки имен регистров, когда сделали, чтобы все регистры с номером вели нумерацию с нуля. Регистры PER_RST1, PER_RST2 стали впоследствии PER_RST0, PER_RST1.
Я посмотрел проект на bitbucket - нет, там заголовочники уже новые.
С уважением, Дмитрий Шпак
ООО "НПФ Вектор"
Сергей
Сообщения: 20
Зарегистрирован: 25 янв 2018, 15:10
Предприятие: АО "Корпорация "ВНИИЭМ"

Re: USB

Сообщение Сергей »

Используется ли у Вас вход CLK_USB (23 нога контроллера, вход PA0). Если да, то на какую частоту установлен генератор.
Есть предположение, что не работает тактирование от OSC_CLK, так как у меня не заработал Ваш пример на плате от "Мехатроника про", где вход CLK_USB не используется.
Аватара пользователя
Лашкевич
Сообщения: 372
Зарегистрирован: 13 май 2015, 13:10
Предприятие: ООО "НПФ Вектор"
Откуда: Москва
Контактная информация:

Re: USB

Сообщение Лашкевич »

наша схемотехника доступна у нас на сайте http://motorcontrol.ru/production/contr ... _nt32m4f1/
С уважением,
Лашкевич Максим.
Инженер-программист ООО "НПФ Вектор", Москва.
http://motorcontrol.ru/
Bond
Сообщения: 3
Зарегистрирован: 18 фев 2018, 21:27
Предприятие: ООО "ГАМЕМ"

Re: USB

Сообщение Bond »

Год назад, в проекте USB Virtual Com Port, выложенному в репозитории, был обнаружен "баг".
После запуска программы при подаче питания на процессор и подключения его по USB к Windows, устройство не распознается Windos-ом.
После рестарта процессора через вывод "reset" без снятия питания, работает без замечаний. В Linux-е, как отмечалось год назад, такого эффекта не наблюдалось. Обсуждение этой проблемы год назад возникло в репозитории при участии авторов самой программы, но продолжения не последовало.
На днях сам "наступил на эти же грабли". Танцы с бубном ни к чему не привели.
Кто нибудь знает решение этой проблемы ?
Дмитрий_0577
Сообщения: 4
Зарегистрирован: 09 окт 2017, 20:29
Предприятие: СФ МЭИ

Re: USB

Сообщение Дмитрий_0577 »

Год назад, в проекте USB Virtual Com Port, выложенному в репозитории, был обнаружен "баг".
После запуска программы при подаче питания на процессор и подключения его по USB к Windows, устройство не распознается Windos-ом.
После рестарта процессора через вывод "reset" без снятия питания, работает без замечаний.
Эта проблема, по крайней мере в моём случае, была вызвана тем, что не устанавливались разрешения прерываний в регистре USB_IRQ_ENB. Поэтому контроллер не реагировал на сигнал сброса от хоста. Проблема исчезла после установки задержки 10 мс после включения тактирования и сброса USB.

Код: Выделить всё

    NT_COMMON_REG->USB_CTRL = USB_CTRL_CLKEN | USB_CTRL_CLKSEL | USB_CTRL_FSEL;
    RCC_PeriphRstCmd(RCC_PeriphRst_USB, ENABLE);
    Delay_ms(10);
    USBDev_Init();
    USBDev_ClassCbInit(&USBDEV_CDC_VCP_cb);
    USBOTG_SetRole(USB_Role_Device);
    VCP_RxHandlerInit(&VCP_RxHandler);
    VCP_TxHandlerInit(&VCP_TxHandler);
    Энвик_EnableIRQ(USBOTG_IRQn);
Системная частота 90 МГц. Внешний кварцевый резонатор 24 МГц.
Ответить

Вернуться в «32-разрядные микроконтроллеры»