www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SPI klappt nicht


Autor: Karl M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe im Moment ein Problem mit eienr SPI Kommunikation.
Ich hatte einen ATmega644 mit einem IC verschaltet. Habe ich erst alles 
direkt verlötet, hat auch alles super geklappt. Dann wollte ich die 
SPI-Schnittstelle via i-Coupler von Analog Devices galvanisch trennen. 
Dazu habe ich den IC auf einer anderen Platine aufgebaut. Dann ging 
nichts mehr.

Aus Verzweiflung habe ich den IC wieder auf die Platine mit dem 
Mikrocontroller zusammengeschaltet - jetzt geht immer noch gar nichts. 
Habe den IC schon ausgetauscht, alle Leitungen 100 mal überprüft.

Fakt ist, er bleibt immer an dieser while-Schlife hängen:
{
  int k;
  unsigned long temp;

  // SS low
  PORTB &= ~(1<<DDB4);
  for (k=0;k<5;k++){;}    

  //Start transmission 
  SPDR = address;
  //Wait for transmission complete 
  while(!(SPSR & (1<<SPIF)));     // HIER BLEIBT ER IMMER STEHEN
  for (k=0;k<50;k++){;}  

  // Byte empfangen
        // Dummy senden
  SPDR = 0x00;
  // Wait for dummy-transmission complete
  while(!(SPSR & (1<<SPIF)));  
  // Byte in temp reinschreiben
  temp = SPDR;
  for (k=0;k<5;k++){;}  

  // SS high
  PORTB |= (1<<DDB4);
  for (k=0;k<100;k++){;}
  return temp;
}


Autor: Karl M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achso meine Frage:

Hat jemand vielleicht einen Tip, wie ich die weitere Fehlersuche 
veranstalten könnte?

Autor: Mike R. (thesealion)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich tippe auf einen Fehler auserhalb des geposteten Codes.
z.B. eine fehlerhafte Initalisierung

Gruß Mike

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mein Verdacht: die SPI-Übertragung wird nicht gestartet.

Allerdings hat das nichts mit der Verdrahtung zu tun. Denn den SPI juckt 
es schon gleich überhaupt nichts, wenn was falsch oder gar nicht an die 
Leitungen angeschlossen ist.
Da hast du wohl irgendwas an der Initialisierung des SPI verbogen.

Autor: Karl M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Okay, du hattest recht. Ich war so dumm, und habe direkt unter main eine 
while(1)-Schleife eingefügt, um das SPI zu testen. Die Initialisierung 
kam erst unter dieser Schleife.

Aber du hast mich erst auf den richtigen Pfad gebracht. Also danke!

Autor: dergelko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
uaaaaahhhhh.
Bitte niemals einfach so while schleifen einbauen.
Immer einen timeout hinzufügen.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das kann man so pauschal nicht sagen.
Bei einer Komponente, die nach einem programmgesteuerten Start 
selbständig auf dem uC läuft (SPI, RS232 senden...), mache ich sowas 
auch. Warum auch nicht? Ich weiß ja, dass dieser Prozess garantiert 
irgendwann fertig wird. Und wenn nicht, dann merke ich das schon in der 
Entwicklung (siehe oben).

Niemals sollte man aber auf externe Ereignisse (RS232-Empfang, 
Schalter...) auf diese Art warten.

Autor: Michael H. (michael_h45)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Datenblatt sagt:
When configured as a Master, the SPI interface has no automatic control of
the SS line. This must be handled by user software before communication can
start. When this is done, writing a byte to the SPI Data Register starts
the SPI clock generator
[...]
The Master may continue to shift the next byte by writing it into SPDR, or
signal the end of packet by pulling high the Slave Select, SS line. The
last incoming byte will be kept in the Buffer Register for later use.
und außerdem:
Master Mode
When the SPI is configured as a Master (MSTR in SPCR is set), the user can
determine the direction of the SS pin.
If SS is configured as an output, the pin is a general output pin which
does not affect the SPI system. Typically, the pin will be driving the SS
pin of the SPI Slave.
If SS is configured as an input, it must be held high to ensure Master SPI
operation. If the SS pin is driven low by peripheral circuitry when the
SPI is configured as a Master with the SS pin defined as an input, the SPI
system interprets this as another master selecting the SPI as a slave and
starting to send data to it. To avoid bus contention, the SPI system takes
the following actions:
1. The MSTR bit in SPCR is cleared and the SPI system becomes a Slave.
As a result of the SPI becoming a Slave, the MOSI and SCK pins become
inputs.
2. The SPIF Flag in SPSR is set, and if the SPI interrupt is enabled, and
the I-bit in SREG is set, the interrupt routine will be executed.

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.