SPI & Arduino

Isis peut simuler le fonctionnement de la plateforme Arduino.

Le langage Arduino propose la bibliothèque SPI dont les fonctions permettent de gérer le bus SPI en mode maître.

On se propose dans cette partie de piloter le MAX6902 avec un Arduino et d'afficher l'heure courante dans un terminal série.

Fonctions de la bibliothèque Arduino SPI.h

La bibliothèque

1
#include <SPI.h>

beginTransaction()

1
SPI.beginTransaction(mySettings)

Initialise le bus SPI avec des réglages précisés dans mySettings, à savoir :

  • la vitesse maximale de transmission ;

  • l'ordre des bits transmis ;

  • le mode SPI (mode 0 à 3).

Exemple :

1
SPISettings mySettings(1000000UL,MSBFIRST, SPI_MODE0);
2
SPI.beginTransaction(mySettings);

begin ()

1
SPI.begin()

Configure les broches SCK, MOSI et /CS en sortie.

transfer()

1
SPI.transfer(val)
2
SPI.transfer(buffer, val);

Permet d'envoyer ou de recevoir un ou plusieurs octets sur le bus SPI.

1
byte receivedByte;
2
receivedByte = SPI.transfer(0x00);

Attention

Pour transférer un ou plusieurs octets la ligne /CS n'est pas pilotée automatiquement. Il faudra donc penser à abaisser /CS avant l'envoi d'un ou plusieurs octets puis à relever /CS à la fin de l'échange :

1
// la ligne /CS est raccordée à la broche 10
2
digitalWrite(10, LOW);
3
receivedByte = SPI.transfer(0x00);
4
digitalWrite(10, HIGH);

endTransaction()

1
SPI.endTransaction()

Permet de libérer les broches SCK, MOSI et /CS de leur utilisation par le bus SPI.

Programmation du MAX6809

L'objectif est de programmer une carte Arduino Uno avec la bibliothèque SPI afin de lire l'heure et la date délivrée par la MAX6902.

Initialisation du MAX6902 à la date et heure courantes

Simulation

Enregistrer, dézipper puis ouvrir les fichiers Isis et Arduino suivants : Max6902-Arduino [zip].

Analysez le programme Arduino MAX6902_INIT puis simulez-le avec Isis.

Vérifier avec Isis que le MAX6902 est bien initialisé à l'heure et date courantes.

Remarque

Il y aura un décalage de quelques secondes car la date est obtenue au moment de la compilation du fichier.

Lecture par Arduino de la date et heure courantes

Simulation

On lira la date et l'heure courantes avec une commande burst. On utilisera la fonction SPI.tranfer(buffer, val) en lui passant en paramètre un tableau d'octets représentant la séquence :

1
byte burst_cmd[9] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; // modifier les valeurs du tableau pour qu'elles correspondent à la commande burst
2
digitalWrite(CS, LOW);
3
SPI.transfer(burst_cmd, 9);
4
digitalWrite(CS, HIGH);

Complétez le programme précédent afin de lire la date et heure courantes.

Le programme sera vérifié par simulation en vérifiant que les octets sont bien envoyés par l'esclave grâce au debugger SPI.

Fondamental

Les valeurs lues par la commande précédente se trouvent dans le tableau burst_cmd.

Pour accéder à un élément du tableau il suffit d'écrire le nom du tableau en indiquant entre crochets le numéro de l'élément. Attention le premier élément a le numéro 0.

1
byte month, minute;
2
month = burst_cmd[5]; // month contient le numéro du mois
3
minute = burst_cmd[2]; // minute contient les minutes

Envoi de la date et heure courantes dans le terminal série

Simulation

Le code utilisé par le MAX6902 est le BCD (Binary Coded Decimal). Exemple : lorsque le MAX6902 envoie la valeur 12 pour le mois de décembre, cela correspond au nombre %00010010. Si vous envoyer ce nombre vers le moniteur série il vous affichera 18 car %00010010 = 18 = $12. Il faut donc modifier Serial.print() pour qu'il envoie la valeur hexadécimale, exemple :

1
byte value = 0x18;
2
Serial.println(value); // affiche 24 car 0x18 = 24
3
Serial.println(value, HEX); // affiche 18

Complétez le programme précédent afin d'envoyer vers le moniteur série la date et heure courantes sous la forme :

Date: JJ-MM-YY

Time: HH-MM-SS

Exemple d'affichage de la date et heures courantes dans le terminal série