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
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.
> 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
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.
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
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
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?
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.