Zaprezentowany układ zawiera specjalizowany, gotowy mostek UART-GPIO/I2C typu SC18IM700 firmy NXP, którego struktura wewnętrzna została pokazana na rysunku 1. Układ komunikuje się z urządzeniem nadrzędnym poprzez standardowy interfejs szeregowy UART przy użyciu komunikacji znakowej ASCII. Interfejs GPIO dostępny jest poprzez rejestry wewnętrzne układu, każde z wyprowadzeń może pracować w czterech trybach: quasi-dwukierunkowym (jak w PCF8574), wejściowym oraz wyjściowym w konfiguracji OD lub Push-Pull. Dodatkowo układ udostępnia magistralę I2C w trybie odczytu i zapisu z możliwością zapisu pojedynczego lub wielobajtowego z 16-bitowym buforem, zapewniając poprawne generowanie sygnałów sterujących magistralą. Dzięki obsłudze I2C możliwe jest dołączenie układów ekspanderów GPIO, sterowników LED itp. bez konieczności poświęcenia czasu na oprogramowanie pośredniczące pomiędzy PC a I2C mikrokontrolera. Cała praca programistyczna, przy zastosowaniu SC18IM700, ogranicza się do opracowania aplikacji na PC komunikującej się poprzez UART.
Aby zapewnić komunikację z SC18IM700, jego port szeregowy podłączony jest z PC poprzez interfejs konwertera USB-UART typu FT230, który zapewnia też zasilanie układu i współpracujących modułów.
Budowa i działanie
Schemat całego układu został pokazany na rysunku 2. Aplikacja układu U1 typu FT230 nie odbiega od standardowej. Pełni on funkcję interfejsu USB-UART, dioda LD2 sygnalizuje obecność zasilania, a dioda LD1 aktywną transmisję szeregową. Stabilizator U2 zapewnia zasilanie 3,3 V dla współpracujących układów GPIO.
Układ U3 pełni funkcję konwertera UART-GPIO/I2C. Sygnały GPIO/I2C z wyprowadzeń układu U3 doprowadzone są do złączy I2C, GP01, GP23, GP45, GP67 zgodnych ze standardem Grove.
Montaż i uruchomienie
Moduł zmontowany jest na dwustronnej płytce drukowanej, której schemat został pokazany na rysunku 3. Montaż jest typowy i nie wymaga szczegółowego opisu. Poprawnie zmontowany układ nie wymaga uruchamiania. Po podłączeniu do portu USB konwerter FT230 powinien zostać wykryty i zainstalowany.
Przy użyciu oprogramowania narzędziowego FTProg, należy skonfigurować prąd pobierany z magistrali – właściwe ustawienia zostały pokazane na rysunku 4. Następnie należy zmienić konfigurację wyprowadzenia C0 na sygnalizację sumy sygnałów RXD/TXD – zgodnie z rysunkiem 5. Jeżeli konfiguracja została ustalona i zapisana, należy układ zrestartować poprzez odłączenie i ponowne podłączenie do złącza USB.
Dla sprawdzenia modułu należy zainstalować program typu terminal portu szeregowego z możliwością wysyłania sekwencji znaków np. Realterm. Należy też przygotować przycisk np. Grove Button i diodę np. Grove LED lub buzzer Grove Buzzer oraz płytkę z układem I2C np. moduł z układem PCF8574. Komunikacja z układem SC18IM700 odbywa się poprzez wysłanie polecenia w postaci komendy ASCII, zestaw rozpoznawanych komend został zestawiony w tabeli 1. Komendy nierozpoznane są ignorowane. Układ ma wbudowany licznik time-out, który kasuje zawartość buforów, jeżeli odbiór kolejnych dwóch znaków zajmuje więcej niż 655 ms.
Po restarcie układ jest wstępnie skonfigurowany – standard transmisji ustawiony jest na 9600,8,N,1. Konfiguracja może zostać zmieniona w rejestrach układu zgodnie z tabelą 2 (szczegółowy opis jest dostępny w dokumentacji układu [1] oraz nocie [2]). Po uruchomieniu terminala i resecie układu zwrócone zostaną znaki OK, potwierdzające połączenie z układem.
Do zmiany konfiguracji służą sekwencje poleceń zapisu rejestru wewnętrznego:
W <rejestr 0> <dana 0>...<rejestr N> <dana N> P
lub odczytu
R <rejestr 0> ...<rejestr N> P
po którym SC18IM700 zwróci ciąg wartości:
<dana 0> ... <dana N>
Dla przykładu – odczyt rejestru 00 to sekwencja:
52 00 50
która po resecie zwraca wartość domyślną 0xF0.
Przed użyciem pinów GPIO w rejestrach PortConf1, PortConf2 należy ustawić wymaganą konfigurację wyprowadzenia IO zgodnie z tabelą 3.
Przycisk podłączymy do złącza GPO1, wyprowadzenie GPIO0 skonfigurujemy jako wejście, zapisując do rejestru wewnętrznego PortConf1 sekwencję:
57 02 55
która ustawia piny GPIO3...0 w rejestrze PortConf1 (0x02) jako wejścia. Odczyt stanu portu GPIO w rejestrze IOState (0x04), w tym przycisku podłączonego do GPIO0, odbywa się poleceniem:
52 04
które zwraca odpowiednio 00 lub 01 po przytrzymaniu przycisku. Zmianę stanu wyjścia GPIO6, do którego podłączony jest buzzer, wykonujemy, konfigurując rejestr PortConf2 (0x03), w którym ustawiamy wyprowadzenie GPIO6 sekwencją:
57 03 65
która ustawia wyprowadzenie GPIO6 jako wyjście Push-Pull. Zmiana stanu wyjścia 0/1 odbywa się poprzez rejestr IOState sekwencją:
57 04 40
która ustawia wyprowadzenie GPIO6 w stan wysoki, załączając buzzer, oraz
57 04 00
która ustawia wyprowadzenie GPIO6 w stan niski, wyłączając buzzer. Oczywiście podczas normalnej pracy modułu przed zapisem należy zapewnić zachowanie stanów pinów GPIO poprzez ustawianie tylko zmienianego wejścia w zależności od trybu pracy wyprowadzenia.
Do sprawdzenia magistrali I2C do modułu (złącze I2C) podłączony będzie układ PCF8574, który ma ustawiony adres 0x20, odczyt stanu wyprowadzeń wykonany jest sekwencją:
53 41 01 50
która odczytuje jeden bajt spod adresu 0x41, czyli stan wyprowadzeń PCF8574 z ustawionym siedmiobitowym adresem 0x20. Ze względu na adresowanie 8-bitowe, najmłodszy bajt ustawiony jest na 1 dla operacji odczytu (0100 0001). Ustawienie wyjść wykonywane jest sekwencją:
53 40 01 00 50
która zapisuje jeden bajt o wartości 0x00 pod adres 0x40, czyli stan wyprowadzeń PCF8574 z ustawionym siedmiobitowym adresem 0x20 zostanie zmieniony na 0x00. Ze względu na adresowanie 8-bitowe, najmłodszy bajt ustawiony jest na 0 dla operacji zapisu (0100 0000). Poprawność wykonania operacji sprawdzamy, odczytując rejestr statusu I2CStat 0x0A sekwencją:
52 0a 50
która powinna zwrócić wartość 0xF0 zgodnie z tabelą 4.
Stosując zapis wielobajtowy, można konfigurować układy o większej liczbie rejestrów np. sterownik LED PCA9531.
Adam Tatuś, EP
Dokumentacja układu SC18IM700:
[1] https://bit.ly/3uPGjk2
[2] https://bit.ly/3JZ9aHe
- R1, R2: 27 Ω
- R3, R4: 2,2 kΩ
- R5, R6, R8: 4,7 kΩ
- R7: 1 kΩ
- C1, C2: 47 pF, 25 V COG
- C3, C4, C8: 0,1 μF
- C5: 10 μF
- C6, C7: 1 μF
- LD1: dioda LED czerwona (SMD0603)
- LD2: dioda LED zielona (SMD0603)
- U1: FT230XS (SSOP16)
- U2: MCP1700T-3302MB (SOT-89)
- U3: SC18IM700IPW (TSSOP16)
- FB: koralik ferrytowy BLM18EG101TN1D
- GP01, GP23, GP45, GP67, I2C: złącze Grove proste
- USB: złącze USB Molex MX105017-0001