Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Europejski lider sprzedaży techniki i elektroniki.
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Realizacja interfejsu I2C (komunikacja mikrokontroler - akcelerometr)

lisur 27 Sty 2014 17:00 1425 3
  • #1 27 Sty 2014 17:00
    lisur
    Poziom 5  

    Witam Forumowiczów,

    Mam mały problem z realizacją magistrali I2C. Otóż mam do dyspozycji czujnik przyspieszenia o wyjściu cyfrowym obsługujący magistralę I2C/SPI. Na płytce z mikrokontrolerem (STM32F4Discovery) zainicjalizowałem odpowiednie piny jako SDA oraz SCL. Zakładam, że peryferia podłączę przez rezystor podciągający (pull-up 4,7k). Tutaj nasuwa się moje pytanie jak zrealizować połączenie magistrali w rzeczywistości?
    Dodatkowo chciałbym dowiedzieć się jak programuje się czujnik przyspieszenia MEMS. W data sheet są opisy odpowiednich rejestrów, ale w jaki sposób się do nich odnieść. Wysyła się je magistralą?

    Prosiłbym w miarę możliwości o wyrozumiałość, gdyż jest to moja pierwsza przygoda z I2C. Nie ukrywam, że schematyczne ujęcie problemu ułatwi sprawę.

    0 3
  • #2 27 Sty 2014 18:55
    krru
    Poziom 32  

    I2C jest dość prostą magistralą, najlepiej jak sobie poczytasz podstawy.
    Działa ona mniej więcej tak, że jest jeden kontroler (w podstawowej konfiguracji),
    który wysyła polecenia odczytania lub zapisania bloku danych pod wybrany adres.
    Można zaadresować ~128 urządzeń, dodatkowy, ósmy bit adresu ustala kierunek transmisji.
    Każdy przesyłany bit jest potwierdzany jednym dodatkowym bitem.
    Po zaadresowaniu można przesłać dowolną liczbę bajtów do wybranego urządzenia.
    Transmisja zaczyna się i konczy odpowiednimi zniamami bitów (sekwencje: start i stop).

    W sumie fajnym ćwiczeniem jest zrealizowanie obsługi I2C na zwykłych pinach IO, jest to magistrala synchroniczna, więc zadziała z dowolnie małą prędkością,
    wtedy można 'zobaczyć' jak to fizycznie działa. Dopiero potem można sobie uprościć kod (nie zawsze to jest uproszczenie - ale głównie służy do odciążenia procka) i użyć sprzętowego kontrolera I2C.


    Standardowo urządzenia I2C posiadają rejestry wybierane poprzed odpowiednie cykle magistrali.
    Do odczytania robisz tak:

    start
    adres_i2c_do_zapisu
    numer rejestru
    repeated start
    adres_i2c_do_odczytu
    odczyt danych z rejestru
    stop

    Czasami można zamiast repeated start dać normalny stop i potem start.
    Zapis do rejestru robi się prościej:

    start
    adres_i2c_do_zapisu
    numer rejestru
    zapis danych do rejestru
    stop

    0
  • #3 27 Sty 2014 19:23
    lisur
    Poziom 5  

    No dobra, o tych podstawach już przeczytałem wcześniej. Bardziej chodzi mi o konkretną implementację tej magistrali. W chwili obecnej mam kod, który inicjalizuje magistralę. Próbuję połączyć się z akcelerometrem na płytce STM32f4. Przy debugowaniu, zatrzymuje się na fladze BUSY, czyli zajętej magistrali. Dodatkowo wyświetlany jest warning o tym, że przekroczona została zmienna odpowiadająca za adres. Jest to zmienna typu uint_8, a adres LIS302DL z data sheet przy wysokim stanie SDO jest następujący 0011101b. Funkcję pochodzą ze standardowych bibliotek STMa , dlatego też pytałem o realizację magistrali. Poniżej kod programu:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Myślę, że to kwestia błędnego adresowania bądź konfiguracji pinów, dlatego pytam o radę.

    0
TME logo Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME
TME Logo