💾 Électronique Fonctions Numériques - Semestre 6

Année Universitaire : 2022-2023
Semestre : 6
Crédits : 2 ECTS
Spécialité : Électronique et Systèmes Embarqués


PART A - Présentation Générale du Cours

Vue d'ensemble

Ce cours se concentre sur les interfaces de communication numériques et leur implémentation dans les systèmes embarqués. L’accent est mis sur les bus de communication série (I2C, SPI, UART) et les aspects pratiques de programmation des microcontrôleurs (horloges, gestion de la consommation, DMA). Le cours utilise des cartes Nordic nRF52832 (Bluetooth Low Energy) pour les travaux pratiques.

Objectifs pédagogiques :

Position dans le cursus

Ce cours fait suite et complète :

Il prépare aux applications :


PART B - Expérience Personnelle et Contexte d’Apprentissage

Organisation et ressources

Le module était organisé en deux volets complémentaires :

1. Cours magistraux :

2. Travaux pratiques :

Matériel utilisé

Carte INSA-BLE (Nordic nRF52832) :

Composant Spécification
MCU ARM Cortex-M4F 64 MHz
Mémoire Flash 512 KB
RAM 64 KB
Connectivité Bluetooth Low Energy 5.0
Capteurs embarqués LIS2DH12 (accéléromètre I2C), MPU-9250 (IMU 9 axes SPI)
Alimentation 3,3V (régulateur intégré)

Périphériques externes :

Déroulement des TPs

TP I2C : Communication avec MCP9804

L’objectif était de lire la température d’un capteur I2C et l’afficher en temps réel.

Protocole SPI

Figure : Chronogramme du protocole SPI - Communication full-duplex avec horloge maître

Étapes de mise en œuvre :

  1. Initialisation du bus I2C :
    • Configuration des broches SCL (P0.27) et SDA (P0.26)
    • Fréquence : 100 kHz (mode standard)
    • Activation du périphérique TWI (Two-Wire Interface)
  2. Adressage du capteur :
    • Adresse I2C du MCP9804 : 0x1F (7 bits)
    • Registre de température : 0x05
  3. Lecture de la température :
    • Envoi de la commande pour accéder au registre 0x05
    • Lecture de 2 octets (température sur 13 bits)
    • Conversion : bits de données / 16 = température en °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 à interfacer un capteur de température SPI.

Configuration SPI :

Protocole de communication :

  1. Initialisation : écrire 0x80, 0x04 pour mode conversion continue
  2. Lecture : envoyer commande 0x02, recevoir 3 octets
  3. Traitement des données de température

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);
}

Difficultés rencontrées

Gestion du Chip Select en SPI : Le CS doit être manipulé manuellement (pas géré automatiquement par le driver). Oubli de basculer le CS provoquait l’absence de communication.

Timing I2C : Les délais entre transmission et réception sont critiques. Un délai trop court entraînait des données corrompues.

Débogage : Utilisation de printf via UART pour afficher les valeurs lues. Configuration du port série nécessaire dans sdk_config.h.


PART C - Aspects Techniques Détaillés

1. Bus de Communication Série

Comparaison des principaux bus :

Caractéristique I2C SPI UART
Fils 2 (SDA, SCL) 4 (MOSI, MISO, SCK, CS) 2 (TX, RX)
Vitesse max 400 kHz (Fast), 3,4 MHz (High-Speed) Plusieurs MHz 115200 bauds typique
Maître/Esclave Multi-maître possible Un maître, plusieurs esclaves Point à point
Adressage Adresse 7 ou 10 bits Chip Select physique Pas d’adresse
Complexité Moyenne Simple Très simple
Distance Courte (< 1 m) Très courte Moyenne (quelques mètres)

2. Protocole I2C (Inter-Integrated Circuit)

Principe de fonctionnement :

I2C utilise deux lignes bidirectionnelles :

Conditions de START et STOP :

Trame de communication :

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

Avantages :

Inconvénients :

3. Protocole SPI (Serial Peripheral Interface)

Signaux SPI :

Modes SPI (4 modes selon CPOL et CPHA) :

Mode CPOL CPHA Description
0 0 0 Clock repos à 0, échantillonnage front montant
1 0 1 Clock repos à 0, échantillonnage front descendant
2 1 0 Clock repos à 1, échantillonnage front descendant
3 1 1 Clock repos à 1, échantillonnage front montant

Avantages :

Inconvénients :

4. Gestion des Horloges dans les Microcontrôleurs

Les microcontrôleurs modernes disposent de plusieurs sources d’horloge pour optimiser performances et consommation.

Sources d’horloge du nRF52832 :

Horloge Fréquence Précision Consommation Usage
HFCLK interne 64 MHz ±5% Élevée CPU, périphériques rapides
HFCLK externe (cristal) 64 MHz ±20 ppm Moyenne Bluetooth, précision
LFCLK interne 32,768 kHz ±5% Faible RTC, timers basse vitesse
LFCLK externe (cristal) 32,768 kHz ±20 ppm Très faible RTC précis, sleep modes

Diviseurs d’horloge : Chaque périphérique peut avoir son propre diviseur pour adapter la fréquence. Exemple : SPI à 125 kHz dérivé de HFCLK 64 MHz (diviseur 512).

Importance pour la consommation :

5. DMA (Direct Memory Access)

Le DMA permet des transferts de données entre périphériques et mémoire sans intervention du CPU.

Avantages :

Cas d’usage typiques :

Configuration DMA pour SPI :

6. Gestion de la Consommation (Low Power)

Modes de fonctionnement du nRF52832 :

Mode Consommation État CPU Périphériques actifs Réveil
Active 5-15 mA Running Tous N/A
Sleep 1-2 µA Halt RTC, GPIO Interruption, timer
Deep Sleep < 1 µA Halt Aucun Reset externe

Techniques d’économie d’énergie :

Exemple de cycle typique :

  1. Réveil par interruption timer (toutes les secondes)
  2. Lecture capteur I2C (10 ms actif)
  3. Traitement données (5 ms actif)
  4. Retour en sleep (985 ms à quelques µA)
  5. Consommation moyenne : ~50 µA au lieu de 5 mA continu

7. Adaptation de Niveaux Logiques

Problématique : Les différents composants fonctionnent à des tensions différentes (5V, 3,3V, 1,8V).

Solutions :

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


PART D - Analyse Réflexive et Perspectives

Compétences acquises

Programmation embarquée bas niveau : Ce cours a renforcé la programmation en C pour systèmes embarqués, notamment la manipulation de registres, la gestion d’interruptions, et l’interfaçage avec périphériques matériels.

Maîtrise des protocoles de communication : Comprendre les différences entre I2C et SPI, savoir choisir le bon protocole selon les contraintes (nombre de fils, vitesse, consommation), et implémenter correctement les transactions.

Optimisation énergétique : Les techniques de low power sont essentielles pour les objets connectés sur batterie. Savoir mesurer et réduire la consommation est une compétence clé.

Points clés à retenir

1. Choix du bus de communication :

2. Gestion rigoureuse du matériel : Lire attentivement les datasheets, respecter les timings, vérifier les niveaux logiques, gérer correctement les CS et ACK.

3. Débogage méthodique : Oscilloscope pour vérifier les signaux, printf pour tracer l’exécution, analyseur logique pour capturer les trames complètes.

4. Consommation énergétique : Concevoir dès le départ avec la consommation en tête : sleep modes, réveil par interruption, choix des horloges.

Applications pratiques

Projets personnels et professionnels :

Objets connectés IoT : Les compétences acquises sont directement applicables aux projets IoT : interfacer des capteurs environnementaux (température, humidité, pression), optimiser la durée de vie sur batterie.

Projet Embedded IA for IoT (S9) : Utilisation du nRF52832 pour des applications de machine learning embarqué avec capteurs (accéléromètre, gyroscope).

Instrumentation : Conception de systèmes d’acquisition de données multi-capteurs avec communication série vers un PC ou cloud.

Limites et ouvertures

Limites du cours :

Ouvertures vers :

Évolution technologique

Tendances actuelles :

Impact des nouvelles normes :

Conclusion

Les bus de communication numériques sont le système nerveux des systèmes embarqués. Leur maîtrise 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 microcontrôleur ARM. La carte nRF52832 est représentative des SoC modernes : puissant, basse consommation, connectivité intégrée.

Complémentarité avec les autres cours :

Recommandations pour aller plus loin :


📚 Documents de Cours

📖 Protocole I2C

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

📥 Télécharger

📖 Protocole SPI

Cours sur le bus SPI : principe maître-esclave, sélection de périphérique, modes d'horloge et communication full-duplex.

📥 Télécharger

📖 Low Power Design

Techniques d'optimisation de la consommation : modes de veille, clock gating, gestion d'énergie dans les microcontrôleurs.

📥 Télécharger

📖 Microcontrôleur, Horloge et DMA

Architecture des microcontrôleurs : gestion des horloges système et accès direct mémoire (DMA) pour performances optimales.

📥 Télécharger


Cours enseigné en 2022-2023 à l’INSA Toulouse, Département Génie Électrique et Informatique.