Akcelerometr BMA180. Jak zarządza współdzieleniem pinów między I2C a SPI?

11

Akcelerometr BMA180 może być albo slave SPI, albo slave I 2 C. Piny dla obu autobusów są wspólne.

SPI mode                    I2C mode
---------------------------------------------------
SDI  input                  SDA  bidirectional (!)
SDO  output                 ADDR address bit, input
SCLK input                  SCL  input
CSB  chip select, input     I2C  mode select, input

Zgodnie z arkuszem danych (patrz rozdział 8) wybór między magistralami odbywa się za pomocą pinu CSB. Gdy CSB jest niski, urządzenie jest urządzeniem podrzędnym SPI. Gdy poziom CSB jest wysoki, urządzenie jest urządzeniem podrzędnym I 2 C.

Oto tryb awarii , o który się martwię. Załóżmy, że BMA180 znajduje się na magistrali SPI. Jest też inne urządzenie na tej samej magistrali z własnym wyborem chipów. Załóżmy, że master magistrali SPI komunikuje się z tym drugim urządzeniem. CSB dla BMA180 jest wysoki, więc I 2 C powinno być włączone. BMA180 widzi krawędzie zegara na SCL (SCLK SPI) i bitów na SDA (MOSI SPI przelatującego). Co jeśli niektóre z tych bitów wyglądają na BMA180 jak na początek ważnej transakcji odczytu I 2 C, a BMA180 zaczyna wysyłać dane i blokuje istniejącą transakcję SPI? W jaki sposób konstrukcja BMA180 mogłaby temu zapobiec?

To kwestia ciekawości. Nie eksperymentowałem jeszcze z tymi problemami. Będę używać BMA180 na SPI.

Wszelkie sugestie, informacje lub referencje są bardzo mile widziane!

Aktualizacja. Znaleziono coś w arkuszu danych (patrz 7.7.11) . Zaleca się wyłączenie I 2 C przez ustawienie dis_i2cbitu, jeśli komunikuje się z BMA180 przez SPI.

Gdy używany jest interfejs SPI, zaleca się ustawienie dis_i2c na 1, aby uniknąć nieprawidłowego działania.

BMA180 ma wbudowaną pamięć EEPROM. Zawartość rejestru może być przechowywana w pamięci EEPROM i automatycznie ładowana po sekwencji rozruchowej. Możliwe jest więc, aby BMA180 ignorował I 2 C całkowicie i zawsze.

Aktualizacja. Żyroskop L3GD20 to kolejny układ scalony, który w podobny sposób dzieli piny między I 2 C a SPI. Wydaje się, że nie ma trochę ustawienia wyłączania trybu I 2 C. Wymagałoby to bramki OR, takiej jak ADXL345, którą przywołał @markrages.

Heads-up! Bosch przestał wysyłać BMA180 ( oficjalny list tutaj ).

Nick Alexeev
źródło

Odpowiedzi:

14

Widziałem dokładnie takie zachowanie, którego się boisz na ADXL345, który korzysta z tego samego schematu wyboru I2C / SPI. Miałem inne urządzenie SPI, które używało innej polaryzacji zegara i zdarzyło się emulować kod startowy I2C, ADXL345 próbował mówić poza kolejnością jako I2C. Złe wieści.

Ostrożnie przepisałem SPI jako bit bang zamiast korzystać z urządzeń peryferyjnych, upewniając się, że nie zmieniłem linii MOSI, gdy zegar był wysoki. (To jest warunek początkowy I2C.) To chyba rozwiązało problemy.

Gdybym zaczynał od zera, spróbowałbym zamiast tego użyć magistrali I2C lub dedykowanego portu SPI dla ADXL345.

Najwyraźniej nie jestem jedynym, który może się z tym spotkać. Ten akapit pojawił się w późniejszej wersji arkusza danych ADXL345:

wprowadź opis zdjęcia tutaj

markrages
źródło
+1 i dziękuję! Właśnie znaleziono w arkuszu danych, że BMA180 ma bit wyłączający I2C (patrz 7.7.11). Możliwe jest, że BMA180 ma również wbudowaną bramkę OR, i nie jest to wyraźnie wymienione w arkuszu danych.
Nick Alexeev
1
Bramka OR skutecznie wyłącza tryb I2C, więc nie jest wbudowana w układ. (Gdyby projektant układu mógł oszczędzić dodatkowego pinu, sytuacji można by całkowicie uniknąć.)
markrages
Nie powinienem był pisać „zbyt” w poprzednim poście. Przez „zbyt” znaczy „oprócz bitu wyłączania I2C”. Myliłem się również, że w tym schemacie bramkę OR można na stałe wbudować w układ scalony akcelerometru. To na zawsze wyłączyłoby I2C. Przepiszę ten poprzedni komentarz.
Nick Alexeev
BMA180 ma 3x DNC / zarezerwowane piny. Być może są już używane do celów fabrycznych.
Nick Alexeev
1
Zauważyłem, że cyfrowe akcelerometry mają tendencję do wzajemnej kompatybilności pinów. To może wyjaśniać nieużywane szpilki. Lub test fabryczny, jak powiedziałeś.
markrages