mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SPI - Schnittstelle


Autor: Günter König (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Tag liebes Forum,

ich habe mal im Anhang ein kleines .ASM Listing gelegt, welches folgende 
Aufgaben erfüllen soll:

1. Initialisierung 8515
Stack, Ports, SREG -> Interrupts zulassen

2. Initialisierung des SPI
Teilung Phi/128 (SPR0 = 1, SPR1 = 1)
Datenübernahme durch steigende Flanke (CPHA = 0, CPOL = 0)
Betrieb als Master (MSTR = 1)
Datenfluß MSB -> LSB (DORD = 0)
SPI aus (Bit SPE = 0)
Interrupt ein (SPIE = 1)

3. SPI Enable (Bit 6 -> SPCR auf 1), Reset Slave durch String $01

4. Adresse an Slave $30

5. Warten bis Flag SPIE in SPSR gesetzt ist

6. Flag SPIE löschen

7. Daten an Slave

8. Warten bis Flag SPIE in SPSR gesetzt ist

9. Flag SPIE löschen

usw.

Nachdem die Übertragung beendet ist, wird das SPI abgeschaltet und 
verbleibt in einer Schleife = späteres Hauptprogramm.

Nun ist mir beim Testen im "AVR Studio 4" aufgefallen, das bereits nach 
dem Senden des ersten Bytes das Bit WCOL im SPSR gesetzt wird und auch 
bleibt.

Das ist mir nicht ganz klar.

Ebenso kann ich im "AVR Studio 4" nicht erkennen, ob das Register SPDR 
mit dem korrektem Byte gesetzt wird. Es steht immer nur $00 drin

Kann mir das vielleicht mal jemand erklären? Kann natürlich auch sein, 
das ich einen Fehler im Listing habe.........

Life austesten kann ich es noch nicht, da der Slave (CMX813)noch nicht 
vollständig aufgebaut werden kann - Quarz fehlt noch.


Danke schon mal,
Günter

Autor: MarkusB (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm,
also im Datenblatt steht, das WCOL gesetzt wird wenn wärend einer 
Übertragung in das SPI Dataregister geschrieben wird (Collision). Was 
aber die Ursache ist hab ich jetzt nicht genau analysiert.
Aber mir ist eins aufgefallen: Du willst Interrupts verwenden hast aber 
keine IRQ Sprungtabelle angelegt. Das ist normal tödlich. Oder hast Du 
in einer anderen Dateri die Definition dafür? Das solltest Du in jedem 
Fall machen.

Gruß
Markus
http://www.elektronik-projekt.de/

Autor: Günter König (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Markus,

Sprungtabelle ist vorhanden, steht an anderer Stelle. Dies hier ist nur 
nur der Versuch, einen Slave über SPI anzusprechen. Den Interrupt muss 
ich aber freigenen, weil sonst das SPIF nicht abgefragt werden kann 
(glaube ich jedenfalls).

Gruß und Dank
Günter

Autor: MarkusB (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
also wenn ich das dem Datenblatt richtig entnehme wird das SPIF auch 
dann gesetzt wenn der IRQ nicht eingeschaltet ist. Man muß ihn nur 
einschalten wenn man mit IRQ arbeiten will.
Das andere von Dir beschriebene Verhalten könnte aber auch ein Bug im 
Studio sein.

Gruß
Markus
http://www.elektronik-projekt.de/

Autor: Günter König (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jawoll Markus,

es ist für diese Routine unerheblich, ob Bit 7 im SREG gesetzt ist oder 
nicht. Ich hab das nochmal  ausprobiert.

Wenn ich die SPI Pins mal mit dem Oszilloskop anfahre, scheint es auch 
alles zu funktionieren. Aber eben sind auch per Post die fehlenden Teile 
eingetroffen (von Reichelt, gestern Mittag geordert) und nun wollen mal 
sehen obs hinhaut.

so denn,
Günter

Autor: Phagsae (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Günter wie wars beim bock ?

#Nun ist mir beim Testen im "AVR Studio 4" aufgefallen, das bereits nach 
#dem Senden des ersten Bytes das Bit WCOL im SPSR gesetzt wird und #auch 
bleibt.

Wenn du den SPI interrupt freigibst erwartet der uC eigentlich das er 
von aussen gerufen wird.
Für den normal MASTER modus brauch man kein IRQ
Da reicht die SPIF Abfrage
SPIF ist übrigens auch ein flag kein IRQ

#Das ist mir nicht ganz klar.
#Ebenso kann ich im "AVR Studio 4" nicht erkennen, ob das Register SPDR 
#mit dem korrektem Byte gesetzt wird. Es steht immer nur $00 drin
#Kann mir das vielleicht mal jemand erklären? Kann natürlich auch sein, 
das i#ch einen Fehler im Listing habe.........

Nö das ist korrekt.
Du solltest das einschreiben ins SPDR sehen können.
Ein takt später ist alles 00
Was auch klar ist weil der Slave ja nichts zurückliefert.
Man  ein IO file an den MISO Port " anschließen"
( Ich verwende da ein RAND generiertes monsterfile )

Das SPDR ist ein Ringregister
Während der Master zb Bit1 rausschiebt kommt vom slave Bit 7 rein
Dh nach der SPI übertragung hast du die Slave Daten im SPDR

Nur so als Tipp
Wenn der Slave Zeit zum Arbeiten braucht ist besser den
Auftrag n a c h der SPI übertragung abzugeben.
Sonst muss der uC immer auf den Slave warten.

Somit können beide Slave und Master parallel weiterarbeiten



Phagsae
CMMR ist lätürnich false -> CMRR =!flase

Autor: Günter König (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Holla Phagsae,

also der Bock war gut, ich war gut drauf am nächsten Tag gabs keine 
Brummstörungen. Alles somit im grünen Bereich.

Gut denn, das mit dem Interrupt ist eigentlich logisch. Die Software 
funktioniert im Atmel und nachdem ich jetzt den Quarz beim Slave 
eingesetzt habe funktioniert das auch. Ich initialisiere jetzt den Slave 
und wenn der ein externes NF-Signal erhält, löst der einen Interrupt an 
Int1 aus. Das soll er auch und nun geht es weiter mit der Hardware...

Was mir aber immer noch nicht einleuchtet, ist die Geschichte mit der 
Word-Collosion. Hängt das etwa damit zusammen, das er kein Feedback vom 
Slave bekommt? Das kann der nämlich nicht. Der kann nur Befehle und 
Daten bekommen und bestenfalls nach aufforderung Daten senden, sonst 
nix. Und wenn ich das richtig geschnallt habe, braucht der Master auch 
kein Feedback vom Slave.

Djambo,
Günter

Autor: Markus Rehn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich hab ein Problem mit meiner SPI-Schnittstelle:

Meine Aufgabe ist es, die Daten, die von einer SPI-Schnittstelle
gesendet werden mit dem Microcontroller PIC 16F873 einzulesen. Dabei
verwende ich die hardwarmäßige SPI-Schnittstelle des Controllers.
Dieser arbeitet mit dem externen Takt und somit als Slave.

Zum Testen habe ich die Takteingangsleitung des PIC an einen
entprellten Taster angeschlossen, um im Debugmodus den Takt selbst
erzeugen zu können.
Leider funktioniert das Ganze nicht richtig. Nur ab und zu wird in den
Empfangsbuffer etwas reingeschrieben.

Die Register für den SPI-Betrieb habe ich folgendermaßen konfiguriert:

SSPSTAT = 0100 0000 (clock edge select = steigende Flanke)
SSPCON  = 0010 0100 (enables serial port;SPI slave mode;clock=SCK-PIN)

Die Konfiguration müsste so eigentlich stimmen.

Für eure Hilfe wäre ich sehr dankbar.

Gruß, Markus

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.