www.mikrocontroller.net

Forum: Compiler & IDEs SPI an Atmega8


Autor: Mike B. (dolulob)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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;
}

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Setze SS als Ausgang, dann funktioniert es.

Autor: Michael Wilhelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nutzt du den SPI Interrupt?

MW

Autor: Mike B. (dolulob)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt, der ist Low Aktiv. Ansonsten ist das eine äußerst böse 
Fehlerquelle, da fällt glaube ich fast jeder drauf rein.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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... ;)

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Mike B. (dolulob)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh, man... Danke Leute!

Das hätt ich ewig nicht gefunden! jetzt klappts (zumindest in der 
Simulation am PC).

Vielen Dank!

Mike

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.