Forum: Mikrocontroller und Digitale Elektronik SPI mit mikrocontroller im daisychain


von dotm (Gast)


Lesenswert?

hallo.
Ich habe versucht PIC Mikrocontroller der PIC18 serie im SPI modus in 
serie zu schalten.
Irgendwie scheinen diese jedoch nicht so zu funktionieren wie ich mir 
das gedacht habe.
Gewüscht wäre dass die Daten solange durch die einzelnen PIC Mikros 
durchgeschickt werden bis jedes paket an der richtigen stelle ist und 
dann die SS Leitung wieder auf HI geht und die daten somit übernommen 
werden.

Tatsächlich passiert folgendes:
-der Inhalt des Spi-Schieberegisters (sspsr) wird in den Spi Buffer 
(sspbuf) übertragen.
-das buffer full flag (bf) wird gesetzt
Wenn ich das nächste Byte übertrage wird dann das vorherige byte 
rausgeschoben.
Nach fertigen Transfer des zweiten Bytes aber bewirkt das gesetzte BF 
flag , dass der sspsr wieder mit dem Inhalt des sspbuf beschrieben wird.

Will ich also bewirken dass mehr als zwei Bytes durch die Daisychain 
durchgeschoben werden , muss ich das bf Flag nach jeweils 8bit löschen.
das geht nur(!) indem ich den sspbuf auslese.

Eigentlich sollte SPI Daisychainbar sein ohne dass ich per Software 
(Interrupt) ständig Flags lösche.

Ich bin jetzt nicht auf PICs angewiesen. Kennt ihr Mikrocontroller die 
sich da anders verhalten?

fg
markus

von dotm (Gast)


Lesenswert?

Ich habe vergessen zu erwähnen :
vor "-der Inhalt des Spi-Schieberegisters (sspsr) wird in den Spi Buffer
(sspbuf) übertragen."
wird natürlich erst mal ein byte übertragen.

von dotm (Gast)


Lesenswert?

hat da keiner eine antwort?

von dotm (Gast)


Lesenswert?

ich brauch diesbezüglich immer noch hilfe.

von Juergen G. (jup)


Lesenswert?

> Will ich also bewirken dass mehr als zwei Bytes durch die Daisychain
> durchgeschoben werden , muss ich das bf Flag nach jeweils 8bit löschen.
> das geht nur(!) indem ich den sspbuf auslese.
>
> Eigentlich sollte SPI Daisychainbar sein ohne dass ich per Software
> (Interrupt) ständig Flags lösche.
>


Was stoert Dich daran, wenn Du das Register auslesen "musst" befor es 
weiter gehen kann.

Ich habe jetzt von den PIC's nicht die Ahnung, aber bei den AVR kann ich 
einen Interrupt auf den SPI ansetzten, und wenn Daten angekommen sind, 
liest die ISR diese Daten in eine dummy Variable und es kann weiter 
gehen.
Beim lesen der Daten werden diese ja nicht geaendert und der naechste in 
der Kette bekommt genau diese Daten.

Ju

von dotm (Gast)


Lesenswert?

Nein leider. Wenn die Daten nicht ausgelesen werden wird das sspsr immer 
wieder mit dem vollen ssbuf überschrieben.
Ohne ständiges Pollen bekommt die restliche Daisychain das erste Byte 
das im ssbuf hängen geblieben ist.
Was mich stört ist dass ich nicht mit voller Geschwindigkeit durch die 
Daisychain durchfahren kann (wollen tu ich 30mhz).
Das Schieberegister sspsr packt zwar 30mhz aber mit dem Pollen komm ich 
nicht nach.
Ausserdem brauch ich einen Interrupt den ich eigentlich für ss (beim 
daisychainen sowas wie latch) Leitung verwenden wollte.
Eigentlich sollte SPI ja daisychainbar sein, das verhalten der PICmikros 
scheint dem aber entgegenzuwirken.
Mir ist es egal auf welcher Platform ich programmiere. Hauptsache SPI 
funktioniert so wie es sollte.

von Juergen G. (jup)


Lesenswert?

Dann lies Dich doch mal in die AVR's von Atmel ein, da wirst Du Dich 
freuen was alles geht. ...  und wie schnell das gehen kann und fuer was 
es alles eigene Interrupts gibt.

Auch hast Du dann hier im Forum mehr Leute die Dir helfen koennen.

Wenn Du mit "30mhz" 30MHz  also 30 Mega Hertz meinst, da kommen die 
kleinen AVRs nicht hin. Das schnellste SPI was ich mit einem 16MHz 
Crystal an einem AVR hinbekommen habe ist 1.2 MHz.

Ju

von dotm (Gast)


Lesenswert?

@ juergen: verstehst du überhaupt meine Problematik?

von Juergen G. (jup)


Lesenswert?

dotm schrieb:
> @ juergen: verstehst du überhaupt meine Problematik?

ahhh ok jetz wo Du so fragst, offensichtlich nicht.

Ich habe bis jetzt immer nur mehrere uC's am SPI zusammengehaengt aber 
immer nur mit dem "gesprochen" bei dem SS auf low ist.

Das willst Du warscheinlich nicht machen wegen der notwendigen SS Pins.



Ju

von dotm (Gast)


Lesenswert?

Ich will die Mikrocontroller (etwa 100 Stück) als Slaves im Daisychain 
betreiben.
SPI-Slaves im Daisychainbetrieb verhalten sich wie ein grosses 
Schieberegister bei dem die Daten durch alle durchgeschickt werden bis , 
wenn alles an der richtigen Stelle, die SS-Leitung mit einer positiven 
Flanke alles übernimmt.
http://www.maxim-ic.com/app-notes/index.mvp/id/3947
Mein Problem ist , nocheinmal, dass das SPI Schieberegister(sspsr) nach 
8 übertragenen Bits , also im falle eines vollen SPI I/O Buffers 
(ssbuf), immer den Inhalt des ssbuf zurück ins sspsr schreibt, somit ein 
Daisychainbetrieb ohne ständiges Pollen nicht möglich ist.
Im Klartext heisst das , wird nach dem ersten Byte ssbuf nicht geleert , 
bekomme jeder dahinter hängende mcu genau dieses Byte wieder und wieder.
SPI ist aber für den Daisychainbetrieb ausgelegt, also offensichtlich 
von Microchip unvollständig implementiert?

von Juergen G. (jup)


Lesenswert?

> Ich will die Mikrocontroller (etwa 100 Stück) als Slaves im Daisychain
> betreiben.

So hab ich das auch verstanden

> SPI-Slaves im Daisychainbetrieb verhalten sich wie ein grosses
> Schieberegister bei dem die Daten durch alle durchgeschickt werden bis ,
> wenn alles an der richtigen Stelle, die SS-Leitung mit einer positiven
> Flanke alles übernimmt.
> http://www.maxim-ic.com/app-notes/index.mvp/id/3947

Das mit dem SS hab ich ein wenig anders im Kopf. SS muss Low bleiben 
solange Du dem Slave was schickst, sonst fuehlt er sich nicht 
angesprochen und nimmt demzufolge die Daten nicht an.

> Mein Problem ist , nocheinmal, dass das SPI Schieberegister(sspsr) nach
> 8 übertragenen Bits , also im falle eines vollen SPI I/O Buffers
> (ssbuf), immer den Inhalt des ssbuf zurück ins sspsr schreibt, somit ein
> Daisychainbetrieb ohne ständiges Pollen nicht möglich ist.
> Im Klartext heisst das , wird nach dem ersten Byte ssbuf nicht geleert ,
> bekomme jeder dahinter hängende mcu genau dieses Byte wieder und wieder.
> SPI ist aber für den Daisychainbetrieb ausgelegt, also offensichtlich
> von Microchip unvollständig implementiert?

Darauf habe ich in einem der obigen Posts angespielt. Bei den AVR's ist 
der Input buffer ein Doppel-Puffer, der output puffer ein single buffer 
und fuer die eingehenden Bytes gibt es einen eigenen Interrupt der Dir 
sagt wenn das Byte komplett ist.

Somit kann man das Dein Problem wie folgt in Angriff nehmen.
Alle MISO MOSI der uC's in einer Kette wie die SI SO Pins bei normalen 
Shift Registern. Alle SCK zusammen und SS zusammen und einen weiteren 
I/O Pin aller uC's als feedback zusammen um dem Master mitzuteilen wann 
das naechste Byte raus kann.
SPI-Complete Interrupt aller uC's aktivieren.
Wenn SPI-Complete Interrupt in den Slaves anspricht die Feedback Leitung 
auf High/Low, damit weiss der Master das Daten in den Slaves verarbeitet 
werden.
Die Slaves lesen den Input Buffer und schreiben den Inhalt ins output 
Register. Wenn fertig lassen sie die Feedback Leitung wieder los.
Wenn alle Slaves die Feedback Leitung losgelassen haben schickt der 
Master das naechste Byte, Der Clock kommt vom Master und somit schieben 
alle Slaves den Inhalt des output registers in das Input register des 
naechsten uC.

Dadurch das das ganze ueber den eigens dafuer bestehenden Interrupt 
getriggert wird, faellt das pollen weg. Und das kopieren der Daten vom 
Input in den Output Buffer ist ein Cyclus.

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.