<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://wikifr.techno-innov.fr/index.php?action=history&amp;feed=atom&amp;title=Technique%2FLogiciel%2FAPI%2FUse%2FDrivers%2FI2C</id>
	<title>Technique/Logiciel/API/Use/Drivers/I2C - Historique des versions</title>
	<link rel="self" type="application/atom+xml" href="https://wikifr.techno-innov.fr/index.php?action=history&amp;feed=atom&amp;title=Technique%2FLogiciel%2FAPI%2FUse%2FDrivers%2FI2C"/>
	<link rel="alternate" type="text/html" href="https://wikifr.techno-innov.fr/index.php?title=Technique/Logiciel/API/Use/Drivers/I2C&amp;action=history"/>
	<updated>2026-04-04T02:31:18Z</updated>
	<subtitle>Historique des versions pour cette page sur le wiki</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://wikifr.techno-innov.fr/index.php?title=Technique/Logiciel/API/Use/Drivers/I2C&amp;diff=43&amp;oldid=prev</id>
		<title>Nathael : Page créée avec « {{DISPLAYTITLE:Interface logicielle (API) - Driver I²C}}  == Présentation ==  #include &quot;drivers/i2c.h&quot; Le driver &quot;i2c&quot; donne accès aux périphériques présents sur les... »</title>
		<link rel="alternate" type="text/html" href="https://wikifr.techno-innov.fr/index.php?title=Technique/Logiciel/API/Use/Drivers/I2C&amp;diff=43&amp;oldid=prev"/>
		<updated>2020-09-02T03:49:02Z</updated>

		<summary type="html">&lt;p&gt;Page créée avec « {{DISPLAYTITLE:Interface logicielle (API) - Driver I²C}}  == Présentation ==  #include &amp;quot;drivers/i2c.h&amp;quot; Le driver &amp;quot;i2c&amp;quot; donne accès aux périphériques présents sur les... »&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nouvelle page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{DISPLAYTITLE:Interface logicielle (API) - Driver I²C}}&lt;br /&gt;
&lt;br /&gt;
== Présentation ==&lt;br /&gt;
 #include &amp;quot;drivers/i2c.h&amp;quot;&lt;br /&gt;
Le driver &amp;quot;i2c&amp;quot; donne accès aux périphériques présents sur les Bus I²C (Inter-Integrated Circuit) ou SMBus (Slave-Master Bus), dont le fonctionnement est très proche.&lt;br /&gt;
&lt;br /&gt;
Lorsque le micro-contrôleur inclue plusieurs liaisons I²C le fichier d&amp;#039;entête fournit plusieurs définitions permettant d&amp;#039;indiquer le Bus I²C à utiliser lors des appels aux différentes fonctions :&lt;br /&gt;
* I2C0&lt;br /&gt;
* I2C1&lt;br /&gt;
* I2C2&lt;br /&gt;
* I2C3&lt;br /&gt;
* ....&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
 int i2c_on(uint8_t bus_num, uint32_t i2c_clk_freq, uint8_t mode);&lt;br /&gt;
 int i2c_off(uint8_t bus_num);&lt;br /&gt;
&lt;br /&gt;
La fonction i2c_on() permet de configurer un des Bus I²C dans le mode de fonctionnement passé en paramètre&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;#039;i2c_clk_freq&amp;#039; sert à spécifier la vitesse du Bus I2C. Le fichier d&amp;#039;entête fournit plusieurs définitions permettant d&amp;#039;indiquer la fréquence de l&amp;#039;horloge (SCL) pour le Bus sélectionné par la paramètre &amp;#039;bus_num&amp;#039; :&lt;br /&gt;
 #define I2C_CLK_100KHz  (100*1000)&lt;br /&gt;
 #define I2C_CLK_400KHz  (400*1000)&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;#039;mode&amp;#039; sert à définir le mode de fonctionnement du Bus I²C sélectionné. Le fichier d&amp;#039;entête fournit une énumération &amp;#039;i2c_type&amp;#039; avec les valeurs suivantes pour définir le mode de fonctionnement :&lt;br /&gt;
* &amp;#039;I2C_MASTER&amp;#039; : Le micro-contrôleur est maître sur ce Bus.&lt;br /&gt;
* &amp;#039;I2C_SLAVE&amp;#039; : Le micro-contrôleur est esclave sur ce Bus.&lt;br /&gt;
* &amp;#039;I2C_MONITOR&amp;#039; : Le micro-contrôleur fonctionne en espion, il ne participe pas aux échanges, mais permet de vérifier le fonctionnement du Bus en donnant accès à toutes les adresses et données, mais aussi aux acquittements et autres états du Bus I²C.&lt;br /&gt;
&lt;br /&gt;
== Utilisation : Principe général ==&lt;br /&gt;
Pour permettre à l&amp;#039;utilisateur du driver i2c d&amp;#039;accéder à tous les modes de fonctionnement possible du Bus I²C et ainsi de de s&amp;#039;interfacer avec tous les périphériques, les fonctions de lecture et d&amp;#039;écriture utilisent un buffer de &amp;quot;contrôle&amp;quot; et un ou deux buffers de données.&lt;br /&gt;
&lt;br /&gt;
=== Buffer de commandes ===&lt;br /&gt;
Les fonctions i2c_read() et i2c_write() utilisent un buffer de commandes qui contient les données spécifiques à la communication comme l&amp;#039;adresse de l&amp;#039;esclave et l&amp;#039;éventuel offset de lecture ou d&amp;#039;écriture.&amp;lt;br /&amp;gt;&lt;br /&gt;
Pour la fonction i2c_read(), il s&amp;#039;agit du paramètre &amp;#039;cmd_buf&amp;#039; dont la taille est &amp;#039;cmd_size&amp;#039;.&amp;lt;br /&amp;gt;&lt;br /&gt;
Pour la fonction i2c_write() ce buffer est inclus au début du buffer de données &amp;#039;buf&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Le premier octet de ce buffer doit toujours être l&amp;#039;adresse de l&amp;#039;esclave, avec le bit R/W positionné selon le besoin.&lt;br /&gt;
Les octets suivants dépendent du protocole de communication de l&amp;#039;esclave et du contenu du buffer de contrôle. Il s&amp;#039;agit le plus souvent d&amp;#039;un offset déterminant l&amp;#039;adresse de lecture ou d&amp;#039;écriture pour les données à suivre.&amp;lt;br /&amp;gt;&lt;br /&gt;
Après chaque action &amp;#039;I2C_DO_REPEATED_START&amp;#039; ou &amp;#039;I2C_DO_STOP_START&amp;#039; du buffer de contrôle, le buffer de commande doit contenir l&amp;#039;adresse de l&amp;#039;esclave avec le bit R/W positionné selon le besoin. L&amp;#039;utilité principale de ce mécanisme est de permettre l&amp;#039;exécution du cycle de contrôle (envoi des données de contrôle à l&amp;#039;esclave, bit R/W de l&amp;#039;adresse positionné à 0 (écriture)) puis d&amp;#039;enchaîner immédiatement avec le cycle de lecture (envoi de l&amp;#039;adresse avec le bit R/W positionné à 1 (lecture) et réception des données transmises par l&amp;#039;esclave).&lt;br /&gt;
&lt;br /&gt;
=== Buffer de contrôle ===&lt;br /&gt;
L&amp;#039;utilisation d&amp;#039;un buffer de contrôle permet l&amp;#039;implémentation des différentes séquences nécessaires à la communication avec les périphériques divers pouvant être interfacés à travers le Bus I²C.&lt;br /&gt;
&lt;br /&gt;
Ce buffer de contrôle contient les actions à effectuer après chaque donnée envoyée, et a donc la même taille que le buffer de commandes pour i2c_read() ou que le buffer de sortie pour i2c_write().&amp;lt;br /&amp;gt;&lt;br /&gt;
Ces actions contrôlent la machine d&amp;#039;état qui gère la communication sur le Bus I²C.&amp;lt;br /&amp;gt;&lt;br /&gt;
Les actions possibles sont au nombre de 4 :&lt;br /&gt;
* I2C_CONT : Aucune action particulière, la machine d&amp;#039;état passe à l&amp;#039;envoi de la donnée suivante.&lt;br /&gt;
* I2C_DO_REPEATED_START : Envoie un &amp;quot;Reapeated start&amp;quot; sur le Bus I²C. Utilisé principalement pour la transition entre le cycle de contrôle (adresse et données de contrôle, envoyées à l&amp;#039;esclave) et le cycle de lecture (adresse et données lues, en provenance de l&amp;#039;esclave) pour i2c_read().&lt;br /&gt;
* I2C_DO_STOP_START : Envoie un &amp;quot;Stop&amp;quot; sur le Bus I²C, mais continue la communication (un &amp;quot;Start&amp;quot; sera donc envoyé ensuite). Cette action n&amp;#039;est pas autorisée pour la fonction d&amp;#039;écriture i2c_write().&lt;br /&gt;
* I2C_STOP: Indique la fin de la transmission à l&amp;#039;esclave par l&amp;#039;envoie d&amp;#039;un &amp;quot;Stop&amp;quot; sur le Bus I²C.&lt;br /&gt;
&lt;br /&gt;
Lorsque le buffer de contrôle n&amp;#039;est pas utilisé (NULL), la machine d&amp;#039;état considère que l&amp;#039;action est toujours &amp;#039;I2C_CONT&amp;#039;, jusqu&amp;#039;à ce qu&amp;#039;il n&amp;#039;y ait plus de données à envoyer, auquel cas elle envoie un &amp;quot;Stop&amp;quot; et termine la communication sur le Bus I²C.&lt;br /&gt;
&lt;br /&gt;
=== Buffer de données ===&lt;br /&gt;
Ce buffer correspond au paramètre &amp;#039;inbuff&amp;#039; pour la fonction i2c_read() et &amp;quot;au reste&amp;quot; du buffer de données &amp;#039;buf&amp;#039; pour la fonction i2c_write().&amp;lt;br /&amp;gt;&lt;br /&gt;
Ce buffer contient les données à écrire pour la fonction i2c_write() et sert à stocker les données lues pour la fonction i2c_read().&lt;br /&gt;
&lt;br /&gt;
=== Adresses I²C ===&lt;br /&gt;
Les adresses des esclaves sont spécifiées à l&amp;#039;aide du buffer de commandes, sur 8 bits, avec le bit R/W positionné selon le besoin.&amp;lt;br /&amp;gt;&lt;br /&gt;
Le fichier d&amp;#039;entête fournit les définitions suivantes pour le bit R/W :&lt;br /&gt;
 #define I2C_READ_BIT 0x01&lt;br /&gt;
 #define I2C_WRITE_BIT 0x00&lt;br /&gt;
&lt;br /&gt;
=== Valeurs de retour ===&lt;br /&gt;
Les fonctions i2c_read() et i2c_write() renvoie le nombre d&amp;#039;octets lus ou écrits si tout se passe normalement.&amp;lt;br /&amp;gt;&lt;br /&gt;
En cas d&amp;#039;erreur, ces fonctions renvoie un entier négatif avec les significations suivantes :&lt;br /&gt;
* -EBADFD : Bus I²C non initialisé (-77)&lt;br /&gt;
* -EBUSY : Bus I²C  occupé ou problème d&amp;#039;arbitration du Bus I²C (-16)&lt;br /&gt;
* -EAGAIN : Bus I²C occupé (-11)&lt;br /&gt;
* -EINVAL : Argument invalide (pas de buffer de contrôle ou de buffer de données (-22)&lt;br /&gt;
* -EREMOTEIO : Pas d&amp;#039;acknowledge reçu depuis l&amp;#039;esclave (-121)&lt;br /&gt;
* -EIO : Bad one: Problème avec la machine d&amp;#039;état (-5)&lt;br /&gt;
&lt;br /&gt;
== Utilisation : Lecture ==&lt;br /&gt;
 int i2c_read(uint8_t bus_num, const void *cmd_buf, size_t cmd_size, const void* ctrl_buf, void* inbuff, size_t count)&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;#039;bus_num&amp;#039; permet de sélectionner le Bus I²C à utiliser (I2C0, I2C1, ....). Certains micro-contrôleurs ont un seul Bus I²C et ignorent ce paramètre.&amp;lt;br /&amp;gt;&lt;br /&gt;
Le paramètre &amp;#039;cmd_buf&amp;#039; correspond au buffer de commande, dont la taille est spécifiée dans le paramètre &amp;#039;cmd_size&amp;#039;.&lt;br /&gt;
Ce buffer contient le plus souvent l&amp;#039;adresse du périphérique sans le bit de lecture, suivie d&amp;#039;un octet de commande, puis à nouveau l&amp;#039;adresse du périphérique avec le bit de lecture positionné.&amp;lt;br /&amp;gt;&lt;br /&gt;
Le paramètre &amp;#039;ctrl_buf&amp;#039; correspond au buffer de contrôle de la communication, qui doit avoir la même taille que le buffer de commande &amp;#039;cmd_buf&amp;#039; si il est utilisé, et permet d&amp;#039;indiquer à quel moment le driver I²C doit effectuer le &amp;quot;Repeated Start&amp;quot; pour signifier au périphérique que le sens de communication va changer.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Attention&amp;#039;&amp;#039;&amp;#039; : Le fonctionnement décrit ci-dessus n&amp;#039;est pas applicable à tous les périphériques. Référez vous à la documentation du périphérique auquel vous voulez accéder pour déterminer le contenu de ces buffers en fonction du protocole de communication utilisé par le périphérique en question.&amp;lt;br /&amp;gt;&lt;br /&gt;
Le paramètre &amp;#039;inbuff&amp;#039; correspond au buffer dans lequel seront placées les données reçues depuis le périphérique. Sa taille est &amp;#039;count&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
 #define I2C_DEV_ADDR 0x94  /* Adresse du périphérique */&lt;br /&gt;
 #define DEV_ID_REG 0x06    /* Adresse du registre &amp;quot;device ID&amp;quot; dans la mémoire du périphérique */&lt;br /&gt;
 #define CMD_BUF_SIZE  3&lt;br /&gt;
 char cmd_buf[CMD_BUF_SIZE] = { I2C_DEV_ADDR, DEV_ID_REG, (I2C_DEV_ADDR | I2C_READ_BIT), };&lt;br /&gt;
 char ctrl_buf[CMD_BUF_SIZE] = { I2C_CONT, I2C_DO_REPEATED_START, I2C_CONT, };&lt;br /&gt;
 uint16_t dev_id = 0;&lt;br /&gt;
 int ret = 0;&lt;br /&gt;
 &lt;br /&gt;
 ret = i2c_read(I2C0, &amp;amp;cmd_buf, CMD_BUF_SIZE, ctrl_buf, &amp;amp;dev_id, 2);&lt;br /&gt;
 if (ret != 2) {&lt;br /&gt;
     uprintf(UART0, &amp;quot;Device ID read error for device %d: %d\n&amp;quot;, I2C_DEV_ADDR, ret);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Utilisation : Écriture ==&lt;br /&gt;
 int i2c_write(uint8_t bus_num, const void *buf, size_t count, const void* ctrl_buf)&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;#039;bus_num&amp;#039; permet de sélectionner le Bus I²C à utiliser (I2C0, I2C1, ....). Certains micro-contrôleurs ont un seul Bus I²C et ignorent ce paramètre.&amp;lt;br /&amp;gt;&lt;br /&gt;
Le paramètre &amp;#039;buf&amp;#039; correspond à la fois au buffer de commande et au buffer de données. Sa taille est spécifiée dans le paramètre &amp;#039;count&amp;#039;.&lt;br /&gt;
Ce buffer contient le plus souvent l&amp;#039;adresse du périphérique sans le bit de lecture, suivie d&amp;#039;un octet définissant l&amp;#039;ofset en mémoire interne du périphérique, puis l&amp;#039;ensemble des données à écrire.&amp;lt;br /&amp;gt;&lt;br /&gt;
Le paramètre &amp;#039;ctrl_buf&amp;#039; correspond au buffer de contrôle de la communication. Ce buffer est le plus souvent inutilisé (Voir explications plus haut). S&amp;#039;il est utilisé, sa taille doit être la même que celle du buffer &amp;#039;buf&amp;#039;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Attention&amp;#039;&amp;#039;&amp;#039; : Le fonctionnement décrit ci-dessus n&amp;#039;est pas applicable à tous les périphériques. Référez vous à la documentation du périphérique auquel vous voulez accéder pour déterminer le contenu de ces buffers en fonction du protocole de communication utilisé par le périphérique en question.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
 #define I2C_DEV_ADDR 0x94  /* Adresse du périphérique */&lt;br /&gt;
 #define DEV_EN_REG 0x06    /* Adresse du registre &amp;quot;device enable&amp;quot; dans la mémoire du périphérique */&lt;br /&gt;
 #define BUF_SIZE  3&lt;br /&gt;
 #define DEV_EN      (0x01 &amp;lt;&amp;lt; 0)&lt;br /&gt;
 #define DEV_IT_OFF  (0x01 &amp;lt;&amp;lt; 2)&lt;br /&gt;
 char buf[BUF_SIZE] = { I2C_DEV_ADDR, DEV_EN_REG, (DEV_EN | DEV_IT_OFF), };&lt;br /&gt;
 int ret = 0;&lt;br /&gt;
 &lt;br /&gt;
 ret = i2c_write(I2C0, &amp;amp;buf, BUF_SIZE, NULL);&lt;br /&gt;
 if (ret != 2) {&lt;br /&gt;
     uprintf(UART0, &amp;quot;Device enable error for device %d: %d\n&amp;quot;, I2C_DEV_ADDR, ret);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Utilisation : Libération du Bus ==&lt;br /&gt;
 void i2c_release_bus(uint8_t bus_num);&lt;br /&gt;
&lt;br /&gt;
Certains périphériques ne relâchent pas le Bus I²C en fin de transmission si ils ne reçoivent pas une condition &amp;quot;START&amp;quot; immédiatement suivie d&amp;#039;une condition &amp;quot;STOP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Cette fonction permet d&amp;#039;envoyer ces deux conditions successives sur le Bus &amp;#039;bus_num&amp;#039; pour forcer ces périphériques à libérer le bus I²C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Spécificités liées aux différents micro-contrôleurs ==&lt;br /&gt;
=== LPC82x ===&lt;br /&gt;
* Nombre de liaisons I²C : 4&lt;br /&gt;
* Modes de fonctionnement : I2C_MASTER, I2C_SLAVE, I2C_MONITOR&lt;br /&gt;
* &amp;quot;True open Drain&amp;quot; : Bus 0 seulement&lt;br /&gt;
&lt;br /&gt;
=== LPC11A04 ===&lt;br /&gt;
&lt;br /&gt;
* Nombre de liaisons I²C : &lt;br /&gt;
* Modes de fonctionnement : &lt;br /&gt;
* &amp;quot;True open Drain&amp;quot; : &lt;br /&gt;
&lt;br /&gt;
=== LPC122x ===&lt;br /&gt;
&lt;br /&gt;
* Nombre de liaisons I²C : 1&lt;br /&gt;
* Modes de fonctionnement : I2C_MASTER, I2C_SLAVE, I2C_MONITOR&lt;br /&gt;
* &amp;quot;True open Drain&amp;quot; : Bus 0 seulement&lt;br /&gt;
&lt;br /&gt;
=== LPC176x ===&lt;br /&gt;
&lt;br /&gt;
* Nombre de liaisons I²C : &lt;br /&gt;
* Modes de fonctionnement : &lt;br /&gt;
* &amp;quot;True open Drain&amp;quot; :&lt;/div&gt;</summary>
		<author><name>Nathael</name></author>
	</entry>
</feed>