Sommaire
Introduction
Le protocole de communication SPI (Serial Peripheral Interface) permet d’établir une liaison de transmission de données série synchrone entre un maître et plusieurs esclaves. La liaison se fait à l’aide de 4 fils (voir schéma suivant – vu du maître) :
- SCK : l’horloge
- MOSI / SDO : données sortant du maitre
- MISO / SDI : données revenant au maitre
- SS / CS : signal de sélection de l’esclave – cette ligne est spécifique à chaque esclave
Principe de la communication SPI
Lorsque la ligne de communication est au repos, le signal de sélection SSx est à ‘1’.
Lorsque l’on souhaite démarrer une communication, il faut alors passer le signal de sélection (SSx) d’un (ou plusieurs) esclave(s) à ‘0’ pour leur signaler le début d’une transmission. La communication est ensuite rythmée par une horloge (SCK). Les données sont souvent transmises par paquet de 8 bits (ou un octet) entre le maître et l’esclave sur la ligne SDO vu du maître, connectée à SDI sur l’esclave.
Lorsque la communication nécessite une réponse de l’esclave, il est alors nécessaire de transmettre depuis le maître une donnée “inutile” (souvent que des ‘1’, soit la valeur 0xFF sur un octet) qui ne servira qu’à générer le signal d’horloge sur SCK pour rythmer la réponse de l’esclave. Cette transmission se fait alors par la ligne SDO de l’esclave, reliée sur l’entrée SDI du maître.
Selon le périphérique utilisé, il peut exister 4 modes de communication en SPI (voir schéma ci-dessous).
La configuration du mode de fonctionnement, sur le PIC16F1509, se fait à l’aide des bits CKE du registre SSP1STAT et CKP du registre SSP1CON1.
Module MSSP du PIC16F150x
Bibliothèque de fonctions
Une bibliothèque de fonctions permettant d’utiliser la liaison SPI en mode maître est disponible ici : spi.h / spi.c (version PIC16F1509)
Cette bibliothèque contient les fonctions suivantes :
- void initSPI(char mode) : initialiser la liaison SPI dans un mode particulier passé en argument (0 à 3).
- void sendSPI(char data) : enoyer une donnée sur la liaison SPI
Ces fonctions sont détaillées dans la suite de ce tutoriel.
Connexion SPI sur le PIC16F1509
Les broches de connexion de la liaison SPI sur le microcontroleur PIC16F1509 sont les suivantes :
- SCK : broche RB6 / configurée en sortie
- SDO : broche RC7 / configurée en sortie
- SDI : broche RB4 / configurée en entrée
Les définitions de ces entrées/sorties sont données dans le fichier spi.h :
#define SSPCK PORTBbits.RB6 // out #define SSPSDO PORTCbits.RC7 // out #define SSPSDI PORTBbits.RB4 // in
Configuration du module MMSP en mode SPI
La configuration du module MSSP (Master Synchronous Serial Port) pour le mode SPI se fait à l’aide des registres : SSPSTAT et SSPCON1.
void initSPI(char mode){ // INPUT / OUTPUT TRISBbits.TRISB6 = 0; // CK TRISCbits.TRISC7 = 0; // SDO TRISBbits.TRISB4 = 1; // SDI // MODE switch(mode){ case 1: SSPSTATbits.CKE = 0; SSPCON1bits.CKP = 0; break; case 2: SSPSTATbits.CKE = 1; SSPCON1bits.CKP = 1; break; case 3: SSPSTATbits.CKE = 0; SSPCON1bits.CKP = 1; break; case 0: default: SSPSTATbits.CKE = 1; SSPCON1bits.CKP = 0; break; } // SSPxSTAT SSPSTATbits.SMP = 0; // Echantillonnage au milieu de la donnee // SSPxCON1 SSPCON1bits.SSPEN = 1; // Validation du module MSSP SSPCON1bits.SSPM = 0b0000; // FCLK = FOSC/4 // Avec FOSC = 16 MHz -> Vitesse de l'horloge = 4 MHz // SSPxCON2/3 - only for I2C return; }
Vitesse de transfert
Utilisation de la liaison SPI en maître
Exemples d’utilisation
- Afficheur LCD – EA DOG 163M
- Convertisseur numérique analogique AD7303
- RAM Statique MCP 23LCV1024