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();
}
iow zu Atmega via SPI
Moderator: Guido Körber
-
- Posts: 13
- Joined: Tue Feb 13, 2007 2:38 pm
- Location: Rüti ZH
-
- Posts: 389
- Joined: Sun Feb 13, 2005 1:22 pm
- Location: Gerblingerode / Duderstadt
- Contact:
Re: iow zu Atmega via SPI
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
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