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

Jak odczytać rejestry z układu Tea5767 za pomocą atmega328 w języku C?

miszczo997 03 Cze 2016 17:34 2388 5
REKLAMA
  • #1 15718540
    miszczo997
    Poziom 28  
    Witam
    Mam problem z odczytem czegokolwiek z tego układu. Po uruchomieniu sketchu arduino i2c scanner znajdowane jest urządzenie pod adresem 0x60. Napisałem program odczytujący wartości rejestrów z użyciem bibliotek dołączonych do książki T. Francuza i niestety wygląda jakby układ nie wysyłał bitu ack. Wg dokumentacji po każdym odebranym bajcie powinien być on wysyłany. Transmisja ustawiona na prędkość 100kHz (#define I2CBUSCLOCK 1000UL) Napisany przeze mnie program:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    W konsoli otrzymuję:
    Jak odczytać rejestry z układu Tea5767 za pomocą atmega328 w języku C?
    Schemat połączeń identyczny jak tutaj (rezystory 4,7k,brak kondensatorów ze schematu, wszystko podpięte pod arduino uno r3).
    Jak odczytać rejestry z układu Tea5767 za pomocą atmega328 w języku C?
  • REKLAMA
  • Pomocny post
    #2 15718704
    excray
    Poziom 41  
    0x60 to adres podawany bez najmłodszego bitu RW. Po dodaniu bitu RW otrzymujesz adresy:
    0xC0 - zapis
    0xC1 - odczyt
    Pamiętaj, że zanim zaczniesz czytać przydałoby sie podać adres od jakiego chcesz zacząć odczyt. Inaczej przy każdym wywołaniu Twoja procedura będzie czytać dane z innego obszaru.
  • REKLAMA
  • Pomocny post
    #3 15718815
    Andrzej__S
    Poziom 28  
    excray napisał:
    Pamiętaj, że zanim zaczniesz czytać przydałoby sie podać adres od jakiego chcesz zacząć odczyt. Inaczej przy każdym wywołaniu Twoja procedura będzie czytać dane z innego obszaru.

    Zwykle tak jest, ale chyba akurat tego układu to nie dotyczy (datasheet strony 10-11).

    Zgodnie z dokumentacją w celu odczytu należy, po wygenerowaniu startu, wysłać adres układu od razu z bitem RW=1, po czym można odczytać 5 bajtów danych wysłanych przez układ slave. W związku z tym, jeśli chcesz odczytywać dane, to we funkcji tea_read_registers() po starcie powinieneś użyć TEA_READ_ADDRESS zamiast TEA_WRITE_ADDRESS.

    Jeśli chodzi o adresowanie, to (jak już napisał kolega excray) powinno być 0xC0 dla zapisu i 0xC1 dla odczytu i dlatego najprawdopodobniej miałeś brak potwierdzenia.
  • REKLAMA
  • Pomocny post
    #4 15718986
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • Pomocny post
    #5 15719558
    Andrzej__S
    Poziom 28  
    Piotrus_999 napisał:
    Andrzej__S napisał:

    Zwykle tak jest, ale chyba akurat tego układu to nie dotyczy (datasheet strony 10-11).


    Nie pisz jakiś dziwnych rzeczy.
    To zwykły I2C i nie ma w nim żadnych tajemnic. Kompletny transfer to 5 bajtów, ale jak nie musisz pisać wszystkich, to możesz przerwać po dowolnym.


    Zwróciłem tylko uwagę, że ten układ nie posiada adresowania wewnętrznego, o którym pisał kolega excray, choć jest ono często stosowane, przynajmniej w tych najpopularniejszych układach (jak np. pamięci, zegary). Procedura odczytu jest w takich układach nieco bardziej skomplikowana. Tutaj sprawa jest prosta, jak to jest opisane w dokumentacji, do której łącze podałem.

    Nie wiem, skąd wziąłeś te "dziwne rzeczy" i "tajemnice".
  • #6 15720060
    miszczo997
    Poziom 28  
    Super, wszystko działa. Zmylił mnie trochę ten fragment dokumentacji
    Jak odczytać rejestry z układu Tea5767 za pomocą atmega328 w języku C?

    Po wpisaniu adresu C1 program uruchomił się i poprawnie odczytał rejestry z układu.
    Jak odczytać rejestry z układu Tea5767 za pomocą atmega328 w języku C?
    Problem rozwiązany.
REKLAMA