AVR - SPI

Hallo!

Ich möchte 2 AVR über SPI verbinden. Da beide senden sollen (und dabei den Transfer einleiten können sollen) muß ich ja regelmäßig die Master-/Slave-Zuordnung wechseln.

Bisher sind folgende beiden Quellcodes entstanden:

formatting link
formatting link

Der Programmablauf ist folgendermaßen: Zu Beginn wird AVR1 als Master festgelegt, AVR2 als Slave. Anschließend wird 1 Byte von AVR1 zu AVR2 übertragen. Als nächstes wird die Master-/Slave-Zurordnung gewechselt, und AVR2 schickt 1 Byte an AVR1.

Soweit so gut. Leider werden aber bei der 2. Übertragung offensichtlich nur 7 Bit gesendet. Statt dem gesendeten 0x33 kommt nur 0x19 an.

Kann mir jemand sagen, wo ich den Fehler mache? Kann ja eigentlich nur sein, daß beim Wechseln von Master und Slave irgendein Register nicht zurückgesetzt wird, was vielleicht zurückgesetzt werden müßte!?

Danke schonmal!

Reply to
Rico Loewe
Loading thread data ...

Hast du Slaveselect oder einen Pullup/Pulldown auf der Clockleitung.

Während des Mastertausches wird die Clockleitung hochohmig was zu einem falschen Puls führen kann. Ob Pullup oder down hängt vom Mode ab.

Hast du schon daran gedacht nur einen Master zu verwenden ? Den Datentransfer kann z.b. durch einen Interruptpin ausgelöst werden.

p.s. Deine Links funktionieren nicht: We're sorry, but we can't supply the file you requested.

--
MFG Gernot
Reply to
Gernot Fink

Danke für die schnelle Antwort! :-)

Hm, also die Fehlermeldung von Fortunecity versteh mal einer. Wieso darf ich denn nicht auf meine Dateien verlinken?? Reichlich sinnlos!

Ich hatte Slaveselect mal verwendet, allerdings hab ich festgestellt, daß es auch ohne funktioniert. Einfach beide /SS verbinden, und da der Port nach dem Reset eh auf low liegt klappt das.

Die Clockleitung hab ich jetzt auch mal probeweise mit Pullup/Pulldown versehen, brachte aber auch keine Änderung.

Ich fand das wechseln komfortabler, aber ich hab jetzt Deinen Tip befolgt und nur noch 1 Master. Per Interruptpin kann ich das ganze aber nicht machen, da ich sowieso schon extremen Portmangel hab und das ganze so nur noch viel komplizierter werden würde, da die Interruptpins ja nicht am gleichen Port sind. Ich hab jetzt einfach so noch nen Pin eingerichtet, als "Meldeleitung" vom Slave zum Master sozusagen. Das scheint auch ausreichend zuverlässig zu funktionieren.

Meine neuen Quellcodes befinden sich jetzt hier:

formatting link

(Nicht über die .htm-Endungen wundern, Fortunecity hatte mal wieder was gegen .asm und .inc ...)

Das funktioniert jetzt so auch, ABER...... Ich programmier die beiden uC auf

2 STK500-Boards. Wenn ich erst den Slave einschalte und danach den Master, dann klappt's. Soweit auch logisch. Wenn ich allerdings die Boards nicht aus- und wieder einschalte, sondern nur resette, dann hab ich wieder das alte Problem, daß zu wenig Bits übertragen werden. Interessanterweise fehlen in beiden Richtungen unterschiedlich viele.

Um das Problem zu beseitigen scheint es 2 Möglichkeiten zu geben:

  1. beide Boards beinahe zeitgleich resetten und nebenbei noch ein bißchen Glück haben,
  2. Master resetten, in ne Warteschleife schicken, und in dieser Zeit den Slave resetten.

Kannst Du mir dieses Phänomen erklären?

Rico

Reply to
Rico Löwe

es

gewagte these ... es klappt ja nicht bei dir :-) der SS pin dient auch dazu die Datenübertragung zu synchronisieren. Wenn der Pin beim Slave auf High gelegt wird wird die gesamte SPI logic zurückgesetzt. Danach sollten dann auch nimmer unterschiedlich viele bits auf verschiedenen seiten fehlen.

im datenblatt: "The SPI Master initiates the communication cycle when pulling low the Slave Select SS pin of the desired Slave." .... "After each data packet, the Master will synchronize the Slave by pulling high the Slave Select, SS, line."

Reply to
Markus Zintl

Wenn du SS sowiso durchverbunden hast könntest du ja vor dem Transfer SS vom Master her kurz auf High ziehen. Dann währst du syncron.

Um das Signalisierungspin einzusparen wirds etwas komplizierter. Mit viel Aufwand kannst du das SSpin verwenden. Schau ins Datenblatt warum das nicht so einfach ist wie man denkt. Falld die Anwendung auf dem Slave nicht Zeitkritisch ist könntest du auch pollen. Af dem Master macht es nicht viel unterschied ob du ein Portpin abfragst oder einen Register schreibst, es danach liest.

Ja Markus hats gesagt.

--
MFG Gernot
Reply to
Gernot Fink

Ja, wenn ich /SS zwischendurch auf High setze klappt's. Hatte ich gestern eigentlich zu Beginn auch mal so gehabt, ohne daß es funktionierte. Na egal, hauptsache jetzt geht's. :-)

Danke euch beiden!!

Rico

Reply to
Rico Löwe

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.