Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[AT91SAM9260][Linux] I2C - jak nawiązać komunikację?

12 Maj 2010 02:38 3467 17
  • Poziom 18  
    Witam!

    Mam takie dość ogólne pytanie odnośnie magistrali I2C na procku takim jak w temacie chodzącym na Linuksie Angstrom. W jaki sposób w ogóle zabrać się za tę magistralę? Jak zmusić ją do działania? Czy jeśli są fizyczne, sprzętowe wyprowadzenia to magistrala ta będzie widziana z katalogu /dev/? Czy potrzebuję jakiegoś dodatkowego oprogramowania?

    z góry dzięki
    pozdrawiam
    herszt
    Darmowe szkolenie: Ethernet w przemyśle dziś i jutro. Zarejestruj się za darmo.
  • Pomocny post
    Poziom 15  
    Witaj
    Jeśli chcesz używać I2C, to kernel musi być skompilowny z odbsugą I2C.
    Jeśli tak jest to w /dev powinieneś mieć np. i2c-0
    NIe wiem jak w twojej dystrybucji, ale u mnie są programy taki jak: i2cdump, i2cdetect, i2cget i i2cset dzieki ktorym można komunikować się z podłączonym układem.
  • Poziom 18  
    Właśnie czytałem o pakiecie I2C-tools i on chyba zawiera wymienione przez Kolegę programy. Sprawdzę czy mam wkompilowaną obsługę I2C, bo co do tego oprogramowania to jest chyba w repozytoriach.

    dzięki
    pozdrawiam
    herszt
  • Pomocny post
    Poziom 20  
    NSLU2 Linksys'a jest oparty na podobnym rdzeniu (armv5tel). Na tej stronie: Sunspot masz opis odpalenia I2C oraz link do strony poświęconej OpenWRT. Pamiętam, że lm-tools nie zawsze ma dodane biblioteki do I2C.
  • Poziom 18  
    *Piotrek* napisał:
    Witaj
    Jeśli chcesz używać I2C, to kernel musi być skompilowny z odbsugą I2C.
    Jeśli tak jest to w /dev powinieneś mieć np. i2c-0
    NIe wiem jak w twojej dystrybucji, ale u mnie są programy taki jak: i2cdump, i2cdetect, i2cget i i2cset dzieki ktorym można komunikować się z podłączonym układem.


    Sterowniki dodałem - teraz widać u mnie i2c-0. Doinstalowałem także I2C-TOOLS. Mam teraz wszystkie wspomniane przez Kolegę programy. Chciałem się teraz nimi pobawić i mam w związku z tym parę pytań: czy mogę tymi programami obsługiwać dowolne urządzenia na I2C? Ramka wygląda standardowo?
    Jak dla przykładu powinno wyglądać zapytanie w którym wysyłam do urządzenia jeden bajt (poza adresem urządzenia i miejsca w pamięci), a następnie odbieram np. 3 bajty? Trochę ciężko o stronę na której będą jakieś opisy tego pakietu.

    z góry dzięki za pomoc
    pozdrawiam
    herszt
  • Pomocny post
    Poziom 15  
    Witaj
    Jeśli chcesz wysłać jeden bajt pod dany adres w pamięci wpisz
    Code:
    i2c-set adres_układu adres_w_pamięci wartość

    Jeśli chcesz sprawdzić jak używać i2c-tools wystarczy wpisać np i2c-dump i wyświetli Ci się sposób użycia.
    Poniżej masz link do strony domowej pakietu. Ewentualnie zerknij do żródeł pakietu. Powinien tam być jakiś plik README z wyjaśnieniami co i jak.
    Link
  • Poziom 18  
    Czy któryś z programów ze wspomnianego pakietu oferuje komunikację, której przebieg mógłby wyglądać następująco:

    wysłanie bajtu -> powtórzony warunek STRAT -> oczekiwanie na odebranie kilku bajtów?

    z góry dzięki za pomoc
    pozdrawiam
    herszt
  • Pomocny post
    Poziom 25  
    Polecam książkę:
    Code:
    Sreekrishnan Venkateswaran, Essential Linux Device Drivers, Prentice Hall, 2008

    a w szczególności rozdział 8: "The Inter-Integrated Circuit Protocol".
    Oraz rozdział 19 w którym jest przykład dostępu do sterownika z poziomu zwykłego użytkownika.
    Ogólnie api ma 2 poziomy:
    1) Najniższy kernelowy(I2C Core), pozwalający na korzystanie z drivera innym sterownikom kernelowym
    2) "userspace"(I2c-dev), czyli open/close + ioctl + read/write dający dostęp do sterownika aplikacjom poziomu użytkownika.

    Edit:
    Dodatkowo w katalogu /doc drzewa kernela jest dokumentacja samego drivera
  • Poziom 18  
    arrevalk napisał:

    Ogólnie api ma 2 poziomy:
    1) Najniższy kernelowy(I2C Core), pozwalający na korzystanie z drivera innym sterownikom kernelowym
    2) "userspace"(I2c-dev), czyli open/close + ioctl + read/write dający dostęp do sterownika aplikacjom poziomu użytkownika.


    Ja sobie doczytałem w dokumentacji:
    Code:

    Please note that there are two files named "i2c-dev.h" out there, one is distributed with the Linux kernel and is meant to be included from kernel driver code, the other one is distributed with i2c-tools and is meant to be included from user-space programs.


    Teraz jestem nieco zmieszany bo nie wiem, z którego pliku powinienem korzystać. Będę wdzięczny za kilka słów wyjaśnień.
    Poza tym doczytałem też, że z interfejsu można korzystać ja ze zwykłych plików (jak to w linuksie :)), ale ten sposób nie zapewnia możliwości wysyłania "mieszanych" komunikatów - tzn. wysyłanie i od razu odczyt za jednym razem. Co bym musiał zrobić, aby właśnie w ten sposób przeprowadzać połączenie?

    z góry dzięki
    pozdrawiam
    herszt
  • Pomocny post
    Poziom 20  
    Podpowiem coś z innej beczki - ale myślę że idea może być użyteczna: Chodzi o zapisywanie z I2C do stworzonego ramdisk'u a potem czytanie jego zawartości.

    Na stronie którą podałem wcześniej: Sunspot jest opis użycia interpretera blassic do czytania z I2C. Może zasada tam wypracowana coś Ci podpowie.
  • Poziom 18  
    Dzięki! Zapoznam się dokładniej z kodem tam zamieszczonym, ale widzę że przynajmniej początkowo jest bardzo podobny do tego co chciałem napisać :)

    dzięki
    pozdrawiam
    herszt
  • Poziom 18  
    Zmagam się póki co z samym zapisem na I2C i wygląda to tak, że czasem potrafi kilka cykli działać bez problemu (po czym się wiesza), a czasem praktycznie od razu przestaje działać. Wyrzuca mi wtedy albo błąd nr 110 (timeout?), albo zawiadamia mnie, że 'NAK bailout'.
    Dodam, że na urządzeniu slave jest kod, który wcześniej działał bez problemu z mastem na którym był NUT/OS.
    Może jakieś propozycje zmian? Korzystam po prostu z funkcji write().

    z góry dzięki
    pozdrawiam
    herszt
  • Pomocny post
    Poziom 20  
    A zrobiłeś pull-up'y do linii danych i zegara, masz odpowiednie napięcia (3V3, 5V1) na linii urządzeń I2C?
  • Poziom 18  
    Dziwna (?) sprawa - wszystko ruszyło gdy nieco 'podkręciłem' ATmegę - ustawiłem wewnętrzny oscylator na 8MHz. Może to wynik tego, że master jako procesor jest taktowany na znacznie wyższych częstotliwościach (ARM9)?

    pozdrawiam
    herszt
  • Pomocny post
    Poziom 20  
    Hmm...

    O ATme'dze nie pisałeś wcześniej :)
    Rozumiem że jest slave'm - możesz napisać co robi?
    Pytam bo też chciałem zrobić slave'a na Atmel'u.

    Co do podkręcenia zegara to szyna I2C może mieć prędkość 100kHz, 400kHz i 1000kHz.

    Sporo postów pisze o tym że szyna 100kHz (default przy niskich prędkościach zegara ATmeg'i) jest za wolna do łączenia z płytkami "linux'owymi" How to change I2C data rate to 400kHz on Gumstix AND Robostix?

    Z noty katalogowej ATmega 48:

    Code:
    SCL frequency = CPU Clock frequency/(16 + 2(TWBR)*(PrescalerValue))
    

    • TWBR = Value of the TWI Bit Rate Register.
    • PrescalerValue = Value of the prescaler, see Table 21-7 on page 244.
  • Poziom 18  
    ucy74 napisał:

    O ATme'dze nie pisałeś wcześniej :)
    Rozumiem że jest slave'm - możesz napisać co robi?
    Pytam bo też chciałem zrobić slave'a na Atmel'u.


    Tak, jak Kolega pisze - ATmega jest slave'm. Wcześniej współpracowała z ATmegą128 i nie było problemów z komunikacją - pojawiły się po przesiadce na ARMa i Linuksa. ATmega wraz z kilkoma dodatkowymi elementami jest dodatkowym modułem do istniejącego urządzenia. Ma zadania 'pomiarowe' (głównie wchodzi tu obsługa przerwań - zliczanie itp.). Jeśli zostanie zapytana przez I2C ma przesłać odpowiednie (w zależności od rozkazu) dane z dokonanych pomiarów.

    pozdrawiam
    herszt
  • Poziom 20  
    Mógłbyś opisać zasadę według której aktualnie wysyłasz/odbierasz dane z linuxa?
    Byłoby to w pewnym sensie podsumowanie Twojego postu - inni mogliby skorzystać z rozwiązania.
  • Poziom 18  
    Kilka punktów, aby móc się skomunikować przez I2C:


    1. trzeba dorzucić sterowniki do jądra jeśli w /dev nie ma i2c-0
    2. jeśli mamy już widoczne urządzenie można się posłużyć przykładowym programem z dokumentacji jądra: dokumentacja
    3. skompilować program cross-kompilatorem i wrzucić do pamięci zestawu uruchomieniowego jeśli takowy posiadamy
    4. przygotować drugą stronę (w moim przypadku ATmega jako slave) do komunikacji


    W wolnej chwili postaram się rozwinąć punkt odnoście kompilacji. Jeśli ktoś chciałby się dowiedzieć czegoś więcej np. na temat ATmegi to na tyle na ile będę potrafił służę pomocą, jeśli jest taka potrzeba mogę ten punkt rozwinąć.

    pozdrawiam
    herszt