AvrIO  1.4.5
Bibliothèque C modulaire pour ATMEL AVR

Description détaillée

Ce module permet d'utiliser la liaison SPI des MCU AVR. Cette liaison série synchrone est constituée de 3 signaux:

Il s'agit d'une liaison maître-esclave. Le maître contrôle la ligne d'horloge SCLK. Pour désigner l'esclave parmi N, le maître dispose de N signaux SS (Slave Select) actifs à l'état bas.

SPI_three_slaves.png
Un maître peut contrôler plusieurs esclaves
À chaque coup d'horloge le maître et l'esclave s'échangent un bit. Après huit coups d'horloges le maître a transmis un octet à l'esclave et vice versa. La vitesse de l'horloge est réglée selon des caractéristiques propres aux périphériques.

SPI_timing_diagram.png
Chronologie d'un échange SPI
Les MCU AVR peuvent être maître ou/et esclave et disposent donc des broches MOSI, MISO, SCK (SCLK) et SS.
Pour utiliser ce module, il faut ajouter AVRIO_SPI_ENABLE àà la variable AVRIO_CONFIG dans le Makefile.
La configuration du module est effectuée dans le fichier avrio-board-afsk.h Ce fichier doit se trouver dans le chemin de recherche des fichiers en-tête (répertoire du projet ou dossier board normalement).

Graphe de collaboration de Bus SPI:

Modules

 Configuration du module SPI
 

Fonctions

uint8_t ucSpiMasterRead (void)
 Lecture SPI. Plus de détails...
 
uint8_t ucSpiMasterReadReg8 (uint8_t reg)
 Lecture d'un registre 8 bits. Plus de détails...
 
uint8_t ucSpiMasterWriteRead (uint8_t ucByte)
 Transmission SPI. Plus de détails...
 
void vSpiClearIF (void)
 Remets à zéro le drapeau d'interruption SPI.
 
void vSpiClearSs (void)
 Désaffirme la broche SS (SS = 1 -> invalidé)
 
void vSpiDisable (void)
 Invalide le bus SPI.
 
void vSpiEnable (void)
 Valide le bus SPI et remets à zéro le drapeau d'interruption SPI.
 
void vSpiMasterInit (eSpiFclkDiv eFclkDiv)
 Initialise le module SPI en mode maître. Plus de détails...
 
void vSpiMasterReadRegBlock (uint8_t reg, uint8_t *buf, uint8_t len)
 Lecture d'un bloc de registres. Plus de détails...
 
void vSpiMasterWrite (uint8_t ucByte)
 Ecriture SPI. Plus de détails...
 
void vSpiMasterWriteReg8 (uint8_t reg, uint8_t data)
 Ecriture d'un registre 8 bits. Plus de détails...
 
void vSpiMasterWriteRegBlock (uint8_t reg, const uint8_t *buf, uint8_t len)
 Ecriture d'un bloc de registres. Plus de détails...
 
void vSpiMasterXfer (const uint8_t *tx_buffer, uint8_t tx_len, uint8_t *rx_buffer, uint8_t rx_len)
 Lecture/Ecriture d'un bloc octets. Plus de détails...
 
void vSpiSetBitOrder (eSpiBitOrder eOrder)
 Modification de l'ordre des bites. Plus de détails...
 
void vSpiSetMode (eSpiMode eMode)
 Modification du mode de fonctionnement. Plus de détails...
 
void vSpiSetSs (void)
 Affirme la broche SS (SS = 0 -> validé)
 
void vSpiSetSsAsInput (void)
 Configure la broche SS en entrée avec résistance de pull-up.
 
void vSpiSetSsAsOutput (void)
 Configure la broche SS en sortie à l'état haut.
 

Macros

#define SPI_CPHA   0x01
 
#define SPI_CPOL   0x02
 
#define SPI_REG_RW_BIT   7
 

Énumérations

enum  eSpiBitOrder { eSpiBitOrderMsb = 0, eSpiBitOrderLsb = 1, eSpiBitOrderNotSet = -1 }
 Ordre des bits. Plus de détails...
 
enum  eSpiFclkDiv {
  SPI_DIV2 = 0x04, SPI_DIV4 = 0x00, SPI_DIV8 = 0x05, SPI_DIV16 = 0x01,
  SPI_DIV32 = 0x06, SPI_DIV64 = 0x02, SPI_DIV128 = 0x03
}
 Facteur de division de l'horloge SPI. Plus de détails...
 
enum  eSpiMode {
  eSpiMode0 = (0|0), eSpiMode1 = (0|SPI_CPHA), eSpiMode2 = (SPI_CPOL|0), eSpiMode3 = (SPI_CPOL|SPI_CPHA),
  eSpiModeNotSet = -1
}
 Mode SPI. Plus de détails...
 

Documentation des macros

#define SPI_CPHA   0x01

phase horloge: 0 premier front (montant si CPOL=0), 1 deuxième front (descendant si CPOL=0)

Définition à la ligne 70 du fichier spi.h.

#define SPI_CPOL   0x02

polarité horloge: 0 horloge sur état haut, 1 horloge sur état bas

Définition à la ligne 71 du fichier spi.h.

#define SPI_REG_RW_BIT   7

bit lecture-écriture pour les fonctions de la famille Reg

Définition à la ligne 72 du fichier spi.h.

Documentation du type de l'énumération

Ordre des bits.

Valeurs énumérées
eSpiBitOrderMsb 

MSB en premier

eSpiBitOrderLsb 

LSB en premier

eSpiBitOrderNotSet 

Non modifié

Définition à la ligne 117 du fichier spi.h.

117  {
118  eSpiBitOrderMsb = 0,
119  eSpiBitOrderLsb = 1,
120  eSpiBitOrderNotSet = -1
121 } eSpiBitOrder;
eSpiBitOrder
Ordre des bits.
Definition: spi.h:117

Facteur de division de l'horloge SPI.

Valeurs énumérées
SPI_DIV2 

F_SPI = (F_CPU / 2)

SPI_DIV4 

F_SPI = (F_CPU / 4)

SPI_DIV8 

F_SPI = (F_CPU / 8)

SPI_DIV16 

F_SPI = (F_CPU / 16)

SPI_DIV32 

F_SPI = (F_CPU / 32)

SPI_DIV64 

F_SPI = (F_CPU / 64)

SPI_DIV128 

F_SPI = (F_CPU / 128)

Définition à la ligne 78 du fichier spi.h.

78  {
79 
80  SPI_DIV2 = 0x04,
81  SPI_DIV4 = 0x00,
82  SPI_DIV8 = 0x05,
83  SPI_DIV16 = 0x01,
84  SPI_DIV32 = 0x06,
85  SPI_DIV64 = 0x02,
86  SPI_DIV128 = 0x03
88 } eSpiFclkDiv;
eSpiFclkDiv
Facteur de division de l'horloge SPI.
Definition: spi.h:78
Definition: spi.h:82
Definition: spi.h:86
Definition: spi.h:83
Definition: spi.h:81
Definition: spi.h:84
Definition: spi.h:85
Definition: spi.h:80
enum eSpiMode

Mode SPI.

Différents modes


SPI Mode POL PHA 1er front 2ème front
0 0 0 montant, échantillonnage descendant, changement état
1 0 1 montant, changement état descendant, échantillonnage
2 1 0 descendant, échantillonnage montant, changement état
3 1 1 descendant, changement état montant, échantillonnage

cf Wikipedia

Valeurs énumérées
eSpiModeNotSet 

Non modifié

Définition à la ligne 105 du fichier spi.h.

105  {
106  eSpiMode0 = (0|0),
107  eSpiMode1 = (0|SPI_CPHA),
108  eSpiMode2 = (SPI_CPOL|0),
109  eSpiMode3 = (SPI_CPOL|SPI_CPHA),
110  eSpiModeNotSet = -1
111 } eSpiMode;
#define SPI_CPHA
Definition: spi.h:70
#define SPI_CPOL
Definition: spi.h:71
eSpiMode
Mode SPI.
Definition: spi.h:105

Documentation des fonctions

uint8_t ucSpiMasterRead ( void  )
inline

Lecture SPI.

Décale 0xFF dans le registre à décalage de l'esclave et récupère l'octet qui en sort.

Renvoie
Octet lu en sortie du registre à décalage de l'esclave
Avertissement
La broche SS de l'esclave doit être affirmée avant l'appel à cette fonction.
Exemples:
net/spi/demo_spi.c.
uint8_t ucSpiMasterReadReg8 ( uint8_t  reg)

Lecture d'un registre 8 bits.

Cette fonction réalise une transmission de l'adresse du registre à lire, suivie d'une lecture d'un octet.

Paramètres
regadresse du registre
Renvoie
la valeur de l'octet
uint8_t ucSpiMasterWriteRead ( uint8_t  ucByte)

Transmission SPI.

Décale ucByte dans le registre à décalage de l'esclave et récupère l'octet qui en sort.

Paramètres
ucByteOctet à écrire dans le registre à décalage de l'esclave (0xFF si aucun)
Renvoie
Octet lu en sortie du registre à décalage de l'esclave
Avertissement
La broche SS de l'esclave doit être affirmée avant l'appel à cette fonction.
void vSpiMasterInit ( eSpiFclkDiv  eFclkDiv)

Initialise le module SPI en mode maître.

A l'issue le bus SPI est validé et prêt à transmettre.

Paramètres
eFclkDivFacteur de division de l'horloge SPI
Avertissement
La broche /SS doit être configurée en sortie ou en entrée à l'état haut AVANT l'appel de cette fonction grâce aux fonctions vSpiSetSsAsInput() ou vSpiSetSsAsOutput().
Dans le cas contraire, le mode maître ne sera pas enclenché.
Exemples:
net/spi/demo_spi.c, sensor/hsc/spi/demo_sensor_hsc_spi.c, et sys/memory/mmc/demo_mmc.c.
void vSpiMasterReadRegBlock ( uint8_t  reg,
uint8_t *  buf,
uint8_t  len 
)

Lecture d'un bloc de registres.

Paramètres
regadresse du premier registre
bufferpointeur vers la zone de stockage des octets
lennombre d'octets à lire
void vSpiMasterWrite ( uint8_t  ucByte)
inline

Ecriture SPI.

Décale ucByte dans le registre à décalage de l'esclave.

Paramètres
ucByteOctet à écrire dans le registre à décalage de l'esclave.
Avertissement
La broche SS de l'esclave doit être affirmée avant l'appel à cette fonction.
Exemples:
net/spi/demo_spi.c.
void vSpiMasterWriteReg8 ( uint8_t  reg,
uint8_t  data 
)

Ecriture d'un registre 8 bits.

Paramètres
regadresse du registre
datavaleur de l'octet
void vSpiMasterWriteRegBlock ( uint8_t  reg,
const uint8_t *  buf,
uint8_t  len 
)

Ecriture d'un bloc de registres.

Paramètres
regadresse du premier registre
bufferpointeur vers la zone de stockage des octets
lennombre d'octets à écrire
void vSpiMasterXfer ( const uint8_t *  tx_buffer,
uint8_t  tx_len,
uint8_t *  rx_buffer,
uint8_t  rx_len 
)

Lecture/Ecriture d'un bloc octets.

Paramètres
tx_bufferpointeur vers la zone de stockage des octets
tx_lennombre d'octets à écrire
rx_bufferpointeur vers la zone de stockage des octets, la taille doit être suffisante pour y stocker le nombre d'octets demandés.
rx_lennombre d'octets à lire
void vSpiSetBitOrder ( eSpiBitOrder  eOrder)

Modification de l'ordre des bites.

Paramètres
eOrderordre choisi
void vSpiSetMode ( eSpiMode  eMode)

Modification du mode de fonctionnement.

Paramètres
eModemode choisi