[6] STM32CUBE w przykładach (obsługa interfejsu I2C)

W tej części kursu na warsztat bierzemy obsługę czujników cyfrowych i magistralę I2C, na przykładzie cyfrowego termometru i barometru BMP180, firmy Bosch.

Interfejs I2C

I2C jest jednym z najważniejszych interfejsów komunikacyjnych w świecie mikrokontrolerów. Służy on głównie do odbioru danych z czujników i komunikacji z urządzeniami nie posiadającymi dużego zapotrzebowania na transfer danych. Tym co wyróżnia go spośród innych interfejsów jest praca w trybie magistrali. Do pojedynczej magistrali danych interfejsu I2C przyłączyć możemy wiele urządzeń, a przyłączenie kolejnych (inaczej niż w SPI) nie powoduje konieczności dodania kolejnych linii “Slave Select”. Połączenie I2C składa się z linii SDA którą przesyłane są dane, w obu kierunkach (od urządzenia głównego do urządzeń podrzędnych i od podrzędnych do głównego) oraz linii SCL – sygnału zegara generowanego przez urządzenie nadrzędne (master), do którego dostosować muszą się wszystkie urządzenia podrzędne (slave). Inny jest też sposób w jaki korzysta się z interfejsu. Specyfikacja protokołu I2C nie ogranicza się do dostarczenia kanału którym przesyłane są bajty danych między urządzeniami. Zamiast przesyłać do urządzeń specyficzne dla nich komunikaty, I2C pozwala w standardowy sposób zapisywać i odczytywać dane pod określonymi adresami w pamięci urządzeń – w rejestrach lub pamięci EEPROM. I2C bywa również często wykorzystywane do przyłączania do układu, zewnętrznej pamięci EEPROM. Odczytywaną wartością może być wartość mierzona przez czujnik, a zapisywaną – parametr pracy urządzenia, polecenie wykonania pomiaru, przełączenia zwrotnicy, czy blokady drzwi w tramwaju.

Rys. 1. Sposób podłączania kolejnych urządzeń w magistrali (źródło: Wikipedia)

Interfejs I2C powstał w latach ‘80 ubiegłego wieku w firmie Philips. Początkowo był on wykorzystywany głównie w sprzęcie RTV tejże firmy. Obecnie jest powszechnie wykorzystywany w wielu układach różnych producentów. Wszędzie tam gdzie zapotrzebowanie na pasmo nie jest duże, a istnieje potrzeba podłączenia do sterownika, wiele prostych urządzeń. Każdy układ podłączony do magistrali posiada swój własny identyfikator – najczęściej 7-bitowy, choć nowsze wersje protokołu przewidują również adresację 10- i 16-bitową. Identyfikatory te przydzielane są przez firmę NXP Semiconductors producentom układów. Pierwsza wersja protokołu I2C pozwalała na transmisję danych z szybkością 10 kbps (low speed) lub 100 kbps (standard speed). Obecnie standard dopuszcza również inne szybkości – fast mode: 400 kbps, fast mode plus: 1 Mbps oraz high speed mode: 3,4 Mbps.

Czujnik BMP180

Czujnik Bosch BMP180 umożliwia pomiar temperatury i ciśnienia atmosferycznego, a także pośrednio, pozwala na obliczenie wysokości nad poziomem morza, na jakiej znajduje się czujnik. Jest on dostępny w wielu sklepach z elektroniką – stacjonarnych i internetowych, w postaci gotowych płytek z wyprowadzonymi pinami, wprost do podłączenia do mikrokontrolera. Czujnik pracuje w zakresie napięć 1.62 – 3.6V, więc możemy podłączyć go do płytki rozwojowej Kamami KA-NUCLEO-F411, bez pośrednictwa konwertera poziomów, czy dzielnika napięć.

Rys. 2. Chip BMP180
Rys. 3. Gotowa płytka z układem czujnika BMP180 (źródło: sklep internetowy Kamami.pl)

Temperatura mierzona jest z dokładnością do 0.1 stopnia Celsjusza w zakresie od -40.0 do 80.0 stopni, a ciśnienie – z dokładnością do pojedynczego Paskala (z dopuszczalną odchyłką od 0.06 hPa do 0.02 hPa, zależną od wybranego trybu pomiaru), w zakresie od 300 do 1100 hPa, co przekłada się na pomiar wysokości n.p.m. w zakresie od -500 do +9000 metrów, z dokładnością do 0.5 lub 0.17 metra (w zależności od trybu pomiaru).

Czujnika nie musimy kalibrować, natomiast uzyskane wyniki pomiarów należy skompensować – podstawić do wzorów, wraz z wartościami kompensacji zapisanymi w pamięci EEPROM układu.

Rys. 4. Schemat blokowy układu Bosch BMP180

Komunikacja z czujnikiem

Nasz czujnik posiada 7-bitowy adres/identyfikator, równy: 1110111. Ponieważ adres ten jest 7-bitowy, wraz z nim, w ramce I2C, na pozycji 8 bitu w oktecie, przesyłana jest flaga odczytu/zapisu. Zwyczajowo podając adres urządzenia w postaci liczby heksadecymalnej, podaje się jego “adres odbiorczy” i “nadawczy”, które dla naszego czujnika wynoszą odpowiednio: 0xEF (odczyt) i 0xEE (zapis). Czujnik wspiera transmisje ze wszystkimi wymienionymi powyżej szybkościami – tj do 3.4 Mbps.

Układ BMP180 posiada wiele rejestrów, z których odczytujemy i do których zapisujemy dane. W 16-bitowych rejestrach o identyfikatorach AC1 (adres 0xAA), AC2 (0xAC), AC3 (0xAE), AC4 (0xB0), AC5 (0xB2), AC6 (0xB4), B1 (0xB6), B2 (0xB8), MB (0xBA), MC (0xBC) oraz MD (0xBE) umieszczone są fabrycznie współczynniki kompensacji, wykorzystywane do przekształcenia odczytów wbudowanego układu ADC, w rzeczywiste wartości, w stopniach Celsjusza lub Paskalach. W komórkach pamięci, o adresach 0xF6, 0xF7 i 0xF8, po wykonaniu pomiaru, przechowywane są nieskompensowaną wartość odczytu temperatury (UT) lub ciśnienia atmosferycznego (UP). 8-bitowy rejestr pod adresem 0xF4 przyjmuje polecenia do wykonania – start pomiaru temperatury lub ciśnienia z ustaloną dokładnością.

Liczby zapisane w rejestrach AC1, AC2, AC3, B1, B2, MB, MC, MD to wartości ze znakiem (signed short/int16_t). Liczby z rejestrów AC4, AC5, AC6 to wartości bez znaku (unsigned/uint16_t).

Algorytm wykonywania pomiarów, zamieszczony w karcie katalogowej czujnika przewiduje następujące akcje:

  • pobranie zawartości rejestrów AC1, AC2, AC3, AC4, AC5, AC6, B1, B2, MB, MC, MD i przechowanie ich w zmiennych;
  • zapisanie do rejestru 0xF4, wartości 0x2E, powodujące rozpoczęcie pomiaru temperatury;
  • odczekanie czasu 4.5 milisekundy;
  • pobranie i przechowanie w 16-bitowej zmiennej UT zawartości pamięci spod adresów 0xF6 oraz 0xF7;
  • zapisanie do rejestru 0xF4 polecenia wykonania pomiaru ciśnienia, z wybraną dokładnością – 0x34 dla najniższej dokładności, 0x74 dla standardowej, 0xB4 dla wysokiej lub 0xF4 dla bardzo wysokiej;
  • odczekanie czasu 4.5, 7.5, 13.5, 25.5 milisekundy (w zależności od wybranej dokładności pomiaru);
  • pobranie zawartości 24-bitów pamięci począwszy od adresu 0xF6 (0xF7, 0xF8) do zmiennej UP;
  • obliczenie, zgodnie ze wzorami podanymi w fragmencie karty katalogowej zamieszczonym obok, skompensowanej wartości temperatury i ciśnienia.

Wynikiem obliczeń będzie temperatura w 0.1 stopniach Celsjuszach oraz ciśnienie w Paskalach.

Autor: admin

Admin