eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronika › AVR32 - problem z USB (bit detach)
Ilość wypowiedzi w tym wątku: 9

  • 1. Data: 2009-11-14 08:31:26
    Temat: AVR32 - problem z USB (bit detach)
    Od: SM <b...@k...com.pl>

    Witam,

    Znów utknąłem przy AT32UC3B0256.

    Mam na linii VBUS napięcie 5V,
    zeruję rejestr UDCON (a więc i
    bit DETACH) a mimo to żadna
    z linii (D+ lub D-) nie zostaje
    podciągnięta do plusa.

    Czy ktoś dysponuje tym prockiem
    i mógłby sprawdzić czy to działa?

    SM


  • 2. Data: 2009-11-14 09:26:49
    Temat: Re: AVR32 - problem z USB (bit detach)
    Od: Name <u...@e...org>

    Tak szczegółowe pytania o AVR32 zadawaj lepiej na forum
    http://www.avrfreaks.net, szybciej dostaniesz odpowiedź.


  • 3. Data: 2009-11-14 10:28:52
    Temat: Re: AVR32 - problem z USB (bit detach)
    Od: SM <b...@k...com.pl>

    Name pisze:
    > Tak szczegółowe pytania o AVR32 zadawaj lepiej na forum
    > http://www.avrfreaks.net, szybciej dostaniesz odpowiedź.

    No to spróbuję.

    Najpierw miałem problem z bitem VBUS w rejestrze USBSTA.
    Zgodnie z PDF powinien on odzwierciedlać stan napięcia
    na linii VBUS (w trybie device):

    "In device mode, the VBUS bit follows the Session_valid comparator output:
    - it is set when the voltage on the VBUS pad is higher than or equal to
    1.4 V;
    - it is cleared when the voltage on the VBUS pad is lower than 1.4 V."

    No i lipa. U mnie nie działa. Nie widzi żadnych zmian na VBUS.
    Dopiero ustawienie bitu OTGPADE w USBCON spowodowało iż
    bit VBUS zmieniał się za zmianami napięcia na linii VBUS.

    Pewnie podobny numer jest z DETACH - znowu jakaś kombinacja
    o której nawet się w PDFie nie zająknęli.

    SM


  • 4. Data: 2009-11-14 11:42:47
    Temat: Re: AVR32 - problem z USB (bit detach)
    Od: J.F. <j...@p...onet.pl>

    On Sat, 14 Nov 2009 10:26:49 +0100, Name wrote:
    >Tak szczegółowe pytania o AVR32 zadawaj lepiej na forum
    >http://www.avrfreaks.net, szybciej dostaniesz odpowiedź.

    Ale my tez sie chetnie czego dowiemy :-)

    J.




  • 5. Data: 2009-11-14 13:46:45
    Temat: Re: AVR32 - problem z USB (bit detach)
    Od: Konop <k...@g...pl>

    >> Tak szczegółowe pytania o AVR32 zadawaj lepiej na forum
    >> http://www.avrfreaks.net, szybciej dostaniesz odpowiedź.
    > Ale my tez sie chetnie czego dowiemy :-)

    No to niech Kolega Sebastian pisze tu pytania i odpowiedzi z AVRFreaks ;)...

    Pozdrawiam
    Konop


  • 6. Data: 2009-11-14 18:41:45
    Temat: Re: AVR32 - problem z USB (bit detach)
    Od: SM <b...@k...com.pl>

    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


  • 7. Data: 2009-11-15 05:52:53
    Temat: Re: AVR32 - problem z USB (bit detach)
    Od: SM <b...@k...com.pl>

    > Ale my tez sie chetnie czego dowiemy :-)
    >
    > J.

    Znalazłem!!!

    Pisałem program jednocześnie w C (AVR32) i moim
    czystym ASMie. W C działa, w ASMie nie.

    Zacząłem szukać różnicy.

    Błąd jest w PDFie Atmela doc32059.pdf.

    Na stronie 57 mamy:

    0x0060 GCCTRL
    0x0064 - 0x00BC Reserved

    A powinno być:

    0x0060 GCCTRL0 - GCLK0 pin
    0x0064 GCCTRL1 - GCLK1 pin
    0x0068 GCCTRL2 - GCLK2 pin
    0x006C GCCTRL3 - USBB

    Ustawiałem więc zegar dla "GCLK0 pin"
    a nie dla "USBB".

    Po zmianie GCCTRL na GCCTRL3 mój ASM
    też działa.

    SM


  • 8. Data: 2009-11-16 17:46:21
    Temat: Re: AVR32 - problem z USB (bit detach)
    Od: Konop <k...@g...pl>

    > Błąd jest w PDFie Atmela doc32059.pdf.
    > 0x0060 GCCTRL
    > 0x0064 - 0x00BC Reserved
    > A powinno być:
    > 0x0060 GCCTRL0 - GCLK0 pin
    > 0x0064 GCCTRL1 - GCLK1 pin
    > 0x0068 GCCTRL2 - GCLK2 pin
    > 0x006C GCCTRL3 - USBB

    No to niezłe kwiatki Atmel robi w PDFach... taka "drobna różnica" :P...


  • 9. Data: 2009-11-17 05:12:50
    Temat: Re: AVR32 - problem z USB (bit detach)
    Od: SM <b...@k...com.pl>

    >...
    > No to niezłe kwiatki Atmel robi w PDFach... taka "drobna różnica" :P...

    Właśnie trochę pisuję z atmelem. Mają to poprawić.

    Podobnie nasiedziałem się nad bitem VBUS. W PDF
    nie napisali że działa on tylko jak się
    uaktywni bit OTGPADE.

    No i brak opisu jak się właściwie dobrać do
    pamięci FIFO USB bezpośrednio CPU (bez DMA).
    W tej chwili adresuję ją jak zwykły SRAM od
    adresu 0xD0000000 plus offset dla endpoint.
    Początkowo sądziłem że jak to jest FIFO
    to będzie jeden rejestr do odczytu w którym
    kolejno dostaję bajty jak ze stosu.
    Z jednej strony USB dopisuje bajty, z
    drugiej ja odbieram - tak jak działa FIFO.
    A tu wychodzi na to że adresuje się FIFO
    jak zwykły SRAM.

    W tej chwili piszę w ASMie własną bibliotekę
    USB CDC. Wzoruję się na przykładzie atmela,
    ale jakieś 2/3 nadmiarowe kodu wywalam. No
    i robię wszystko w jednej pętli. Może uda
    się bez przerwań to zrobić.

    SM

strony : [ 1 ]


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: