mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik (Triviales?) Problem mit der SPI


Autor: Kai S. (hugstuart)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe ein kleines Problem mit der Simulation der SPI im AVR-Studio. 
Ich initilalisiere die SPI-Schnittstelle mit den Beispielcodes im 
AVR-Datenblatt (ATMega8), die Funktionen liegen in SPI.c. Wenn ich nun 
zwei Bytes übertrage, bleibt das Programm im zweiten Byte hängen (die 
Write-Collision-Flag wird gesetzt). Es kommt nicht mehr aus der 
SPI_MasterTransmit heraus. Meine Überlegung war, dass die Übertragung 
des ersten Bytes noch nicht abgeschlossen war. Aber selbst wenn ich ein 
langes Delay vor die Übertragung des zweiten Bytes setze tritt das 
Problem immer noch auf. Hat jemand eine Idee?

Vielen Dank!


 #include <avr/io.h>
#include <avr/delay.h>
#include "SPI.h"

int main(void)
{
  SPI_MasterInit();
  SPI_MasterTransmit(0);
  SPI_MasterTransmit(9);
  return 0;
}

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Aber selbst wenn ich ein
>langes Delay vor die Übertragung des zweiten Bytes setze tritt das
>Problem immer noch auf. Hat jemand eine Idee?

Ja, poste kompletten compilierbaren Code.
Und den Simulator vergiss besser mal.
In der Realität sieht es meistens anders aus.

Autor: Kai S. (hugstuart)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke schon mal. Hier ist noch der Inhalt der SPI.c-Datei, damit ist der 
komplette Code geposted.
#include <avr/io.h>
void SPI_MasterInit(void)
{
  /* Set MOSI and SCK output, all others input */
  DDRB = (1<<3)|(1<<5);
  /* Enable SPI, Master, set clock rate fck/16 */
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<CPOL)|(1<<CPHA);
}
void SPI_MasterTransmit(char cData)
{
  /* Start transmission */
  SPDR = cData;
  /* Wait for transmission complete */
  while(!(SPSR & (1<<SPIF)));
}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void SPI_MasterInit(void)
{
  /* Set MOSI and SCK output, all others input */
  DDRB = (1<<3)|(1<<5);
  /* Enable SPI, Master, set clock rate fck/16 */
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<CPOL)|(1<<CPHA);
}

Du musst SS als Output konfigurieren. Siehe Datenblatt.

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.