Hallo, folgendes Problem: ich habe zwei atmega48. Einen habe ich als SPI-Master, den anderen als Slave definiert. Ich möchte nun Daten vom Master zum Slave schicken und umgehrt. Dazu habe ich nun erstmal zu Testzwecken ein kleines Programm geschrieben. Es wird das letzt empfangene Byte ins eeprom geschrieben. Was ich ja dann über das STK500 auslesen kann. Es wird aber weder ein empfangenes Byte vom Master noch vom Slave ins eeprom geschrieben. Also wird wohl komischer Weise nix empfangen! Die zwei Controller habe ich auf ein Steckboard miteinander verbunden. Leider weiß ich schon langsam nicht mehr weiter, an was es liegen könnte. vielleicht kann mir hier jemand helfen! Hier mal der Quellcode meines Programms: #define F_CPU 8000000 #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include <avr/eeprom.h> #define P_MOSI PB3 #define P_MISO PB4 #define P_SCK PB5 /* Umschalter zwischen Master und Slave */ #define MASTER uint8_t spi_putc(uint8_t byte) { SPDR = byte; while(!(SPSR & (1<<SPIF))); return SPDR; } int main() { uint8_t byte = 0; uint8_t eeAdr = 0x10; #ifdef MASTER _delay_ms(1); /* Ausgänge festlegen */ DDRB = ( 1 << P_MOSI) | (1 << P_SCK); /* Pull-Up MISO */ PORTB = (1 << P_MISO); /* Master-Modus aktivieren, Prescaler 8 */ SPCR = (1 << MSTR) | (1 << SPR0); SPSR = ( 1 << SPI2X); /* SPI-BUS aktivieren */ SPCR |= (1 << SPE); byte = SPDR; byte = SPSR; _delay_ms(1); /* Daten zum Slave senden */ byte = spi_putc('B'); byte = spi_putc('A'); #else /* Ausgang festlegen */ DDRB = ( 1 << P_MISO); /* Pull-Up MOSI */ PORTB |= (1 << P_MOSI); /* SPI-BUS aktivieren */ SPCR = (1 << SPE); /* löschen */ byte = SPDR; byte = SPSR; byte = spi_putc('C'); byte = spi_putc('D'); #endif /* letztes Byte abspeichern */ eeprom_write_byte(&eeAdr,byte); while (1) { _delay_ms(1); } return 0; }
Setz den Slaveselect Pin beim Master auf high oder auf Ausgang.
Hallo ja, habe ich nun gemacht. Habe mein Programm um folgende Zeilen im MASTER erzänzt /* Ausgänge festlegen */ DDRB = ( 1 << P_MOSI) | (1 << P_SCK) | (1 << P_SS); PORTB = (1 << P_MISO) | (1 << P_SS); ... /* Daten senden */ PORTB &= ~(1 << P_SS); byte = spi_putc('B'); byte = spi_putc('A'); PORTB |= (1 << P_SS); funktioniert aber leider immer noch nicht!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.