Ich möchte einen AD7609 an einen Raspberry (mit Raspbian) anschließen und habe mittlerweile auch alles auf dem Tisch liegen. Nun habe ich allerdings bisher nicht viel Erfahrung damit, in der Ausbildung haben wir keine SPI-Kommunikation aufgebaut. Für den bcm2835 des Raspberry gibt es eine lib (http://www.airspayce.com/mikem/bcm2835/), die direkt in C die Nutzung von SPI Befehlen erlaubt, allerdings werden da immer einzeln 8-bit eingelesen. Der AD7609 sendet allerdings über SPI alle 8 Kanäle mit jeweils 18bit direkt nacheinander (im Datenblatt S.26/27). Da bringt mir diese Lib nicht viel, oder? Dazu kommen ja nocht ein paar Punkte, wie z.B. senden eines Conversion-Start-Impuls, auslesen vom Busy-Flag usw. Muss ich mir jetzt die komplette Kommunikation selber konfigurieren? Oder gibt es zu solchen ICs für gewöhnlich schon fertige Librarys, und ich finde sie nur nicht?^^ Ich hoffe, mir kann da jemand den ein oder anderen hilfreichen Tipp nennen ;) Viele Grüße EGSler
EGSler schrieb: > allerdings werden da immer einzeln 8-bit > eingelesen. Na, passt doch. > Der AD7609 sendet allerdings über SPI alle 8 Kanäle mit jeweils 18bit > direkt nacheinander (im Datenblatt S.26/27). Der AD 'sendet' von sich aus überhaupt nichts. Der Pi ist es, der die Übertragung steuert. Wenn der nach jeweils 8 Bit eine kleine Pause einlegt, bis er den nächsten SPI Takt-Puls auf die Leitung legt, dann muss sich der AD danach richten. Du liest einfach eine entsprechende Anzahl an Bytes (jeweils 8 Bit) hintereinander ein und setzt dir aus diesen Bytes die 18 Bit Daten wieder selbst zusammen. Alles was du tun musst ist: darauf achten, dass dir der Pi die CS Leitung nicht versaut. CS geht auf Low entsprechende Anzahl an Bytes einlesen CS geht wieder auf High Aus den Bytes (die du zb in einem Array gesammelt hast), mit Bitoperationen die 18 Bit Einheiten wieder zusammensetzen.
So wie ich den Schaltplan vom Raspi lese, sind auf dem 26-poligen GPIO Sockel doch auch die SPI-Signale (Clock, Mosi Miso und 2 Chip-Enable). Damit sollten doch SPI-Geräte direkt angeschlossen werden können? Unter Linux kann man auch /dev/spiXXX öffnen, und mit ioctl() Transfers auslösen.
Karl Heinz schrieb: > Aus den Bytes (die du zb in einem Array gesammelt hast), mit > Bitoperationen die 18 Bit Einheiten wieder zusammensetzen. Stimmt, das ergibt irgendwo Sinn, dann erscheint das plötzlich doch nicht mehr so kompliziert. Das sollte machbar sein =) @ PittyJ Ja, die herausgeführte SPI0-Schnittstelle verwende ich. Ok, die von Linux integrierte Funktion kannte ich nicht, bin ich bisher bei meinen Recherchen komischerweise nicht drüber gestolpert. Ich werd mir das mal ansehen ;)
Zum Zusammensetzen der Bytes habe ich noch eine kleine Frage. Für meinen Kanal1 mit 18 bit brauch ich die ersten beiden Bytes der Übertragung komplett und vom dritten Byte die beiden höchstwertigen Bits (Übertragung mit MSB first). Wenn ich mir das dann so zusammenstückel, sollte das funktionieren, nicht wahr? Da werden beim Verschieben der Bits keine Nullen nachgeschoben, sodass ich mir die bereits drinstehenden Daten nicht überschreibe, richtig?
1 | long Ch1 = (Byte0 << 10) + (Byte1 << 2) + (Byte2 >> 6) |
Ach moment, führt der Compiler bei dieser Operation intern vielleicht eine Veroderung durch? Zumindest ergäbe das für mich gerade Sinn...^^
Für den MCP3008 beschreibt ein Tutorial die Zusammenhänge. https://learn.adafruit.com/reading-a-analog-in-and-controlling-audio-volume-with-the-raspberry-pi/overview Zumindest arbeitet der auch mit SPI. So viel anders kann es nicht sein.
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.