Systèmes communicants : TP sur le
protocole SPI
Mise en oeuvre du bus SPI à par r d'un microcontrôleur PIC P18F2620 et d’un conver sseur numérique- analogique DAC 12bits MCP4821 (à interface SPI)
Une liaison SPI (pour Serial Peripheral
Interface) est un bus de données série synchrone, qui opère en mode Full-duplex. Les circuits communiquent selon un schéma maître-esclaves, où le maître s'occupe totalement de la
communication. Plusieurs esclaves peuvent coexister sur un même bus, dans ce cas, la sélection du destinataire se fait par une ligne dédiée entre le maître et l'esclave appelée chip select.
Théorie
Etude du bus SPI
1) Nommer les fils nécessaires pour réaliser un bus au protocole SPI -
- - -
2) Quel type de liaison est réalisé par la liaison SPI ?
( liaison série ou parallèle , synchrone ou asynchrone , half duplex ou full duplex )
3) A partir du schéma structurel ci-dessous , repérer et nommer les fils du bus SPI :
SPI Master
SCLK MOSI MISO SS1 SS2 SS3
SPI Slave SCLK
MOSI MISO SS
SPI Slave SCLK
MOSI MISO SS
SPI Slave SCLK
MOSI MISO SS
Etude du circuit MCP4821
A partir de la documentation technique sur ce circuit , répondez aux questions suivantes : 4) Donner la résolution de chaque DAC .
5) Quelle est la tension de référence de ce DAC ?
6) Combien de convertisseurs DAC intègre ce circuit ? (voir le « block diagram »)
D'après le schéma structurel , quel est le DAC utilisé ?
7) On suppose que le « gain » (amplification en tension) sélectionné pour ce DAC est de 2.
Calculer la tension analogique obtenue en sortie de ce circuit si la donnée numérique en entrée est 6AD (donnée en hexadécimale).
8) A partir de la question 6) , donner la valeur binaire nécessaire pour programmer (écrire) le registre de commande du circuit MCP4821 à la configuration demandée.
b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0
9) Analyse du programme
- Surligner l'instruction permettant de valider le convertisseur DAC MCP4821 (entrée Chip select) . - Repérer sur le programme la boucle sans fin . Que permet elle de réaliser en sortie du DAC ? - A partir du document sur le pic18F2620 en mode spi (page 18) , commenter l'action de chaque bit du registre de contrôle SSPCON1 , pour paramétrer le protocole SPI.
SSPCON1 WCOL SSPOV(1) SSPEN(2) CKP SSPM3(3) SSPM2(3) SSPM1(3) SSPM0
0 0 1 0 0 0 0 0
- Quel est le nom du registre du PIC 18F2520 qui permet d'émettre ou de recevoir les données ?
#include <p18f2620.h> // « header » incluant tous les registres internes du µC PIC18F2620
#define CS PORTCbits.RC2 // définit la broche CS sur la ligne RC2 du port C du pic
#define TRIS_CS TRISCbits.TRISC2 // TRIS_CS permet de définir la ligne RC2 en entrée ou en sortie void initSPI_emission(void) // initialise l'interface SPI sur PIC18
{
DDRCbits.RC3=0; //SCK en sortie
DDRCbits.RC5=0; //SDO en sortie
SSPSTAT=0b01000000; //echantillonne au milieu de la donnée, sur front montant SSPCON1=0b00100000; // active SPI MASTER, IDLE=0, clock=FOSC/4 PIR1bits.SSPIF=0; // efface drapeau d'emission SSPIF
TRIS_CS=0 ; // signal CS en sortie
CS=1; // CS= 1 (chip select invalidé)
}
void emet_SPI(unsigned int n) // envoie synchro, pouls et spo2 {
unsigned char forts,faibles;
forts=n>>8; // recupere poids forts faibles=n|0x0F; // recupere poids faibles
CS=0; // debut transmission
forts|=0b00010000; // Sortie MCP4821 activee G=2 SSPBUF=forts;
while(!PIR1bits.SSPIF); // attend la fin de l'émission PIR1bits.SSPIF=0;
SSPBUF=faibles; // émission
while(!PIR1bits.SSPIF); // attend la fin de l'émission PIR1bits.SSPIF=0;
CS=1; // fin transmission, d=buffer en sortie du MCP4821 }
void main(void) {
unsigned int a;
init_horloge_interne();
initSPI_emission(); // appel le sous programme (fonction en langage C) initSPI_emission(void) while(1) // demo, generateur de rampes
{
for (a=0;a<=4095;a+=10) {
emet_SPI(a); // appel le sous programme emet_SPI(unsigned int n) }
} }
TP Génération d'une rampe
1) A partir du logiciel isis (version 7.7) ouvrir le fichier de simulation* et simuler le graphe pour obtenir la courbe en sortie du DAC.
Imprimer la courbe obtenue . Mesurer la valeur min et max obtenue ainsi que la durée d'une rampe Validation professeur :
*Vérifier que le fichier SPI.hex est chargé dans le microcontrôleur
2) Lancer l'animation (touche « play ») et imprimer les valeurs obtenues sur le moniteur (SPI Debug) avec au moins 2 cycles d'écriture . (L'animation nécessite un ordinateur puissant )
Commenter chaque ligne sur votre impression .
Convertir en binaire les données hexadécimales et commenter les 4 bits de poids forts :
b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0
Calculer la tension de sortie du DAC obtenue.
b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0
Calculer la tension de sortie du DAC obtenue.
3) Modifier le programme pour avoir en sortie du DAC un « générateur de triangle » (triangle isocèle)
Pour cela utiliser le compilateur C18 avec MPLAB afin de compiler votre programme (ouvrir le projet SPI.mcp ). Imprimer votre programme en ajoutant votre nom en commentaire.
Inclure le fichier.hex obtenu dans le schéma de simulation avec Isis. (Faire un clic doit sur le Pic 18F2620 puis « Edit properties ». Insérer votre fichier.hex à la ligne « Program File ».)
Simuler ensuite votre graphe (en modifiant le temps max).
Mesurer les valeurs max et min ainsi que la période du signal.
MPLAB –- Project — open « SPI.mcp »
Sauvegarder le projet (save project as) avec un autre nom
Faire les modifications nécessaires pour générer un triangle ( isocèle) dans votre programme.
Compiler ensuite votre programme (bouton « Make » ou « build all »)
Validation professeur :
Validation professeur :
Validation professeur :
5) Reprendre le fichier d'origine (générateur de rampe (fichier SPI.hex) ) .
- Mettre des sondes de tension (Voltage probe mode) aux signaux SCK , CS/ , SDI du composant MCP 4821 .
- Dans Graph mode , sélectionner Mixed et faire une fenêtre de ce graphe pour signaux numériques et analogiques dans la zone de l'éditeur .
Dans l'onglet « Graph » , sélectionner « Add Trace ». Dans « Probe P1 » , sélectionner le signal SCK et le paramétrer en mode « Digital ».
Dans l'onglet « Graph » , sélectionner « Add Trace ». Dans « Probe P1 » , sélectionner le signal CS/ et le paramétrer en mode « Digital ».
Dans l'onglet « Graph » , sélectionner « Add Trace ». Dans « Probe P1 » , sélectionner le signal SDI et le paramétrer en mode « Digital ».
Dans l'onglet « Graph » , sélectionner « Add Trace ». Dans « Probe P1 » , sélectionner le signal VS et le paramétrer en mode « Analog».
Dans l'onglet « Graph » , sélectionner « EditTrace ». Paramétrer le début du graphe à t=4,139ms et à la fin du graphe à t=4,144ms.
Dans l'onglet « Graph » , sélectionner « Simulate Graph » ( ou appuyer sur la barre d'espace directement dans le graphe) pour lancer la simulation des signaux . Les chronogrammes vont apparaître sur le graphe.
Agrandir la fenêtre du graphe (double clic sur le bandeau vert du graphe) . Imprimer le graphe (Dans Files puis Print ) .
A quel état logique doit être la broche de validation CS/ pour valider la transmission de la donnée ? Mettre sur le graphe , les données binaires obtenues sur le signal de donnée SDI (donnée sur 16 bits s'enclenchant sur les fronts descendants du signal d'horloge SCK)
Ces 16 bits représentent 4 bits de configuration + donnée
N
sur 12 bits.Donner la signification des 4 bits de configuration (quartet de poids fort)
Convertir la donnée
N
en hexadécimal et ensuite la convertir en décimalMettre sur le graphe , la valeur analogique du signal VS .
A l'aide de la formule donnée en sortie du DAC MCP4821 : Vout = (2,048∗2∗N)
212 , calculer la tension VS en sortie de ce DAC.
Comparer cette valeur avec la valeur mesurée en simulation en VS . Calculer le pourcentage d'erreur faite sur la mesure par rapport à la valeur théorique ( % d'erreur = [(valeur mesurée – valeur théorique) / valeur théorique ]*100 )
Conclure si la mesure est précise ( mesure précise si <1 % d'erreur).
Lancer l'animation de ce circuit en sélectionnant le touche lecture.
Appuyer ensuite sur la touche Pause
Avec le moniteur SPI , recopier la ligne correspondant à la donnée obtenue en sortie de ce DAC pour le temps demandé à la simulation.
Donnée obtenue avec le moniteur SPI ( recopier la ligne )
Comparer cette donnée avec votre valeur mesurée à partir des chronogrammes.
Ici donnée mesurée entre 2,112ms et 2,115ms