AVR - SPI

R

Rico Loewe

Guest
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:

http://members.fortunecity.de/ricole/AVR1.txt
http://members.fortunecity.de/ricole/AVR2.txt

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!
 
In article <752fab07.0404110246.687838a1@posting.google.com>,
downx@gmx.de (Rico Loewe) writes:
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:

http://members.fortunecity.de/ricole/AVR1.txt
http://members.fortunecity.de/ricole/AVR2.txt

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.
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
 
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!

Hast du Slaveselect oder einen Pullup/Pulldown auf der Clockleitung.
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.

Hast du schon daran gedacht nur einen Master zu verwenden ?
Den Datentransfer kann z.b. durch einen Interruptpin ausgelöst werden.
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:

http://members.fortunecity.de/ricole/index.html

(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
 
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.
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."
 
In article <c5cj0a$i5g$01$1@news.t-online.com>,
"Rico Löwe" <downx@gmx.de> writes:
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.
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.


Meine neuen Quellcodes befinden sich jetzt hier:

http://members.fortunecity.de/ricole/index.html

(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?
Ja Markus hats gesagt.

--
MFG Gernot
 
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
 

Welcome to EDABoard.com

Sponsor

Back
Top