www.mikrocontroller.net

Forum: Compiler & IDEs SPI beispiel


Autor: mixl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen

Ich suche ein AVRGCC Beispiel das zeigt wie SPI benutzt wird... konnte 
leider nicht wirklich etwas finden

besten dank und gruss

Autor: unsichtbarer WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schon mal im Datenblatt geguckt?

Übrigens gehören in die Codesammlung keine Fragen.
Deine gehört eher ins gcc-Forum.

Autor: unsichtbarer WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mist! Verdrückt. Die ist hier ja schon richtig...
Datenblatt und die Forensuche dürften trotzdem deine erste Anlaufstelle 
sein.


Autor: mixl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
soweit war ich selber schon...

wie sieht denn nun eine gelungene funktion zum senden per spi aus? so 
als gutes beispiel zum wieder verwenden?

danke

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hättest du ins Datenblatt geschaut, hättest du da eine gefunden...

Autor: Valdur (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab den code aus dem Datenblatt, aber es geht trotzdem nicht wäre es 
nicht einfacher in 1 thread mal eine ordentliche beispiel 
implementierung zu posten wie in 100 threads "schau im datenblatt"...?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ich hab den code aus dem Datenblatt, aber es geht trotzdem nicht wäre es
>nicht einfacher in 1 thread mal eine ordentliche beispiel
>implementierung zu posten wie in 100 threads "schau im datenblatt"...?

NEIN, dafür ist das Datenblatt da! Wer zu faul ist das Datenblatt zu 
lesen, ist vermutlich auch zu faul, den entsprechenden Beitrag im Forum 
zu suchen und zu finden und es würde trotzdem 100000 mal wieder das 
selbe gefragt!

Wenn es bei Dir nicht funktioniert, dann liegt der Fehler sicher nicht 
in dem Teil, den Du aus dem Datenblatt hast.

Autor: Valdur (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und woher soll ich den code zaubern der nicht im Datenblatt steht... 
ausm Datenblatt?... Der Code ausm Datenblatt Funktioniert, aber z.B. 
fehlt da die Rückleitung momentan kann ich nur von meinem AVR128 etwas 
zu meinem AVR88 Senden und nichts zurück. Und da helfen mir die 100 
Verweise auf das Datenblatt leider GARNICHTS!

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Valdur wrote:
> Ich hab den code aus dem Datenblatt, aber es geht trotzdem nicht

Laß Dir nicht alles aus der Nase ziehen, was geht nicht?
Also was machst Du, was soll daraufhin passieren, was passiert 
stattdessen, wie prüfst Du es?
Wie reagieren die Statusbits?

Glaskugelmodus an:
Beim SPI-Master den SS-Pin als Ausgang gesetzt?


Peter

Autor: Valdur (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hatte vor einen AVR 128 und 8 AVR 88 zu benutzen die auf Anfrage des 
128 gers Daten ihm zusenden.

128 ger master code aus dem 128 ger Datenblatt
void SPI_MasterInit(void)
{
/* Set MOSI and SCK output, all others input */
DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK);
/* 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)))
;
}

88 ger slave code aus dem 88 ger datenblatt
void SPI_SlaveInit(void)
{
/* Set MISO output, all others input */
DDR_SPI = (1<<DD_MISO);
/* Enable SPI */
SPCR = (1<<SPE);
}
char SPI_SlaveReceive(void)
{
/* Wait for reception complete */
while(!(SPSR & (1<<SPIF)))
;
/* Return Data Register */
return SPDR;
}

sämtliche pins habe ich richtig gesetzt wenn ich vom Master auf den 
Slave eine "12" Sende kommt diese auch an.
Auf meinem Oszi habe ich auch nachgewiesen das was über MOSI zum slave 
geht stimmt soweit kein Problem. Nun hab ich die Transmit Funktion des 
Masters für den slave Kopiert aber das Funktioniert nicht auf der MISO 
Leitung wird nur das MOSI signal etwas verzögert gespiegelt und mein 
Master empfängt mit der etwas Modifizierten Transmit Funktion auch 
nichts.
char SPI_MasterTransmit(char cData)
{
  /* Start transmission */
  SPDR = cData;
  /* Wait for transmission complete */
  while(!(SPSR & (1<<SPIF)));
  
  return SPDR;
}

Ich bin mir im Klaren das es dieses /SS gibt, aber in der Datenblatt 
Implementierung gibt es das auch nur auf low sogar beim Master.

Sorry wenn sich manche Sachen etwas blöd anhöhren aber das hier ist 
nicht direkt mein Fachgebiet.

Autor: Valdur (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach und wie kann ich /SS auf Ausgang schalten, ich weis nur wie ich es 
high oder low ziehen kann, mit dem SPCR Register geht es nicht und sonst 
hab ich dazu im Datenblatt auch nichts gefunden.

Autor: tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DDR_SPI |= (1 << SS);

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, das SPI zwischen 2 AVRs ist gelinde gesagt ziemlich 
bauchschmerzig.

Die AVRs haben keinen Sendepuffer, d.h. der SPI-Slave müßte hellsehen 
können, wann er das zu sendende Byte schreiben darf.

Der Master muß den /SS des Slave auf low ziehen, der Slave muß diesen 
Pin mit auf einen Interrupt legen und der Interrupt schreibt dann das 
erste Sendebyte rein.
Der Master zieht also /SS auf low und wartet dann ne Weile.
Dann schreibt er ein Dummy-Byte und danach wartet er wieder usw.
Für nen ersten Test nimm 1ms Wartezeit, sollte dem Slave erstmal 
reichen, das SPI rechtzeitig zu füttern.
Und wenns klappt, kann man kürzer probieren.

Das ganze SPI wird also eher zu ner Warteorgie als denn zu einem 
flüssigen Datentransfer.


Wenn möglich würde ich daher das I2C vorziehen, da gibt es ein klar 
definiertes Handshake über die SCL-Leitung und niemand muß unnütz 
warten.


Peter

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.