Vous êtes sur la page 1sur 7

Roxane Kouamé

He Yiming
IESE4 Gr1

Compte-rendu de Travaux Pratiques


Bus et Interface

Les Bus Inter-IC : Le bus SPI


Interfaçage du MCP4922 avec le STM32

Le but de ce TP est d’interfacer le Convertisseur Numérique/Analogique (CNA) 12 bits série


MCP4922 (Microchip) avec le microcontrôleur STM32 via le bus SPI.

Pour ce Tp, nous disposons du matériel suivant:


- Platine à trous
- Platine Nucleo STM32F446
- MCP4922
- Oscilloscope
- Multimètre

Ainsi que de la documentation suivante:


- Manuel de référence STM32F446
- Datasheet STM32F446
- Datasheet Nucleo-F446
- Datasheet DAC MCP4922
- Cours Informatique Industrielle (Les bus Inter-IC)

1 Interfaçage : partie matérielle

En s’appuyant sur leurs documentations respectives, on réalise une liaison SPI entre la
STM32 et le DAC.

Figure 1 - Table des connecteurs Arduino


À partir de la table précédente, on relève les signaux de la STM32 à connecter:
● Le SPI1_SCK sur la patte PA5 correspondant à notre signal d’horloge
● Le SPI1_MOSI sur la patte PA7 car on transmet les données entre maître(STM32) et
esclave(DAC)
● Et le SPI1_CS qui est le chip select sur la patte PB6

Figure 2 - Table des fonctions des pattes du DAC

Quant au DAC, la table précédente nous indique les signaux suivants:


● L’alimentation VDD à relier à celle de la carte STM32 et le VSS au ground (GND)
● Le chip select CS/ à relier au PB6 de la carte
● L’horloge SCK à relier à la patte PA5 de la carte
● Le pin SDI à relier à la patte PA7 de la carte
● Le pin LDAC/ qu’on relie à la masse
● On utilise le DAC A donc le pin VREF A recevra la tension de référence et la sortie
VOUTA sera visualisée sur un oscilloscope

Pour le bon fonctionnement du DAC, la tension de référence doit être inférieure à la tension
d’alimentation VDD c’est à dire 3,3V.
2 Interfaçage : partie logicielle

En s'aidant des chronogrammes fournis par Microchip dans les spécifications, nous allons
choisir le mode de fonctionnement, le mode de transfert et configurer les registres
nécessaires au fonctionnement de la liaison SPI.

● La carte STM32 contrôle le DAC donc elle est en mode Master, c’est pour cela qu’on
utilise uniquement le pin MOSI.
Quant au mode de fonctionnement, d'après le chronogramme de la documentation
du MCP4922 suivant, le composant peut fonctionner en mode (0,0) ou (1,1), on
choisit donc le mode (0,0).

● On configure le registre SPI_CR1 pour établir la liaison

Figure 3 - Registre SPI_CR1

Bit 15 : (0) Choix du type de liaison, on choisit un type unidirectionnel car on ne recoit rien
du DAC.
Bit 14 : (0) On se met en mode transmission.
Bit 13 : (0) On n’utilise pas ce bit
Bit 12 : (0) On n’utilise pas ce bit
Bit 11 : (1) Format 16 bits de transmission de données
Bit 10 : (0) Mode réception uniquement
Bit 9 : (1) On active le Software slave management
Bit 8 : (1) On n’utilise pas ce bit
Bit 7 : (0) On transmet les bits de poids fort en premier
Bit 6 : (1) Activation de la liaison série.
Bit 5-3 : (010) Le DAC fonctionne pour une horloge jusqu’à 20MHz or l’horloge est de
100MHz donc on choisit une division fpclk/8 pour avoir 12,5MHz.
Bit 2 : (1) La STM32 est le maître et le DAC l’esclave.
Bit 1-0 : (00) On choisit le mode (0,0) comme dit plus haut.

● On configure aussi les ports d’entrées sorties :


Nous configurons sur GPIOA_MODER les pins PA_5 et PA_7 en fonction alternative pour
utiliser les fonctionnalités de la liaison SPI. Nous configurons sur GPIOB_MODER le pin
PB_6 en sortie puis le pin 6 du registre GPIOB_ODR qu’on initialise à 1.
De plus, puisque le registre GPIOA_AFR permet de sélectionner le type de fonction
alternative d’un pin, on configure les pins 5 et 7 sur AF5(0101) afin d’utiliser l’horloge et le
mode MOSI du SPI.

● Ensuite on configure le DAC, à partir de la documentation, on détermine le registre


suivant à configurer:

Bit 15 :(0) On utilise le DAC A


Bit 14 :(0) On n’utilise pas le buffer
Bit 13 :(1) On choisit un gain de 1.
Bit 12 :(1) Pour visualiser la sortie, il faut mettre le SHDN/ à l’état haut
Bit 11-0 : Ces bits représentent les données à transmettre

À partir des registres à configurer cités plus haut, on écrit les programmes des fonctions
suivantes:
● On établit la liaison SPI avec la fonction Spi1_Init

void Spi1_Init(void)
{
SPI1->CR1 &= 0x0040; //SPE = 0, désactivation de la liaison série
SPI1->CR1 = 0b0000101100010100; //0x0b14
SPI1->CR1 |= 0x0040; //SPE=1, activation de la liaison série
}

● On configure les ports entrées et sorties avec la fonction InitPeripheral()

void InitPeripheral(void)
{
GPIOA->MODER |= (0xA800); //pins PA5 et PA7 en mode alternative
GPIOB->MODER = (GPIOB->MODER & ~(0x3000)) | (0x1000); //on
réinitialise PB6 et on met en sortie
GPIOB->ODR = 0x40; //Activation du pin PB6
GPIOA->AFR[0]= 0x55500000; //Fonction alternative AF5
}
● On envoit les données vers le bus avec la fonction Spi1Write(unsigned int
data)
void Spi1Write(unsigned int data)
{
int x;
while(!(SPI1->SR & SPI_I2S_FLAG_TXE)); //flag TXE
SPI1->DR=data; //ecriture
while(!(SPI1->SR & SPI_I2S_FLAG_RXNE)); //flag RXNE
x= SPI1->DR;
}

Pour être sûr que l'écriture des données a bien été faite, on attend les flags TXE avant
d'écrire et RXNE après écriture.

● Après toutes les configurations, on peut maintenant envoyer des données grâce à la
fonction WriteToDAC(unsigned int value)

À chaque front descendant du chip select, on envoie les bits écrits vers le DAC.
Aussi, on ajoute toujours à la valeur les bits de configuration déterminés plus haut.
void WriteToDAC(unsigned int value)
{
GPIOB->ODR = 0x00; //Etat bas du chip select
value = 0x3000+ value; //Bits de configuration
Spi1Write(value); //Envoi de la valeur
GPIOB->ODR = 0x40; //Etat haut du chip select
}
Ainsi, on observe sur l’oscilloscope le chip select(violet) qui au front descendant, laisse
apparaitre les 16 coups d’horloge(jaune). On observe aussi le MOSI(bleu) et la sortie
VOUTA(vert) qui a une amplitude de 1,30 V lorsqu’on envoie la valeur 0x07FF au DAC.

Figure 4 - Écran de l’oscilloscope

Nous avons remarqué que la tension de sortie était fonction de la valeur envoyée au DAC,
ce qui nous a permis de relever que la tension maximale est de 2,56 V pour une valeur de
0x0FFF envoyée au DAC.
3 Applications

La tension de sortie étant fonction de la valeur écrite au DAC, on écrit la fonction


SignalTriangle(void) qui nous permet d’afficher des dents de scie à l'écran de
l’oscilloscope en incrémentant la valeur des bits à envoyer au DAC.

void SignalTriangle(void)
{
int i;
for(i=0;i<0xFFF;i++) //On incrémente la valeur
{
WriteToDAC(i); //envoi sur le DAC de la valeur i
}
}

Figure 5 - Signal dents de scies

Conclusion

Tout au long de ces travaux pratiques, nous avons appris à lire plusieurs documentations et
à en extraire l’essentiel afin de configurer correctement les appareils mis à notre disposition.
Nous avons établi la liaison SPI sur une STM32 Nucleo F446RE pour communiquer avec un
DAC MCP4922 et nous avons pu générer un signal de forme souhaitée.

Vous aimerez peut-être aussi