Outils pour utilisateurs

Outils du site


robotics:computing:communication_spi_atmega

Introduction

La communication SPI est une communication synchrone série très rapide entre un maitre et un ou plusieurs esclaves.  

Protocole

Le maître initialise la communication en passant la ligne SS/ (Slave select) à 0 pour sélectionner l'esclave qu'il veut interroger (une ligne SS/ par esclave). Le maître et l'esclave charge leur donnée à envoyer dans leur registre SPDR. Puis, le maître se charge de synchroniser la communication en produisant le signal d'horloge sur SCK. La donnée est envoyée du maître vers l'esclave sur la ligne MOSI (Master Out Slave In) et une autre est envoyée de l'esclave vers le maître sur la ligne MISO (Master In Slave Out). Le maître peut envoyer d'autres octets ou bien signaler la fin de l'échange en repassant la ligne SS/ à 1 (ligne au repos).

Quand un octet est reçu, le flag SPIF est mis à 1 et retourne une interruption si celle-ci est activée. L'octet reçu doit être lu avant l'arrivée complète du suivant sinon il est perdu.

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

SS/ est configuré en entrée. La communication n'est active que si SS/ passe à 0.

Mode maitre

SS/ est configuré en sortie. c'est lui qui initialise les communications en choisissant l’esclave avec qui il veut échanger.

Super Maitre

Le maitre peut devenir esclave à la demande d'un «super maitre». SS/ est configuré en entrée. Lorsque SS/ est à 1, c'est lui qui gère les échanges. Lorsque SS/ passe à 0, il est alors considéré comme esclave (MSTR passe à 0).

Implémentation

Registres

SPDR : registre de données SPCR : registre de controle - MSTR : permet de définir le mode de l'ATMEL (maitre ou esclave) - SPIE : active les interruptions SPI SPSR : registre d'état - SPIF : flag mis à 1 après un transfert - WCOL : flag mis à 1 après détection d'une collision

Initialisation Master

  • 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)
  • 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
  • active les interruptions globales (mettre à 1 bit I de SREG)

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.

/*
 * SPI_Master.c
 *
 *  Created on: Dec 18, 2011
 *      Author: ldo
 */
 
#include<avr/io.h>
 
#define DDR_SPI DDRB	/* SPI PORTB */
#define DD_MOSI 3	/* MISO : PB4*/
#define DD_SCK 5	/* SCK : PB5 */
 
void SPI_MasterInit(void)
{
	DDR_SPI = (1<<DD_MOSI) | (1<<DD_SCK);	/* set MOSI and SCK output */
	SPCR = (1<<SPE) |(1<<MSTR) | (1<<SPR0);	/* Enable SPI, Master, set clock rate fck/16 */
}
 
char SPI_MasterTransmit(char data)
{
	SPDR = data;	/* start transmission */
	while (!(SPSR & (1<<SPIF)));	/* wait transmission end */
	return SPDR;
}
 
int main (void)
{
	SPI_MasterInit();
 
	while(1)
	{
		SPI_MasterTransmit(0xAA);
	}
 
	return 1;
}
robotics/computing/communication_spi_atmega.txt · Dernière modification: 2012/09/20 10:52 (modification externe)