PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Spi-lesen



sterngleiter
03.12.2017, 06:41
Hallo,
ich habe eine Schaltung aufgebaut wo der Raspberry SPI-Master und ein PIC-Controller ein Slave ist. Soweit so gut. Mein Problem liegt dadrin dass ich auf eine anfrage bei Slave mehrere Anworten heben möchte. Beispiel Master sendet 1 Byte und Slave anwortet mit 4 Bytes zurück.
spi.writebytes(0x12)
antwort=spi.readbaytes(0);
print antwort[0]
print antwort[1]
print antwort[2]
print antwort[3]

ich finde ein Anwort nur im antwort[0] aber da ist nur der Letze Wert drin der von Slave gesendet wurde.
Ich bitte um Hilfe

Klebwax
03.12.2017, 07:23
Ich weiß zwar nicht, in welcher Sprache dein Codefragment ist. Ich kenne ebenfalls die Funktion spi.readbaytes() nicht. Ich kann aber auch im Code keine Stelle sehen, wo die Zahl 4 vorkommt. Dafür finde ich bei spi.readbaytes(0) den Parameter 0. Was bedeutet der? Was sagt die Doku zu spi.readbaytes()? Könnte der Parameter die Anzahl der zu lesenden Bytes sein? Könnte dein Problem ein klassischer "Manual not Read Error" sein?

MfG Klebwax

sterngleiter
03.12.2017, 07:51
Ich bin doch richtig hier oder im Forum raspberry Pi. Ich denke hier müsste PYthon bekannt sein. https://pypi.python.org/pypi/spidev kleine erklärung. Die zahl 4 denke ich hier dass es nicht relevant ist weil die letzte Antwort überschreibt den vorherigen. Auch wenn ich antwort=spi.readbaytes(4); schreibe.
Gruß

Klebwax
03.12.2017, 08:35
Ich bin doch richtig hier oder im Forum raspberry Pi. Ich denke hier müsste PYthon bekannt sein.

Ein Raspberry ist ein PC. Da läuft jede Sprache drauf, die auch auf dem PC läuft. Diese Zeile z.B.

antwort=spi.readbaytes(0);

könnte auch gültiger C-Code, lua oder Javascript sein.

Wenn also die 0 unwesentlich ist, liegt das Problem woanders. Mir fehlt trotzdem die Vorstellung, woher das readbyte wissen soll, daß 4 Bytes und nicht 1k Bytes gelesen werden sollen.

Ein wenig Googlen nach spi.readbaytes() fördert


Python Spidev
.
.
.
readbytes(n)

Read n bytes from SPI device.



Ob das nun die Doku für die von dir benutzte Python Library ist oder ob du eine andere benutzt, weiß ich nicht.

MfG Klebwax

sterngleiter
03.12.2017, 08:54
Sorry leiten Sie das Thema nicht woanders hin. Meine google versuche haben mir nicht geholfen daher ersuche ich Hilfe hier.
Ich habe gehofft das ein erfahrener Kollege mir eventuell ein Tipp gibt. Es gibt sowenige Anleitung bzw. Erklärung dazu. Laut Anleitungen Müssten die Werte im Array "anwort" stehen. Das Problem bei dem Code ist dass sich "antwort" nicht wie ein Array verhält. Python ist für mich gerad neu Land.
Gruß

HaWe
03.12.2017, 16:38
Hallo,
ich habe eine Schaltung aufgebaut wo der Raspberry SPI-Master und ein PIC-Controller ein Slave ist. Soweit so gut. Mein Problem liegt dadrin dass ich auf eine anfrage bei Slave mehrere Anworten heben möchte. Beispiel Master sendet 1 Byte und Slave anwortet mit 4 Bytes zurück.
spi.writebytes(0x12)
antwort=spi.readbaytes(0);
print antwort[0]
print antwort[1]
print antwort[2]
print antwort[3]

ich finde ein Anwort nur im antwort[0] aber da ist nur der Letze Wert drin der von Slave gesendet wurde.
Ich bitte um Hilfe

hallo,
ein paar Fragen und Anmerkungen:
1.) die verwendete Programmiersprache gehört eigentlich immer in den Titel oder wenigstens klar erkennbar genannt im ersten Post (TOP). Bei dir also: "PYTHON".
- welche Version aber? 2 oder 3?
2.) Dann ist es immer hilfreich, den kompletten Code zu sehen, nicht nur ein Schnipsel.
3.) Dann gibt es gefühlt 100 verschiedene Raspberry Pis, welchen Pi benutzt du?
4.) Dann gibt es gefühlt 1000 verschiedene Betriebssysteme für Raspberries (z.B. Raspbian Jessie oder Raspbian Stretch oder auch v.a.m.)
- welches benutzt du, in welcher genauen Version?
5.) Dann unterscheiden sich oft bei SPI die Codes, je nachem welches Gerät dran hängt - was hast du dran? --- EDIT: sah gerade: ein PIC, ok! ---
6.) Dann scheint es sich bei deinem Code um einen Tippfehler zu handeln, denn es heißt readbytes und nicht readbaytes.
7.) spi.readbytes könnte ein befehl aus einem Python module namens "py-spidev" sein, aber jedes Modul ist anders - ist dies deines, oder welches sonst?
8.) Die Zahl hinter readbytes ist wschl die Anzahl der zu lesenden Bytes, wie schon Klebwax richtig erwähnt hat. willst du 4 lesen, muss dort auch 4 stehen.
Steht 0 dort, liest du auch nur 0. Siehe: https://github.com/doceme/py-spidev
9.) Außerdem wäre noch wichtig zu wissen, wie dein SPI Port konfiguriert ist und welchen SPI Port du benutzt (der Raspi hat 2 verschiedene) - und ob er überhaupt enabled ist.


Ich bin nun kein Python-Nutzer, aber probiere doch mal testweise diesen Code, falls meine Vermutungen soweit stimmen:



#!/usr/bin/env python
import spidev
def dmp(A):
s = ""
cnt = 0
for a in A:
s+="%0.2X " % a
cnt=(cnt+1)%6
if cnt == 0:
s+="\n"
print s

spi = spidev.SpiDev()
spi.open(0,0)
b = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x95, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0xAD, 0xBE, 0xEF, 0xBA, 0xAD, 0xF0, 0x0D]
print "testing read/write bytes"
spi.writebytes(b)
dmp(spi.readbytes(len(b)))
print "testing xfer"
dmp(spi.xfer(b))
print "testing xfer2"
dmp(spi.xfer2(b))
spi.close()


wenn er läuft, ists schon mal gut, dann können wir deinen Code berichtigen - bitte posten!

- ansonsten stimmt möglicherweise was bei deinen Pi Enstellungen nicht - dann guck mal hier in der Diskussion:
https://github.com/doceme/py-spidev/issues/19

PS,
Anm.: ich nutze selber kein SPI für eigene Programme, weil ich SPI für extrem schwierig halte, schon gar nichts für Anfänger.