USB_OTG в stm32
USB_OTG в stm32
Пытаюсь программировать USB device на stm32f107VC
// core
OTG_FS_GAHBCFG|=OTG_FS_GAHBCFG_GINTMSK; // globalk interrupt mask
OTG_FS_GAHBCFG&OTG_FS_GAHBCFG_TXFELVL;
OTG_FS_GAHBCFG&OTG_FS_GAHBCFG_PTXFELVL;
OTG_FS_GUSBCFG|=OTG_FS_GUSBCFG_HNPCAP; // HNP
OTG_FS_GUSBCFG|=OTG_FS_GUSBCFG_SRPCAP; // SRP
OTG_FS_GUSBCFG|=OTG_FS_GUSBCFG_TOCAL5; // FS timeout calibration
OTG_FS_GUSBCFG|=OTG_FS_GUSBCFG_TRDT5; // USB turnaround time
OTG_FS_GINTMSK|=OTG_FS_GINTMSK_OTGINT; // unmask OTG interrupt
// device
OTG_FS_DCFG|=OTG_FS_DCFG_DSPD3; // device speed
// ~ non-zero-length status OUT handshake
OTG_FS_GINTMSK|=OTG_FS_GINTMSK_USBRST; // unmusk USB reset interrupt
OTG_FS_GINTMSK|=OTG_FS_GINTMSK_ENUMDNEM; // unmask enumeration done interrupt
OTG_FS_GINTMSK|=OTG_FS_GINTMSK_ESUSPM; // unmask early suspend interrupt
OTG_FS_GINTMSK|=OTG_FS_GINTMSK_USBSUSPM; // unmask USB suspend interrupt
OTG_FS_GINTMSK|=OTG_FS_GINTMSK_SOFM; // unmask SOF interrupt
OTG_FS_GCCFG|=OTG_FS_GCCFG_VBUSBSEN; // enable device (SWITCH ON PULL-UP RESISTOR)
- вот это взято из даташита (то есть переписано со слов). После чего говорят, надо дождаться прерывания по ресету. А его нет. прерывания делаю так:
NVIC_SetPriority(OTG_FS_IRQn,1);
NVIC_EnableIRQ(OTG_FS_IRQn);
и вот обработчик:
void OTG_FS_IRQHandler()
{
var=1;
OTG_FS_GINTSTS|=0xFFFFFFFF;
}
по переменной var выставляю ногу в 1 на контроллере. не работает. Что я делаю не так?
И еще. как на 25 МГц кварце сделать 48 МГц для модуля USB. у меня только 50 получилось. может из за этого не работает?
// core
OTG_FS_GAHBCFG|=OTG_FS_GAHBCFG_GINTMSK; // globalk interrupt mask
OTG_FS_GAHBCFG&OTG_FS_GAHBCFG_TXFELVL;
OTG_FS_GAHBCFG&OTG_FS_GAHBCFG_PTXFELVL;
OTG_FS_GUSBCFG|=OTG_FS_GUSBCFG_HNPCAP; // HNP
OTG_FS_GUSBCFG|=OTG_FS_GUSBCFG_SRPCAP; // SRP
OTG_FS_GUSBCFG|=OTG_FS_GUSBCFG_TOCAL5; // FS timeout calibration
OTG_FS_GUSBCFG|=OTG_FS_GUSBCFG_TRDT5; // USB turnaround time
OTG_FS_GINTMSK|=OTG_FS_GINTMSK_OTGINT; // unmask OTG interrupt
// device
OTG_FS_DCFG|=OTG_FS_DCFG_DSPD3; // device speed
// ~ non-zero-length status OUT handshake
OTG_FS_GINTMSK|=OTG_FS_GINTMSK_USBRST; // unmusk USB reset interrupt
OTG_FS_GINTMSK|=OTG_FS_GINTMSK_ENUMDNEM; // unmask enumeration done interrupt
OTG_FS_GINTMSK|=OTG_FS_GINTMSK_ESUSPM; // unmask early suspend interrupt
OTG_FS_GINTMSK|=OTG_FS_GINTMSK_USBSUSPM; // unmask USB suspend interrupt
OTG_FS_GINTMSK|=OTG_FS_GINTMSK_SOFM; // unmask SOF interrupt
OTG_FS_GCCFG|=OTG_FS_GCCFG_VBUSBSEN; // enable device (SWITCH ON PULL-UP RESISTOR)
- вот это взято из даташита (то есть переписано со слов). После чего говорят, надо дождаться прерывания по ресету. А его нет. прерывания делаю так:
NVIC_SetPriority(OTG_FS_IRQn,1);
NVIC_EnableIRQ(OTG_FS_IRQn);
и вот обработчик:
void OTG_FS_IRQHandler()
{
var=1;
OTG_FS_GINTSTS|=0xFFFFFFFF;
}
по переменной var выставляю ногу в 1 на контроллере. не работает. Что я делаю не так?
И еще. как на 25 МГц кварце сделать 48 МГц для модуля USB. у меня только 50 получилось. может из за этого не работает?
- Реклама
Re: USB_OTG в stm32
n_User123 писал(а): И еще. как на 25 МГц кварце сделать 48 МГц для модуля USB. у меня только 50 получилось. может из за этого не работает?
Там десятых долей процента достаточно, чтобы ТОЧНО не работало
Re: USB_OTG в stm32
И зачем голыми руками лезть ?
Чем исходники и примеры от производителя и поставщиков сред разработки не нравятся ?
Чем исходники и примеры от производителя и поставщиков сред разработки не нравятся ?
Re: USB_OTG в stm32
это получается мне нужно кварц менять?
Re: USB_OTG в stm32
нет. пример вообще то заработал. значит можно обойтись без замены кварца. но всякими делителями умножиттелями не удалось подобрать точную частоту.
- Реклама
- romazan
- Потрогал лапой паяльник
- Сообщения: 335
- Зарегистрирован: Чт май 21, 2009 13:54:07
- Откуда: Москва
- Контактная информация:
Re: USB_OTG в stm32
в ARM7 есть свой генератор для USB и от внешнего кварца он не зависитn_User123 писал(а):это получается мне нужно кварц менять?
Re: USB_OTG в stm32
Покажешь ? -))romazan писал(а):в ARM7 есть свой генератор для USB и от внешнего кварца он не зависитn_User123 писал(а):это получается мне нужно кварц менять?
И где в stm32 можно увидеть arm7 тоже интересно -))
Re: USB_OTG в stm32
Вообще в даташите ясно указано, что USB тактируется 48 МГц. а как их сделать из 25? с множителями от 1 до 9 и 6,5 и делителями. Так прерывание завелось, просто оказалось, что оно не прописано в таблице прерываний
Re: USB_OTG в stm32
А зачем тебе вобще на 25 кварц понадобился ?
Классически пользуют 12, 16мгц. иногда 8.
Классически пользуют 12, 16мгц. иногда 8.
Re: USB_OTG в stm32
платка старткит. там уже 25 МГц. пример от кейла работает. значит не факт что кварц виноват. а если настроить на частоту 24 МГц...
- shodan
- Поставщик валерьянки для Кота
- Сообщения: 2087
- Зарегистрирован: Чт май 24, 2012 22:47:39
- Откуда: Тула
- Контактная информация:
Re: USB_OTG в stm32
Сам ща столкнулся с подобной задачей, но интереснее, хочу сделать USB и Ethernet на STM32F107.
Закупил все включая генераторы на 25Mhz, потом вспомнил что еще и USB надо.... оказывается солюшен есть!!!
В даташите нашел раздел "A.4 USB OTG FS interface + Ethernet/I2 S interface solutions"
Там приведена конфигурация как от генератора на 25MHZ одновременно:
- запустить ядро на 72Mhz.
- затактировать PHY чип на 50Mhz.
- дать 48Mhz на USB.
Короче - полный фарш! Мозг взрывает однозначно....

Закупил все включая генераторы на 25Mhz, потом вспомнил что еще и USB надо.... оказывается солюшен есть!!!
В даташите нашел раздел "A.4 USB OTG FS interface + Ethernet/I2 S interface solutions"
Там приведена конфигурация как от генератора на 25MHZ одновременно:
- запустить ядро на 72Mhz.
- затактировать PHY чип на 50Mhz.
- дать 48Mhz на USB.
Короче - полный фарш! Мозг взрывает однозначно....
Дозиметр мало отличается от девушки, он нежный, любит чистоту, и хорошо себя чувствует только под обильным слоем лака.


