Raspberry Pi 3B über SPI Schnittstelle

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Raspyy123

Hallo zusammen,


ich versuche mit meinem Raspby 3B ein Evaluation Board über die SPI Schnittstelle zu steuern. Die Bits möchte ich selbst einlesen. Ich habe das mit folgendem Beispiel versucht und möchte dieses Programm etwas abändern auf mein Board:

https://gist.github.com/m0xpd/4578261


ich habe dies folgendermaßen abgeändert:

import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BOARD)

GPIO.setwarnings(False)


# Define GPIO pins, s. S.9 Data Sheet

SCLK = 23 # M6

SDO = 21 # M4

SDIO = 29 # M5

CSB = 24 # M3


GPIO.setup(SCLK, GPIO.OUT) # Serial Clock Input

GPIO.setup(SDO, GPIO.IN) # Serial Data Output

GPIO.setup(SDIO, GPIO.OUT) # Serial Data Input and Output

GPIO.setup(CSB, GPIO.OUT) # Chip Select Input


GPIO.output(SCLK, False) # initialize everything to zero...

GPIO.output(SDIO, False)

GPIO.output(CSB, False)

GPIO.input(SDO, False)


pulseHigh(CSB) # start-up sequence to see measurements (except DATA or SDIO)

pulseHigh(SCLK)

pulseHigh(SDO)


def pulseHigh(pin): # Function to send a pulse

GPIO.output(pin, True) # do it a few times to increase pulse width

GPIO.output(pin, True)

GPIO.output(pin, True)

GPIO.output(pin, False) # end of the pulse

return


# Funktion zur Übermittlung der Anweisungen

def tfr_byte(data): # Function to send a byte by serial "bit-banging"

GPIO.output(CSB,false) # Pull the CSB low to enable the SPI port

for i in range (0,24): # clock in the 16 preceding address bits

GPIO.output(SDIO, data & 0x80) # Mask out MSB and put on GPIO pin "SDIO"

pulseHigh(SCLK) # pulse the clock line

data=data<<1 # Rotate left to get next bit

GPIO.output(CSB,true) # Pull the CSB high to disable the SPI port, CSB goes high, serial data is loaded into the register

return


Anbei habe ich das Datenblatt von den Signalen, die ich erreichen möchte.

Meine Frage nun: Wie würdet ihr CSB einbauen? und generell Read and Write? Ich weiß nicht genau, wie ich zb Anweisungen wie 0x180064 übermitteln soll....

Dies ist das Datenblatt: https://www.analog.com/media/e…/data-sh ... AR1000.pdf
__deets__
User
Beiträge: 14533
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte in Zukunft Code-Tags verwenden. Dazu im vollstaendigen Editor den </> druecken, nachdem man den Code markiert hat.

Und welchen Sinn soll das haben, SPI selbst zu machen? Der PI hat dafuer eine Schnittstelle, und damit kanns du dann auch deine Anweisung zB als Byte-Sequenz uebermitteln. Das ist schneller, stabiler, bequemer. Warum machst du dir das Leben schwer?
__deets__
User
Beiträge: 14533
Registriert: Mittwoch 14. Oktober 2015, 14:29

Oh, und der Link zu deinem Datenblatt tut nicht.
Raspyy123

das tut mir Leid, nächstes Mal werde ich die Einrückungen nutzen.
https://www.analog.com/media/en/technic ... AR1000.pdf
Ich habe den Link nochmal eingefügt und hoffe, dass dies funktioniert.

Ich denke, wenn es es selbst übermittle, dann ist der Lerneffekt deutlich höher...Hättest du einen Tipp? Ich denke mein Ansatz ist nicht ganz falsch...
Benutzeravatar
__blackjack__
User
Beiträge: 13099
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Raspyy123: Naja, wenn der Lerneffekt höher sein soll, dann musst Du es halt auch selbst implementieren. Problem ist: Wenn Du dann auf ein Problem stösst, musst Du jemanden finden der das schon mal selbst implementiert hat, oder sich damit auseinandersetzen möchte.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
__deets__
User
Beiträge: 14533
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich wuerde es wirklich, wirklich nicht so machen. Es dauert laenger, produziert schlechteren und langsameren Code, und im allerschlimmsten Fall (ungewoehnlich bei SPI, aber nicht unmoeglich) funktioniert der Chip nicht. Weil timing constraints nicht eingehalten werden.

Wenn du drauf bestehst, dann sind Bitoperationen wie & und << deine Freunde. Damit musst du die Bits der Bytes anschauen, und nach Bedarf toggeln.
Raspyy123

hm okay, wenn man es nicht bitweise machen würde, dann würde man sich das mit spidev machen...wie würdest du dort aber zb eine Adresse 0x180064 mit ihrem Content 64 übermitteln?
__deets__
User
Beiträge: 14533
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das hat ja nun mit der Frage nach Bit-Weise oder nicht nix zu tun. Da geht es darum, dass du das Datenblatt nicht verstehst. Ich habe angefangen mir das anzuschauen, aber das ist nicht trivial. Die Addressierung ist etwas verzwickt, weil da wohl auch noch daisy-chaining von mehreren Chips dazu kommt (so interpretiere ich das zumindest). Eine Adresse 0x180064 gibt's aber ganz bestimmt nicht.

So wie ich das sehe sind das ueblicherweise 3 Bytes, in big endian order, mit MSB first. Mehr Zeit habe ich im Moment nicht. Ich wuerde mal schauen, ob du aus dem Datenblatt Anwendungsbeispiel schlauer wirst.
__deets__
User
Beiträge: 14533
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wie ich sehe laesst du dir ja hier helfen: https://forum-raspberrypi.de/forum/thre ... post388981

Dann viel Erfolg beim Bitschubsen.
Antworten