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) :
| Composant | Specification |
|---|---|
| MCU | ARM Cortex-M4F 64 MHz |
| Memoire Flash | 512 KB |
| RAM | 64 KB |
| Connectivite | Bluetooth Low Energy 5.0 |
| Capteurs embarques | LIS2DH12 (accelerometre I2C), MPU-9250 (IMU 9 axes SPI) |
| Alimentation | 3,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.
Figure : Chronogramme du protocole SPI - Communication full-duplex avec horloge maitre
Etapes de mise en oeuvre :
- 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)
- Adressage du capteur :
- Adresse I2C du MCP9804 : 0x1F (7 bits)
- Registre de temperature : 0x05
- 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 :
- Initialisation : ecrire 0x80, 0x04 pour mode conversion continue
- Lecture : envoyer commande 0x02, recevoir 3 octets
- 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 :
| Caracteristique | 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 |
| Maitre/Esclave | Multi-maitre possible | Un maitre, plusieurs esclaves | Point a point |
| Adressage | Adresse 7 ou 10 bits | Chip Select physique | Pas d'adresse |
| Complexite | Moyenne | Simple | Tres simple |
| Distance | Courte (< 1 m) | Tres courte | Moyenne (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 :
- Condition START
- Adresse esclave (7 bits) + bit R/W
- Bit ACK (acknowledgement) de l'esclave
- Donnees (8 bits)
- Bit ACK
- 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) :
| Mode | CPOL | CPHA | Description |
|---|---|---|---|
| 0 | 0 | 0 | Clock repos a 0, echantillonnage front montant |
| 1 | 0 | 1 | Clock repos a 0, echantillonnage front descendant |
| 2 | 1 | 0 | Clock repos a 1, echantillonnage front descendant |
| 3 | 1 | 1 | Clock 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 :
| Horloge | Frequence | Precision | Consommation | Usage |
|---|---|---|---|---|
| HFCLK interne | 64 MHz | +/-5% | Elevee | CPU, peripheriques rapides |
| HFCLK externe (cristal) | 64 MHz | +/-20 ppm | Moyenne | Bluetooth, precision |
| LFCLK interne | 32,768 kHz | +/-5% | Faible | RTC, timers basse vitesse |
| LFCLK externe (cristal) | 32,768 kHz | +/-20 ppm | Tres faible | RTC 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 :
| Mode | Consommation | Etat CPU | Peripheriques actifs | Reveil |
|---|---|---|---|---|
| Active | 5-15 mA | Running | Tous | N/A |
| Sleep | 1-2 uA | Halt | RTC, GPIO | Interruption, timer |
| Deep Sleep | < 1 uA | Halt | Aucun | Reset 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 :
- Reveil par interruption timer (toutes les secondes)
- Lecture capteur I2C (10 ms actif)
- Traitement donnees (5 ms actif)
- Retour en sleep (985 ms a quelques uA)
- 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 :
- Microcontroleur - S6 : architecture ARM Cortex-M
- Langage d'Assemblage ARM - S6 : bas niveau ARM
- Embedded IA for IoT - S9 : applications avancees
- Energy for Connected Objects - S9 : optimisation poussee
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.
Protocole SPI
Cours sur le bus SPI : principe maitre-esclave, selection de peripherique, modes d'horloge et communication full-duplex.
Low Power Design
Techniques d'optimisation de la consommation : modes de veille, clock gating, gestion d'energie dans les microcontroleurs.
Microcontroleur, Horloge et DMA
Architecture des microcontroleurs : gestion des horloges systeme et acces direct memoire (DMA) pour performances optimales.
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):
| Component | Specification |
|---|---|
| MCU | ARM Cortex-M4F 64 MHz |
| Flash Memory | 512 KB |
| RAM | 64 KB |
| Connectivity | Bluetooth Low Energy 5.0 |
| Onboard Sensors | LIS2DH12 (I2C accelerometer), MPU-9250 (9-axis IMU SPI) |
| Power Supply | 3.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.
Figure: SPI protocol timing diagram - Full-duplex communication with master clock
Implementation steps:
- 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
- Sensor addressing:
- MCP9804 I2C address: 0x1F (7 bits)
- Temperature register: 0x05
- 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:
- Initialization: write 0x80, 0x04 for continuous conversion mode
- Reading: send command 0x02, receive 3 bytes
- 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:
| Characteristic | I2C | SPI | UART |
|---|---|---|---|
| Wires | 2 (SDA, SCL) | 4 (MOSI, MISO, SCK, CS) | 2 (TX, RX) |
| Max speed | 400 kHz (Fast), 3.4 MHz (High-Speed) | Several MHz | 115200 baud typical |
| Master/Slave | Multi-master possible | One master, multiple slaves | Point to point |
| Addressing | 7 or 10-bit address | Physical Chip Select | No address |
| Complexity | Medium | Simple | Very simple |
| Distance | Short (< 1 m) | Very short | Medium (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:
- START condition
- Slave address (7 bits) + R/W bit
- ACK (acknowledgement) bit from the slave
- Data (8 bits)
- ACK bit
- 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):
| Mode | CPOL | CPHA | Description |
|---|---|---|---|
| 0 | 0 | 0 | Clock idle at 0, sampling on rising edge |
| 1 | 0 | 1 | Clock idle at 0, sampling on falling edge |
| 2 | 1 | 0 | Clock idle at 1, sampling on falling edge |
| 3 | 1 | 1 | Clock 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:
| Clock | Frequency | Accuracy | Power Consumption | Usage |
|---|---|---|---|---|
| Internal HFCLK | 64 MHz | +/-5% | High | CPU, fast peripherals |
| External HFCLK (crystal) | 64 MHz | +/-20 ppm | Medium | Bluetooth, precision |
| Internal LFCLK | 32.768 kHz | +/-5% | Low | RTC, low-speed timers |
| External LFCLK (crystal) | 32.768 kHz | +/-20 ppm | Very low | Precise 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:
| Mode | Consumption | CPU State | Active Peripherals | Wake-up |
|---|---|---|---|---|
| Active | 5-15 mA | Running | All | N/A |
| Sleep | 1-2 uA | Halt | RTC, GPIO | Interrupt, timer |
| Deep Sleep | < 1 uA | Halt | None | External 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:
- Wake-up by timer interrupt (every second)
- I2C sensor reading (10 ms active)
- Data processing (5 ms active)
- Return to sleep (985 ms at a few uA)
- 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:
- Microcontroller - S6: ARM Cortex-M architecture
- ARM Assembly Language - S6: low-level ARM
- Embedded IA for IoT - S9: advanced applications
- Energy for Connected Objects - S9: advanced optimization
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.
SPI Protocol
Course on the SPI bus: master-slave principle, peripheral selection, clock modes and full-duplex communication.
Low Power Design
Power consumption optimization techniques: sleep modes, clock gating, energy management in microcontrollers.
Microcontroller, Clock and DMA
Microcontroller architecture: system clock management and direct memory access (DMA) for optimal performance.
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.