Pregled vmesnikov UART, I2C in SPI za mikrokrmilnike z ARM arhitekturo
[Slika vezalne sheme za modul UART (npr. Nextion zaslon ali Bluetooth modul)]
Vzorčna vezalna shema (Opis):
STM32 TX (Transmit) Zunanja naprava RX (Receive)
STM32 RX (Receive) Zunanja naprava TX (Transmit)
GND GND (Skupna masa je nujna za referenco napetosti!)
UART: Universal Asynchronous Receiver-Transmitter (Univerzalni asinhroni sprejemnik-oddajnik).
USART: Universal Synchronous/Asynchronous Receiver-Transmitter (Dodana možnost sinhronega prenosa z urnim signalom).
Značilnosti: Gre za asinhrono komunikacijo, kar pomeni, da naprave ne delijo skupnega urnega signala (Clock). Namesto tega morata imeti obe napravi vnaprej dogovorjeno hitrost prenosa (Baud rate). Komunikacija je polno dupleksna (full-duplex), kar omogoča hkratno pošiljanje in sprejemanje. Povezava je tipično "točka-točka" (med dvema napravama).
Kdaj se uporablja: Za komunikacijo z računalnikom (preko USB-to-UART pretvornikov), Bluetooth moduli (HC-05), GPS moduli ter pametnimi zasloni (kot je Nextion iz vzorca).
Hitrosti: Najpogostejše standardne hitrosti so 9600, 19200, 38400 in 115200 bps (bitov na sekundo). Sposoben je tudi višjih hitrosti (do nekaj Mbps), vendar je občutljiv na dolžino kabla.
V razdelku Connectivity izberemo ustrezen USARTx ali UARTx.
Zavihek Mode: Nastavimo na Asynchronous.
Zavihek Configuration -> Parameter Settings:
Baud Rate: Vnesemo dogovorjeno vrednost (npr. 115200 Bits/s).
Word Length: 8 Bits (standardno).
Parity: None (brez paritetnega bita).
Stop Bits: 1.
// Ukaz za POŠILJANJE (Transmit) podatkov preko UART:
// 1. parameter: Kazalec na UART strukturo (npr. &huart2)
// 2. parameter: Kazalec na polje podatkov, ki jih pošiljamo (tip uint8_t*)
// 3. parameter: Število bajtov za pošiljanje
// 4. parameter: Časovna omejitev v milisekundah (Timeout)
uint8_t tx_data[] = "Pozdravljen Svet!\r\n";
HAL_UART_Transmit(&huart2, tx_data, sizeof(tx_data), 1000);
// Ukaz za SPREJEMANJE (Receive) podatkov preko UART (blokirajoč način):
uint8_t rx_buffer[10];
HAL_UART_Receive(&huart2, rx_buffer, 10, 1000);
// Funkcija čaka (do 1000 ms), da prejme 10 bajtov podatkov v rx_buffer.
[Slika vezalne sheme za modul I2C (npr. OLED zaslon Adafruit SSD1306 ali RTC modul)]
Vzorčna vezalna shema (Opis):
STM32 SDA Zunanja naprava SDA (Podatkovna linija)
STM32 SCL Zunanja naprava SCL (Urni signal)
VCC / 3.3V VCC
GND GND
Pomembno: Liniji SDA in SCL potrebujeta dvižna upora (pull-up resistors, običajno 4.7k$\Omega$) na VCC, saj imajo I2C naprave izhode tipa "odprt kolektor" (open-drain). Moduli za mikrokrmilnike jih imajo pogosto že vgrajene.
I2C ali I$^2$C: Inter-Integrated Circuit (Med-integrirano vezje). Včasih se imenuje tudi TWI (Two-Wire Interface).
Značilnosti: Sinhrona komunikacija z urnim signalom (SCL), ki ga generira "Master" (gospodar). Uporablja vodilno topologijo (bus architecture) – na dve žici je lahko priključenih več "Master" in "Slave" naprav. Komunikacija je pol-dupleksna (half-duplex). Vsaka "Slave" naprava ima svoj unikaten naslov (običajno 7-bitni).
Kdaj se uporablja: Za komunikacijo med IC čipi na istem tiskanem vezju in senzorji na kratkih razdaljah (npr. OLED zasloni, žiroskopi MPU6050, EEPROM pomnilniki, temperaturni senzorji).
Hitrosti:
Standard Mode: 100 kHz
Fast Mode: 400 kHz
Fast Mode Plus: 1 MHz
V razdelku Connectivity izberemo I2C1 (ali drugega).
Zavihek Mode: Pri I2C izberemo opcijo I2C.
Zavihek Configuration -> Parameter Settings:
I2C Speed Mode: Izberemo Standard Mode (100kHz) ali Fast Mode (400kHz), odvisno od senzorja.
Ostale nastavitve (Duty cycle, Own address) pustimo na privzetih vrednostih.
// Ukaz za PISANJE v specifičen register I2C naprave (uporabno za senzorje/zaslone):
// 1. parameter: Kazalec na I2C strukturo (&hi2c1)
// 2. parameter: I2C naslov Slave naprave (pomakne se za 1 bit v levo - 8-bitni naslov!)
// 3. parameter: Naslov pomnilnika/registra v napravi, kamor pišemo
// 4. parameter: Velikost naslova registra (ponavadi I2C_MEMADD_SIZE_8BIT)
// 5. parameter: Podatki za pošiljanje
// 6. parameter: Velikost podatkov
// 7. parameter: Timeout
uint8_t data_to_send = 0x1A;
HAL_I2C_Mem_Write(&hi2c1, (0x3C << 1), 0x00, I2C_MEMADD_SIZE_8BIT, &data_to_send, 1, 100);
// Preprosto pošiljanje podatkov na I2C vodilo (brez specificiranja registra naprave):
uint8_t buffer[2] = {0x40, 0xFF};
HAL_I2C_Master_Transmit(&hi2c1, (0x3C << 1), buffer, 2, 100);
[Slika vezalne sheme za modul SPI (npr. TFT LCD zaslon ali SD kartica)]
Vzorčna vezalna shema (Opis):
STM32 MOSI Zunanja naprava MOSI (Master Out Slave In)
STM32 MISO Zunanja naprava MISO (Master In Slave Out)
STM32 SCK Zunanja naprava SCK (Serial Clock)
STM32 GPIO (NSS/CS) Zunanja naprava CS/SS (Chip Select / Slave Select)
VCC & GND napajanje.
SPI: Serial Peripheral Interface (Zaporedni periferni vmesnik).
Značilnosti: Izjemno hiter, sinhroni, polno dupleksni (full-duplex) protokol. Temelji na arhitekturi Master-Slave. Nima vgrajenega sistema naslavljanja kot I2C; namesto tega Master izbere specifično Slave napravo tako, da njeno linijo CS (Chip Select) postavi na nizko stanje (LOW). Zahteva več pinov kot I2C (vsaj 4 pini za eno napravo, dodaten CS pin za vsako dodatno napravo).
Kdaj se uporablja: Kadar so potrebni hitri prenosi podatkov. Tipična uporaba: SD kartice, TFT barvni LCD zasloni, Ethernet in Wi-Fi moduli, visoko-frekvenčni ADC/DAC pretvorniki.
Hitrosti: Zelo visoke. Standardne hitrosti gredo v desetinah MHz (npr. od 1 MHz do 50+ MHz).
V razdelku Connectivity izberemo SPI1.
Zavihek Mode: Za standardno uporabo izberemo Full-Duplex Master. Hardware NSS signal se pogosto pusti izklopljen (Disable) in se CS (Chip Select) pin raje konfigurira kot navaden GPIO Output, saj omogoča večjo kontrolo pri uporabi knjižnic.
Zavihek Configuration -> Parameter Settings:
Data Size: 8 Bits (ali 16 bitov).
Prescaler (for Baud Rate): Z deliteljem urnega signala (Prescaler) znižamo frekvenco na vrednost, ki jo senzor podpira.
CPOL (Clock Polarity) in CPHA (Clock Phase): Nastavimo glede na specifikacijo "Slave" naprave (tipično je Mode 0: CPOL=Low, CPHA=1 Edge).
// Pri SPI komunikaciji moramo "Slave" napravo najprej izbrati tako,
// da ročno postavimo njen CS (Chip Select) pin na nizko stanje (0).
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); // Aktiviraj CS pin (LOW)
// Ukaz za POŠILJANJE preko SPI (hkratno pošiljanje in prejem podatkov, vendar tukaj le pošiljamo):
uint8_t spi_data[] = {0x01, 0x02, 0x03};
HAL_SPI_Transmit(&hspi1, spi_data, 3, 100);
// Ukaz za hkraten SPREJEM in POŠILJANJE (Full-Duplex delovanje):
uint8_t tx_buf[2] = {0xFF, 0xFF}; // Pošiljamo "dummy" bajte, da generiramo Clock
uint8_t rx_buf[2];
HAL_SPI_TransmitReceive(&hspi1, tx_buf, rx_buf, 2, 100);
// Po končani komunikaciji napravo "od-izberemo" - CS pin postavimo nazaj na visoko stanje (1).
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); // Deaktiviraj CS pin (HIGH)