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
Liaison SPI avec plusieurs esclaves – Documentation du PIC16F1509, Figure 21-4

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).

Protocole SPI – Chronogramme des signaux utilisés selon le mode – Documentation du PIC16F1509, Figure 21-6

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

Exemple

Microchip PIC16F / Utiliser une liaison SPI / PIC16F1509