Hallo, ich versuche die Hardware SPI am Atmega8 zu benutzen, aber komme irgendwie nicht weiter. Ja ich habe schan das Datenblatt gelesen und weiß wie die SPI vom Prinzip her funktionieren soll... Aber schon bei der Simulation am PC klappt es nicht... die simulation bleibt immer an der Zeile "while(!(SPSR & (1<<SPIF)))" hängen, als ob diese bedingung nie erfüllt wird... wie kann das sein? mache ich da was falsch? Danke Mike -----------code---------------------- void SPI_MasterInit(void) { /* Set MOSI and SCK output, all others input */ DDRB = (1<<PB3)|(1<<PB5); /* Enable SPI, Master, set clock rate fck/16 */ SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0); } void SPI_MasterTransmit(char cData) { /* Start transmission */ SPDR = cData; /* Wait for transmission complete */ while(!(SPSR & (1<<SPIF))) ; } int main (void) { SPI_MasterInit(); sei (); for (;;){ SPI_MasterTransmit(0b11111111); _delay_ms(20); SPI_MasterTransmit(0b00000000); _delay_ms(20); } return 0; }
nicht dass ich wüsste, ich will einfach nur bytes über die SPI schnittstelle schicken. Ich hab das ganze mal software mäßig realisiert und das hat super funktioniert, aber wollte halt jetzt die Hardware spi nutzen Mike
Setze SS als Ausgang, dann funktioniert es. Denn wenn dieser als Eingang geschaltet ist, schaltet ein High Pegel an diesem das SPI Interface in den Slave Mode.
Benedikt K. wrote:
> ...schaltet ein High Pegel an diesem das SPI Interface in den Slave Mode.
Nur zur Vermeidung von Missverständnissen: /SS ist Low-aktiv. Ein
Low-Pegel sorgt für einen Wechsel in den Slave-Betrieb.
Ansonsten aber völlig korrekt: Nur wenn /SS als Ausgang konfiguriert
ist, dann ist man vor bösen Überraschungen sicher.
Stimmt, der ist Low Aktiv. Ansonsten ist das eine äußerst böse Fehlerquelle, da fällt glaube ich fast jeder drauf rein.
Benedikt K. wrote: > Stimmt, der ist Low Aktiv. Ansonsten ist das eine äußerst böse > Fehlerquelle, da fällt glaube ich fast jeder drauf rein. Naja, nicht unbedingt darauf reingefallen. Aber etwas komisch kam es mir beim ersten mal im Datenblatt lesen schon vor... ;)
> Naja, nicht unbedingt darauf reingefallen. Aber etwas komisch kam es mir > beim ersten mal im Datenblatt lesen schon vor... ;) Mir käme eine Select-Leitung komisch vor, die mit high level aktiv ist. Weil solche Signale seit Urzeiten weit überwiegend active low sind. Das ist eine althergebrachte Konvention, die möglicherweise mit der asymmetrischen Charakteristik von Logikbausteinen in bipolarer Technik zu tun hat.
Andreas Kaiser wrote: >> Naja, nicht unbedingt darauf reingefallen. Aber etwas komisch kam es mir >> beim ersten mal im Datenblatt lesen schon vor... ;) > > Mir käme eine Select-Leitung komisch vor, die mit high level aktiv ist. > Weil solche Signale seit Urzeiten weit überwiegend active low sind. Das > ist eine althergebrachte Konvention, die möglicherweise mit der > asymmetrischen Charakteristik von Logikbausteinen in bipolarer Technik > zu tun hat. Das meinte ich eigentlich auch nicht. Du hast natürlich Recht, das wundert mich nicht. Mich wundert(e) viel eher, dass man für den MASTER Betrieb (Wofür es ja eigentlich schon ein Bit im Control-Register gibt) SS als Ausgang setzen muss.
In der ersten LPC2000 Generation ist es perfiderweise exakt umgekehrt. Da muss SS Eingang sein und inaktiv, so dass sich die Leitung grad nicht für den angestammten Zweck nutzen lässt.
Oh, man... Danke Leute! Das hätt ich ewig nicht gefunden! jetzt klappts (zumindest in der Simulation am PC). Vielen Dank! Mike
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.