SPI
Sommaire
[masquer]- 1 Introduction
- 2 Interface et Fonctionnement
- 3 Avantages et Inconvénients
- 4 Rapport avec le projet
- 5 Exemple de programme Arduino (liaison SPI)
- 6 Exemple de programme FPGA (liaison SPI)
- 7 Exemple de transfert de donnée
- 8 Adaptation de tension Arduino/FPGA
- 9 Assemblage Communication Codeur
- 10 Référence
Introduction
SPI (= Sérial Peripheral Interface) est un bus de données série synchrone fonctionnant en Full-duplex sous un principe de Maître-Esclaves entre plusieurs micro-contrôleurs soit de la même famille soit ayant des interfaces compatibles. Il permet la communication à courte distance entre plusieurs périphériques.
Interface et Fonctionnement
Le bus SPI contient 4 signaux logiques. Il y en à trois généré par le Maître:
- SCLK = horloge
- MOSI = Master Output,Slave Input
- SS = Slave Select, actif à l'état bas
Un généré par l'Esclave:
- MISO = Master Input, Slave Output
Une transmission SPI typique est une communication simultanée entre un Maître et un Esclave. On a le Maître qui génère l'horloge et sélectionne l'Esclave avec qui il veut communiquer. On a aussi l'Esclave qui répond aux requêtes du Maître. A chaque coup d'horloge le Maître et l'Esclave s'échange un bit, à savoir que la vitesse de l'horloge est réglée selon des caractéristiques propres aux périphériques. La configuration est fait sous forme de couple où le bit de poids fort est CPOL(Clock Polarity) et le bit de poids faible CPHA(Clock Phase).
Mode | CPOL | CPHA |
---|---|---|
0 (0,0) | 0 | 0 |
1 (0,1) | 0 | 1 |
2 (1,0) | 1 | 0 |
3 (1,1) | 1 | 1 |
La fréquence des modes d'opération du "Maître" dépend de l'adaptateur ou de l'analyseur pouvant aller de 10MHz à 1000MHz.
Avantages et Inconvénients
points positifs:
- Communication Full duplex
- Débit assez important par rapport à i2c
- Flexibilité du nombre de bits à transmettre
- Simplicité de l'interface matérielle
- Aucun arbitre nécessaire car aucune collision possible
- Les esclaves utilisent l'horloge du maître et n'ont donc pas besoin d'oscillateur de précision
- Pas de PHY nécessaire
- Partage d'un bus commun pour l'horloge, MISO et MOSI entre les périphériques
points négatifs:
- Monopolise plus de pattes d'un boîtier que l'i2c qui en utilisent seulement deux.
- Aucun adressage possible, il faut une ligne de sélection par esclave en mode non chaîné.
- Le protocole n'a pas d'acquittement. Le maître peut parler dans le vide sans le savoir.
- Il ne peut y avoir qu'un seul maître sur le bus.
- Ne s'utilise que sur de courtes distances contrairement aux liaisons RS-232, RS-485 ou bus CAN
- Néanmoins, il est possible d'utiliser un driver RS-232 (exemple : MAX208) pour relier un maître et un esclave avec un câble de quelques mètres
Rapport avec le projet
La liaison SPI est donc un autre moyen d'établir la communication entre le FPGA et le micro-contrôleur tout comme l'i2c, tout en ayant un débit plus important et étant plus facile à réaliser que l'i2c. C'est donc ces deux critères qui nous ont permis de choisir entre les deux, ainsi nous utiliserons cette technologie pour établir la liaison.
Exemple de programme Arduino (liaison SPI)
Programme Maître (langage C)
#include <SPI.h>
void setup (void)
{
pinMode(8,OUTPUT);
pinMode(7,INPUT);
digitalWrite(SS, HIGH);
// ensure SS stays high for now
// Put SCK, MOSI, SS pins into output mode
// also put SCK, MOSI into LOW state, and SS into HIGH state.
// Then put SPI hardware into Master mode and turn SPI on
SPI.begin ();
Serial.begin(9600);
// Slow down the master a bit
SPI.setClockDivider(SPI_CLOCK_DIV128);
} // end of setup
void loop (void)
{
//déclaration variable
unsigned char dataByte;
// enable Slave Select
digitalWrite(SS, LOW);
// SS is pin 10
dataByte=SPI.transfer (85);
Serial.println(dataByte,DEC);
digitalWrite(SS, HIGH);
delay (200);
// 1 seconds delay
}
// end of loop
Exemple de programme FPGA (liaison SPI)
Programme Esclave (VHDL) :
- .sym
- .sch
- .ucf
- .vhd
Exemple de transfert de donnée
- Signal bleu => Horloge (Sck)
- Signal jaune => Donnée envoyée (ici A9) du maître(Arduino) à l'esclave(FPGA)
Adaptation de tension Arduino/FPGA
Pour effectuer la communication entre Arduino/FPGA, il a fallu faire une adaptation de tension.
Arduino 5 V => FPGA 3,3 V
FPGA 3,3 V => Arduino 5 V
Assemblage Communication Codeur
Le FPGA utilisé avec le moteur, étant de la marque Altera, il a fallu changer de logiciel. En effet nous sommes passés sous Quartus II, et nous avons assemblé notre module de communication avec un codeur, puis rajouté quelques modules pour régler les différents problèmes.
Voici le rendu final : Media: Quartus.zip
Référence
- http://fr.wikipedia.org/wiki/Serial_Peripheral_Interface
- http://www.google.fr/url?sa=t&rct=j&q=&esrc=s&source=web&cd=9&cad=rja&sqi=2&ved=0CF4QFjAI&url=http%3A%2F%2Fstsserd.free.fr%2FCours_sts2%2FLogique%2FCours%2520bus%2520SPI%2520STS.pdf&ei=h3lnUtzOBOuI7Aatj4HgAg&usg=AFQjCNEOkDOda4CfAiaN5hYz3_EL-OH-vA&bvm=bv.55123115,d.d2k
- http://arduino.cc/en/Reference/SPI