Страница 1 из 6

USB

Добавлено: 01 мар 2018, 15:27
Сергей
На основе проекта, выложенного в репозитории, работы с 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 подключилось неизвестное устройство.

Re: USB

Добавлено: 17 апр 2018, 14:55
Лашкевич
У нас USB заработал на основе примера, смотрите исходники проекта https://bitbucket.org/niietcm4/motorcontroldemo
Может быть тактирование запрещено или в аппаратной части проблемы.

Re: USB

Добавлено: 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

Re: USB

Добавлено: 22 май 2018, 12:00
Лашкевич
Сложно сказать, давно это было. Выглядит как ошибка по Вашим словам, однако наш программист, который это писал, сказал что не помнит уже ничего.

Re: USB

Добавлено: 22 май 2018, 12:15
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.

Re: USB

Добавлено: 22 май 2018, 12:23
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 - нет, там заголовочники уже новые.

Re: USB

Добавлено: 22 май 2018, 14:27
Сергей
Используется ли у Вас вход CLK_USB (23 нога контроллера, вход PA0). Если да, то на какую частоту установлен генератор.
Есть предположение, что не работает тактирование от OSC_CLK, так как у меня не заработал Ваш пример на плате от "Мехатроника про", где вход CLK_USB не используется.

Re: USB

Добавлено: 23 май 2018, 18:23
Лашкевич
наша схемотехника доступна у нас на сайте http://motorcontrol.ru/production/contr ... _nt32m4f1/

Re: USB

Добавлено: 29 май 2018, 22:01
Bond
Год назад, в проекте USB Virtual Com Port, выложенному в репозитории, был обнаружен "баг".
После запуска программы при подаче питания на процессор и подключения его по USB к Windows, устройство не распознается Windos-ом.
После рестарта процессора через вывод "reset" без снятия питания, работает без замечаний. В Linux-е, как отмечалось год назад, такого эффекта не наблюдалось. Обсуждение этой проблемы год назад возникло в репозитории при участии авторов самой программы, но продолжения не последовало.
На днях сам "наступил на эти же грабли". Танцы с бубном ни к чему не привели.
Кто нибудь знает решение этой проблемы ?

Re: USB

Добавлено: 25 июл 2018, 13:24
Дмитрий_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 МГц.