Pour un projet, j'aimerais que trois PIC (deux esclaves PIC18F4620, un maître PIC18F46K22) communiquent via le bus I2C. Plus tard, d'autres esclaves peuvent être ajoutés (comme EEPROM, SRAM, ...). J'écris le code de ces PIC en C en utilisant le compilateur C18. J'ai beaucoup regardé sur Internet, mais je n'ai pas trouvé de bibliothèques pour gérer le périphérique (M) SSP. J'ai lu la fiche technique des deux PIC sur le périphérique (M) SSP en mode I2C mais je n'ai pas trouvé comment interfacer le bus.
J'ai donc besoin de bibliothèques maîtres et esclaves.
Que recommandez-vous? Avez-vous une telle bibliothèque quelque part? Est-il intégré au compilateur et si oui, où? Existe-t-il un bon tutoriel quelque part sur le net?
Réponses:
Microchip a écrit des notes d'application à ce sujet:
Les notes d'application fonctionnent avec ASM mais elles peuvent être portées facilement en C.
Les compilateurs gratuits C18 et XC8 de Microchip ont des fonctions I2C. Vous pouvez en savoir plus à leur sujet dans la documentation des bibliothèques du compilateur , section 2.4. Voici quelques informations de démarrage rapide:
Mise en place
Vous disposez déjà du compilateur C18 ou XC8 de Microchip. Ils ont tous deux des fonctions I2C intégrées. Pour les utiliser, vous devez inclure
i2c.h
:Si vous souhaitez consulter le code source, vous pouvez le trouver ici:
installation_path
/v
x.xx
/h/i2c.h
installation_path
/v
x.xx
/src/pmc_common/i2c/
installation_path
/v
x.xx
/include/plib/i2c.h
installation_path
/v
x.xx
/sources/pic18/plib/i2c/
Dans la documentation, vous pouvez trouver dans quel fichier du
/i2c/
dossier se trouve une fonction.Ouverture de la connexion
Si vous connaissez les modules MSSP de Microchip, vous savez qu'ils doivent d'abord être initialisés. Vous pouvez ouvrir une connexion I2C sur un port MSSP à l'aide de la
OpenI2C
fonction. Voici comment cela est défini:Avec
sync_mode
, vous pouvez choisir si l'appareil est maître ou esclave et, s'il s'agit d'un esclave, s'il doit utiliser une adresse 10 bits ou 7 bits. La plupart du temps, le 7 bits est utilisé, en particulier dans les petites applications. Les options poursync_mode
sont:SLAVE_7
- Mode esclave, adresse 7 bitsSLAVE_10
- Mode esclave, adresse 10 bitsMASTER
- Mode maîtreAvec
slew
, vous pouvez sélectionner si l'appareil doit utiliser la vitesse de balayage. En savoir plus sur ce que c'est ici: Quel est le taux de balayage pour I2C?Deux modules MSSP
Il y a quelque chose de spécial avec les appareils avec deux modules MSSP, comme le PIC18F46K22 . Ils ont deux ensembles de fonctions, un pour le module 1 et un pour le module 2. Par exemple, au lieu de
OpenI2C()
, ils ontOpenI2C1()
etopenI2C2()
.D'accord, vous avez donc tout configuré et ouvert la connexion. Faisons maintenant quelques exemples:
Exemples
Exemple d'écriture maître
Si vous connaissez le protocole I2C, vous saurez qu'une séquence d'écriture maître typique ressemble à ceci:
Dans un premier temps, nous envoyons une condition START. Pensez à décrocher le téléphone. Ensuite, l'adresse avec un bit d'écriture - composer le numéro. À ce stade, l'esclave avec l'adresse envoyée sait qu'il est appelé. Il envoie un accusé de réception ("Bonjour"). Maintenant, l'appareil maître peut envoyer des données - il commence à parler. Il envoie n'importe quelle quantité d'octets. Après chaque octet, l'esclave doit ACK les données reçues ("oui, je vous entends"). Lorsque l'appareil maître a fini de parler, il raccroche avec la condition STOP.
En C, la séquence d'écriture principale ressemblerait à ceci pour le maître:
Exemple de lecture maître
La séquence de lecture principale est légèrement différente de la séquence d'écriture:
Encore une fois, le maître lance l'appel et compose le numéro. Cependant, il veut maintenant obtenir des informations. L'esclave répond d'abord à l'appel, puis commence à parler (envoi de données). Le maître reconnaît chaque octet jusqu'à ce qu'il dispose de suffisamment d'informations. Il envoie ensuite un Not-ACK et raccroche avec une condition STOP.
En C, cela ressemblerait à ceci pour la partie maître:
Code esclave
Pour l'esclave, il est préférable d'utiliser une routine de service d'interruption ou ISR. Vous pouvez configurer votre microcontrôleur pour recevoir une interruption lorsque votre adresse est appelée. De cette façon, vous n'avez pas à vérifier constamment le bus.
Tout d'abord, configurons les bases des interruptions. Vous devrez activer les interruptions et ajouter un ISR. Il est important que les PIC18 aient deux niveaux d'interruptions: haut et bas. Nous allons définir I2C comme une interruption de haute priorité, car il est très important de répondre à un appel I2C. Ce que nous allons faire est le suivant:
GOTO
instruction à l'ISR général sur le vecteur d'interruption de haute priorité. Nous ne pouvons pas mettre l'ISR général directement sur le vecteur car il est trop grand dans de nombreux cas.Voici un exemple de code:
La prochaine chose à faire est d'activer l'interruption de haute priorité lors de l'initialisation de la puce. Cela peut être fait par quelques manipulations de registre simples:
Maintenant, nous avons des interruptions de travail. Si vous implémentez cela, je le vérifierais maintenant. Écrivez une base
SSPISR()
pour commencer à faire clignoter une LED lorsqu'une interruption SSP se produit.D'accord, vous avez donc fait fonctionner vos interruptions. Écrivons maintenant du vrai code pour la
SSPISR()
fonction. Mais d'abord une théorie. Nous distinguons cinq types d'interruption I2C différents:Vous pouvez vérifier dans quel état vous êtes en vérifiant les bits dans le
SSPSTAT
registre. Ce registre est le suivant en mode I2C (les bits inutilisés ou non pertinents sont omis):Avec ces données, il est facile de voir comment voir l'état du module I2C:
Dans le logiciel, il est préférable d'utiliser l'état 5 par défaut, ce qui est supposé lorsque les exigences pour les autres états ne sont pas remplies. De cette façon, vous ne répondez pas lorsque vous ne savez pas ce qui se passe, car l'esclave ne répond pas à un NACK.
Quoi qu'il en soit, jetons un œil au code:
Vous pouvez voir comment vous pouvez vérifier le
SSPSTAT
registre (d'abord ANDed avec0x2d
pour que nous ayons seulement les bits utiles) en utilisant des masques de bit afin de voir quel type d'interruption nous avons.Il vous appartient de savoir ce que vous devez envoyer ou faire lorsque vous répondez à une interruption: cela dépend de votre candidature.
Références
Encore une fois, je voudrais mentionner les notes d'application que Microchip a écrites sur I2C:
Il y a de la documentation pour les bibliothèques du compilateur: Documentation des bibliothèques du compilateur
Lorsque vous configurez quelque chose vous-même, consultez la fiche technique de votre puce dans la section (M) SSP pour la communication I2C. J'ai utilisé le PIC18F46K22 pour la partie maître et le PIC18F4620 pour la partie esclave.
la source
Tout d'abord, je recommanderais de passer au compilateur XC8 simplement parce que c'est le dernier. Il y a des bibliothèques périphériques disponibles, mais je ne les ai jamais beaucoup utilisées. Consultez le site Web de Microchips pour plus de détails et la documentation.
D'accord, j'ai ici de très vieilles routines de base pour les communications eeprom I2C que j'ai utilisées il y a longtemps avec un PIC16F et l'ancien compilateur de milieu de gamme Microhip (c'était peut-être celui de haute technologie), mais je pense qu'elles peuvent fonctionner correctement avec le PIC18, car je pense que le périphérique est le même. Vous découvrirez très vite de toute façon si tout est différent.
Ils faisaient partie d'un fichier plus grand qui a été utilisé avec un projet d'enregistreur de température, donc j'ai rapidement déchiré toutes les autres fonctions non liées et enregistré en tant que fichiers ci-dessous, il est donc possible que j'en ai fait un peu gâchis, mais j'espère que vous sera en mesure de se faire une idée de ce qui est nécessaire (cela peut même fonctionner, on ne sait jamais ;-))
Vous devrez vous assurer que le fichier d'en-tête principal est correct et vérifier / modifier les broches pour vous assurer qu'il s'agit des broches périphériques I2C correctes et des noms de registre s'ils proviennent du compilateur Hi-Tech, qui a fait les choses un peu différemment. concernant la convention de dénomination des registres.
Fichier I2C.c:
Fichier d'en-tête I2C.h:
la source
SSP1ADD = ((_XTAL_FREQ/100000)/4)-1;
à 1KHz, etc.Les compilateurs XC8 et XC16 incluent des bibliothèques pour I2C.
Le problème que j'ai rencontré est que la documentation n'est pas très bonne! Si vous utilisez les exemples de la documentation Microchip, vous n'avez pas de chance. Même le support Microchip ne peut pas vous aider. Je m'y suis rendu moi-même.
Il y a quelque temps, j'ai travaillé avec le microcontrôleur de la série PIC24EP512GP et la bibliothèque ne fonctionnait pas pour moi, comme indiqué par Microchip.
la source