Introduction à I2C et SPI avec des microcontrôleurs PIC

Les microcontrôleurs de la famille PIC Microchip sont largement utilisés dans les systèmes embarqués, des nœuds de capteurs simples aux contrôleurs industriels complexes. Une compétence clé pour tout développeur embarqué est la capacité d'interfacer les périphériques en utilisant des protocoles de communication série. Deux des plus courantes sont I2C (circuit inter-intégré) et SPI (Interface périphérique série).

Cet article fournit un guide pratique et approfondi pour la mise en œuvre de I2C et SPI sur les microcontrôleurs PIC. Nous allons couvrir la configuration matérielle, la configuration de l'enregistrement, les séquences de code typiques et les techniques de débogage communes. D'ici la fin, vous aurez la connaissance d'ajouter en toute confiance la communication série à votre prochain projet PIC.

Aperçu de l'I2C et de l'IPS

Les deux protocoles sont des bus série synchrones, mais ils diffèrent en architecture, vitesse et application.

I2C (circuit inter-intégré)

I2C n'utilise que deux fils : SDA (Sérial Data) et SCL[ (Sérial Clock). Chaque appareil du bus a une adresse unique 7-bit ou 10-bit, et la communication est maître-esclave. Le maître génère l'horloge et lance des transactions. Plusieurs maîtres peuvent partager le bus avec arbitrage. Le mode standard fonctionne à 100 kHz, le mode rapide à 400 kHz et le mode haute vitesse jusqu'à 3,4 MHz. I2C est idéal pour les périphériques qui n'ont pas besoin de vitesse de blazing, tels que les capteurs de température, les horloges en temps réel, les EEPROM et les petits écrans.

Comme seulement deux fils sont nécessaires, I2C économise les broches d'E/S, ce qui le rend attrayant pour les petites PIC. Cependant, le protocole est plus complexe que SPI en raison de l'adressage, reconnaître les bits et l'étirement de l'horloge.

SPI (Interface périphérique sérielle)

SPI utilise quatre lignes : MOSI (Maître Out Slave In), MISO (Maître In Slave Out), SCLK[ (Clock Serial), et SS[ (Slave Select). C'est un bus duplex complet – les données sont envoyées et reçues simultanément. Le maître génère l'horloge et sélectionne l'esclave en tirant sa broche de sélection de puce (SS) à faible hauteur. SPI est nettement plus rapide que I2C, avec des vitesses en dizaines de MHz, et est le protocole de choix pour les appareils à haut débit tels que les cartes SD, les écrans graphiques, les ADC et les potentiomètres numériques.

SPI est plus simple à mettre en œuvre dans le matériel, mais nécessite plus de broches – une ligne SS dédiée par esclave. De nombreux microcontrôleurs PIC comprennent un module Master Synchronous Serial Port (MSSP) dédié qui peut être configuré pour soit I2C ou SPI.

Considérations matérielles pour I2C et SPI

Avant de plonger dans le code, vous devez obtenir le matériel correct.

Résistances à arrachement:[ Les lignes I2C sont à écoulement ouvert; elles nécessitent des résistances externes à arrachement (généralement 4,7 k-à 10 k-) pour tirer SDA et SCL vers VDD. La valeur dépend de la capacité et de la vitesse des bus.

Taux de tension: Assurez-vous que votre PIC et votre périphérique fonctionnent à la même tension logique (p. ex. 3,3 V ou 5 V). Si elles diffèrent, utilisez des décalages de niveau tels que le SparkFun BOB‐12009 ou un simple circuit MOSFET.

La longueur du bus et la charge capacitive:[ Pour les fils plus longs (plus de quelques pouces), gardez la capacité du bus en dessous du maximum spécifié dans votre fiche technique PIC (PIC16F1xxx datasheet indique souvent 400 pF pour I2C).

Découplage des condensateurs:[ Placez des condensateurs 0,1 μF près de chaque broche d'alimentation IC=s pour supprimer le bruit qui peut corrompre les données.

Configuration de I2C sur les microcontrôleurs PIC

La plupart des PIC modernes comprennent le module Master Synchronous Serial Port (MSSP) qui prend en charge à la fois I2C et SPI. Nous allons nous concentrer sur le MSSP en mode maître I2C pour un PIC 8 bits typique (p. ex. PIC16F18877).

Registres clés pour I2C

  • SSPxADD – Valeur de recharge du générateur de vitesse de baud. La fréquence de l'horloge I2C est dérivée de l'horloge du système à l'aide d'une formule : FSCL = FOSC[ / (4 * (SSPxADD + 1)). Pour 100 kHz avec un oscillateur de 16 MHz, SSPxADD = 39.
  • SSPxSTAT – Registre de l'état. Les bits indiquent une collision avec un autobus, une collision écrite et si une condition de démarrage/arrêt a été détectée.
  • SSPxCON1 – Registre de contrôle 1. Sélectionne le mode I2C (master, esclave) et active le module.
  • SSPxCON2 – Contrôle du mode Master. Commandes pour l'envoi de Start, Redémarrer, Stop et reconnaître.
  • SSPxBUF[ – tampon de données. Écrivez à envoyer, lisez à recevoir.

Séquence principale d'initialisation I2C

  1. Désactiver le module MSSP en éliminant le bit SSPEN (SSPxCON1<5>).
  2. Réglez le mode maître I2C (généralement 0x08 dans SSPxCON1 bits <3:0>).
  3. Configurez le taux de baud en chargeant SSPxADD avec la valeur appropriée.
  4. Mettre en place des broches SDA et SCL comme entrées avec des tractions faibles (ou utiliser des résistances externes).
  5. Activer le module en réglant SSPEN.
  6. Activer les interruptions pour le MSSP en option.

Exemple : Lecture à partir d'un capteur de température LM75

Le LM75 a une adresse 7 bits (généralement 0x48 pour les broches A0-A2 mises à la terre). Pour lire le registre de température (pointeur 0x00), vous devez d'abord écrire le pointeur, puis générer un démarrage et une lecture répétés.

Séquence de pointeur d'écriture:[ Début → adresse octet (0x90) → attendre ACK → pointer octet (0x00) → attendre ACK → arrêter

]Lire la séquence de température:[ Début → adresse octet (0x91) → attendre ACK → lire deux octets (MSB, LSB) → NACK sur octet dernier → arrêter

]

Chaque échange d'octets nécessite le vote du registre SSPxSTAT pour le bit BF (Buffer Full) et le drapeau d'interruption SSPxIF. Une erreur courante est d'oublier d'envoyer l'ACK/NACK après avoir reçu les données. Utilisez les bits ACKDT[ et ACKEN[ dans SSPxCON2 pour contrôler l'acceptation.

Pièges I2C communs

  • Clock stretching:[ Certains esclaves maintiennent SCL bas pour ralentir le maître. Activer le support d'étirement de l'horloge dans le MSSP (régler le CKP bit de façon appropriée).
  • Collision de bus:[ Si un autre maître essaie de conduire le bus, le MSSP définit le drapeau BCLIF. Utilisez ceci pour réessayer la transaction.
  • Bus de bus: Si un esclave ne libère pas SDA après une transmission, le bus peut accrocher. Implémenter un délai d'attente qui envoie neuf impulsions d'horloge pour récupérer.

Configuration de l'IPS sur les microcontrôleurs PIC

Le MSSP peut également fonctionner en mode maître ou esclave SPI. We=ll couvre le mode maître, qui est le plus commun.

Registres clés pour SPI

  • SPIxBRG – Générateur de vitesse de baud. Pour SPI, la fréquence de l'horloge est FOSC / (2 * (SPIxBRG + 1)).
  • SPixSTAT – Registre d'état. Contient le bit BF, la collision écrite, recevoir les drapeaux de débordement.
  • SPixCON1 – Registre de contrôle 1. Sélectionne maître/esclave, polarité de l'horloge (CKP), phase de l'horloge (CKE) et point d'échantillonnage (SMP).
  • SPixCON2 – Commande supplémentaire (p. ex. mode image, SS2 active).
  • SPIxBUF[ – tampon de données pour transmission et réception (buffered).

SPI séquence d'initialisation principale

  1. Désactiver le module SPI (speen clair).
  2. Réglez la polarité et la phase de l'horloge désirée. Mode 0 (CKP=0, CKE=1) est le plus courant : les données sont échantillonnées sur le bord montant et déplacées sur le bord tombant.
  3. Configurez la vitesse de baud dans SPIxBRG. Pour 1 MHz avec une horloge 16 MHz, SPIxBRG = 7.
  4. Sélectionnez le mode maître (smp bits = 0b0000 pour le maître SPI, horloge = FOSC/4).
  5. Réglez la direction de la broche SS. Sur de nombreux PIC, la broche SS est une entrée dédiée en mode maître. Pour la sélection des esclaves, vous devez basculer une broche GPIO séparée connectée à la puce de sélection de l'esclave.
  6. Activer le module.

Exemple : Interfaçage avec un CCP3008 8 canaux

Le MCP3008 est un ADC 10 bits qui communique via SPI en mode 0. Pour lire un canal (p. ex. canal 0), le maître envoie trois octets : un bit de démarrage, un bit de unit/différenciationnel et l'adresse du canal. L'esclave renvoie simultanément deux octets de données.

Séquence de transaction:[
1. Conduisez la commande SS basse
2. Écrire 0x01 (démarrage) au SPIxBUF – attendre que la commande BF soit effacée
3. Écrire (canal=0x80) au SPIxBUF – lire le premier octet de déchets du transfert précédent
4. Écrire 0x00 (dummy) au SPIxBUF – lire les 8 bits élevés de résultat de conversion
5. Écrire 0x00 à nouveau – lire les 2 bits bas et les zéros traînants[
6. Conduire la commande SS haute

]

Notez que chaque écriture sur SPIxBUF déclenche une réception simultanée. Vous devez lire le tampon après chaque écriture pour éviter le débordement.

Gestion de plusieurs esclaves SPI

Chaque esclave nécessite une broche unique de sélection de puces. Utilisez un GPIO par esclave. Assurez-vous qu'il y a un petit délai entre le changement de la broche SS et le démarrage de l'horloge pour répondre aux exigences de temps de configuration de l'esclave. Beaucoup de PIC vous permettent d'utiliser la broche SS matérielle pour la génération automatique de sélection d'esclaves seulement en mode esclave; en mode maître vous devez le faire manuellement.

Débogage de la communication I2C et SPI

Quand les choses ne fonctionnent pas, suivez une approche méthodique:

  • Utilisez un analyseur logique ou un oscilloscope. C'est l'outil de débogage le plus efficace. Vérifiez que l'horloge est présente, que les transitions de données se produisent et que les adresses sont correctes.
  • Vérifiez les résistances à traction. Si SDA ou SCL restent à terre, vous pouvez avoir un dispositif qui tient le bus. Débranchez tous les esclaves sauf un et essayez à nouveau.
  • Vérifier la vitesse de baud Mesurer le signal d'horloge avec une portée. Pour I2C, la fréquence d'horloge doit être dans la spécification de l'esclave.
  • Adresse d'examine et octets de commande. Une erreur courante est d'envoyer une adresse 7 bits sans déplacer gauche par un (le bits R/W va dans LSB).
  • Pour SPI, vérifiez la polarité et la phase de l'horloge. Beaucoup d'esclaves sont sensibles au mode exact. Consultez la fiche technique de l'esclave. Assurez-vous également que la ligne de sélection de puce est active basse et conduite en conséquence.

Si le débogage du matériel révèle des formes d'onde correctes, le problème peut être dans votre firmware. Utilisez des LED de débogage ou une console série pour imprimer des registres d'état. De nombreux tableaux de développement PIC comprennent un programmeur/débogueur embarqué (p. ex., MPLAB PICkit 4) qui peut vous aider à passer le code.

Logiciel Bit‐Banging comme sauvegarde

Si le périphérique matériel n'est pas disponible ou si vous devez utiliser un PIC qui manque d'un MSSP, vous pouvez implémenter I2C ou SPI dans un logiciel utilisant des broches GPIO. Pour le bit-banging I2C, vous basculez directement SDA et SCL, en respectant les délais de synchronisation. Pour SPI, vous déplacez les bits à travers un GPIO et lisez simultanément la broche d'entrée. Le bit-banging est flexible mais consomme les cycles CPU et est plus lent. C'est aussi un bon moyen d'apprendre le protocole à un niveau bas.

Sujets avancés

I2C Multi-Master et chronomètre

Lorsque plusieurs maîtres partagent le bus, vous devez gérer l'arbitrage avec soin. Le MSSP en PIC prend en charge le mode multi-maître; il surveille l'autobus et renonce au contrôle si un autre maître envoie des données. Utilisez l'interruption de collision de bus (BCLIF) pour détecter la perte d'arbitrage et de réessayer après un retard aléatoire.

Pour une I2C plus rapide (p. ex. 400 kHz), activez le contrôle du taux de slew sur les broches de sortie (si disponible) et utilisez des résistances de traction plus fortes (p. ex. 2,2 k.). Certaines PIC ont un SSPxADD dédié qui peut être réglé à des valeurs inférieures à zéro en utilisant un pré-échelleur.

SPI Daisy‐Chaining et DMA

Certains appareils SPI supportent la chaîne de données daisy, où la sortie de données (MISO) d'un appareil alimente l'entrée (MOSI) de la prochaine. Cela permet à plusieurs esclaves d'avoir une seule ligne de sélection de puces. Le MSSP peut gérer la chaîne de données daisy si les appareils le supportent.

Pour les SPI à grande vitesse, envisagez d'utiliser le contrôleur d'accès direct à la mémoire (DMA) PIC. DMA peut transférer des données vers/depuis le tampon SPI sans intervention du processeur, libérant le noyau pour d'autres tâches. Le périphérique DMA est configuré avec source, destination et comptage, puis déclenché par l'interruption SPI.

Conclusion

I2C et SPI sont des outils essentiels dans n'importe quel kit de concepteur intégré. Avec le module MSSP flexible trouvé dans la plupart des microcontrôleurs PIC, la mise en œuvre de ces protocoles est simple une fois que vous comprenez les paramètres de configuration et de synchronisation du registre.

Les fiches de données demeurent votre meilleur ami : Microchip=» official datasheets[ fournissent des cartes de registre et des diagrammes de chronométrage exacts.Les notes d'application telles que AN734 (Conseils I2C) et AN1009 (utilisation de l'IPS) sont des ressources précieuses.