iow zu Atmega via SPI

Dies ist das deutsche Forum für alle Themen um den IO-Warrior. Beiträge bitte nur in Deutsch.

Moderator: Guido Körber

Post Reply
ruediheimlicher
Posts: 13
Joined: Tue Feb 13, 2007 2:38 pm
Location: Rüti ZH

iow zu Atmega via SPI

Post by ruediheimlicher »

Ich möchte ca. 50 Bytes Daten vom IOW56 zu einem Atmega328 übertragen. Dieser läuft mit 8 MHz.
Der SPI-Takt des IOW ist probeweise 100 kHz, sollte aber später wesentlich schneller sein.
CPOL und CPHA sind auf beiden Seiten 0, MSB ist vorn.
Ich habe es im Atmega mit Interrupt und mit Polling versucht, aber ich erhalte keine vernünftigen Daten.

An den IOW schicke ich zur Initialisierung des SPI zuerst einen Report mit ID 08 mit den Daten
{ 0x01, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00}
Dann sollte er Daten (1 Byte) schicken mit ReportID 09 und
{ 0x01, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00}; (kein DRDY)
Er generiert auch eine Antwort mit der ReportHandlerCallback-Routine mit ReportID 9, aber ohne relevante Daten.

Der Atmega zeigt den Aufruf von SPI an, aber die Daten sind Garbage. Beim ersten Aufruf ein beliebiges Zeichen, dann nur noch ||.

Hat das schon jemand geschafft? Es gibt einige Beiträge in den Groups, die von der Implementation des Atmega als SPI-Slave nichts halten. Gibt es einen anderen Weg, der mehr Erfolg verspricht? IIC?
Danke für jeden guten Rat.
Ruedi Heimlicher


Meine SPI-Routinen:

volatile char SPI_daten; // vorlaeufig nur 1 Byte
void initSPI_Slave()
{
DDRB |= (1<<SPI_MISO_PIN); // output

SPCR &= ~(1<<MSTR); // Set als slave
SPCR |= (1<<SPE); // Enable SPI
}

In der while-Loop:

if (!(SPSR & (1<<SPIF))) // SPI hat begonnen
{
while(!(SPSR & (1<<SPIF))) //warten
{;}

SPI_data = SPDR;
spistatus |= (1<<SPI_DATA_IN_BIT);
SPDR=(char)SPI_count; Ereigniszaehler zurueckmelden,
SPSR &= ~(1<<SPIF); // flag setzen
}

if (spistatus & (1<<SPI_DATA_IN_BIT)) // SPI detektiert
{
cli();
lcd_gotoxy(0,1);
lcd_puts(" \0");
lcd_gotoxy(0,1);
lcd_puts("SPI:\0");
lcd_putc(SPI_data);
lcd_putc(' ');
lcd_puthex(SPI_count++); // Zaehler fuer die Anzahl Aufrufe, wird hochgezaehlt
spistatus &= ~(1<<SPI_DATA_IN_BIT);
sei();
}
friend-of-rq
Posts: 389
Joined: Sun Feb 13, 2005 1:22 pm
Location: Gerblingerode / Duderstadt
Contact:

Re: iow zu Atmega via SPI

Post by friend-of-rq »

Hallo ruediheimlicher,

ich kann Dir nur mein Testprogramm AllInOne anbieten ...
da kannst Du die verschiedenen Einstellungen der SPI-Schnittstelle bequem und einfach mit deinem uC testen ...

Gruss Ralf
Post Reply