Adressage I2C, ACK/NACK, conditions START/STOP et structure de FSM VHDL.
I2C relie plusieurs composants avec SDA pour les données et SCL pour l'horloge. Les sorties à drain ouvert abaissent les lignes ; les résistances de pull-up les ramènent au niveau haut lorsque les composants les relâchent.
Signal
Type
Description
SDA
Open-drain bidirectionnel
Serial Data - données
SCL
Open-drain bidirectionnel
Serial Clock - horloge
Adresser et encadrer l'échange
Les esclaves utilisent une adresse de 7 ou 10 bits. Les adresses doivent être distinctes pour communiquer séparément avec plusieurs composants sur le même bus.
SDA reste stable pendant SCL haut, sauf pour deux conditions : START fait descendre SDA, STOP le fait remonter. Pendant les données, les changements se font avec SCL bas.
Une écriture typique à adresse de sept bits suit cette séquence :
Le maître produit START, envoie l'adresse MSB d'abord puis le bit R/W : 0 pour écrire, 1 pour lire. Le destinataire acquitte l'adresse, puis chaque octet de données reçoit un ACK ou un NACK. Le maître termine avec STOP pour libérer le bus.
Au neuvième coup d'horloge, le récepteur produit ACK en abaissant SDA, ou NACK en la laissant haute. NACK peut signaler un refus ou la fin d'une lecture : après son dernier octet reçu, le maître utilise NACK pour annoncer qu'il ne veut plus de données.
Construire le contrôleur
Cette interface VHDL expose la commande, l'adresse et les deux lignes bidirectionnelles :
library ieee;use ieee.std_logic_1164.all;entity i2c_master is generic ( g_SYS_CLK_HZ : positive := 100_000_000; -- 100 MHz g_I2C_CLK_HZ : positive := 400_000 -- 400 kHz (Fast mode) ); port ( i_clk : in std_logic; i_rst : in std_logic; i_start : in std_logic; i_rw : in std_logic; -- '0'=write, '1'=read i_addr : in std_logic_vector(6 downto 0); i_data : in std_logic_vector(7 downto 0); o_data : out std_logic_vector(7 downto 0); o_busy : out std_logic; o_ack_err : out std_logic; io_sda : inout std_logic; io_scl : inout std_logic );end entity i2c_master;
Une FSM d'écriture peut suivre IDLE → START → ADDR → ACK_ADDR → DATA → ACK_DATA → STOP. L'interface seule ne constitue pas une implémentation complète ; l'exercice associé développe le comportement.
L'esclave peut garder SCL bas pour étirer l'horloge. Le maître doit alors lire la ligne et attendre sa remontée. Cela demande une commande à drain ouvert et une lecture de SCL, y compris côté maître.
Avec plusieurs maîtres, chacun compare SDA à la valeur qu'il souhaite transmettre. Celui qui relâche la ligne pour un 1 mais lit 0 perd l'arbitrage et cesse d'émettre. L'autre poursuit sa transaction.
Choisir la vitesse et vérifier la carte
Mode
Fréquence SCL maximale
Standard Mode
100 kHz
Fast Mode
400 kHz
Fast Mode Plus
1 MHz
High Speed Mode
3,4 MHz
Les pull-up, la capacité du bus et les temps de montée doivent respecter le mode choisi. La limite de capacité n'est pas une valeur unique valable pour toutes les variantes.