Chapitre II.
Les bus de communication
capteurs
III. Le bus SPI
MC43 Mesures et Capteurs 1
III. Bus SPI
III.1 Présentation générale
SPI : Serial Peripheral Interface
Développé dans les années 1980 par Motorola
Transmission série synchrone full duplex
Communications maître esclave
Interconnexion par 2 lignes de données, 1 ligne d’horloge et
1 ligne de sélection
donnée SPISIMO (Slave input / Master output)
donnée SPISOMI (Slave output / Master input)
horloge SPICLK (pilotée par le maître)
sélection SPISTE (Slave Transmit Enable)
MC43 Mesures et Capteurs 2
III. Bus SPI
III.1 Présentation générale
La fréquence de transfert est limitée uniquement par les
caractéristiques électriques des composants utilisés
TMS320LF2407A : 10MHz max; TMS320F28335 : 18,75MHz max
Un seul esclave est activé à la fois (pas de conflit ni
d’arbitrage)
Connexion de plusieurs esclaves par pilotage de plusieurs
signaux de sélection SPISTE (signaux SS : Slave Select)
Pas d’acquittement
Format des données libre de 1 à 16 bits
déphasage SPIDAT/SPICLK réglable (suivant les propriétés
du composant esclave)
MC43 Mesures et Capteurs 3
III. Bus SPI
III.1 Présentation générale
Connection maître-esclave
lignes de
Maître données Esclave
registre de
réception
registre de
transmission
ligne ligne
d’activation d’horloge
MC43 Mesures et Capteurs 4
III. Bus SPI
III.1 Présentation générale
Connection maître-esclave
Un maître et un esclave Un maître et plusieurs esclaves
Lignes nSS (Slave Select)
- une seule active à la fois
- réalisées à l’aide d’E/S numériques
MC43 Mesures et Capteurs 5
III. Bus SPI
III.2 Principe de transmission
• Le maître active nSS avant de transmettre et la relâche après la transmission
• La ligne d’horloge est pilotée par le maitre
• Le maître pilote la ligne de données SIMO pour réaliser une écriture (bit de
poids fort en premier)
• L’esclave pilote la ligne de données SOMI pour réaliser une lecture (bit de poids
fort en premier)
• La lecture et l’écriture peuvent se faire simultanément (lignes distinctes)
MC43 Mesures et Capteurs 6
III. Bus SPI
III.2 Principe de transmission
Modes de configuration de l’horloge
Le positionnement des bits de donnée par
rapport aux cycles d’horloge comporte 4
modes de configuration possibles
Le maître doit être
configuré selon le mode
accepté par l’esclave (à
vérifier dans sa
documentation)
MC43 Mesures et Capteurs 7
III. Bus SPI
III.2 Principe de transmission
Exemple du DAC 12 bits MCP4922 (rising edge with delay)
MC43 Mesures et Capteurs 8
III. Bus SPI
III.2 Principe de transmission
Exemple de signaux de communication
• Ecriture 16 bits
• Mode rising edge with delay
• Horloge à 5 MHz
MC43 Mesures et Capteurs 9
III. Bus SPI
III.3 Exemple du µC TMS320LF2407
Architecture du contrôleur SPI du TMS320LF2407
registre de
réception
registre
d’émission interruptions
lignes de
transmission
MC43 Mesures et Capteurs 10
III. Bus SPI
III.3 Exemple du µC TMS320LF2407
Horloge
Registres
Tailles des mots
Interruption
(3 ≤ SPIBRR ≤ 127)
Fbauds = Fcpu/4
Si SPIBRR=0,1 ou 2
Communications
MC43 Mesures et Capteurs 11
III. Bus SPI
III.3 TMS320LF2407
Interruptions
Interruption SPIINT déclenchée dans
les deux cas suivants:
- donnée reçue (disponible dans
SPIRXBUF)
- donnée transmise (SPITXBUF
envoyé)
MC43 Mesures et Capteurs 12
III. Bus SPI
III.3 Exemple du µC TMS320LF2407
Exercice: initialisation du module SPI dans le mode suivant :
• données de 16 bits
• émission uniquement
• fréquence maximale
• positionnement de la donnée sur front montant, horloge
retardée d’½ cycle
MC43 Mesures et Capteurs 13
III. Bus SPI
III.3 Exemple du µC TMS320LF2407
MC43 Mesures et Capteurs 14
III. Bus SPI
III.3 Exemple du µC TMS320LF2407
Initialisation du module SPI dans le mode suivant :
• données de 16 bits
• émission uniquement
• fréquence maximale
• positionnement de la donnée sur front montant, horloge
retardée d’½ cycle
MC43 Mesures et Capteurs 15
III. Bus SPI
III.3 Exemple du µC TMS320LF2407
// attente SCITXBUF vide
MC43 Mesures et Capteurs 16
III. Bus SPI
III.3 Exemple du µC TMS320LF2407
// Emission et réception d’une donnée de 16 bits
int rxspi(unsigned int x)
{
while(SPISTS & 0x20); // attente SCITXBUF vide (TX BUF FULL FLAG)
SPITXBUF = x;
while(SPISTS & 0x40); // attente fin de transmission (SPI INT FLAG)
return SPIRXBUF;
}
MC43 Mesures et Capteurs 17
III. Bus SPI
III.4 Exemple du TMS320F28335
Architecture du contrôleur SPI du TMS320F28335
FIFO de réception
(16 registres)
registre de
réception interruptions
FIFO d’émission
(16 registres)
registre
d’émission
lignes de
transmission
MC43 Mesures et Capteurs 18
III. Bus SPI
III.4 Exemple du TMS320F28335
Emission et réception de paquets de 8 mots de 16 bits (FIFO / interruptions)
void spi_fifo_init()
{
// Initialize SPI FIFO registers
[Link]=0; // Reset SPI
[Link]=0x001F; // 16-bit character, Loopback mode (test), CLKPOL=0
[Link]=0x0017; // Int. enabled, Master/Slave XMIT enabled, CLKPHS=0
[Link]=0; // Baud rate = LSPCLK/4 = 9,375MHz (default)
[Link]=0xC028; // RST SPI & TXFIFO, Enable FIFO's, TX FIFO level=8
[Link]=0x0028; // RST RXFIFO, RX FIFO level=8
[Link]=0x00;
[Link]=0x0010;
[Link]=1; // Enable SPI
[Link]=1;
[Link]=1;
}
MC43 Mesures et Capteurs 19
III. Bus SPI
III.4 Exemple du TMS320F28335
Emission et réception de paquets de 8 mots de 16 bits (FIFO / interruptions)
void spi_fifo_init()
{
// Initialize SPI FIFO registers
[Link]=0; // Reset SPI
[Link]=0x001F; // 16-bit character, Loopback mode (test), CLKPOL=0
[Link]=0x0017; // Int. enabled, Master/Slave XMIT enabled, CLKPHS=0
[Link]=0; // Baud rate = LSPCLK/4 = 9,375MHz (default)
[Link]=0xC028; // RST SPI & TXFIFO, Enable FIFO's, TX FIFO level=8
[Link]=0x0028; // RST RXFIFO, RX FIFO level=8
[Link]=0x00;
[Link]=0x0010;
[Link]=1; // Enable SPI
[Link]=1;
[Link]=1;
}
MC43 Mesures et Capteurs 20
III. Bus SPI
III.4 Exemple du TMS320F28335
Emission et réception de paquets de 8 mots de 16 bits (FIFO / interruptions)
void spi_fifo_init()
{
// Initialize SPI FIFO registers
[Link]=0; // Reset SPI
[Link]=0x001F; // 16-bit character, Loopback mode (test), CLKPOL=0
[Link]=0x0017; // Int. enabled, Master/Slave XMIT enabled, CLKPHS=0
[Link]=0; // Baud rate = LSPCLK/4 = 9,375MHz (default)
[Link]=0xC028; // RST SPI & TXFIFO, Enable FIFO's, TX FIFO level=8
[Link]=0x0028; // RST RXFIFO, RX FIFO level=8
[Link]=0x00;
[Link]=0x0010;
[Link]=1; // Enable SPI
[Link]=1;
[Link]=1;
}
MC43 Mesures et Capteurs 21
III. Bus SPI
III.4 Exemple du TMS320F28335
Emission et réception de paquets de 8 mots de 16 bits (FIFO / interruptions)
void spi_fifo_init()
{
// Initialize SPI FIFO registers
[Link]=0; // Reset SPI
[Link]=0x001F; // 16-bit character, Loopback mode (test), CLKPOL=0
[Link]=0x0017; // Int. enabled, Master/Slave XMIT enabled, CLKPHS=0
[Link]=0; // Baud rate = LSPCLK/4 = 9,375MHz (default)
[Link]=0xC028; // RST SPI & TXFIFO, Enable FIFO's, TX FIFO level=8
[Link]=0x0028; // RST RXFIFO, RX FIFO level=8
[Link]=0x00;
[Link]=0x0010;
Int. TX FIFO si nb valeur <= 8
[Link]=1; // Enable SPI (soit 16-8=8 places
[Link]=1; disponibles)
[Link]=1;
}
MC43 Mesures et Capteurs 22
III. Bus SPI
III.4 Exemple du TMS320F28335
Emission et réception de paquets de 8 mots de 16 bits (FIFO / interruptions)
void spi_fifo_init()
{
// Initialize SPI FIFO registers
[Link]=0; // Reset SPI
[Link]=0x001F; // 16-bit character, Loopback mode (test), CLKPOL=0
[Link]=0x0017; // Int. enabled, Master/Slave XMIT enabled, CLKPHS=0
[Link]=0; // Baud rate = LSPCLK/4 = 9,375MHz (default)
[Link]=0xC028; // RST SPI & TXFIFO, Enable FIFO's, TX FIFO level=8
[Link]=0x0028; // RST RXFIFO, RX FIFO level=8
[Link]=0x00;
[Link]=0x0010;
Int. RX FIFO si nb valeur >= 8
[Link]=1; // Enable SPI (soit 8 réceptions)
[Link]=1;
[Link]=1;
}
MC43 Mesures et Capteurs 23
III. Bus SPI
III.4 Exemple du TMS320F28335
Emission et réception de paquets de 8 mots de 16 bits (FIFO / interruptions)
void InitSpiaGpio()
{ SPI sur GPIO16,17,18,19 ou 54,55,56,57
EALLOW;
// Enable internal pull-up for the selected pins
// Pull-ups can be enabled or disabled by the user.
[Link].GPIO16 = 0; //Enable pull-up on GPIO16 (SPISIMOA)
[Link].GPIO17 = 0; //Enable pull-up on GPIO17 (SPISOMIA)
[Link].GPIO18 = 0; //Enable pull-up on GPIO18 (SPICLKA)
[Link].GPIO19 = 0; //Enable pull-up on GPIO19 (SPISTEA)
// Set qualification for selected pins to asynch only
// This will select asynch (no qualification) for the selected pins.
[Link].GPIO16 = 3; // Asynch input GPIO16 (SPISIMOA)
[Link].GPIO17 = 3; // Asynch input GPIO17 (SPISOMIA)
[Link].GPIO18 = 3; // Asynch input GPIO18 (SPICLKA)
[Link].GPIO19 = 3; // Asynch input GPIO19 (SPISTEA)
// Configure SPI-A pins using GPIO regs
// This specifies which of the possible GPIO pins will be SPI functional pins.
[Link].GPIO16 = 1; // Configure GPIO16 as SPISIMOA
[Link].GPIO17 = 1; // Configure GPIO17 as SPISOMIA
[Link].GPIO18 = 1; // Configure GPIO18 as SPICLKA
[Link].GPIO19 = 1; // Configure GPIO19 as SPISTEA
EDIS;
}
MC43 Mesures et Capteurs 24
III. Bus SPI
III.4 Exemple du TMS320F28335
Emission et réception de paquets de 8 mots de 16 bits (FIFO / interruptions)
Initialisation des vecteurs d’interruption (fonctions d’int.) et autorisation
// Interrupts that are used in this example are re-mapped to
// ISR functions found within this file.
EALLOW;// This is needed to write to EALLOW protected registers
[Link] = &spiRxFifoIsr;
[Link] = &spiTxFifoIsr;
EDIS; // This is needed to disable write to EALLOW protected registers
// Step 4. Initialize all the Device Peripherals:
// This function is found in DSP2833x_InitPeripherals.c
// InitPeripherals(); // Not required for this example
spi_fifo_init(); // Initialize the SPI only
// Enable interrupts required for this example
[Link] = 1; // Enable the PIE block
[Link].INTx1=1; // Enable PIE Group 6, INT 1
[Link].INTx2=1; // Enable PIE Group 6, INT 2
IER=0x20; // Enable CPU INT6
EINT; // Enable Global Interrupts
MC43 Mesures et Capteurs 25
III. Bus SPI
III.4 Exemple du TMS320F28335
Emission et réception de paquets de 8 mots de 16 bits (FIFO / interruptions)
Initialisation des vecteurs d’interruption (fonctions d’int.) et autorisation
MC43 Mesures et Capteurs 26
III. Bus SPI
III.4 Exemple du TMS320F28335
Emission et réception de paquets de 8 mots de 16 bits (FIFO / interruptions)
Initialisation des vecteurs d’interruption (fonctions d’int.) et autorisation
// Interrupts that are used in this example are re-mapped to
// ISR functions found within this file.
EALLOW;// This is needed to write to EALLOW protected registers
[Link] = &spiRxFifoIsr;
[Link] = &spiTxFifoIsr;
EDIS; // This is needed to disable write to EALLOW protected registers
// Step 4. Initialize all the Device Peripherals:
// This function is found in DSP2833x_InitPeripherals.c
// InitPeripherals(); // Not required for this example
spi_fifo_init(); // Initialize the SPI only
// Enable interrupts required for this example
[Link] = 1; // Enable the PIE block
[Link].INTx1=1; // Enable PIE Group 6, INT 1
[Link].INTx2=1; // Enable PIE Group 6, INT 2
IER=0x20; // Enable CPU INT6
EINT; // Enable Global Interrupts
MC43 Mesures et Capteurs 27
III. Bus SPI
III.4 Exemple du TMS320F28335
Emission et réception de paquets de 8 mots de 16 bits (FIFO / interruptions)
Fonction d’interruption d’émission (8 places libres en TXFIFO)
__interrupt void spiTxFifoIsr(void)
{
Uint16 i;
for(i=0;i<8;i++)
{
[Link]=sdata[i]; // Send data
}
for(i=0;i<8;i++) // Increment data for next cycle (exemple pour test)
{
sdata[i] = sdata[i]+ 1;
}
[Link]=1; // Clear Interrupt flag
[Link]|=0x20; // Issue PIE ACK (Group 6)
}
MC43 Mesures et Capteurs 28
III. Bus SPI
III.4 Exemple du TMS320F28335
Emission et réception de paquets de 8 mots de 16 bits (FIFO / interruptions)
Fonction d’interruption de réception (8 mots reçus en RXFIFO)
__interrupt void spiRxFifoIsr(void)
{
Uint16 i;
for(i=0;i<8;i++)
{
rdata[i]=[Link];// Read data
}
for(i=0;i<8;i++) // Check received data (exemple pour test)
{
if(rdata[i] != rdata_point+i) error();
}
rdata_point++;
[Link]=1; // Clear Overflow flag
[Link]=1; // Clear Interrupt flag
[Link]|=0x20; // Issue PIE ack (Group 6)
}
MC43 Mesures et Capteurs 29