Gast
#1179481
Hallo,
ich will mit einem Master Controller mehrere Slave Controller über spi
steuern, aber mache wohl irgendwelche Fehler. Hab noch relativ wenig
Ahnung von Microcontrollern ;)
Ich vermute, dass irgendwas an der Initialisierung nicht stimmt..
Master:
#include <util/delay.h>
#include <avr/io.h>
#include <avr/interrupt.h>
void SPI_Transmit(unsigned char cData){
/* Start transmission */
SPDR = cData;
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)));
}
void main(){
/*Set MOSI, SCK output, */
DDRB = 0x28;
//SS connections
DDRC=0xFF;
//enable global interrupt
sei();
//enable SPI and Master mode
SPCR=0x50;
while(1){
//transmit data to first controller
PORTC|=0x01;
SPI_Transmit('a');
_delay_ms(40);
_delay_ms(40);
_delay_ms(40);
_delay_ms(40);
_delay_ms(40);
SPI_Transmit('b');
_delay_ms(40);
_delay_ms(40);
_delay_ms(40);
_delay_ms(40);
_delay_ms(40);
SPI_Transmit('c');
_delay_ms(40);
_delay_ms(40);
_delay_ms(40);
_delay_ms(40);
_delay_ms(40);
SPI_Transmit('d');
_delay_ms(40);
_delay_ms(40);
_delay_ms(40);
_delay_ms(40);
_delay_ms(40);
_delay_ms(40);
SPI_Transmit('e');
_delay_ms(40);
_delay_ms(40);
_delay_ms(40);
_delay_ms(40);
_delay_ms(40);
_delay_ms(40);
SPI_Transmit('f');
_delay_ms(40);
_delay_ms(40);
_delay_ms(40);
_delay_ms(40);
_delay_ms(40);
_delay_ms(40);
PORTC&=!0x01;
}
}
Slave:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
//SPI Transfer Complete Interrupt starting on page 124 in datasheet
ISR( SPI_STC_vect ){
unsigned char tmp = SPDR;
switch(tmp){
case 'a':
PORTD&=!0x01;
break;
case 'b':
PORTD|=0x01;
break;
case 'c':
PORTD&=!0x02;
break;
case 'd':
PORTD|=0x02;
break;
case 'e':
PORTD&=!0x02;
break;
case 'f':
PORTD|=0x02;
break;
}
PORTC=~PORTC;
}
void main(){
// Set MISO and PB0 output
DDRB=0x11;
DDRD=0xFF;
DDRC=0xFF;
//enable global interrupt
sei();
//enable SPI,slave etc
SPCR=0xC0;
PORTD=0xFF;
PORTC=0xFF;
PORTB|=0x01;
while(1){
}
}