Cette page vous affiche les différences entre la révision choisie et la version actuelle de la page.
robotics:computing:communication_spi_atmega [2012/03/08 16:38] ldo créée |
robotics:computing:communication_spi_atmega [2012/09/20 10:52] (Version actuelle) |
||
---|---|---|---|
Ligne 10: | Ligne 10: | ||
L'esclave désigné peut envoyer des messages seulement si le maitre génère le signal d'horloge (il ne peut pas le générer lui-même). | L'esclave désigné peut envoyer des messages seulement si le maitre génère le signal d'horloge (il ne peut pas le générer lui-même). | ||
- | ===== mode esclave ===== | + | ===== Mode esclave ===== |
SS/ est configuré en entrée. La communication n'est active que si SS/ passe à 0. | SS/ est configuré en entrée. La communication n'est active que si SS/ passe à 0. | ||
- | ===== mode maitre ===== | + | ===== Mode maitre ===== |
SS/ est configuré en sortie. c'est lui qui initialise les communications en choisissant lesclave avec qui il veut échanger. | SS/ est configuré en sortie. c'est lui qui initialise les communications en choisissant lesclave avec qui il veut échanger. | ||
Ligne 30: | Ligne 30: | ||
===== Initialisation Master ===== | ===== Initialisation Master ===== | ||
- | - configurer SS/, MOSI et SCK en sortie (MISO est automatiquement configurée en entrée). | + | * configurer SS/, MOSI et SCK en sortie (MISO est automatiquement configurée en entrée). |
- | - configurer le registre de controle SPCR en mettant à 1 SPE (active la communication SPI) et MSTR (maitre) | + | * configurer le registre de controle SPCR en mettant à 1 SPE (active la communication SPI) et MSTR (maitre) |
- | - sélectionne la vitesse du SPI et active les interruptions SPI (mettre à 1 le bit SPIE de SPCR) | + | * sélectionne la vitesse du SPI et active les interruptions SPI (mettre à 1 le bit SPIE de SPCR) |
- | - effacer les flags des interruptions SPI en lisant SPSR et SPDR | + | * effacer les flags des interruptions SPI en lisant SPSR et SPDR |
- | - active les interruptions globales (mettre à 1 bit I de SREG) | + | * active les interruptions globales (mettre à 1 bit I de SREG) |
- | Routine dinterruption SPI | + | |
- | - copie l'octet à envoyer dans SPDR | + | |
- | Initialisation Esclave | + | |
- | - configurer MISO en sortie (SS/, MOSI et SCK sont automatiquement configurée en entrée). | + | |
- | - activer la communication SPI (en mettant à 1 le bit SPE de SPCR) | + | |
- | - active les interruptions SPI (mettre à 1 le bit SPIE de SPCR) | + | |
- | - effacer les flags des interruptions SPI en lisant SPSR et SPDR | + | |
- | - active les interruptions globales (mettre à 1 bit I de SREG) | + | |
- | Routine dinterruption SPI | + | |
- | - | + | |
+ | ===== Initialisation Esclave ===== | ||
+ | * configurer MISO en sortie (SS/, MOSI et SCK sont automatiquement configurée en entrée) | ||
+ | * activer la communication SPI (en mettant à 1 le bit SPE de SPCR) | ||
+ | * active les interruptions SPI (mettre à 1 le bit SPIE de SPCR) | ||
+ | * effacer les flags des interruptions SPI en lisant SPSR et SPDR | ||
+ | * active les interruptions globales (mettre à 1 bit I de SREG) | ||
+ | ===== Exemple Master ===== | ||
+ | Le master envoie le caractère 0xAA. | ||
+ | <code c> | ||
/* | /* | ||
* SPI_Master.c | * SPI_Master.c | ||
Ligne 55: | Ligne 53: | ||
*/ | */ | ||
- | #include<avr/io.h> /* pour les definitions des registres */ | + | #include<avr/io.h> |
- | /* PORT | + | #define DDR_SPI DDRB /* SPI PORTB */ |
- | * PB3 MOSI | + | #define DD_MOSI 3 /* MISO : PB4*/ |
- | * PB4 MISO | + | #define DD_SCK 5 /* SCK : PB5 */ |
- | * PB5 SCK | + | |
- | * */ | + | |
- | + | ||
- | #define DDR_SPI DDRB /* SPI est sur le port B */ | + | |
- | #define DD_MOSI 3 /* MISO est sur PB4*/ | + | |
- | #define DD_SCK 5 /* SCK sur PB5 */ | + | |
void SPI_MasterInit(void) | void SPI_MasterInit(void) | ||
Ligne 73: | Ligne 65: | ||
} | } | ||
- | void SPI_MasterTransmit(char data) | + | char SPI_MasterTransmit(char data) |
{ | { | ||
SPDR = data; /* start transmission */ | SPDR = data; /* start transmission */ | ||
while (!(SPSR & (1<<SPIF))); /* wait transmission end */ | while (!(SPSR & (1<<SPIF))); /* wait transmission end */ | ||
- | return SPDR; | + | return SPDR; |
} | } | ||
int main (void) | int main (void) | ||
{ | { | ||
- | |||
- | PORTD = 0x00; | ||
- | |||
SPI_MasterInit(); | SPI_MasterInit(); | ||
Ligne 94: | Ligne 83: | ||
return 1; | return 1; | ||
} | } | ||
+ | </code> |