Ceci est une question de référence. J'ai supprimé quelques commentaires qui rendaient cela moins évident. (La question est répondue par le demandeur).
Nick Gammon
Réponses:
10
Ce tutoriel que j'ai donné à la conférence Linux embarqué essaie de répondre aux questions, en fournissant des liens vers une description plus détaillée des sujets abordés et en utilisant l'exemple pratique de la conduite d'un drone 4WD, où un Arduino Mini Pro agit comme esclave et contrôle les 4 roues indépendantes . Le document original se trouve ici .
Remarque: Cette réponse est actuellement en cours d'élaboration, car j'adapte les faits saillants du lien.
Applications typiques du bus I2C
Interface avec des périphériques relativement lents. Ex: capteurs, actionneurs mécaniques.
Contrôle des périphériques «rapides», qui utilisent d'autres canaux pour l'échange de données. Ex: codecs.
Dans un PC, le système d'exploitation interagit généralement sur I2C avec:
compteurs de température et de tension de batterie;
contrôleurs de vitesse de ventilateur;
codecs audio.
Dans le cas où plusieurs contrôleurs de bus sont disponibles, les périphériques sont regroupés par vitesse, afin que les plus rapides ne soient pas pénalisés par les plus lents.
Une introduction rapide au bus I2C - caractéristiques clés
Bus série.
Seulement 2 lignes: Serial CLock et Serial DAta (plus la masse).
4 vitesses: 100 kHz, 400 kHz, 1 MHz, 3,2 MHz.
En règle générale, 1 appareil maître et 1 ou plusieurs esclaves.
Les communications sont toujours initiées par un appareil maître.
Plusieurs maîtres peuvent coexister sur le même bus (multi-maître).
Drain ouvert: les deux SDA et SCL ont besoin de résistances de pull-up.
«Étirement de l'horloge»
Le maître contrôle SCL, mais un esclave peut le maintenir enfoncé (car drain ouvert), s'il a besoin d'ajuster la vitesse.
Le maître doit vérifier ce scénario.
Un esclave peut se coincer et bloquer le bus: nécessité de réinitialiser les lignes du maître vers l'esclave.
L'adressage généralement sur 7 bits, mais également sur 10 bits est pris en charge.
Protocole logique: les niveaux de tension réels ne sont pas spécifiés et dépendent des implémentations individuelles. Ex: 1,8 V / 3,3 V / 5,0 V
RTOS: préemption, tâches, sémaphores, tic système dynamique, etc.
Petite empreinte: lien uniquement code / données utilisé.
Distinction entre RTOS et BSP via HAL.
GPLv3 pour une utilisation non commerciale.
Activement développé, mais déjà mature.
Prend en charge l'AVR 8 bits.
Cependant, il avait un support BSP limité pour AVR, manque de: - interruption du pilote pour les GPIO AVR (ajouté). - Prise en charge I2C pour le mode esclave AVR (personnalisé). Qui devait être développé séparément dans le cadre du logiciel Drone pour l'AVR .
Définition des paramètres de communication
Pour chaque roue:
Cycle de service du signal PWM utilisé pour le piloter - 1 octet. 0xFF = couple max / 0x00 = pas de couple.
Sens de rotation - 1 octet.
0x00 = inactif
0x01 = inverse
0x02 = avant
0x03 = verrouillé
Période moyenne entre les créneaux du codeur optique - 2 octets.
L'écriture de quelque chose réinitialise la mesure.
Index des paramètres - 1 quartet:
0 = rapport cyclique
1 = Direction
2 = période moyenne
Index des roues - 1 quartet:
0 = arrière gauche
1 = arrière droit
2 = avant droit
3 = avant gauche
4 = Tout
Sous-protocole: définition des registres
Format de registre: 0xαβ
- α = Index des paramètres - β = Index des roues
Adresse (choisie arbitrairement): 0x10
Format Bus Pirate:
- [= bit de début -] = bit de fin - r = octet de lecture - temps d'adresse 2 (décalage à gauche 1), pour le bit R / W
Exemple - au format Bus Pirate
[i2c_addr reg_addr = (parm, wheel) reg_value]
[0x20 0x20 0x02] Left Rear Forward
[0x20 0x21 0x01] Right Rear Backward
[0x20 0x22 0x01] Right Front Backward
[0x20 0x23 0x02] Left Front Forward
[0x20 0x14 0xFF] Wheels set to max torque
La voiture tourne dans le sens des aiguilles d'une montre.
Réponses:
Ce tutoriel que j'ai donné à la conférence Linux embarqué essaie de répondre aux questions, en fournissant des liens vers une description plus détaillée des sujets abordés et en utilisant l'exemple pratique de la conduite d'un drone 4WD, où un Arduino Mini Pro agit comme esclave et contrôle les 4 roues indépendantes . Le document original se trouve ici .
Remarque: Cette réponse est actuellement en cours d'élaboration, car j'adapte les faits saillants du lien.
Applications typiques du bus I2C
Contrôle des périphériques «rapides», qui utilisent d'autres canaux pour l'échange de données. Ex: codecs.
Dans un PC, le système d'exploitation interagit généralement sur I2C avec:
Dans le cas où plusieurs contrôleurs de bus sont disponibles, les périphériques sont regroupés par vitesse, afin que les plus rapides ne soient pas pénalisés par les plus lents.
Une introduction rapide au bus I2C - caractéristiques clés
URL de référence:
Exemple de configuration de bus
Caractéristiques du protocole (simplifié)
Exemple de trafic de bus
Esclaves personnalisés
Pourquoi créer un esclave I2C personnalisé?
Comment concevoir un esclave I2C personnalisé?
Conception du maître I2C
Critères de conception clés:
Débogage: diviser et conquérir
Prenez le contrôle direct du bus avec un appareil ad hoc. Exemples:
Snoop le bus avec un analyseur logique ou un oscilloscope / mètre avancé. Exemples:
Utilisez un débogueur / émulateur de circuit spécifique à l'esclave.
Exemple: AVR Dragon pour puces AVR (Arduino UNO, Nano, Mini, MiniPro)
Pirate BUS
Adaptateur USB vers I2C
sigrok et pulseview
logo sigrok (composant bakend)
exemple de pulseview (visualiseur)
Exemple d'analyseur logique bas de gamme
Exemple: piloter un drone 4x4
Prototype construit avec 2 Arduino Mini Pro.
Que fait l'esclave dans l'exemple?
L'esclave I2C:
Schéma fonctionnel de haut niveau de l'esclave I2C.
Sélection de l'esclave: Arduino Mini Pro
ICD spécifique à l'esclave: AVR Dragon
Sélection du système d'exploitation: ChibiOS
Cependant, il avait un support BSP limité pour AVR, manque de: - interruption du pilote pour les GPIO AVR (ajouté). - Prise en charge I2C pour le mode esclave AVR (personnalisé). Qui devait être développé séparément dans le cadre du logiciel Drone pour l'AVR .
Définition des paramètres de communication
Pour chaque roue:
Cycle de service du signal PWM utilisé pour le piloter - 1 octet. 0xFF = couple max / 0x00 = pas de couple.
Sens de rotation - 1 octet.
Période moyenne entre les créneaux du codeur optique - 2 octets.
Index des paramètres - 1 quartet:
Index des roues - 1 quartet:
Sous-protocole: définition des registres
Format de registre: 0xαβ - α = Index des paramètres - β = Index des roues
Adresse (choisie arbitrairement): 0x10
Format Bus Pirate: - [= bit de début -] = bit de fin - r = octet de lecture - temps d'adresse 2 (décalage à gauche 1), pour le bit R / W
Exemple - au format Bus Pirate
[i2c_addr reg_addr = (parm, wheel) reg_value]
La voiture tourne dans le sens des aiguilles d'une montre.
la source