Forum: Mikrocontroller und Digitale Elektronik SPI mit PIC -> 18 bit nur empfangen?


von Thomas W. (thomas0906)


Lesenswert?

Hallo

Ich möchte die MSSP Schnittstelle eines PIC18F... mit SPI nutzen, um 18 
bit zu empfangen.
D.h. der Slave (ein Sensor) sendet genau 18 bit.
Der Slave hat aber kein SPI, das nennt sich da SSI, funktioniert aber 
auch mit CLK, DO und CS. Nur, daß er eben 18 Clocks benötigt, um 18 bits 
zu senden. Keine Ahnung, was er macht, wenn da noch weitere CLKs kommen.
Ein erneutes Senden wird mit CS HIGH und dann wieder CS LOW getriggert.

Meine Frage jetzt:
Mit SPI lese ich ja ein Byte ins Schieberegister ein, das wird in den 
Buffer kopiert, es wird ein Flag gesetzt und ich kann es aus dem Buffer 
lesen:

Was passiert beim Spi dann, wie geht es weiter?
Hält der CLK solange an, bis ich das Byte gelesen habe? Oder wird das 
Schieberegister weiter vollgeschrieben?
Wenn ja, was passiert, wenn das Schieberegister wieder voll ist, ich 
aber den Buffer noch nicht ausgelesen habe? Hält dann der Clock an?
Sprich, kann mir da was verloren gehen?
Und was passiert mit den letzten 2 Bits, durch die wird der Buffer ja 
nicht mehr voll? Wie bekomme ich also das ENDE der ganzen Übertragung 
mit?

Oder muß ich einfach nur 3x den Buffer auslesen, wenn das Flag Buffer 
voll kommt und mir weiter keine Sorgen machen?

Danke für Hilfe
Thomas

von Thomas W. (thomas0906)


Lesenswert?

Hi

Schade, das hat scheints noch niemand gemacht.

Wenn der PIC da ist, probier ich es einfach mal aus was passiert.

Ansonsten muß ich es eben selbst programmieren, also 18 Clocks senden 
und 18 Bits reinschieben. Die Arbeit wollte ich das SPI machen lassen.

Gruß
Thomas

von Anja (Gast)


Lesenswert?

Thomas W. schrieb:
> Schade, das hat scheints noch niemand gemacht.

Da sind einfach zu wenig Angaben ...

Gruß Anja

von Thomas W. (thomas0906)


Lesenswert?

Also ganz einfach, teilen wir die Frage mal in ihre Einzelteile auf:

Was passiert, wenn man mit dem SPI Verfahren mehr als 1 Byte, also z.B. 
10 bit übertragen möchte?
Was passiert da auf der Master Seite, wenn die ersten 8 bits eingelesen 
wurden?
Wie kommt man dann an die nächsten 2 bit, wenn der Slave nur noch 2 bit 
sendet, ein weiteres Byte also nicht voll wird?

Gruß
Thomas

von Anja (Gast)


Lesenswert?

Thomas W. schrieb:
> Also ganz einfach, teilen wir die Frage mal in ihre Einzelteile auf:

hilft immer noch nichts:
- mir ist immer noch nicht klar wer Master und wer Slave ist (Slave 
"sendet" nie sondern ist passiv)

normalerweise ist SPI ein einfaches Schieberegister. Mit einem 
Load-Impuls (CS) wird das Schieberegister parallel geladen oder 
ausgelesen. Der Master taktet dann die Info aus dem Schieberegister 
heraus. bei jedem Takt wird gleichzeitig ein neues Bit an der anderen 
Seite des Schieberegisters hereingetaktet. Wenn mehr Takte als Bits da 
sind erscheinen logischerweise die Bits die hereingetaktet wurden um X 
Takte verzögert am Ausgang.

Wenn Du jetzt 18 Bits hast und der Master immer 24 Bits überträgt mußt 
Du nur darauf achten daß beim Lesen vom Slave immer die ersten 18 Bits 
gültige Info haben und beim Schreiben an den Slave die letzten 18 Bits 
ein gültiges Kommando darstellen.

Gruß Anja

von Thomas W. (thomas0906)


Lesenswert?

Hi

Master: Mein PIC.
Slave: Ein Sensor AS5145 mit CLK, DO und CS.


Slave (der SENSOR) erwartet LOW CS, danach reagiert er auf CLK und 
sendet bei jedem Flankenwechsel ein Bit auf DO. Das macht er 18-mal, da 
die Information 18bit lang ist. Danach erwartet er an CS HIGH. Dadurch 
wir er wieder resettet, um für neue Anfragen bereit zu sein.

Mit dem PIC als MASTER möchte ich die 18bit jetzt per SPI auslesen, 
anfordern.

Also an einem Ausgang den CS auf LOW setzen.
Dann SPI starten.
Was im Sendebyte steht, von mir aus 0x00, ist egal, da ich ja nichts 
senden möchte.
Durch das CLK SIGNAL erstmal 8 bits ins Empfangsbyte schieben.
Dann kommt ja das Flag "Byte bereit zum Auslesen"

Und nun meine erste Frage: Wartet der SPI Prozessor des PIC mit dem CLK 
Signal solange, bis ich das Byte ausgelesen habe, damit die nächsten 
Bits vom Sensor (Slave)reingeschoben werden können, oder gehen mir die 
verloren, wenn ich nicht schnell genug das Empfangsbyte leere?

Was ich bräuchte ist also:

Master sendet CS LOW
Master sendet C C C C C C C C C
Flag Byte voll wird gesetzt
Master sendet keinen C mehr
1. Byte wird weggeschrieben
Master sendet C C C C C C C C
Flag Byte voll wird gesetzt
Master sendet keinen C mehr
2. Byte wird weggeschrieben
Master sendet C C (C C C C C C)
tja und dann? wohl egal wie der Ausgang des Sensors dann aussieht.
Flag Byte voll wird gesetzt
Master sendet keinen C mehr
3. Byte wird weggeschrieben ( aber nur die beiden linken Bits relevant)
Master sendet CS HIGH


Denn der Slave sendet ja nicht byteweise, sondern erwartet 18 CLK 
Impulse hintereinander, um seine Bits rauszuschieben. D.h. es 
funktioniert hier nicht einen erneuten Austauschvorgang mit neuerlichem 
Chipselect für ein Byte zu starten, wie es bei SPI eigentlich üblich 
ist.

Soweit sollte ich es doch klar beschrieben haben?

Frage also: Funktioniert das mit SPI so, wie oben angenommen, obwohl der 
Slave (Sensor) kein richtiges SPI macht.?


Gruß
Thomas

von Tobi D. (fanti)


Lesenswert?

du hast es richtig beschrieben

Aber du kannst dem PIC-Interface nicht sagen, dass es nach 18 clocks 
aufhören soll, es sendet immer nur ganze Bytes.
Da du die Daten nurin ein Puffer schreibst und dann wieder ausliest hast 
du da auch keinen Einfluss auf den Sendeprozess.

Was der slave macht, wenn er mehr als die geforderten clocks bekommt 
weiß ich nicht, aber wenn du Glück hast schreibt er in ich überflüssigen 
Bits nur eine 0 rein.
Da hilft wohl nur probieren.

Eine Alternative wäre eine Software SPI, sie ist zwar um einiges 
langsamer, aber dafür kannst du genau die Bitanzahl senden die du 
möchtest.

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.