Forum: Mikrocontroller und Digitale Elektronik SPI Bus am Raspberry


von Zeno (Gast)


Lesenswert?

Hallo zusammen!

Ich habe bei mir dieses Hutschienenmultimeter 
(https://www.conrad.de/de/p/entes-epm-06cs-din-programmierbares-3-phasen-din-schienen-ac-multimeter-epm-06cs-din-spannung-strom-frequenz-betrieb-103280.html) 
verbaut. Das Teil hat eine RS485 Schnittstelle die ich mit einem RasPi + 
RasPiComm- Karte auslese. Für die RS485 Schittstelle wird vom Hersteller 
der RasPiComm Karte ein Kernelmodul zur Verfügung gestellt, welches ich 
auch installiert habe. Die RS485 Schnittstelle wird via SPI über einen 
MAX3140 realisiert. Das Ganze funktioniert auch erst mal schon seit 
einiger Zeit.

Jetzt wollte ich das ganze mit einer PiFace Digitalkarte erweitern die 
ebenfalls über den SPI Bus läuft. Auf der PiFace Karte ist ein 
MCP23S17SP verbaut, der ebenfalls über SPI gesteuert wird.

Beide sollten eigenlich zusammen am SPI Bus funktionieren, da man ja 2 
Kanäle CE0 (/dev/spidev0.0) und  CE1 (/dev/spidev0.1) zur Verfügung hat. 
Theoretisch sollte es sogar mit einem Kanal funktionieren, da die RS485 
mit CE0=1 und die Interfacekarte mit CE0=0 aktiviert wird.
Das Problem ist das das Kernelmodul für die RS485 beim Laden die 
/dev/spidev* Devicefiles entfernt. Damit ist die Interfacekarte über 
diese Devicefiles nicht mehr ansprechbar. Eigentlich soll das 
Kernelmodul nur /dev/spidev0.0 entfernen, aber er entfernt beide. Ich 
kann zwar das Devicefile wieder anlegen aber es wird nicht erkannt oder 
geblockt.

Also habe ich mir gedacht, verzichtest Du halt auf das Kernelmodul und 
schreibste halt was Eigenes. Es gibt da eine Bibliothek (bcm2835) mit 
der man SPI Gedöns relativ einfach ansprechen kann. Dies scheint auch zu 
funktionieren und für das PiFace gibt es auch genug Dokumentation so das 
man da eine passende Befehlssequenz hin bekommt.
Beim MAX3140 sieht es da relativ dünne aus. Es gibt da lediglich ein 
Datenblatt wo am Ende etwas zur Programmierung steht, aber da werde ich 
nicht wirklich schlau draus.
Habe mich versucht im Netz kundig zu machen aber daa hält man sich auch 
eher bedeckt.
Deshalb meine Frage: Hat da jemand schon mal was in der Richtung oder 
kennt zumindest die Befehlssequenzen mit der der MAX3140 zu Mitarbeit zu 
bewegen ist. Also solche Sachen wie kann ich abfragen ob das Teil 
überhaupt vorhanden ist, wie erreiche ich das ein Byte per RS485 
gesendet wird usw.
Da ich da schon eine Weile sitze bin ich für jeden Hinweis dankbar. Das 
kann doch nicht so schwer sein.

Achso die Abfrage der RS485 muß nicht permanent erfolgen, so wie beim 
Kernelmodul. Ich frage die Daten eh nur einmal pro Minute ab.
Evtl. würde es auch reichen wenn man es hinbekommt das Löschen der 
spi-Devicefiles durch das Kernelmodul zu verhindern.

von John Doe (Gast)


Lesenswert?

Rührende Geschichte!
Was schreibt der Hersteller auf Deine Anfrage hin?

von Wolfgang (Gast)


Lesenswert?

Zeno schrieb:
> Theoretisch sollte es sogar mit einem Kanal funktionieren, da die RS485
> mit CE0=1 und die Interfacekarte mit CE0=0 aktiviert wird.

Das muss dann aber an den Interfacekarten liegen. MAX3140 und MCP23S17 
werden beide mit CS aktiv low angesteuert. Was soll das für eine 
RasPiComm-Karte sein, auf der CS invertiert gesteuer wird?

von PittyJ (Gast)


Lesenswert?

Hm, ich verstehe das Problem nicht so ganz.
Den bus kann man doch wunderbar ansprechen mit ioctl:
  struct spi_ioc_transfer SpiTransfer[1];
  Status = ioctl (FileSpiDevice,
      SPI_IOC_MESSAGE(1),
      &SpiTransfer[0]    );
Und dann setzt man sich hin und implementiert eine Basiskommunikation 
zum Chip, um Modi zu setzen.
Ich habe den Max3140 noch nie programmiert, aber alle andere 
Datenblätter sehen genauso aus. Das erfordert ein bisschen Einlesen vom 
Programmierer.
Man programmiert erst mal ein paar Basis-Sachen wie Abfrage der 
Statusbits.
Und dann versucht man, den Chip zu einer sinnvollen Arbeit zu bringen.
Dauert meist so 2-4 Tage, und dann geht das Teil.

Ist eben mal Arbeit.

von Dominik S. (dasd)


Lesenswert?

Wenn ich nach "RasPiComm- Karte" suche finde ich Karten der Fa. Amescon.
Verwendest du die?

Den Code zum Kernel-Modul gibt es hier wenn ich mich nicht täusche:
https://github.com/amescon/raspicomm-module

Leider recht unschön. Die verwenden direkt die SPI-Hardware anstatt über 
den SPI-Kerneltreiber zu gehen.
Damit ist der Parallelbetrieb zum spidev-Treiber eigentlich 
ausgeschlossen.

von Zeno (Gast)


Lesenswert?

John Doe schrieb:
> Rührende Geschichte!
> Was schreibt der Hersteller auf Deine Anfrage hin?
Danke das hat jetzt echt weiter geholfen. Schön das es immer wieder 
Leute gibt die besser mal die Griffel still halten sollten.

Wolfgang schrieb:
> Zeno schrieb:
>> Theoretisch sollte es sogar mit einem Kanal funktionieren, da die RS485
>> mit CE0=1 und die Interfacekarte mit CE0=0 aktiviert wird.
>
> Das muss dann aber an den Interfacekarten liegen. MAX3140 und MCP23S17
> werden beide mit CS aktiv low angesteuert. Was soll das für eine
> RasPiComm-Karte sein, auf der CS invertiert gesteuer wird?

Die ist von AMESCOM. Ja ich weis das der Chip mit 0 aktiviert wird. Habe 
jetzt gerade noch mal nach geschaut. Die haben da noch einen 
Pegelwandler drauf und der ist bei mir irgendwie als Inverter 
durchgegangen.
Manchmal trampelt man irgenwie auf der Stelle.
Danke! Das hat auch erst mal weiter geholfen. Da muß ich heute Abend mal 
schauen ob dich damit das Ruder schon rum reißen kann.

PittyJ schrieb:
> Den bus kann man doch wunderbar ansprechen mit ioctl:
>   struct spi_ioc_transfer SpiTransfer[1];
>   Status = ioctl (FileSpiDevice,
>       SPI_IOC_MESSAGE(1),
>       &SpiTransfer[0]    );
> Und dann setzt man sich hin und implementiert eine Basiskommunikation
> zum Chip, um Modi zu setzen.
Das ist eine Möglichkeit, aber diese möchte ich nicht nutzen, weil diese 
nur funktioniert, wenn die Devicefiles da sind.
Die bcm2835 ist auch nicht schwieriger zu handhaben und umgeht den Kram 
mit den Devicefiles. Wenn man die Bytesequenzen kennt um den Chip 
anzusprechen ist das überhaupt kein Problem, aber ich kenne sie eben 
nicht und aus dem Geschreibsel von Maxim werde ich nicht wirklich 
schlau. Zumindest nicht was diesen Chip betrifft.

PittyJ schrieb:
> Ich habe den Max3140 noch nie programmiert, aber alle andere
> Datenblätter sehen genauso aus. Das erfordert ein bisschen Einlesen vom
> Programmierer.
> Man programmiert erst mal ein paar Basis-Sachen wie Abfrage der
> Statusbits.
Ja Du Schlauberger was meinst Du wohl was ich die letzten Tage gemacht 
habe. Um selbige abzufragen braucht es erst mal eine entsprechende 
Bytesequenz um dies dem Chip mitzuteilen. Wenn mann die nicht kennt dann 
ist es halt essig.
Beim DS2482 haben die das deutlich besser gelöst. Da steht im Dabla 
eindeutig drin wie man das Ding anspricht, da ist das Ganze an einem 
Nachmittag erledigt. Beim 3140 hingegen sind zwar die Registerbits 
ordentlich erklärt, aber eben nicht wie man da hin kommt. Es gibt im 
Dabla nur am Ende ein paar (mir) nichts sagende Codeschnipsel. Wer's 
täglich macht der wurstelt sich da durch, aber zu den Leuten gehöre ich 
nicht.

PittyJ schrieb:
> Und dann versucht man, den Chip zu einer sinnvollen Arbeit zu bringen.
> Dauert meist so 2-4 Tage, und dann geht das Teil.
>
> Ist eben mal Arbeit.
dito

Dominik S. schrieb:
> Wenn ich nach "RasPiComm- Karte" suche finde ich Karten der Fa. Amescon.
> Verwendest du die?
>
> Den Code zum Kernel-Modul gibt es hier wenn ich mich nicht täusche:
> https://github.com/amescon/raspicomm-module
>
> Leider recht unschön. Die verwenden direkt die SPI-Hardware anstatt über
> den SPI-Kerneltreiber zu gehen.
> Damit ist der Parallelbetrieb zum spidev-Treiber eigentlich
> ausgeschlossen.
Ja genau die. Die bauen einen Kerneltreiber, der auch funktioniert, und 
ein /dev/ttyRPC0 zur Verfügung stellt. mit ioctl läuft es ja auch 
darüber seit gut einem Jahr. Jetzt wollt ich halt noch was dazu bauen 
und dabei habe ich eben festgestellt das dieser Kerneltreiber mir die 
SPI-Devicefiles abschießt. Man könnte jetzt den 3140 sicher auch über 
ioctl ansprechen aber auch dazu braucht es die Steuersequenzen. Da ich 
beides gleich machen möchte habe ich mich für die bcm2835 Bibliothek 
entschieden und spreche die SPI-Hardware direkt an. Die Devicefiles 
brauche ich dann nicht mehr.

von Zeno (Gast)


Lesenswert?

Hallo Wolfgang!

Möchte mich bei Dir nochmals für den Tip nach CS zu schauen bedanken - 
das war's. Irgendwie war ich da auf dem falschen Dampfer.
Jetzt antwortet das Ding und jetzt habe ich auch verstanden wie MAXIM 
das mit der Kommunikation meit bzw. wie das Datenblatt zu lesen ist.

Im Prinzip werden immer 2 Byte übertragen, wobei Bit 14 und 15 bestimmen 
was gemacht werden soll.

Falls es Dich interessiert:
Bit15/14 = 1/1  >> Konfiguration (Bit 13 - 0) schreiben
Bit15/14 = 0/1  >> Konfiguration (Bit 13 - 0) lesen
Bit15/14 = 1/0  >> Daten (1Byte) senden (Daten stehen im Low-Byte)
Bit15/14 = 0/0  >> Daten (1Byte) lesen

Bei der SPI Übertragung Highbyte zuerst

Danke!

Grüße aus Thüringen

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.