Electronique Fonctions Numeriques - Semestre 6

Annee Universitaire : 2022-2023
Semestre : 6
Credits : 2 ECTS
Specialite : Electronique et Systemes Embarques


PART A - Presentation Generale du Cours

Vue d'ensemble

Ce cours se concentre sur les interfaces de communication numeriques et leur implementation dans les systemes embarques. L'accent est mis sur les bus de communication serie (I2C, SPI, UART) et les aspects pratiques de programmation des microcontroleurs (horloges, gestion de la consommation, DMA). Le cours utilise des cartes Nordic nRF52832 (Bluetooth Low Energy) pour les travaux pratiques.

Objectifs pedagogiques :

  • Maitriser les protocoles de communication serie (I2C, SPI)
  • Programmer des microcontroleurs ARM Cortex-M4 en C
  • Comprendre les mecanismes d'horloge et de gestion de puissance
  • Interfacer des capteurs via bus numeriques
  • Optimiser la consommation energetique

Position dans le cursus

Ce cours fait suite et complete :

  • Fondements Electronique Numerique (S5) : logique combinatoire et sequentielle
  • Langage C (S5) : programmation systeme en C
  • Microcontroleur (S6) : architecture ARM et peripheriques

Il prepare aux applications :

  • Embedded IA for IoT (S9) : objets connectes et edge computing
  • Energy for Connected Objects (S9) : optimisation energetique
  • Projets embarques : conception de systemes complets

PART B - Experience Personnelle et Contexte d'Apprentissage

Organisation et ressources

Le module etait organise en deux volets complementaires :

1. Cours magistraux :

  • Comparaison des bus de communication (I2C, SPI, UART, CAN, USB)
  • Architecture des microcontroleurs (horloges, DMA, modes basse consommation)
  • Protocoles de communication serie (timing, signalisation, adressage)
  • Adaptation de niveaux logiques et WiFi

2. Travaux pratiques :

  • Carte INSA-BLE basee sur Nordic nRF52832 (ARM Cortex-M4F + BLE)
  • Programmation en C avec SDK Nordic
  • TP I2C : lecture d'un capteur de temperature MCP9804
  • TP SPI : interfacage avec capteur TC72

Materiel utilise

Carte INSA-BLE (Nordic nRF52832) :

ComposantSpecification
MCUARM Cortex-M4F 64 MHz
Memoire Flash512 KB
RAM64 KB
ConnectiviteBluetooth Low Energy 5.0
Capteurs embarquesLIS2DH12 (accelerometre I2C), MPU-9250 (IMU 9 axes SPI)
Alimentation3,3V (regulateur integre)

Peripheriques externes :

  • MCP9804 : capteur de temperature I2C haute precision (+/-0,25 deg C)
  • TC72 : capteur de temperature SPI

Deroulement des TPs

TP I2C : Communication avec MCP9804

L'objectif etait de lire la temperature d'un capteur I2C et l'afficher en temps reel.

Protocole SPI

Figure : Chronogramme du protocole SPI - Communication full-duplex avec horloge maitre

Etapes de mise en oeuvre :

  1. Initialisation du bus I2C :
    • Configuration des broches SCL (P0.27) et SDA (P0.26)
    • Frequence : 100 kHz (mode standard)
    • Activation du peripherique TWI (Two-Wire Interface)
  2. Adressage du capteur :
    • Adresse I2C du MCP9804 : 0x1F (7 bits)
    • Registre de temperature : 0x05
  3. Lecture de la temperature :
    • Envoi de la commande pour acceder au registre 0x05
    • Lecture de 2 octets (temperature sur 13 bits)
    • Conversion : bits de donnees / 16 = temperature en deg C

Extrait de code I2C :

#define TWI_INSTANCE_ID 0
#define MCP9804_ADDRESS 0x1F

static const nrf_drv_twi_t twi_instance = NRF_DRV_TWI_INSTANCE(TWI_INSTANCE_ID);

void twi_init(void) {
    ret_code_t err_code;
    const nrf_drv_twi_config_t twi_config = {
        .scl = NRF_GPIO_PIN_MAP(0, 27),
        .sda = NRF_GPIO_PIN_MAP(0, 26),
        .frequency = NRF_TWI_FREQ_100K,
        .interrupt_priority = APP_IRQ_PRIORITY_LOWEST,
        .clear_bus_init = false
    };
    err_code = nrf_drv_twi_init(&twi_instance, &twi_config, NULL, NULL);
    APP_ERROR_CHECK(err_code);
    nrf_drv_twi_enable(&twi_instance);
}

float read_temperature(void) {
    uint8_t reg[2] = {0x05, 0x00};
    uint8_t temp_data[2] = {0};

    nrf_drv_twi_tx(&twi_instance, MCP9804_ADDRESS, reg, sizeof(reg), true);
    nrf_delay_ms(10);
    nrf_drv_twi_rx(&twi_instance, MCP9804_ADDRESS, temp_data, sizeof(temp_data));

    int16_t temp_raw = (temp_data[0] << 8) | temp_data[1];
    temp_raw &= 0x0FFF;  // Masque 12 bits utiles
    float temperature = temp_raw / 16.0;

    return temperature;
}

TP SPI : Communication avec TC72

Le second TP consistait a interfacer un capteur de temperature SPI.

Configuration SPI :

  • Mode 1 (CPOL=0, CPHA=1)
  • Frequence : 125 kHz
  • CS (Chip Select) : P0.31, gere manuellement
  • MOSI : P0.28, MISO : P0.29, SCK : P0.30

Protocole de communication :

  1. Initialisation : ecrire 0x80, 0x04 pour mode conversion continue
  2. Lecture : envoyer commande 0x02, recevoir 3 octets
  3. Traitement des donnees de temperature

Extrait de code SPI :

#define SPI_CS_PIN    NRF_GPIO_PIN_MAP(0,31)
#define SPI_MISO_PIN  NRF_GPIO_PIN_MAP(0,29)
#define SPI_MOSI_PIN  NRF_GPIO_PIN_MAP(0,28)
#define SPI_SCK_PIN   NRF_GPIO_PIN_MAP(0,30)

void spi_init(void) {
    nrf_drv_spi_config_t spi_config = NRF_DRV_SPI_DEFAULT_CONFIG;
    spi_config.ss_pin   = NRF_DRV_SPI_PIN_NOT_USED;
    spi_config.miso_pin = SPI_MISO_PIN;
    spi_config.mosi_pin = SPI_MOSI_PIN;
    spi_config.sck_pin  = SPI_SCK_PIN;
    spi_config.mode     = NRF_DRV_SPI_MODE_1;
    spi_config.frequency = NRF_DRV_SPI_FREQ_125K;
    APP_ERROR_CHECK(nrf_drv_spi_init(&spi, &spi_config, spi_event_handler, NULL));
}

void tc_init(void) {
    nrf_gpio_cfg_output(SPI_CS_PIN);
    nrf_gpio_pin_clear(SPI_CS_PIN);
    spi_init();
    uint8_t data_to_send[2] = {0x80, 0x04}; // Conversion continue
    nrf_gpio_pin_set(SPI_CS_PIN);
    spi_send(data_to_send, 2, NULL, 0);
    nrf_gpio_pin_clear(SPI_CS_PIN);
}

Difficultes rencontrees

Gestion du Chip Select en SPI : Le CS doit etre manipule manuellement (pas gere automatiquement par le driver). Oubli de basculer le CS provoquait l'absence de communication.

Timing I2C : Les delais entre transmission et reception sont critiques. Un delai trop court entrainait des donnees corrompues.

Debogage : Utilisation de printf via UART pour afficher les valeurs lues. Configuration du port serie necessaire dans sdk_config.h.


PART C - Aspects Techniques Detailles

1. Bus de Communication Serie

Comparaison des principaux bus :

CaracteristiqueI2CSPIUART
Fils2 (SDA, SCL)4 (MOSI, MISO, SCK, CS)2 (TX, RX)
Vitesse max400 kHz (Fast), 3,4 MHz (High-Speed)Plusieurs MHz115200 bauds typique
Maitre/EsclaveMulti-maitre possibleUn maitre, plusieurs esclavesPoint a point
AdressageAdresse 7 ou 10 bitsChip Select physiquePas d'adresse
ComplexiteMoyenneSimpleTres simple
DistanceCourte (< 1 m)Tres courteMoyenne (quelques metres)

2. Protocole I2C (Inter-Integrated Circuit)

Principe de fonctionnement :

I2C utilise deux lignes bidirectionnelles :

  • SDA (Serial Data) : transmission des donnees
  • SCL (Serial Clock) : horloge generee par le maitre

Conditions de START et STOP :

  • START : SDA passe de HIGH a LOW alors que SCL est HIGH
  • STOP : SDA passe de LOW a HIGH alors que SCL est HIGH

Trame de communication :

  1. Condition START
  2. Adresse esclave (7 bits) + bit R/W
  3. Bit ACK (acknowledgement) de l'esclave
  4. Donnees (8 bits)
  5. Bit ACK
  6. Condition STOP

Avantages :

  • Seulement 2 fils pour plusieurs peripheriques
  • Adressage logiciel (pas de CS supplementaire)
  • Detection des collisions en multi-maitre

Inconvenients :

  • Vitesse limitee
  • Resistances de pull-up necessaires
  • Capacite parasite limite la longueur des cables

3. Protocole SPI (Serial Peripheral Interface)

Signaux SPI :

  • MOSI (Master Out Slave In) : donnees du maitre vers l'esclave
  • MISO (Master In Slave Out) : donnees de l'esclave vers le maitre
  • SCK (Serial Clock) : horloge generee par le maitre
  • CS (Chip Select) : selection de l'esclave (actif bas)

Modes SPI (4 modes selon CPOL et CPHA) :

ModeCPOLCPHADescription
000Clock repos a 0, echantillonnage front montant
101Clock repos a 0, echantillonnage front descendant
210Clock repos a 1, echantillonnage front descendant
311Clock repos a 1, echantillonnage front montant

Avantages :

  • Communication full-duplex (simultanee dans les deux sens)
  • Vitesse elevee (jusqu'a plusieurs dizaines de MHz)
  • Simple a implementer (pas de protocole complexe)

Inconvenients :

  • Nombre de fils augmente avec le nombre d'esclaves (un CS par esclave)
  • Pas de mecanisme d'acquittement (ACK)
  • Pas de detection d'erreur integree

4. Gestion des Horloges dans les Microcontroleurs

Les microcontroleurs modernes disposent de plusieurs sources d'horloge pour optimiser performances et consommation.

Sources d'horloge du nRF52832 :

HorlogeFrequencePrecisionConsommationUsage
HFCLK interne64 MHz+/-5%EleveeCPU, peripheriques rapides
HFCLK externe (cristal)64 MHz+/-20 ppmMoyenneBluetooth, precision
LFCLK interne32,768 kHz+/-5%FaibleRTC, timers basse vitesse
LFCLK externe (cristal)32,768 kHz+/-20 ppmTres faibleRTC precis, sleep modes

Diviseurs d'horloge : Chaque peripherique peut avoir son propre diviseur pour adapter la frequence. Exemple : SPI a 125 kHz derive de HFCLK 64 MHz (diviseur 512).

Importance pour la consommation :

  • Mode actif (64 MHz) : ~5 mA
  • Mode sleep (32 kHz) : quelques uA
  • Transition rapide entre modes pour economiser l'energie

5. DMA (Direct Memory Access)

Le DMA permet des transferts de donnees entre peripheriques et memoire sans intervention du CPU.

Avantages :

  • CPU libre pour d'autres taches
  • Transferts rapides et efficaces
  • Reduit la consommation (CPU peut rester en sleep)

Cas d'usage typiques :

  • Reception UART en continu (buffer circulaire)
  • Acquisition ADC multicanaux
  • Transferts SPI de grandes quantites de donnees

Configuration DMA pour SPI :

  • Buffer source en memoire
  • Peripherique SPI comme destination
  • Generation d'interruption en fin de transfert

6. Gestion de la Consommation (Low Power)

Modes de fonctionnement du nRF52832 :

ModeConsommationEtat CPUPeripheriques actifsReveil
Active5-15 mARunningTousN/A
Sleep1-2 uAHaltRTC, GPIOInterruption, timer
Deep Sleep< 1 uAHaltAucunReset externe

Techniques d'economie d'energie :

  • Utiliser les interruptions plutot que le polling
  • Desactiver les peripheriques non utilises
  • Reduire la frequence d'horloge quand possible
  • Utiliser des timers basse frequence (LFCLK)
  • Sleep entre les evenements

Exemple de cycle typique :

  1. Reveil par interruption timer (toutes les secondes)
  2. Lecture capteur I2C (10 ms actif)
  3. Traitement donnees (5 ms actif)
  4. Retour en sleep (985 ms a quelques uA)
  5. Consommation moyenne : ~50 uA au lieu de 5 mA continu

7. Adaptation de Niveaux Logiques

Problematique : Les differents composants fonctionnent a des tensions differentes (5V, 3,3V, 1,8V).

Solutions :

  • Diviseur resistif : simple mais ne fonctionne que pour 5V vers 3,3V
  • Transistor MOSFET : bidirectionnel pour I2C
  • Circuits dedies : TXS0108E (8 canaux, bidirectionnel)
  • Buffer 74LVCxx : conversion avec isolation

Carte INSA-BLE : Fonctionne en 3,3V. Connexion directe a des capteurs 3,3V. Pour interfacer avec du 5V (ex : Arduino), adaptation necessaire.


PART D - Analyse Reflexive et Perspectives

Competences acquises

Programmation embarquee bas niveau : Ce cours a renforce la programmation en C pour systemes embarques, notamment la manipulation de registres, la gestion d'interruptions, et l'interfacage avec peripheriques materiels.

Maitrise des protocoles de communication : Comprendre les differences entre I2C et SPI, savoir choisir le bon protocole selon les contraintes (nombre de fils, vitesse, consommation), et implementer correctement les transactions.

Optimisation energetique : Les techniques de low power sont essentielles pour les objets connectes sur batterie. Savoir mesurer et reduire la consommation est une competence cle.

Points cles a retenir

1. Choix du bus de communication :

  • I2C : plusieurs capteurs, peu de fils, vitesse moderee
  • SPI : haute vitesse, full-duplex, plus de fils
  • UART : simple, point a point, universel

2. Gestion rigoureuse du materiel : Lire attentivement les datasheets, respecter les timings, verifier les niveaux logiques, gerer correctement les CS et ACK.

3. Debogage methodique : Oscilloscope pour verifier les signaux, printf pour tracer l'execution, analyseur logique pour capturer les trames completes.

4. Consommation energetique : Concevoir des le depart avec la consommation en tete : sleep modes, reveil par interruption, choix des horloges.

Applications pratiques

Projets personnels et professionnels :

Objets connectes IoT : Les competences acquises sont directement applicables aux projets IoT : interfacer des capteurs environnementaux (temperature, humidite, pression), optimiser la duree de vie sur batterie.

Projet Embedded IA for IoT (S9) : Utilisation du nRF52832 pour des applications de machine learning embarque avec capteurs (accelerometre, gyroscope).

Instrumentation : Conception de systemes d'acquisition de donnees multi-capteurs avec communication serie vers un PC ou cloud.

Limites et ouvertures

Limites du cours :

  • Peu de UART (pourtant tres utilise)
  • Pas de CAN (important pour l'automobile)
  • Pas d'USB (complexe mais omnipresent)
  • Bluetooth uniquement mentionne, pas approfondi

Ouvertures vers :

  • Protocoles industriels : Modbus, Profibus, CAN, EtherCAT
  • Communication sans fil : Bluetooth, WiFi, LoRa, Zigbee
  • Interfaces haute vitesse : USB 2.0/3.0, Ethernet, PCIe
  • Securite des communications : chiffrement, authentification
  • Reseaux de capteurs : topologies mesh, routage, economie d'energie

Evolution technologique

Tendances actuelles :

  • Integration accrue : SoC avec CPU + peripheriques + radio
  • Ultra-basse consommation : nW pour capteurs recoltant l'energie ambiante
  • Protocoles unifies : Matter pour interoperabilite IoT
  • Edge computing : traitement local avec IA embarquee

Impact des nouvelles normes :

  • Bluetooth 5.0+ : portee etendue, debit augmente
  • Thread et Matter : standardisation IoT
  • MIPI I3C : evolution d'I2C avec vitesses jusqu'a 12,5 MHz

Conclusion

Les bus de communication numeriques sont le systeme nerveux des systemes embarques. Leur maitrise est indispensable pour interfacer capteurs, actionneurs, et modules de communication.

Ce cours a fourni une base solide en I2C et SPI, avec une approche pratique sur microcontroleur ARM. La carte nRF52832 est representative des SoC modernes : puissant, basse consommation, connectivite integree.

Complementarite avec les autres cours :

Recommandations pour aller plus loin :

  • Etudier les datasheets completes (nRF52, capteurs)
  • Experimenter avec d'autres bus (CAN, USB)
  • Mesurer la consommation reelle avec un amperemetre de precision
  • Developper des projets complets integrant plusieurs capteurs
  • Explorer les stacks Bluetooth et WiFi

Documents de Cours

Protocole I2C

Cours complet sur le bus I2C : principe de fonctionnement, adressage, trame de communication et implementation.

Telecharger

Protocole SPI

Cours sur le bus SPI : principe maitre-esclave, selection de peripherique, modes d'horloge et communication full-duplex.

Telecharger

Low Power Design

Techniques d'optimisation de la consommation : modes de veille, clock gating, gestion d'energie dans les microcontroleurs.

Telecharger

Microcontroleur, Horloge et DMA

Architecture des microcontroleurs : gestion des horloges systeme et acces direct memoire (DMA) pour performances optimales.

Telecharger


Digital Electronics Functions - Semester 6

Academic Year: 2022-2023
Semester: 6
Credits: 2 ECTS
Specialization: Electronics and Embedded Systems


PART A - General Course Overview

Overview

This course focuses on digital communication interfaces and their implementation in embedded systems. The emphasis is on serial communication buses (I2C, SPI, UART) and practical aspects of microcontroller programming (clocks, power management, DMA). The course uses Nordic nRF52832 boards (Bluetooth Low Energy) for the lab sessions.

Learning objectives:

  • Master serial communication protocols (I2C, SPI)
  • Program ARM Cortex-M4 microcontrollers in C
  • Understand clock mechanisms and power management
  • Interface sensors via digital buses
  • Optimize energy consumption

Position in the curriculum

This course follows and complements:

  • Fundamentals of Digital Electronics (S5): combinational and sequential logic
  • C Language (S5): systems programming in C
  • Microcontroller (S6): ARM architecture and peripherals

It prepares for the following applications:

  • Embedded IA for IoT (S9): connected objects and edge computing
  • Energy for Connected Objects (S9): energy optimization
  • Embedded projects: complete system design

PART B - Personal Experience and Learning Context

Organization and resources

The module was organized into two complementary components:

1. Lectures:

  • Comparison of communication buses (I2C, SPI, UART, CAN, USB)
  • Microcontroller architecture (clocks, DMA, low-power modes)
  • Serial communication protocols (timing, signaling, addressing)
  • Logic level shifting and WiFi

2. Lab sessions:

  • INSA-BLE board based on Nordic nRF52832 (ARM Cortex-M4F + BLE)
  • C programming with Nordic SDK
  • I2C lab: reading an MCP9804 temperature sensor
  • SPI lab: interfacing with a TC72 sensor

Hardware used

INSA-BLE Board (Nordic nRF52832):

ComponentSpecification
MCUARM Cortex-M4F 64 MHz
Flash Memory512 KB
RAM64 KB
ConnectivityBluetooth Low Energy 5.0
Onboard SensorsLIS2DH12 (I2C accelerometer), MPU-9250 (9-axis IMU SPI)
Power Supply3.3V (integrated regulator)

External peripherals:

  • MCP9804: high-precision I2C temperature sensor (+/-0.25 deg C)
  • TC72: SPI temperature sensor

Lab session details

I2C Lab: Communication with MCP9804

The objective was to read the temperature from an I2C sensor and display it in real time.

SPI Protocol

Figure: SPI protocol timing diagram - Full-duplex communication with master clock

Implementation steps:

  1. I2C bus initialization:
    • Pin configuration for SCL (P0.27) and SDA (P0.26)
    • Frequency: 100 kHz (standard mode)
    • Enabling the TWI (Two-Wire Interface) peripheral
  2. Sensor addressing:
    • MCP9804 I2C address: 0x1F (7 bits)
    • Temperature register: 0x05
  3. Temperature reading:
    • Sending the command to access register 0x05
    • Reading 2 bytes (temperature on 13 bits)
    • Conversion: data bits / 16 = temperature in deg C

I2C code excerpt:

#define TWI_INSTANCE_ID 0
#define MCP9804_ADDRESS 0x1F

static const nrf_drv_twi_t twi_instance = NRF_DRV_TWI_INSTANCE(TWI_INSTANCE_ID);

void twi_init(void) {
    ret_code_t err_code;
    const nrf_drv_twi_config_t twi_config = {
        .scl = NRF_GPIO_PIN_MAP(0, 27),
        .sda = NRF_GPIO_PIN_MAP(0, 26),
        .frequency = NRF_TWI_FREQ_100K,
        .interrupt_priority = APP_IRQ_PRIORITY_LOWEST,
        .clear_bus_init = false
    };
    err_code = nrf_drv_twi_init(&twi_instance, &twi_config, NULL, NULL);
    APP_ERROR_CHECK(err_code);
    nrf_drv_twi_enable(&twi_instance);
}

float read_temperature(void) {
    uint8_t reg[2] = {0x05, 0x00};
    uint8_t temp_data[2] = {0};

    nrf_drv_twi_tx(&twi_instance, MCP9804_ADDRESS, reg, sizeof(reg), true);
    nrf_delay_ms(10);
    nrf_drv_twi_rx(&twi_instance, MCP9804_ADDRESS, temp_data, sizeof(temp_data));

    int16_t temp_raw = (temp_data[0] << 8) | temp_data[1];
    temp_raw &= 0x0FFF;  // Mask for useful 12 bits
    float temperature = temp_raw / 16.0;

    return temperature;
}

SPI Lab: Communication with TC72

The second lab consisted of interfacing an SPI temperature sensor.

SPI configuration:

  • Mode 1 (CPOL=0, CPHA=1)
  • Frequency: 125 kHz
  • CS (Chip Select): P0.31, manually controlled
  • MOSI: P0.28, MISO: P0.29, SCK: P0.30

Communication protocol:

  1. Initialization: write 0x80, 0x04 for continuous conversion mode
  2. Reading: send command 0x02, receive 3 bytes
  3. Temperature data processing

SPI code excerpt:

#define SPI_CS_PIN    NRF_GPIO_PIN_MAP(0,31)
#define SPI_MISO_PIN  NRF_GPIO_PIN_MAP(0,29)
#define SPI_MOSI_PIN  NRF_GPIO_PIN_MAP(0,28)
#define SPI_SCK_PIN   NRF_GPIO_PIN_MAP(0,30)

void spi_init(void) {
    nrf_drv_spi_config_t spi_config = NRF_DRV_SPI_DEFAULT_CONFIG;
    spi_config.ss_pin   = NRF_DRV_SPI_PIN_NOT_USED;
    spi_config.miso_pin = SPI_MISO_PIN;
    spi_config.mosi_pin = SPI_MOSI_PIN;
    spi_config.sck_pin  = SPI_SCK_PIN;
    spi_config.mode     = NRF_DRV_SPI_MODE_1;
    spi_config.frequency = NRF_DRV_SPI_FREQ_125K;
    APP_ERROR_CHECK(nrf_drv_spi_init(&spi, &spi_config, spi_event_handler, NULL));
}

void tc_init(void) {
    nrf_gpio_cfg_output(SPI_CS_PIN);
    nrf_gpio_pin_clear(SPI_CS_PIN);
    spi_init();
    uint8_t data_to_send[2] = {0x80, 0x04}; // Continuous conversion
    nrf_gpio_pin_set(SPI_CS_PIN);
    spi_send(data_to_send, 2, NULL, 0);
    nrf_gpio_pin_clear(SPI_CS_PIN);
}

Difficulties encountered

SPI Chip Select management: The CS must be toggled manually (not handled automatically by the driver). Forgetting to toggle the CS caused a complete loss of communication.

I2C timing: The delays between transmission and reception are critical. A delay that was too short resulted in corrupted data.

Debugging: Using printf via UART to display the read values. Serial port configuration was required in sdk_config.h.


PART C - Detailed Technical Aspects

1. Serial Communication Buses

Comparison of the main buses:

CharacteristicI2CSPIUART
Wires2 (SDA, SCL)4 (MOSI, MISO, SCK, CS)2 (TX, RX)
Max speed400 kHz (Fast), 3.4 MHz (High-Speed)Several MHz115200 baud typical
Master/SlaveMulti-master possibleOne master, multiple slavesPoint to point
Addressing7 or 10-bit addressPhysical Chip SelectNo address
ComplexityMediumSimpleVery simple
DistanceShort (< 1 m)Very shortMedium (a few meters)

2. I2C Protocol (Inter-Integrated Circuit)

Operating principle:

I2C uses two bidirectional lines:

  • SDA (Serial Data): data transmission
  • SCL (Serial Clock): clock generated by the master

START and STOP conditions:

  • START: SDA transitions from HIGH to LOW while SCL is HIGH
  • STOP: SDA transitions from LOW to HIGH while SCL is HIGH

Communication frame:

  1. START condition
  2. Slave address (7 bits) + R/W bit
  3. ACK (acknowledgement) bit from the slave
  4. Data (8 bits)
  5. ACK bit
  6. STOP condition

Advantages:

  • Only 2 wires for multiple peripherals
  • Software addressing (no additional CS needed)
  • Collision detection in multi-master mode

Disadvantages:

  • Limited speed
  • Pull-up resistors required
  • Parasitic capacitance limits cable length

3. SPI Protocol (Serial Peripheral Interface)

SPI signals:

  • MOSI (Master Out Slave In): data from master to slave
  • MISO (Master In Slave Out): data from slave to master
  • SCK (Serial Clock): clock generated by the master
  • CS (Chip Select): slave selection (active low)

SPI modes (4 modes based on CPOL and CPHA):

ModeCPOLCPHADescription
000Clock idle at 0, sampling on rising edge
101Clock idle at 0, sampling on falling edge
210Clock idle at 1, sampling on falling edge
311Clock idle at 1, sampling on rising edge

Advantages:

  • Full-duplex communication (simultaneous in both directions)
  • High speed (up to tens of MHz)
  • Simple to implement (no complex protocol)

Disadvantages:

  • Number of wires increases with the number of slaves (one CS per slave)
  • No acknowledgement mechanism (ACK)
  • No built-in error detection

4. Clock Management in Microcontrollers

Modern microcontrollers have multiple clock sources to optimize performance and power consumption.

nRF52832 clock sources:

ClockFrequencyAccuracyPower ConsumptionUsage
Internal HFCLK64 MHz+/-5%HighCPU, fast peripherals
External HFCLK (crystal)64 MHz+/-20 ppmMediumBluetooth, precision
Internal LFCLK32.768 kHz+/-5%LowRTC, low-speed timers
External LFCLK (crystal)32.768 kHz+/-20 ppmVery lowPrecise RTC, sleep modes

Clock dividers: Each peripheral can have its own divider to adjust the frequency. Example: SPI at 125 kHz derived from HFCLK 64 MHz (divider 512).

Impact on power consumption:

  • Active mode (64 MHz): ~5 mA
  • Sleep mode (32 kHz): a few uA
  • Fast transition between modes to save energy

5. DMA (Direct Memory Access)

DMA enables data transfers between peripherals and memory without CPU intervention.

Advantages:

  • CPU free for other tasks
  • Fast and efficient transfers
  • Reduces power consumption (CPU can remain in sleep)

Typical use cases:

  • Continuous UART reception (circular buffer)
  • Multi-channel ADC acquisition
  • SPI transfers of large data volumes

DMA configuration for SPI:

  • Source buffer in memory
  • SPI peripheral as destination
  • Interrupt generation at end of transfer

6. Power Management (Low Power)

nRF52832 operating modes:

ModeConsumptionCPU StateActive PeripheralsWake-up
Active5-15 mARunningAllN/A
Sleep1-2 uAHaltRTC, GPIOInterrupt, timer
Deep Sleep< 1 uAHaltNoneExternal reset

Energy saving techniques:

  • Use interrupts rather than polling
  • Disable unused peripherals
  • Reduce clock frequency when possible
  • Use low-frequency timers (LFCLK)
  • Sleep between events

Typical cycle example:

  1. Wake-up by timer interrupt (every second)
  2. I2C sensor reading (10 ms active)
  3. Data processing (5 ms active)
  4. Return to sleep (985 ms at a few uA)
  5. Average consumption: ~50 uA instead of 5 mA continuous

7. Logic Level Shifting

The problem: Different components operate at different voltage levels (5V, 3.3V, 1.8V).

Solutions:

  • Resistive voltage divider: simple but only works for 5V to 3.3V
  • MOSFET transistor: bidirectional for I2C
  • Dedicated ICs: TXS0108E (8 channels, bidirectional)
  • 74LVCxx buffer: conversion with isolation

INSA-BLE board: Operates at 3.3V. Direct connection to 3.3V sensors. To interface with 5V devices (e.g., Arduino), level shifting is required.


PART D - Reflective Analysis and Perspectives

Skills acquired

Low-level embedded programming: This course reinforced C programming for embedded systems, particularly register manipulation, interrupt management, and interfacing with hardware peripherals.

Mastery of communication protocols: Understanding the differences between I2C and SPI, knowing how to choose the right protocol based on constraints (number of wires, speed, power consumption), and correctly implementing transactions.

Energy optimization: Low-power techniques are essential for battery-powered connected objects. Knowing how to measure and reduce consumption is a key skill.

Key takeaways

1. Communication bus selection:

  • I2C: multiple sensors, few wires, moderate speed
  • SPI: high speed, full-duplex, more wires
  • UART: simple, point-to-point, universal

2. Rigorous hardware management: Read datasheets carefully, respect timings, verify logic levels, correctly manage CS and ACK signals.

3. Methodical debugging: Oscilloscope to verify signals, printf to trace execution, logic analyzer to capture complete frames.

4. Energy consumption: Design with power consumption in mind from the start: sleep modes, interrupt-based wake-up, clock selection.

Practical applications

Personal and professional projects:

IoT connected objects: The skills acquired are directly applicable to IoT projects: interfacing environmental sensors (temperature, humidity, pressure), optimizing battery life.

Embedded IA for IoT project (S9): Using the nRF52832 for embedded machine learning applications with sensors (accelerometer, gyroscope).

Instrumentation: Designing multi-sensor data acquisition systems with serial communication to a PC or cloud.

Limitations and future directions

Course limitations:

  • Limited coverage of UART (yet widely used)
  • No CAN bus (important for automotive)
  • No USB (complex but ubiquitous)
  • Bluetooth only mentioned, not covered in depth

Future directions:

  • Industrial protocols: Modbus, Profibus, CAN, EtherCAT
  • Wireless communication: Bluetooth, WiFi, LoRa, Zigbee
  • High-speed interfaces: USB 2.0/3.0, Ethernet, PCIe
  • Communication security: encryption, authentication
  • Sensor networks: mesh topologies, routing, energy saving

Technological evolution

Current trends:

  • Increased integration: SoC with CPU + peripherals + radio
  • Ultra-low power: nW for energy-harvesting sensors
  • Unified protocols: Matter for IoT interoperability
  • Edge computing: local processing with embedded AI

Impact of new standards:

  • Bluetooth 5.0+: extended range, increased throughput
  • Thread and Matter: IoT standardization
  • MIPI I3C: evolution of I2C with speeds up to 12.5 MHz

Conclusion

Digital communication buses are the nervous system of embedded systems. Mastering them is essential for interfacing sensors, actuators, and communication modules.

This course provided a solid foundation in I2C and SPI, with a practical approach on ARM microcontrollers. The nRF52832 board is representative of modern SoCs: powerful, low-power, with integrated connectivity.

Complementarity with other courses:

Recommendations for further study:

  • Study complete datasheets (nRF52, sensors)
  • Experiment with other buses (CAN, USB)
  • Measure actual power consumption with a precision ammeter
  • Develop complete projects integrating multiple sensors
  • Explore Bluetooth and WiFi stacks

Course Documents

I2C Protocol

Complete course on the I2C bus: operating principle, addressing, communication frame and implementation.

Download

SPI Protocol

Course on the SPI bus: master-slave principle, peripheral selection, clock modes and full-duplex communication.

Download

Low Power Design

Power consumption optimization techniques: sleep modes, clock gating, energy management in microcontrollers.

Download

Microcontroller, Clock and DMA

Microcontroller architecture: system clock management and direct memory access (DMA) for optimal performance.

Download


Cours enseigne en 2022-2023 a l’INSA Toulouse, Departement Genie Electrique et Informatique. Course taught in 2022-2023 at INSA Toulouse, Department of Electrical Engineering and Computer Science.