logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

xmegaA3 i TWI WINAVR. Proszę o sugestie. Co robię źle?

mgradzki 07 Gru 2011 21:37 1502 7
REKLAMA
  • #1 10231292
    mgradzki
    Poziom 16  
    Witam

    Siedzę sobie i walczę o uruchomienie zegara RTC PCF8563 z XMEGĄ 64A3. Pogooglalem trochę i napisałem kawałek softu do obsługi TWI. Nie wiem co jest z nim nie tak, bo dopiero przesiadam się z ATMEGA na ATXMEGA, a w ATMEGA obsługa TWI wyglądała nieco inaczej.

    Układ PCF 8563 z adresem 0xA0, zasilanie 3.3V, PullUpy 4k7 - wszystko zmontowane na płytce podpinane do goldpinow na płytce uruchomieniowej do XMEGA. Sprzętowo raczej OK, bo przed odpięciem od płytki uruchomieniowej ATMEGA działało bez problemu.

    Popełniony przeze mnie kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Kiedy próbuję odczytać coś z PCFa (np. sekundy spod adresu 0x02):
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Program przestaje się wykonywać - przypuszczam, ze stoi w pętli "while"

    Jeśli ktoś pisał już obsługę TWI na XMEGA to prosiłbym o sugestie, co robię nie tak.

    Pozdrawiam
  • REKLAMA
  • #2 10231828
    tmf
    VIP Zasłużony dla elektroda
    Odpowiednie piny IO ustawione są właściwie? Pamiętaj, że peryferia w XMEGA nie przejmują pełnej kontroli nad pinami tak jak to było w ATMEGA.
    Unikaj też nieskończonych pętli przy TWI, czekających na jakieś zdarzenie. Warto implementować w takich przypadkach timeouty, bo jakikolwiek problem na magistrali będzie zwieszał program.
  • REKLAMA
  • #3 10231943
    mgradzki
    Poziom 16  
    tmf napisał:
    Odpowiednie piny IO ustawione są właściwie? Pamiętaj, że peryferia w XMEGA nie przejmują pełnej kontroli nad pinami tak jak to było w ATMEGA.
    Unikaj też nieskończonych pętli przy TWI, czekających na jakieś zdarzenie. Warto implementować w takich przypadkach timeouty, bo jakikolwiek problem na magistrali będzie zwieszał program.


    Piny na początku jako wyjście, a potem tego nie zmieniałem, bo sądziłem, że procesor sam tego pilnuje i zmienia po wystawieniu adresu do nadawania. Popróbuję ustawiać to ręcznie.
    Co do timeoutów to będą, ale na razie próbuję uruchomić to na jak najprostszym sofcie.
    Nie wiem, czy dobrze podchodzę do tematu, bo w ATMEGA ręcznie wysyłałem START CONDITION, czytałem, że w XMEGA po zapisaniu do rejestru .ADDR z automatu wysyłany jest START CONDITION i potem adres.

    Chyba czeka mnie powrót do lektury dokumentacji i googlania, jak to zrobili inni.
  • REKLAMA
  • #4 10232316
    kchpl
    Poziom 15  
    Tak tylko profilaktycznie zapytam czy zmieniłeś zegar xmegi na 32MHz, fabrycznie chodzi na 2MHz.
  • #5 10232384
    mgradzki
    Poziom 16  
    kchpl napisał:
    Tak tylko profilaktycznie zapytam czy zmieniłeś zegar xmegi na 32MHz, fabrycznie chodzi na 2MHz.


    Ustawiłem na 32Mhz, ale nawet gdybym nie ustawił to przypuszczam, że TWI powinno działać, tyle że nie z częstotliwością 80kHz, a 5 kHz.
  • REKLAMA
  • #6 10232595
    kchpl
    Poziom 15  
    spróbuj jeszcze adres przesunąć o bit w lewo i dodać bit R/W
    czyli chyba (0xA0<<1)+1
  • #7 10232865
    mgradzki
    Poziom 16  
    kchpl napisał:
    spróbuj jeszcze adres przesunąć o bit w lewo i dodać bit R/W
    czyli chyba (0xA0<<1)+1


    To operacja, której nie wróżę powodzenia, ale sugestia odnośnie adresu jest dobra, bo teraz sprawdziłem adresy w w dokumentacji i jest:

    "I2C-bus slave address: read A3H; write A2H"

    Adres 0xA0 to ma PCF8583 - frajerski błąd z przyzwyczajenia po poprzednim RTC, tego nie dopatrzyłem.
    Zmianę adresu zapis/odczyt realizuję tak:
    TWIC.MASTER.ADDR = Addr|0x01; 
  • #8 10232901
    kchpl
    Poziom 15  
    To przesunięcie adresu jest wzięte z drivera atmela (AVR1308):
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Najpierw przesuwają adres a potem w zależności co chcą ustawiają bit R/W
REKLAMA