-
Data: 2009-11-14 18:41:45
Temat: Re: AVR32 - problem z USB (bit detach)
Od: SM <b...@k...com.pl> szukaj wiadomości tego autora
[ pokaż wszystkie nagłówki ]Wziąłem się za przeglądanie przykładów atmela dostarczanych z AVR32
Przykład usb_cdc.
Możliwa praca albo z FREERTOS albo z poolingiem.
W obu przypadkach część funkcji jest realizowana na przerwaniach.
Biorę pod uwagę tylko tę cześć programu, które odpowiada
wyłącznie za tryb pracy DEVICE.
Najpierw mamy wywołanie:
pm_configure_usb_clock()
Spoko. Uruchamia PLL1 dla USB na 48MHz.
Potem:
usb_task_init();
Też w miarę OK.
1. Instaluje handler przerwania.
2. Wymusza tryb pracy DEVICE.
3. Wywołuje usb_device_task_init();
Ten też OK.
1. Uruchamia pad OTG
2. Uruchamia USBE
3. Odmraża zegar dla USB
4. I tu uwaga! Uruchamia przerwanie USB od VBUS (kontroli
napięcia zasilania na lini VBUS).
Inicjalizację mamy za sobą. Teraz w kółko wywoływana jest
procedura usb_task() która w przypadku DEVICE wywołuje
usb_device_task().
Co widzimy na początku usb_device_task():
if (!usb_connected && Is_usb_vbus_high())
{
usb_start_device();
Czyli: usb_connected to flaga programu. Oczywiście wyzerowana.
Is_usb_vbus_high() natomiast robi pooling USBSTA bitu VBUS.
Czyli usb_start_device() zostanie wywołane w momencie
podania napięcia na VBUS.
I byłoby OK, ale zajrzyjmy do procedury obsługi przerwań
od USB, czyli usb_general_interrupt(void):
if (Is_usb_vbus_transition() && Is_usb_vbus_interrupt_enabled())
{
Usb_ack_vbus_transition();
if (Is_usb_vbus_high())
{
usb_start_device();
Tutaj w przerwaniu mamy dokładnie to samo w pętli głównej, tyle
że na przerwaniach. W momencie przyjścia napięcia na VBUS
zostaje wywołana ta sama procedura co w programie głównym.
Co będzie jeśli przerwanie przyjdzie wtedy, kiedy główna
procedura będzie odczytywała stan bitu VBUS w USBSTA?
Zostanie dwukrotnie wywołane usb_start_device().
Mało prawdopodobna sytuacja, ale możlwia. I co wtedy?
Będziemy mieć np. podwójne zaalokowanie pamięci dla
endpoint 0. Bardzo wredny błąd, bo ciężki do wychwycenia.
Dlatego chciałem napisać własną obsługę USB CDC niż korzystać
z wątpliwych gotowców atmela, tyle że procek nie bardzo
chce pracować wg tego co piszą w PDFie.
Robię tak:
// usbb base
mov.w r12, USBB_BASE
// disable usb, freeze clock, force device mode
mov.w r0, (1 << USBCON_FRZCLK) | (1 << USBCON_OTGPADE) | (1 <<
USBCON_UIMOD) | (1 << USBCON_VBUSHWC)
st.w r12[USBB_USBCON], r0
// enable usb, unfreeze clock, force device mode
mov.w r0, (1 << USBCON_USBE) | (1 << USBCON_OTGPADE) | (1 <<
USBCON_UIMOD) | (1 << USBCON_VBUSHWC)
st.w r12[USBB_USBCON], r0
// enable endpoint
mov r0, (1 << UERST_EPEN0)
st.w r12[USBB_UERST], r0
// configure endpoint
mov.w r0, (3 << UECFG_EPSIZE) | (1 << UECFG_ALLOC)
st.w r12[USBB_UECFG0], r0
// attach
mov r0, 0
st.w r12[USBB_UDCON], r0
I lipa. Attach nie działa. Żadna z linii D+/D- nie zostaje podciągnięta.
SM
Następne wpisy z tego wątku
Najnowsze wątki z tej grupy
- Współczesny falomierz
- Zasilacz 7V na szynę DIN
- Waga z legalizacją
- Wietnam wykłada 500M$ i chce zbudować fabrykę za 50G$
- Pendrive zdycha, czy coś jeszcze innego? Problem z plikami.
- Odkurzacz Smapp Dynamic - dawny Zelmer
- Nagra IV i zewnętrzny pilot
- Fejk muzyczny czy nie fejk
- Raspberry Pi 3 Model B+
- Kuchenka elektryczna
- test
- Cewka elektrozaworu
- zapytanie o chip r5f21275nfp
- nie naprawiam więcej telewizorów
- Zrobił TV OLED z TV LCD
Najnowsze wątki
- 2025-03-28 A gdyby to był elektryk?
- 2025-03-28 Współczesny falomierz
- 2025-03-28 Rzeszów => WEBCON Developer <=
- 2025-03-28 Szczecin => Specjalista ds. public relations <=
- 2025-03-28 Warszawa => Staż w dziale Sprzedaży B2B <=
- 2025-03-28 Warszawa => MENA New Business Manager <=
- 2025-03-28 Środa Wielkopolska => SAP FI/CO Internal Consultant <=
- 2025-03-28 Białystok => Generative AI Engineer <=
- 2025-03-28 China-Kraków => Key Account Manager IT <=
- 2025-03-28 Warszawa => SQL Developer <=
- 2025-03-28 Gliwice => Ekspert IT (obszar systemów sieciowych) <=
- 2025-03-28 Gliwice => IT Expert (Network Systems area) <=
- 2025-03-28 Warszawa => International Freight Forwarder <=
- 2025-03-28 Ostrów Wielkopolski => Konsultant Wdrożeniowy Comarch XL/Optima (Ksi
- 2025-03-28 Częstochowa => Manager ds. produktu <=