Ich versuche den MCP23S17 (Expander) per SPI über einen Raspberry Pi
anzusprechen. Aber es will mir überhaupt nicht gelingen.
Im folgenden Code fällt auf, dass ich nicht CE0 oder CE1 verwende,
sondern GPIO27. Das sollte grundsätzlich als CS möglich sein.
Zudem habe ich in der letzten Zeile von main() den hex-Code 0x10. Nach
meinen Überlegungen, will ich ja den Pin5 des Expanders (=GPB4)
schalten, somit muss das fünfte Bit auf 1 gesetzt werden -> 0x10.
Richtig?
Ich sehe aber leider überhaupt nicht den Fehler an der Sache. Vielleicht
seht ihr ja mehr...
Hast du schon mal mit einem protocolanalyser geschaut ob das recht
unkoordinierte Bitgewackel in deiner sendValue überhaupt ein gültiges
Timing ergibt?
Keine Ahnung ob das Python-Geraffel hier langsam genug ist.
Da ich letztlich auf meiner Platine mehr als zwei ICs habe, habe ich
bewusst auf die vorhandenen CE0 und CE1 verzichtet. Ich möchte/muss also
freie GPIO-Pins als CS verwenden. Und genau da liegt wohl auch mein
Problem...
Das gleiche PRoblem habe ich ich mit der WiringPi-Bibliothek.
@Kaj: Vielleicht verstehe ich es ja falsch. Also grundsätzlich ist es
für mich kein Problem GPIO-Pins zu setzen - egal ob direkt per Python
oder über WiringPi.
Hier ist ja die SPI-Schnittstelle mein Problem.
In meinem Script wird der gewünschte GPIO-Pin ja durchaus auf High
gesetzt - allerdings resultiert daraus noch lange keine funktionierende
SPI-Verbindung.
Jay Myon schrieb:> @Kaj: Vielleicht verstehe ich es ja falsch. Also grundsätzlich ist es> für mich kein Problem GPIO-Pins zu setzen - egal ob direkt per Python> oder über WiringPi.
Das hast du schon richtig verstanden, war aber nicht böse gemeint.
gibt genug Leute die hir nach Hilfe suche, und da stellt sich dann raus
das die mit 'nem ATTiny ein Kernkraftwerk steuern wollen, aber es noch
nie hinbekommen haben, einfach mal ne LED zum blinken zu bringen.
Deswegen hab ich nachgefragt.
Welche Python-Version benutzt du?
Was mir gerade auffält:
Jay Myon schrieb:> def sendSPI(opcode, addr, data):Jay Myon schrieb:> sendSPI(SPI_SLAVE_ADDR, SPI_IODIRB, 0x00)
So scheint das nicht zu passen ;)
in deiner definition sagst du: opcode, addr, data
und beim senden gibts du die sachen dann aber falsch in die Funktion
rein... es sei denn das SPI_SLAVE_ADDR den opcode darstellt, was ich
nicht glaube ;)
Kaj schrieb:> es sei denn das SPI_SLAVE_ADDR den opcode darstellt, was ich> nicht glaube ;)
Doch.. ist eigentlich der Opcode. 01000000 -> 0x40
Mich ärgert es gerade sehr, dass ich endlich eine fertige Platine habe,
alles verschaltet habe und nun das ganze Projekt daran scheitert, dass
ich schlicht eine SPI-Schnittstelle nicht hinbekomme; nur um letztlich
einen Pin für ein Relais zu setzen :-((((
Jay Myon schrieb:> Doch.. ist eigentlich der Opcode.
Ok, wenn du das sagst...
Ich hatte jetzt erwartet das eine Variable die SPI_SLAVE_ADDR heist,
auch zu dem Funkrionsparameter addr gehört, aber nun gut.
Im Datenblatt von dem MCP23S17
(https://cdn-reichelt.de/documents/datenblatt/A200/MCP23S17_MIC.pdf)
steht:
"High-speed SPI interface (MCP23S17) 10 MHz (max.)"
Irgendwer schrieb:> ...überhaupt ein gültiges Timing ergibt?> Keine Ahnung ob das Python-Geraffel hier langsam genug ist.
Vermutung:
In anbetracht der Tatsache das der RPi mit gut 700MHz läuft, und du
keine delays in deinem Code hast, dürften deine aktionen durch aus über
den max. 10MHz liegen. Durchaus möglich das es deswegen nicht klappt.
Jay Myon schrieb:> Mich ärgert es gerade sehr
Noch ist der Tag nicht vorbei ;)
Nachdem ich nun endlich eine SPI-Verbindung auf dem Steckbrett ans
Laufen gebracht habe (der obige Code funktioniert), fällt mir nun auf,
dass nicht bei jedem Start des Scripts letztlich auch der Ausgang
gesetzt wird (in meiner Beispiel-Schaltung wird eine LED eingeschaltet:
1
sendSPI(SPI_SLAVE_ADDR,SPI_GPIOB,0x10)
2
time.sleep(3)
3
sendSPI(SPI_SLAVE_ADDR,SPI_GPIOB,0x00)
Starte ich das Script immer wieder, so funktioniert es manchmal und
manchmal nicht. Auch mit sleep zwischen den Befehlen komme ich nicht
weiter (wobei ich die ehrlich gesagt wahllos gesetzt habe.
Zur Schaltung: Es wird ein MCP23S17 mit einem ULN2803 kombiniert.
Der MCP23S17 wird mit 3,3V betrieben. Die geschaltete LED wird mit 5V
über den ULN2803 betrieben.
Also manchmal geht die LED an und nicht aus, manchmal geht sie wie
gewünscht an und aus und manchmal passiert gar nichts.
Ich hatte eben das gleiche Problem, dass es manchmal schaltet und
manchmal eben nicht und fand's schade, dass es hier im Thread nicht
weiterging.
Mein Problem habe ich gelöst, es war ein dämlicher Fehler. SI und SO
hatte ich leider vertauscht. Komischerweise tat es manchmal, was dazu
führte, dass ich die Pinbelegung gar nicht mehr geprüft habe.
(Vielleicht stand die Pinbelegung auch irgendwo falsch drin)