-
Path: news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!new
s.nask.pl!news.nask.org.pl!news.internetia.pl!newsfeed.neostrada.pl!nemesis.new
s.neostrada.pl!atlantis.news.neostrada.pl!news.neostrada.pl!not-for-mail
From: SM <b...@k...com.pl>
Newsgroups: pl.misc.elektronika
Subject: Re: AVR32 - problem z USB (bit detach)
Date: Sat, 14 Nov 2009 19:41:45 +0100
Organization: TP - http://www.tp.pl/
Lines: 99
Message-ID: <hdmu9b$mp4$1@nemesis.news.neostrada.pl>
References: <hdlqh0$6o7$1@nemesis.news.neostrada.pl>
NNTP-Posting-Host: aeex145.neoplus.adsl.tpnet.pl
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-2; format=flowed
Content-Transfer-Encoding: 8bit
X-Trace: nemesis.news.neostrada.pl 1258224747 23332 79.186.127.145 (14 Nov 2009
18:52:27 GMT)
X-Complaints-To: u...@n...neostrada.pl
NNTP-Posting-Date: Sat, 14 Nov 2009 18:52:27 +0000 (UTC)
User-Agent: Thunderbird 2.0.0.23 (Windows/20090812)
In-Reply-To: <hdlqh0$6o7$1@nemesis.news.neostrada.pl>
Xref: news-archive.icm.edu.pl pl.misc.elektronika:575651
[ ukryj 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
- Jaka ładowarka sieciowa do Iphona?
- Taśma izolacyjna do prac elektrycznych
- Recenzja 3.1A ;) w 6 gniazdach...
- Re: Recenzja 3.1A ;) w 6 gniazdach...
- Re: Recenzja 3.1A ;) w 6 gniazdach...
- Re: Recenzja 3.1A ;) w 6 gniazdach...
- Wkrętarki, wiertarki...
- Zasilacz impulsowy 12V 10A, coś godnego uwagi jako zamiennik akumulatora wkrętarki
- Mouser - koszt wysyłki
- [OT] Jak wycinac ksztalt w piance lub styropianie?
- FV--> ciepła woda w kranie
- Szok
- Dziwny schemat wzmacniacza m.cz.
- We Wrocławiu ruszyła Odra 5, pierwszy w Polsce komputer kwantowy z nadprzewodzącymi kubitami
- CGNAT i ewentualne problemy
Najnowsze wątki
- 2025-07-03 Trybik
- 2025-07-04 Renault Symbioz
- 2025-07-04 Architektura IIIRP: Wyjątkowa, a prymitywniejsza niż stodoła pod zaborami
- 2025-07-04 Warszawa => International Freight Forwarder <=
- 2025-07-04 Wrocław => SAP ABAP Developer <=
- 2025-07-04 Warszawa => Mid/Senior IT Recruiter <=
- 2025-07-04 Białystok => Kotlin Developer <=
- 2025-07-04 Bieruń => Spedytor Międzynarodowy (handel ładunkami/prowadzenie flo
- 2025-07-04 Warszawa => Specjalista wsparcia IT - analiza techniczna sprzętu IT <
- 2025-07-04 Zakrzewo => Konsultant SAP HCM <=
- 2025-07-04 Łódź => Programista Mainframe (z/OS, Assembler) <=
- 2025-07-04 Szczecin => Key Account Manager IT <=
- 2025-07-04 Warszawa => Technik IT - Konfiguracja i Wsparcie Sprzętowe <=
- 2025-07-04 Warszawa => Technique IT - Hardware Configuration and Support <=
- 2025-07-04 Warszawa => Specjalista ds. Sprzętu IT i Wsparcia Technicznego <=