Forum: Mikrocontroller und Digitale Elektronik spi: mehrere bytes senden (luna-avr)


von tom (Gast)


Lesenswert?

hi.

irgendwie komme ich nicht weiter. ich scripte mit lunaavr und habe zwei 
atmega32. beide sollen miteinander ueber spi komunizieren.

der master wird innerhalb der loop-schleife mit
1
spislave1=0
2
spi.master.writebyte(wert1)
3
spislave1=1
gefuettert und der slave faengt das ebenfalls in der loop mit
1
wert=spi.slave.readbyte
 ab.

so weit funktioniert das. aber ich moechte mehr als nur ein byte 
uebertragen.
master:
1
spislave1=0
2
spi.master.writebyte(wert1)
3
spi.master.writebyte(wert2)
4
spislave1=1
slave:
1
wert=spi.slave.readbyte
2
wert2=spi.slave.readbyte
 funktioniert nicht.

kann mir da jemand helfen?

gruß
tom

von Mike (Gast)


Lesenswert?

ich würde meinen das zweite byte wird nicht zwangsläufig beim pollen 
auch mit dem richtigen Timing ausgelesen. wenn es mit einem delay 
funktioniert, dann wird das wohl so sein.

nimm zum Empfang doch die ISR und pack die bytes in einen buffer.

von tom (Gast)


Lesenswert?

Mike schrieb:
> nimm zum Empfang doch die ISR und pack die bytes in einen buffer.

hm ... hast du dafuer ein beispiel? mir ist es nicht ganz so gelaeufig

tom

von Anus P. (Firma: Abfluskiuads AG) (anuspraeter)


Lesenswert?

tom schrieb:
> irgendwie komme ich nicht weiter. ich scripte mit lunaavr und habe zwei
> atmega32. beide sollen miteinander ueber spi komunizieren.

Du weißt, dass das Codieren der letzte Schritt einer Entwicklung ist?

von tom (Gast)


Lesenswert?

Anus Praeter schrieb:
> Du weißt, dass das Codieren der letzte Schritt einer Entwicklung ist?

ja. aber irgendwie muss man erst einmal das entwickeln lernen damit man 
was entwickeln kann. das weisst du?
ich lerne auf dem praktischem autodidaktischem weg. darum frage ich wie 
ein noob nach unterstuetzung und nicht wie ein profi.

von Fusel (Gast)


Lesenswert?

Tom,

warum wendest Du Dich nicht an das hauseigene Forum von LunaAVR?
Die Leute dort müssten Dir doch am besten sagen können, wie deren 
Software und Libraries und hast Du nicht gesehen funktionieren 
soll(t)en.

Stelle einfach dort die Frage. Mache eine Weltreise und wenn Du wieder 
kommst hast Du vielleicht die passende Lösung.
So schön die IDE von Luna auch sein sollte, aber die Libs mit der 
mangelhaften Dokumentation und dem fragwürdigen Support stellen trotz 
der angeblichen "anfängerfreundlichen" Umgebung eher was für Profis dar, 
die sonst keine Fragen haben.
Die Tatsache, das dort Fragen mit weniger hilfreichen, meist mehr oder 
weniger inhaltlosen Gegenfragen beantwortet werden, sollte einem schon 
zu denken geben.

Have fun
Fusel

von Peter D. (peda)


Lesenswert?

Der Master kann zwar senden, wann er will, der Slave aber nicht 
empfangen, wann er will.
Der Slave muß exakt in dem Augenblick das Datenregister auslesen, wenn 
der Master das Byte gesendet hat. Nicht früher oder später, sondern 
genau dann. Und das geht eigentlich nur mit Interrupt.

von harald (Gast)


Lesenswert?

Fusel schrieb:
> aber die Libs mit der
> mangelhaften Dokumentation und dem fragwürdigen Support stellen trotz
> der angeblichen "anfängerfreundlichen" Umgebung eher was für Profis dar,
> die sonst keine Fragen haben.

also ich sehe mich definitiv nicht als Profi, ich finde die 
Dokumentation durchaus sehr detailliert, da steht auch nicht mehr oder 
weniger drin als was man erwartet. 1. ne Kurzbeschreibung, die 
Funktionen und in 90% der Fälle ein Code-Beispiel. Das man nicht allen 
alles servierfertig vorkauen kann ist klar, ich musste da auch lernen.

von Fusel (Gast)


Lesenswert?

Moin Harald,

harald schrieb:
> Das man nicht allen
> alles servierfertig vorkauen kann ist klar, ich musste da auch lernen.
da gebe ich Dir vollkommen recht. Ich persönlich fände es auch ziemlich 
langweilig wenn dem so wäre. Ich bastel lieber selber herum und freue 
mich anschließend wenn etwas passiert/funktioniert.

harald schrieb:
> ich finde die
> Dokumentation durchaus sehr detailliert, da steht auch nicht mehr oder
> weniger drin als was man erwartet. 1. ne Kurzbeschreibung, die
> Funktionen und in 90% der Fälle ein Code-Beispiel
Echt? Hast Du eine andere Dokumentation als wie ich?
Ich sehe zumindest in der PDF-Variante nur designbedingt abgeschnittene 
Infos die ja (aus welchen Gründen auch immer) in einem 
Inline-Frame-Design eingefügt werden müssen.
Ja Grundfunktionen und Methoden werden aufgeführt. Aber nicht welche 
benötigt werden und wie sie funktionieren. Für einen Anfänger ist das 
nichts obwohl man dort in den FAQ ja schreibt "anfängerfreundlich".

Ich verfolge gerade bei denen im Forum mit, wie der TE dort um Hilfe 
betteln muss. Der Autor der Lib antwortet ja fleissig ... mit 
Gegenfragen!
Entschuldige, aber fachlich kompetente und aussagekräftige Hilfe sieht 
für mich definitiv anders aus. Entweder ist der Autor selber Ahnungslos 
oder verfused. :D

@tom:
Ich muß dem Uwe aber recht geben: Nehme I2C/TWI für Deine Zwecke. 
Benutze die beiden Master- und Slave-Libs im Example-Ordner und fuchse 
Dich dort ein wenig rein. Die Dinger funktionieren schon irgendwie. 
Eigentlich ganz einfach sogar. Bin auch ein Anfänger und hatte nach ca. 
10 Minuten den Durchblick. ;-)

Gruß
Fusel

von Peter D. (peda)


Lesenswert?

Fusel schrieb:
> Nehme I2C/TWI für Deine Zwecke.

Das AVR-SPI ist eh nicht tauglich für MC-MC Kommunikation. Stätestens 
beim Slave-Transmitter kracht es.

Das I2C hat dagegen ein Handhake eingebaut. Der Master wartet immer auf 
den Slave, bis der SCL wieder auf high zieht, d.h. sein Byte gelesen 
oder geschrieben hat.

von harald (Gast)


Lesenswert?

Fusel schrieb:
> Echt? Hast Du eine andere Dokumentation als wie ich?
> Ich sehe zumindest in der PDF-Variante nur designbedingt abgeschnittene
> Infos die ja (aus welchen Gründen auch immer) in einem
> Inline-Frame-Design eingefügt werden müssen.
> Ja Grundfunktionen und Methoden werden aufgeführt. Aber nicht welche
> benötigt werden und wie sie funktionieren. Für einen Anfänger ist das
> nichts obwohl man dort in den FAQ ja schreibt "anfängerfreundlich".

hmm, ich benutze die Online-Dokumentation und wenn man bezüglich dem TWI 
die entsprechende Seite aufruft, erscheint bei mir eine Beschreibung, 
ein Verschaltungsbild, die Liste der Funktionen und ein komplett 
funktionierendes Master-Beispiel. Die ganzen Beispiele sind ja im Ordner 
Examples auch vorhanden, inkl. ein funktionierendes Slave-Beispiel!

Das ist doch nichts anderes als wie hier, das ist ein Wiki, wenn es 
jemand verstanden hat kann er es ja erweitern. Sorry, aber bissl selber 
nachdenken muss man schon, schau doch mal was hier passiert wenn einer 
nen Problem hat und nur mit halben Infos rausrückt was er eigentlich 
machen will.

Wenn ich ein Problem habe, dann beschreibe ich das möglichst komplett, 
kann ja sein das ich auf dem Holzweg bin mit meiner Idee und so ist es 
ja scheinbar auch wenn man mit SPI ein Haus vernetzen wollte.

von c-hater (Gast)


Lesenswert?

Peter Dannegger schrieb:

> Das AVR-SPI ist eh nicht tauglich für MC-MC Kommunikation. Stätestens
> beim Slave-Transmitter kracht es.

Na ein Glück, daß meine AVRs von dieser neuesten Danneggerschen 
Horrorstory noch nix gehört haben...

Sonst könnte ich z.B. nicht mit dem Teil hier

> http://nanorivertech.com/nanoboard.html

kommunizieren, denn das kann nur SPI-Master. Ich kann aber mit dem Ding 
reden, was wohl bedeuten muß, daß mein AVR Slave ist, was mich 
allerdings nicht überrascht, denn ich habe ihn tatsächlich auch als 
solchen programmiert.

Übrigens: Das, was NanoRiverTech da auf den Drawings als 
"USB-Controller" apostrophiert, ist nix anderes als ein PIC, womit wohl 
das Szenario einer MC-MC-Kommunikation als gegeben anzusehen wäre...

Fazit: Wer wirklich programmieren kann, kriegt auch einen AVR als 
SPI-Slave zum Laufen. Eigentlich ist das sogar überhaupt kein Problem, 
wenn man die Interrupt-Latenzen seiner Anwendung unter Kontrolle hat und 
keine angesichts dieser Latenzen unrealistisch hohe Bitrate für die 
SPI-Kommunikation wählt. Es muß einfach nur gewährleistet werden, daß 
auch im worst case innerhalb von 7,5 SPI-Takten nach dem IRQ das zu 
sendende Byte in SPIDR angekommen ist, dann flutscht SPI auch im 
Slave-Mode problemlos.

Im konkreten Fall wird übrigens 750kHz SPI-Takt verwendet. Naja, nicht 
gerade berauschend, aber ausreichend für das Problem und mit nur 
minimalen Umbauten der bestehenden Anwendung zu erreichen.

Es ging konkret darum, die Ergebnisse einer Signalverarbeitung in der 
AVR-Anwendung zu Debugging-Zwecken in Echtzeit in einen PC zu kriegen. 
Der naheliegende Weg, daß einfach via UART zu erledigen, schied leider 
wegen ungünstiger Taktfrequenz des AVR-Systems aus. Eine Änderung von 
20MHz auf 18.432MHz wäre zwar performancemäßig möglich gewesen, hätte 
aber erheblich mehr Änderungen an der Anwendung nach sich gezogen als 
der Einbau der Ausgabe via SPI-Slave. Insbesondere wären tiefgreifende 
Änderungen am zu debuggenden Teil der Anwendung selber nötig geworden, 
was das Debugging einigermaßen nutzlos hätte werden lassen.

von Peter D. (peda)


Lesenswert?

c-hater schrieb:
> Es muß einfach nur gewährleistet werden, daß
> auch im worst case innerhalb von 7,5 SPI-Takten nach dem IRQ das zu
> sendende Byte in SPIDR angekommen ist, dann flutscht SPI auch im
> Slave-Mode problemlos.

Nö, Du hast als Slave nur 0,5 SPI-Takte Zeit, das Byte ins 
Schieberegister zu schreiben, da das SPI keinen Sendepuffer hat, nur 
einen Empfangspuffer.

Natürlich kann man das Slave-Senden auf dem AVR irgendwie zusammen 
schustern, nur muß dann der Master lange Gedenkpausen einlegen oder den 
Takt deutlich verlangsamen. Und das ist definitiv nicht das, was ich 
unter einem brauchbaren SPI verstehe.
Slave SPI ist daher auf dem AVR alles andere als trivial und erst recht 
nicht Anfänger tauglich.


Z.B. beim AT89LP4052 hat Atmel nicht so einen Mist gebaut, der hat ein 
"Enhanced SPI with Double-buffered Send/Receive". Das ist aber kein AVR, 
sondern ein 8051.
Damit kann man bequem den maximalen Takt F_CPU/4 = 5MHz nehmen, ohne 
Datenbrei befürchten zu müssen.

von c-hater (Gast)


Lesenswert?

Peter Dannegger schrieb:

> Nö, Du hast als Slave nur 0,5 SPI-Takte Zeit, das Byte ins
> Schieberegister zu schreiben

Ja, richtig, das hatte ich glatt vergessen (ist schon eine kleine Weile 
her).

Man hat bei kontinuierlichem Takt wirklich nur 0,5 SPI-Takte Zeit, das 
stimmt. Dazu kommt allerdings die Zeit, die der Master einem gibt. Im 
konkreten Fall summierte sich das ziemlich genau zu 7,5 SPI-Takten.

> Natürlich kann man das Slave-Senden auf dem AVR irgendwie zusammen
> schustern, nur muß dann der Master lange Gedenkpausen einlegen

Das ist genau das Szenario.

Der Punkt ist: Der PIC auf dem Nanoboard hat wohl genauso zu kämpfen, 
denn der muß ja noch nebenbei USB fullspeed in Echtzeit bedienen und 
legt deshalb die "Gedenkpausen" wohl mehr oder weniger "freiwillig" ein. 
Dokumentiert sind sie beim Nanoboard übrigens nicht, ich mußte sie 
damals erst beim Support erfragen.

However: Es ist eine funktionierende MC-MC-Kommunikation via SPI mit dem 
AVR als Slave. Und sie ist durchaus brauchbar, ich habe damit jedenfalls 
letztlich den Fehler in der Signalverarbeitung gefunden. :o)

Davon mal abgesehen: Eine echte Dauerstrich-Kommunikation mit 
kontinuierlichem Takt kriegt AVR-SPI ja nichtmal als Master hin, selbst 
wenn er garnix anderes zu tun hat, das geht nur mit USART im SPI-Mode.

von Hans-Georg L. (h-g-l)


Lesenswert?

c-hater schrieb:
>
> Der Punkt ist: Der PIC auf dem Nanoboard hat wohl genauso zu kämpfen,
> denn der muß ja noch nebenbei USB fullspeed in Echtzeit bedienen und
> legt deshalb die "Gedenkpausen" wohl mehr oder weniger "freiwillig" ein.
> Dokumentiert sind sie beim Nanoboard übrigens nicht, ich mußte sie
> damals erst beim Support erfragen.
>

Dann haben die den falschen PIC verwendet ;)

Ich bastle gerade mit einem PIC24FJ128GC010, der hat 8fach Read/Write 
SPI Fifo und das lässt sich über DMA füllen bzw. leeren. Full Speed USB 
macht parallel die CPU oder über andere DMA Kanäle.

von c-hater (Gast)


Lesenswert?

Hans-Georg Lehnard schrieb:

> Dann haben die den falschen PIC verwendet ;)

Ich habe vergessen, welcher das genau ist, kann aber morgen (oops, ist 
ja schon morgen, also heute) oder spätestens am Montag diese Information 
nachliefern. Aber irgendwas mit PIC24... war es, da bin ich ziemlich 
sicher.

von Peter D. (peda)


Lesenswert?

Die eDIP von Electronic Assembly haben ja auch einen AVR:
"Das eDIP benötigt eine bestimmte Zeit um die Daten
bereit zu stellen; deshalb muss vor jedem zu lesenden
Byte mindestens 6μs gewartet werden (keine Aktivität
auf der CLK Leitung)."

Das tut schon richtig dolle weh, wenn man im SPI-Interrupt 120 CPU 
Zyklen nutzlos verwarten muß.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.