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> | ||