ATmega644 : problème avec SPI
Bonsoir,
Je n'arrive pas à faire communiquer mon Atmega par SPI en mode master. Après plusieurs heures à bloquer sur ce problème j'ai fini par réduire petit à petit le programme au maximum mais toujours rien.
Information utile : Je programme en c (avec WINAVR) sur un ATmega644 cadencé à 20Mhz par un quartz externe. Le microcontrôleur est programmé physiquement par ICSP. J'utilise un oscilloscope pour visualiser le signal.
Voici le programme :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| #include <avr/io.h>
#define F_CPU 20000000UL
int main (void)
{
// make the MOSI, SCK, and SS pins outputs
DDRB |= ( 1 << PB5 ) | ( 1 << PB7 ) | ( 1 << PB4 );
PORTB |= (1 << PB4); // SS high
// make sure the MISO pin is input
DDRB &= ~( 1 << PB6 );
// set up the SPI module: SPI enabled, MSB first, master mode,
// clock polarity and phase = 0, F_osc/8
SPCR = 0b01010001;
SPSR = 0b00000001; // set double SPI speed for F_osc/8
//------------------------------------------------------------------------
PORTB &= ~( 1 << PB4); //PB4 low
SPDR = 10;
while ( ! ( SPSR & ( 1 << SPIF )));
PORTB |= (1 << PB4); //PB4 high
while (1)
{
}
return 1;
} |
Sur l'oscillo, je n'observe que la broche PB4 passer de 1 à 0. Rien d'autre ne se produit... même pas d'horloge!
J'ai vérifié la partie hardware à plusieurs reprise, elle est bel et bien correct.
J'ai testé une variante de ce programme dans laquelle j'utilisais PA0 en tant que broche de sélection de l'esclave laissant PB4 à 1. Sans résultat non plus.
Une idée ?