RPi: SPI Verständnisproblem

TommyB

Team Bitschubse
17. Mai 2010
2.151
80
48
40
127.0.0.1 ;)
Sprachen
  1. C#
  2. VB.Net
  3. LunaAVR
  4. Assembler
  5. Python
Da es sich wieder um den Raspberry dreht diesmal wieder im OffTopic :)

Ich bin grade dabei zu verstehen wie der SPI Port so "tickt". Zumindest versuche ich es.
Die Installation war schon mal grausam. Viele Informationen im Netz die von nem simplem Download bis hin zur Kernel Kompilierung alles beschrieben und sich gegenseitig widersprachen... Aber ich habe es endlich zum Laufen bekommen *yay*

Aaaber nur so ein bisschen. Weil einfach nur dumme Bytes raus schieben geht ja nicht, man muss ja noch (ggf.) den Mode und Frequenz und sowas alles einstellen. Und da gehts schon wieder los, der Wrapper der SPI für Python verfügbar macht ist im Netz so garnicht dokumentiert, nur in der original c Datei (man läd sich den Source runter). Immerhin etwas. Deswegen wollte ich das Ganze mal einigermaßen vernünftig dokumentieren. Aber einige Fragen sind da noch offen.

Zum Beispiel: Was ist threewire? Und was meinen die mit loopback?

Ich schmeiß mal das was ich fertig hab nebst der c Datei in den Anhang, vielleicht kann mir ja wer auf die Sprünge helfen.

Anhang anzeigen spidev_module.c

... Ok, die pdf denn doch als Link, is größer als 200kb
http://tightDev.net/SpiDev_Doc.pdf
 
Das mit den Three wires ist leider nicht überall einheitlich. So nennt Atmel das Interface TWI (Three Wire Interface), und meint damit SCK, MISO und MOSI. Die ChipSelect/ChipEnable-Leitung wird nur zum erzwingen des Slave-Modes hardwareseitig unterstützt.

Teilweise findet man auch 4-Wire-Interface für SPI, eben mit der CS-Leitung. Bei einigen Devices sogar mit mehreren CS-Leitungen (Displays von ElectronicAssembly ? ).

Was bei Dir aber passen könnte ist, das zusammenfassen von SI und SO auf eine Leitung (Halbduplex). Das scheint Deine Vermutung zu sein (Dein Kommentar).

Wikipedia - Serial Peripheral Interface Bus schrieb:
However, when someone talks about a part supporting a three-wire serial bus you should always find out what it means: standard four-wire SPI, without the chip select pin from that count, since most buses use chip selects but only three wires carry "real" signals; (More, sometimes with an unshared SPI bus segment the device's chip select will be hard-wired as "always selected".) "real" three-wire SPI; or even a RS-232 cable with RXD, TXD, and shield/ground, or an application-specific signaling scheme.

Zum loopback:
Einige komplexere Hardware besitzt zum testen der Sende-/Empfangswege einen aktivierbaren loopback-Testmode. Dabei werden die sonst verwendeten Pins tristate, SI und SO innerhalb der Hardware (!) miteinander verbunden. Das Device führt dann Selbstgespräche.

Nachtrag: Wiso kannst Du bei der Himbeere nicht einfach Bytes rausjagen? Klar, die Hardware muß natürlich vorher wissen, wie (CPOL, CPHA, Clockrate etc) - aber beim AVR muß das einmal eingestellt werden, danach kann man jederzeit (so grad nix gesendet wird) das versenden eines Bytes durch beschreiben des SPI-Datenregisters initiiert werden. (die entsprechenden Konfigurationsbits besitzen natürlich Voreinstellungen - ob die bereits für einen konkreten Fall passen ist 'ne andere Sache)
Mußt Du beim RPi vor jedem Byte die Einstellungen (neu) angeben?
 
Hi,

Das mit den Three wires ist leider nicht überall einheitlich. So nennt Atmel das Interface TWI (Three Wire Interface), und meint damit SCK, MISO und MOSI. Die ChipSelect/ChipEnable-Leitung wird nur zum erzwingen des Slave-Modes hardwareseitig unterstützt.
ist das TWI nicht das Two-Wire-Interface (I2C) von Atmel?

SPI hab ich aber wie schon von dir geschrieben oft bei anderen Herstellern als Three-Wire-Interface oder Four-Wire-Interface gesehen. Das ist dann SI/SO/CLK oder SI/SO/CLK/CS. Wobei diese Interfaces nicht wirklich SPI sein müssen. Bei manchen Chips wird dann mit den wunderlichsten Signalwechseln eine Datenübertragung gemacht. Die wirkliche Erleuchtung bringt bei den Chips eigentlich nur das Datenblatt. Man sollte also mit den Schnittstellenbezeichnungen immer recht vorsichtig sein und immer vorher mal ins Datenblatt sehen was der Hersteller da denn nun wirklich gemeint hat.

Gruß
Dino
 
Ups... stimmt. Damit habe jetzt auch ich zur allgemeinen Verunsicherung beigetragen.
Hintergrund ist das USI der Tinies gewesen - dieses läßt sich mehr oder weniger als IIC verwenden (TWI - SDA und SCL mit Pullups und Protokoll-Overhead) - nennt sich hier Two Wire Synchronous Datatransfer.
Oder eben als SPI mit 3 Leitungen (beide Signale und Clock), nennt sich dann Three Wire Synchronous Transfer.

Mit TWI bezeichnet ATMEL das IIC/I²C, stimmt.
 
Mit threewire, das könnte natürlich gut sein dass damit das interne Handling der CS Leitungen (der hat 2) abgeschaltet wird, werd das nachher auf jeden Fall mal testen. Ich dachte erst weil da was von SI und SO stand (serial input, serial output?) dass es nur eine Datenleitung gibt, aber das verwirrte mich. Weil normalerweise sendet der Slave ja beim nächstem Byte das zuletzt empfangende zurück was bei mehreren Bytes zur Kollision führen würde. Alles merkwürdig. Naja ich hab grad nur ein Display hier mit SPI (EA DIP204, die haben ne Lötbrücke zum umschalten für Parallel / SPI). Wenn das läuft gehts ans Try and Error :)

Loopback, das wusste ich garnicht, klingt aber doch sehr brauchbar :)

Wie kommst du darauf dass man das immer wieder neu setzen muss?
Ich setze am Anfang der Anwendung (naja, des Scripts eher) die Einstellungen für SPI und arbeite denn in der Main Loop wie ich will. Am Ende schließe ich SPI wieder bevor das Programm beendet wird, wie beim AVR auch. Oder hab ich dich jetzt falsch verstanden?


p.S.: Das sind nicht meine Kommentare sondern ich hab die aus der .c Datei zusammen gesucht, ggf. nur etwas erweitert / (für mich) verständlicher gemacht :)
 
Hi,

Ich dachte erst weil da was von SI und SO stand (serial input, serial output?) dass es nur eine Datenleitung gibt, aber das verwirrte mich. Weil normalerweise sendet der Slave ja beim nächstem Byte das zuletzt empfangende zurück was bei mehreren Bytes zur Kollision führen würde. Alles merkwürdig.

SPI sind eigentlich zwei zu einem Ring geschaltete 8Bit-Schieberegister die mit einem gemeinsamen Takt betrieben werden. Also SO des einen an SI des anderen oder MOSI des Masters an SI des Slaves und MISO des Masters an SO des Slaves.

Bei der Übertragung wird dann natürlich der Inhalt der beiden Schieberegister ausgetauscht. Also beide liefern die enthaltenen Daten auf ihre SO-Leitung und nehmen an der SI-Leitung den Inhalt des jeweiligen anderen entgegen.

Durch die CS-Pins kann man mehrere Slave-Schieberegister parallel schalten. Es fühlt sich dann nur das angesprochen was mit CS aktiviert wurde. Alle anderen nehmen nichts an und verhalten sich passiv.

Mit der Phasenlage muß man dann Master und Slave aufeinander einstimmen. Je nachdem ob das SSchieberegister bei fallender oder steigender Flanke den Pegel auf der SI-Leitung übernimmt. Der Ruhepegel wird dadurch auch eingestellt damit dann auch mit der richtigen Flanke bei der Übertragung angefangen werden kann. Damit werden dann die Modi 0 bis 3 erzeugt. Also ...
Ruhepegel Low, Übernahme mit fallender Flanke
Ruhepegel Low, Übernahme mit steigender Flanke
Ruhepegel High, Übernahme mit fallender Flanke
Ruhepegel High, Übernahme mit steigender Flanke

Wenn das nicht zusammen paßt, dann verliert man entweder das erste oder letzte Bit der Übertragung oder es ergeben sich andere recht komische Phänomene mit Bitverschiebungen und Einstreuungen.

Gruß
Dino
 
wegen
...Weil einfach nur dumme Bytes raus schieben geht ja nicht, man muss ja noch (ggf.) den Mode und Frequenz und sowas alles einstellen...
Dann hatte ich Dein "gequengel" nur falsch interpretiert. Solche Einstellungen mußt Du natürlich beim AVR vorher auch einmal machen. Und das nicht nur beim SPI, sondern auch beim I²C, oder selbst beim simplen UART.

Wenn die Kommentare "original" sind, klingt das allerdings eher nach einer gemeinsamen verwendeten Leitung für Si und So. Im englischsprachigem Wiki wird etwas derartiges angedeutet:
There are also hardware-level differences. Some chips combine MOSI and MISO into a single data line (SI/SO); this is sometimes called three-wire signaling (in contrast to normal four-wire SPI). Another variation of SPI removes the chip select line, managing protocol state machine entry/exit using other methods; this isn't usually called three-wire though. Anyone needing an external connector for SPI defines their own: UEXT, JTAG connector, Secure Digital card socket, etc. Signal levels depend entirely on the chips involved.
Wie das mit dem Halbduplex dann konkret gehandhabt wird, ist mir auch nicht ganz klar, da SPI ja mit den normalerweise verbundenen Schieberegistern per Definition Vollduplex ist...

P.S.: genau genommen sendet der Slave nicht das letzte empfangene Byte zurück, sondern den Inhalt seines Datenregisters. Das kann (!) natürlich das zuletzt empfangene Byte sein - der Slave kann aber zwischenzeitlich auch irgendwas anderes in diesem Register platziert haben...
 
Hmmm denn ist das wohl doch tatsächlich so dass der denn nur eine Datenleitung nutzt... Naja, ich muss es ja weder verstehen noch nutzen ^^

Will nur die Dokumentation einigermaßen verständlich gestalten. Vielleicht nützt sie ja noch den Einen oder Anderem.


p.S.: "Gequengel"? 0.o
 
"gequengel": Ich will doch nur bla... warum muß ich da denn noch blub und trallala... :p
;)

P.S.: grad 'n Elektor-Newsletter überflogen:
in den letzten beiden Folgen von Elektor.POST ging es um die seriellen Schnittstellen UART und SPI auf dem Expansion Header von RPi. Nun vervollständigen wir das Ganze mit dem letzten seriellen Interface: I²C.
Hmm... muß an mir vorbeigegangen sein... soll ich mal den Download suchen? (Bist Du nicht selbst Abonent gewesen?)
 
Ein bissl OffTopic.

Scheinbar ist dieses Forum bei Google beliebt ^^
Zumindest schrieb mich gestern jemand per E-Mail an (auf englisch, irgendwo aus Amerika) und hatte Fragen zum Thema RasPi und SPI nachdem er es wie in meiner pdf gemacht hat. Ich hab die aber nur hier verlinkt weils ja noch nur ein Entwurf ist ^^

Aber scheinbar ist alles verständlich und funktioniert auch so wie ich geschrieben habe. Am SPI lag sein Problem nämlich nicht :)


Hatte ich ganz übersehen: Ne, ich hab die Elektor nicht abonniert :)
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)