Wie liest Daten von einem seriellen (SPI) - Verbindung in C?
Ich versuche, ein Programm zu schreiben, das installiert wird, auf einem Linux-MCU (Raspberry Pi), das Lesen von seriellen Daten kommen, um es aus noch einem anderen MCU (etwas homegrown, dass ich mir selbst zu bauen).
Habe ich recherchiert, wie dies zu tun, und denke, dass ich das "große Bild", aber noch fehlen ein paar Dinge. Zum einen, brauche ich zum aktivieren des kernel-Moduls und geben mir Zugang zu dem Gerät:
sudo modprobe spi_bcm2708
sudo chown `id -u`.`id -g` /dev/spidev0.*
Von dort können das berühmte C-Datei zum testen des SPI-Verbindung.
So, jetzt ist die Verbindung da, aber ich muss es noch Lesen von seriellen Daten aus. Nach der Antwort auf diese Frage ALSO, ich muss einfach:
...öffnen Sie den entsprechenden port für das Lesen und verwenden
read()
um die Daten zu erhalten.
Jedoch das code-snippet in dieser Antwort scheint sich zu öffnen einen port durch einen Gerätetreiber, der nicht per SPI.
Meine Verständnis war, dass ich verwenden könnte, SPI zum Lesen von Daten aus dem angeschlossenen MCU-Gerät, und das würde ich nicht schreiben müssen, mein eigenes Gerät Treiber für das entsprechende Gerät. Ist das wahr? Wenn ja, wie würde ich Lesen aus einer SPI-Verbindung, und wie würde das code anders als der code in der Antwort auf die Frage oben verlinkten?
Und wenn mein Verständnis falsch ist, und ich lese "durch" ein device-Treiber, wozu brauche ich den Treiber überhaupt? Nicht, dass das, was SPI Hoffnungen zu umgehen? Vielen Dank im Voraus.
int fd = open("/dev/spidevname", O_RDONLY);
dann verwenden tcsetattr()
.Danke @H2CO3 (+1) - aber ist das nicht
/dev/spidevname
ein Treiber? Oder ist es der Treiber für den SPI-port (in dem Fall, dass macht Sinn, und ich denke, dass ich "get it"). Nochmals vielen Dank.wenn Sie schließen Sie ein unterstütztes Gerät, dann die Treiber/der kernel einen speziellen device-Datei, um Sie in der Lage sein, darauf zuzugreifen, und dieses spezielle Gerät aufgelistet ist unter
/dev
. Das ist nicht "der Fahrer" - der Treiber ist eine software-Komponente, die die eigentliche low-level - (hadrware -) Kommunikation.Ok, jetzt sind wir an die Wurzel meiner Frage: der MCU, dass ich den Anschluss ist ein Brett ich selbst (es enthält eine Kamera, einige LEDs und einem ARM-Prozessor alle auf der gleichen platine). So Frage ich mich, wenn ich schreiben müssen, ein Gerätetreiber für diese homegrown-MCU, und installieren/laden Sie den Treiber auf meiner Mainboard (wo der gesamte code für das Lesen von seriellen verbindungen wird ausgeführt). Wenn ich schreiben müssen, meine eigenen Treiber, dann warum? Ich dachte, das ist der service, SPI zur Verfügung gestellt. Und wenn ich nicht schreiben müssen, meine eigenen Treiber, dann wie wird
/dev/spidevname
für mich verfügbar sein?InformationsquelleAutor IAmYourFaja | 2012-12-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
[MCU ist nicht der richtige Begriff zu verwenden. Der Raspberry Pi nutzt ein SoC (System on a Chip). Ein mikrocontroller wäre ein günstiger & einfachere Geräte, als ein SoC. Wenn Sie verwenden möchten, TLA, dann SBC, single board computer.]
[Sie missbrauchen die Begriffe "serial port" und "serial data". Heute, aufgrund der weiten Verbreitung von PCs, "serial port" ist gekommen, um beziehen sich ausschließlich auf EIA/RS-232 asynchrone serielle verbindungen. SPI. USB. I2C, TWI, SATA et cetera sollte nicht verwiesen werden, wie "serial" verbindungen, es sei denn, Sie erklären, wie Sie funktionieren.]
In Linux SPI-Treiber ist oft implementiert als *Plattform-Treiber" eher als eine Zeichen-Treiber. Deshalb so einen Treiber würde keine Datei-Operationen, oder fops, durchführen open(), read(), write() oder close(). Eine solche operation sind für die Zielgeräte, die die Plattform-Gerät mit dem system. Als eine Konsequenz, Plattform-Geräte nicht über device-nodes in
/dev
wie Ziel-Geräte tun. SPI ist in die gleiche Kategorie wie USB und PCI; Sie sind alle Busse und in der Regel implementiert, die als platform-Treiber.Die Antwort hängt davon ab, ob der kernel, den Sie verwenden hat eine SPI-char-Gerät ausgesetzt, die für Ihre Benutzer-Programm zu verwenden. Aber wenn der SPI-Treiber ist ein Plattform-Treiber, dann ein Treiber für die benutzerdefinierte SBC hätte umgesetzt werden. Dieses Ziel Gerät brauche einen Knoten in
/dev
, major-und minor-Nummern zugewiesen und ein Fahrer im Zusammenhang mit diesen zahlen. Dieser Treiber würde nutzen die Plattform-Operationen, die der SPI-Treiber bietet, oder verwenden Sie die Linux-SPI API zum ausführen der transfers. Das SPI und seine Treiber sind nur Leitungen für die übertragung von Daten zwischen diesem Prozessor und dem Ziel-Gerät. Wie SATA und PCI, die Nutzer selten bewusst, diese (interne) Busse, die den Anschluss von Peripheriegeräten an den computer.linux/drivers/spi/spi_bcm2708.c
ist ein Plattform-Treiber. Es hat keine fops zu unterstützen/durchführen open(), read(), write() oder close() Operationen. Es registriert sich selbst als ein SPI-master, damit andere (Ziel -) Treiber verwenden können, die SPI API für seine Dienste.IMO wäre es besser aus der Umsetzung eines EIA/RS-232-Verbindung zwischen dem RPI und Ihre benutzerdefinierten SBC. Wenn nicht-kanonischen (raw) - transfers verwendet wurden, dann wahrscheinlich 99% des Codes, den Sie schreiben, wird wiederverwendbar sein, wenn Sie konvertieren/aktualisieren, um eine SPI-Verbindung. Ein 3-Draht, serielle Verbindung mit "no flow" - Steuerung ist ähnlich wie ein SPI-Verbindung, aber nicht mit master - /slave-Hierarchie auferlegt, ein einfacher HW-Schnittstelle, und mehr möglich, die Länge der Kabel.
Beachten Sie, dass Sie möglicherweise nicht in der Lage zu erreichen, schnelle übertragungsraten mit langen SPI-Entfernungen mit was auch immer Kabel-rig. Die 10s-Mbit /s-Tarife für SPI sind in der Regel auf multilayer-Platinen mit masseflächen und kurze Spuren.
InformationsquelleAutor sawdust
Unter Unix ist alles eine Datei
Wenn die
spi_bcm2708
Treiber richtig installiert sollte es eine/dev/whatever
- Datei für das Gerät ( oder mehrere für den Zugriff auf das Gerät in unterschiedlicher Weise).Wenn man nicht automatisch erstellt, Sie können einen Eintrag mit mknod
User-space-code hat einfach zu öffnen
/dev/whatever
- Datei, als ob es jede andere normale Datei, und Lesen/schreiben von Daten von ihm. Das ist der ganze Punkt von Unix.edit: das ist genau das, was der code in dem verlinkten Frage ist es öffnen Sie das terminal
/dev/ttyS0
als eine Datei mit open() und Lesen/schreiben.spi_bcm2708
. Es klingt wie Sie sagen mir, dass in dies zu tun, Linux wird automatisch ein/dev/whatever
- Datei. Ist das richtig? Wenn nicht, bitte korrigieren Sie mich. Sonst, wenn ich richtig bin, dann bin ich garantiert, dass das Lesen/schreiben auf/dev/wahetever
ist mit SPI-serial comm und nicht etwas anderes zu tun......wie Sie eine grüne LED on/off auf dem Raspberry Pi board?
bin ich garantiert, dass das Lesen/schreiben auf /dev/wahetever ist mit SPI-serial comm und nicht etwas anderes tun..." - was anderes würde es tun, ganz ehrlich? Warum wollen Sie eine spezielle "Garantie" für diese?
Was ist, wenn die Macher von Raspberry Pi schrieb die
spi_bcm2708
Gerätetreiber, die Anwendungsentwicklern ermöglicht, um: (a) kommunizieren über eine SPI-Verbindung zu anderen Geräten, und (b) stellen Sie die grüne LED (wird mit dem Pi-board) on/off. Wenn ich Lesen/schreiben/dev/whatever
, wie kann ich festlegen, um die Treiber, die ich lese, aus einem seriellen SPI-Verbindung, und nicht versuchen, Lesen Sie die on/off Wert der grünen LED?Diese sind die gleichen, im wesentlichen. Um eine LED an-und ausschalten zählt als "Kommunikation mit einem anderen Gerät". (Auch, entscheiden, ob Sie erwägen, den Vorstand oder den PC als master-Gerät, das ist immer verwirrend...)
InformationsquelleAutor Martin Beckett
Haben, finden Sie Linux-Dokumentation von SPI ?
Gibt es paar gute Dokumente: spi-Zusammenfassung und spidev.
Gibt es auch Beispiel-Datei spidev_fdx.c, wo
read()
wird für SPI-Gerät.Aber in der Regel Lesen von SPI erfolgt durch
ioctl()
Funktion.InformationsquelleAutor SKi