Hallo Forum,
ich experimentiere gerade mit dem SPI-Modul eines Mega8.
void spi_init(void)
{
MOSI_DDR|=(1<<MOSI);//DDR MOSI-Pin
SCK_DDR|=(1<<SCK);//DDR MISO-Pin
SS_DDR|=(1<<SS); //DDR /SS-Pin, notwendig für Master Mode
SPCR=(1<<SPE)|(1<<MSTR); //Enable SPI, Master, f_Clk/4
SPCR|=(1<<CPOL);//|(1<<CPHA); /SPI Mode 3
SPSR=(1<<SPI2X); //Double Speed -> f_Clk/2
}
unsigned char spi_trx(unsigned char c)
{
SPDR=c; // SPI Datenregister laden
while (!(SPSR&(1<<SPIF))); // auf SPIF warten
return SPDR; // eingelesenes Byte rückgeben
}
Es funktioniert auch soweit alles, aber es schein keinen Unterschied zu
machen, ob CPHA in SPCR gesetzt ist oder nicht, das Oszillogramm schau
immer gleich aus.
Woran kann das liegen?
Die Daten müssten mit CPHA=0 mit der steigenden, mit CPHA=1 mit der fallenden Flanke ausgegeben werden. Sie kommen aber unabhängig von CPHA immer mit der steigenden Flanke. Hab mal ein Bild angehängt.
ich hab mal Bilder von allen 4 Modes gemacht. Mode 2 und 3 sind gleich. Das stimmt nicht mit den Bildern im Datenblatt überein.
Doofe Frage: Mißt Du auf MOSI oder MISO? Der Slave, der MISO treibt, weiß natürlich nichts von CPHA...
Peinlich, peinlich - aber Fehler gefunden. Habe am falschen Punkt auf der Platine ein falsches Signal als vermeintliches MOSI abgegriffen. Das hat mich jetzt schlappe 2 Tage gekostet. Also - ich nehme alles zurück. Alle Timings wie sie sein sollten.
Hier nochmal Bilder von den Modes, für die, die's interessiert. Oben SCK, unten MOSI.
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.
