Curs 2 - Arhitectura și Programarea Perifericelor (GPIO, I2C, SPI, UART, ADC, DAC)

Acest curs explorează arhitectura și programarea principalelor interfețe periferice utilizate în sistemele embedded.

1. Generalități despre Periferice

Microcontrolerele și microprocesoarele comunică cu dispozitive externe prin interfețe periferice. Acestea includ GPIO pentru control digital, I2C și SPI pentru comunicare serială, UART pentru transmisie asincronă și ADC/DAC pentru conversia semnalelor analogice.

Source: https://brandonroots.com/2020/11/03/lab-i2c-and-spi-communication/

2. GPIO (General-Purpose Input/Output)

GPIO sunt pini configurabili ai microcontrolerului care pot funcționa ca intrare sau ieșire digitală. Ei sunt utilizați pentru controlul LED-urilor, butoanelor și altor dispozitive digitale.

a) Configurarea unui pin GPIO

#define GPIO_OUTPUT 1
#define GPIO_INPUT 0

void set_pin_mode(int pin, int mode) {
    if (mode == GPIO_OUTPUT) {
        // Configurare ca ieșire
    } else {
        // Configurare ca intrare
    }
}

void write_gpio(int pin, int value) {
    // Setează valoarea pinului
}

3. I2C (Inter-Integrated Circuit)

I2C este un protocol de comunicație serială utilizat pentru conectarea senzorilor și altor componente. Folosește două linii: SDA pentru date și SCL pentru ceas.

a) Transmiterea de date prin I2C

void i2c_write(int address, char data) {
    // Inițializare transmisie
    // Transmitere adresă și date
}

4. SPI (Serial Peripheral Interface)

SPI este o interfață de comunicație serială sincronă utilizată pentru transferuri rapide de date. Folosește linii dedicate pentru semnalul de ceas și selecția dispozitivului.

a) Configurarea SPI

void spi_init() {
    // Configurare ceas și mod SPI
}

void spi_transfer(char data) {
    // Transmitere și recepție simultană
}

5. UART (Universal Asynchronous Receiver-Transmitter)

UART permite transmisia de date între dispozitive printr-o conexiune serială asincronă. Este utilizat în comunicații RS232 și USB-TTL.

a) Inițializarea UART

void uart_init(int baudrate) {
    // Configurare viteză baud și mod de transmisie
}

void uart_send(char data) {
    // Transmitere caracter
}

6. ADC (Analog-to-Digital Converter)

ADC convertește un semnal analogic într-o valoare digitală, permițând citirea senzorilor de temperatură, presiune sau luminozitate.

a) Citirea unui semnal analogic

int read_adc(int channel) {
    // Selectează canalul și începe conversia
    return adc_value;
}

7. DAC (Digital-to-Analog Converter)

DAC convertește o valoare digitală într-un semnal analogic, fiind utilizat pentru generarea de unde sinusoidale și PWM.

a) Generarea unui semnal analogic

void write_dac(int value) {
    // Convertirea valorii digitale în tensiune analogică
}

Resurse suplimentare: