Académique Documents
Professionnel Documents
Culture Documents
He Yiming
IESE4 Gr1
En s’appuyant sur leurs documentations respectives, on réalise une liaison SPI entre la
STM32 et le DAC.
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).
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.
À 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
}
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.
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
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
}
}
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.