Chapitre 3 : Le Bus SPI
SERIAL PERIPHERAL
INTERFACE
Platforme : STM32F4, API: HAL
SPI : Serial Peripheral Interface
Specifié par Motorola fin des années 80s et normalisé en ISO
11898
Nature des données : paquets d’octets
Couche : physique
Topologie : “bus” (+ 1 fil SS par esclave)
Synchrone (fil clock)
Duplex : full-duplex (2 fils de données)
Symétrie : un client, plusieurs serveur
Modalité : série
Spécificités :
beaucoup plus rapide que I2C(1-100MHz)
pas de spécification sur la structure des messages (pas de frames, pas
d’en-têtes)
1
Examples
Afficheur
Capteur intelligent
Memoires
MMC/SD cards
Extension IO
2
3
Topologie
MOSI : Master Output Slave Input, généré
par le maître,
MISO : Master Input Slave Output, généré
par l’esclave
SCK : SPI Serial Clock: Ligne d’horloge
SS : Slave Select, Les esclaves sont
identifiées grâce au signal de leur ligne SS
Autres nommages possibles : SDO (Serial
Data Out) et SDI (Serial Data Input).
Principe de transmission
4
5
Principe de transmission
Deux registres à décalages sont mis en œuvre. Ils forment
un buffer circulaire inter-puce.
Les communications sont initiées par le maître, qui
commence par sélectionner l’esclave. Au cours de chaque
cycle d’horloge, le maître envoie un bit à l’esclave, qui le
lit sur la ligne MOSI.
En parallèle, l’esclave envoie un bit au maître, qui le lit sur
la ligne MISO. Ces lectures et écritures simultanées entre
le maître et l’esclave forment une communication Full-
Duplex.
Topologie
6
Topologie
7
Topologie
Les esclaves sont « chaînés » Les données envoyées se suivent
8
Le bus SPI : Les paramètres de l’horloge
Trois paramètres : SPI- CPOL CPHA
La fréquence d'horloge. Mode
La polarité de l'horloge, paramètre CPOL 0 0 0
1 0 1
La phase de l'horloge, paramètre CPHA
2 1 0
CPOL et CPHA ont deux état possible : 3 1 1
4 possibilités de configuration.
Les configurations étant incompatibles entre elles :
Maître et esclave doivent avoir les mêmes paramètres.
La fréquence de lʼhorloge est fixée par le maître :
Elle doit tenir compte des configurations possibles de l'esclave.
Pas de contrainte sur la précision.
10
Le bus SPI : Les paramètres de l’horloge
4 variantes existent au niveau de la prise en compte des
données qui sont échangées.
11
Le bus SPI : Les paramètres de l’horloge
CPOL Clock POLarity
=1 le SCK est à 1 au repos
=0 le SCK est à 0 au repos
CPHA Clock Phase
=1 le SCK est valide sur front descendant
=0 le SCK est valide sur front montant
12
Exemple
Configuration : Mode 0, Envoie d’un octet
13
Périphérique SPI du STM32
14
Fonctionnalités du SPI
Transferts synchrones en full duplex sur trois lignes
Transferts synchrones simplex sur deux lignes
Format de trame de transfert 8 ou 16 bits
Fonctionnement maître ou esclave
Mode multi-maître
Gestion NSS par matériel ou logiciel pour le maître et l'esclave:
changement dynamique du rôle maître / esclave
Polarité (CPOL) et phase d'horloge (CPHA) programmables
Flag de transmission et de réception reliés aux interruptions
Indicateur d'état d'occupation du bus SPI
15
Diagramme Fonctionnel
16
Application : Un maitre/un esclave
17
Gestion du NSS (Slave Select pin)
(Reference manual P 798)
Hardware or software slave select management can be set using the SSM bit
in the SPI_CR1 register.
Software NSS management (SSM = 1)
The slave select information is driven internally by the value of the SSI bit in the
SPI_CR1 register. The external NSS pin remains free for other application uses.
Hardware NSS management (SSM = 0)
Two configurations are possible depending on the NSS output configuration
(SSOE bit in register SPI_CR1).
NSS output enabled (SSM = 0, SSOE =1)
This configuration is used only when the device operates in master mode. The NSS
signal is driven low when the master starts the communication and is kept low until
the SPI is disabled.
NSS output disabled (SSM = 0, SSOE =0)
This configuration allows multimaster capability for devices operating in master
mode. For devices set as slave, the NSS pin acts as a classical NSS input: the slave is
selected when NSS is low and deselected when NSS high.
18
Les modes NSS : Slave select NSS signal
standard management
NSS input
Peut être géré par HW ou SW
Slave mode – sélectionne
l’esclave actif
Mode Multi-Master – Eviter le
conflict entre maitres
NSS output
Master mode
Sélectionne l’esclave active
Modes spécifiques
19
Interconnection des noeuds SPI :
Structure Multi-maitre
Deux noeuds peuvent
être maître
(alternativement)
Les noeuds sont en mode
esclave par défaut
Le noeud actif prend le
controle du bus et devient
maître pour la session en
cours.
La broche NSS est configure
en entrée pour éviter tout
conflit entre les maitres
20
Interconnection des noeuds SPI :
Structure Multi-slave
Topologie Etoile
Le maître doit selectionner un
seul esclave lorsqu’il lit ses
données
La configuration et le format peut
changer d’un esclave à un autre
Topologie Circulaire (daisy
chain)
Chaque donnée circule à travers
tous les noeuds
La configuration et le format
doivent être les mêmes pour tous
les esclaves
21
Paramètres de configuration de la trame
Taille de la trame
de 4-bits à 16-bits
Ordre des bits
MSB ou LSB
Configuration de l’horloge
(mode 0-3)
Etat haut ou bas pour l’horloge au repos
Front de lecture du bit : montant ou
descendant
22
Performance
La limite de la vitesse de communication théorique est PCLK/2
La vitesse réelle dépond de :
La capacité du bus SPI (nombre de périphériques connectés et leur impedance
d’entrée, la longueur des fils)
La configuration du GPIO : mode GPIO rapide,
Tension d’alimentation,
Température ambiante
29
Comparison across STM32F series
QUADSPI
STM32L4 STM32F0 STM32F1 STM32F2 STM32F3 STM32F4 STM32F7
features
Maximum
number of 3 1-2* 1-3* 3 1-4* 3-6* 6
instances
40
Maximum speed 18 18 30 18 37,5 ??
[MHz]
Software
compatibility
N/A Yes Partial Partial Yes Partial Partial
Full or almost full
* : depends on part numbers Low-level drivers
Partial
software compatibility: No compatibility
30
APIs HAL CUBEMX
HAL_StatusTypeDef HAL_SPI_Init(SPI_HandleTypeDef *hspi)
[Link] = SPI1;
[Link] = SPI_BAUDRATEPRESCALER_256;
[Link] = SPI_DIRECTION_2LINES;
[Link] = SPI_PHASE_1EDGE;
[Link] = SPI_POLARITY_HIGH;
[Link] = SPI_CRCCALCULATION_DISABLE;
[Link] = 7;
[Link] = SPI_DATASIZE_8BIT;
[Link] = SPI_FIRSTBIT_MSB;
[Link] = SPI_NSS_SOFT;
[Link] = SPI_TIMODE_DISABLE;
[Link] = SPI_MODE_MASTER;
if(HAL_SPI_Init(&SpiHandle) != HAL_OK)
{Error_Handler(); }
32
HAL_SPI_TransmitReceive()
HAL_StatusTypeDef HAL_SPI_TransmitReceive(
SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t
*pRxData, uint16_t Size, uint32_t Timeout);
* @brief Transmit and Receive an amount of data in
blocking mode.
* @param hspi pointer to a SPI_HandleTypeDef
structure that contains the configuration information
for SPI module.
* @param pTxData pointer to transmission data buffer
* @param pRxData pointer to reception data buffer
* @param Size amount of data to be sent and received
* @param Timeout Timeout duration
* @retval HAL status
33
HAL_SPI_Transmit()
HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef
*hspi, uint8_t *pData, uint16_t Size, uint32_t
Timeout)
* @brief Transmit an amount of data in blocking
mode.
* @param hspi pointer to a SPI_HandleTypeDef
structure that contains
* the configuration information for
SPI module.
* @param pData pointer to data buffer
* @param Size amount of data to be sent
* @param Timeout Timeout duration
* @retval HAL status
34
HAL_SPI_Receive()
HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef
*hspi, uint8_t *pData, uint16_t Size, uint32_t
Timeout)
* @brief Receive an amount of data in blocking
mode.
* @param hspi pointer to a SPI_HandleTypeDef
structure that contains the configuration
information for SPI module.
* @param pData pointer to data buffer
* @param Size amount of data to be received
* @param Timeout Timeout duration
* @retval HAL status
35