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.