Forum: Mikrocontroller und Digitale Elektronik SPI Daten ( Cypress CY7C64316 <-> PN512 ) auswerten


von Stephan V. (Firma: FH Gelsenkirchen) (devilx)


Lesenswert?

Hallo ich habe die SPI Kommunikation zwischen einem dem Cypress 
CY7C64316 und dem PN512 aufgezeichnet und möchte diese Auswerten und 
verstehen.

Ich zeichne mit einem Digital Oszilloskop Clock Miso und Mosi mit 25M 
Samples auf und Speicher die Daten als CSV ab.

Anschließend überprüfe ich mit einem kleinen Programm die Taktdaten auf 
eine Positive Flanke und nehme die dann aktuellen Miso/Mosi Werte.
Dies mache ich 8x und Speicher dann die Bytes in ein neues File ab.

Ich möchte dieses Programm erweitern so das es erkennt ob es sich beim 
Aktuelle Byte um Daten oder eine Adresse handelt, falls ja möchte ich 
weitergehend auswerten ob es ein Lese oder Schreibzugriff ist und auf 
welche Adresse sich dieser bezieht.

Mein Problem ist nun Folgendes ich kann nicht erkennen ob ich ein 
Adresse oder Datenbyte vor mir habe so das ich mit meiner Auswertung 
nicht vorankomme.

Siehe:
http://www.nxp.com/documents/data_sheet/PN512.pdf
Seite: 66 und folgende

Hat jemand eine Idee die mir helfen könnte ich habe das Gefühl das ich 
etwas entscheidendes übersehe.

von Niemand (Gast)


Lesenswert?

Hi, Cypress ist Host, NXP ist Slave. Du solltest noch das NSS Signal 
auswerten. Dann kannst Du den Beginn der Kommunikation sehen. Dort ist 
das erste Byte auf MOSI die Adresse, mit Angabe ob lesen oder schreiben 
und das Byte auf MISO die gelesenen Daten.

von Stephan V. (Firma: FH Gelsenkirchen) (devilx)


Lesenswert?

Dankeschön

Also wenn ich das richtig sehe wird der Slave aktiv gesetzt wenn der NSS 
auf Low geht.
Also wüsste ich dadurch wann ein Übertragungsvorgang zum Lesen oder 
schreiben Startet.

Lese Vorgang:
1.) NSS geht auf LOW
2.) auf dem MOSI wird die Lese-Adresse-1 gesendet
3.) auf dem MOSI wird die Lese-Adresse-2 gesendet, auf dem MISO werden 
die Daten1 gesendet.
4.) auf dem MOSI wird 00 gesendet, auf dem MISO werden die Daten-2 
gesendet.
5.) damit ist die Kommunikation abgeschlossen und der NSS geht auf HIGH

als nächstes kommt z.B. ein Schreibvorgang:
1.) NSS geht auf LOW
2.) auf dem MOSI wird die Schreib-Adresse-1 gesendet
3.) auf dem MOSI werden DATEN-1 gesendet
4.) auf dem MOSI werden DATEN-2 gesendet usw
5.) der Schreibvorgang hat kein 00 als Ende und endet dadurch das NSS 
auf HIGH geht.

Hier hätte ich noch ne Frage:
Die DATEN-2 beim Schreibvorgang,  würden diese an die gleiche Adresse 
geschrieben werden wie DATEN-1, oder würden diese an die nächste Adresse 
(1Byte weiter) geschrieben werden?

Wenn ein LESE oder Schreibvorgang zuende ist muss NSS immer auf HIGH 
gehen bevor der nächste Vorgang starten kann?

MFG Stephan

von Niemand (Gast)


Lesenswert?

Hi, ich muss sagen, ich kenn' den NXP nicht so genau, denke aber, dass 
Deine Vermutungen richtig sind. Und ja, wenn NSS auf high geht, ist der 
"alte" Vorgang beendet, für den neuen wieder NSS auf Low.

von Stephan V. (Firma: FH Gelsenkirchen) (devilx)


Lesenswert?

So da bin ich mal wieder
Ich habe erstmal angefangen per Hand Teile des Datenstromes auszuwerten, 
und mir sind nun Stellen aufgefallen an denen ich etwas unsicher bin:

Als erstes wäre zu sagen das das Nss immer für 2 Bytes auf 0 geht.

Es gibt Stellen wo das Erste und das Zweite Mosi Byte eine LeseAnfrage 
sind.
Die Antwort auf die Erste LeseAnfrage wäre ja das Zweite Miso Byte.
Die Antwort auf die Zweite LeseAnfrage, kommt diese dann im Nächsten 
"Nss Frame" als erstes Miso Byte??

MFG Stephan

von Stephan V. (Firma: FH Gelsenkirchen) (devilx)


Lesenswert?

Hmm Keiner der da fitt ist oder eine Idee hat?
wollte nach Möglichkeit heute Abend das Programm anpassen.

MFG Stephan

von Tim R. (vref)


Lesenswert?

Na, lies dir mal das Datenblatt vom PN512 genau durch (10.2 Serial 
Peripheral Interface).

Das steht genau, was bei SPI read und write zu passieren hat.

Der Master (Encore) schickt als erstes ein Adressbyte.
Wenn das oberste Bit (7) eine 1 ist (high), will er vom PN512 (Slave) 
lesen.
Die Adresse steht in den unteren 7 Bit (6:0).

Die Daten aus dem adressierten Register kommen über MISO rein, aber 8 
bit nach hinten versetzt (da der PN512 ja erst zu diesem Zeitpunkt die 
komplette Adresse kennt).
Parallel zum Auslesen des zuletzt adressierten Registerwertes schickt 
der Master bereits die nächste Adresse, von der er lesen möchte, oder 
0x00, wenn es der letzte Lesezyklus ist.

Beispiel:
MOSI: 0x80 0x81 0x82 0x00
MISO: 0x-- 0x02 0x05 0x30

Master adressiert hintereinander Register 0-2 zum lesen
Slave antwortet: Register 0=0x02, Register 1=0x05, Register 2=0x30
0x-- meint: Daten ignorieren, ungültig, egal,


Schreiben funktioniert anders:
Da schickt der Master im ersten Byte die Adresse, im oberen Bit aber 
eine 0 (=write).
Danach kommen einfach die Daten, die ab dieser Adresse geschrieben 
werden sollen.

Beispiel:
MOSI: 0x05 0x20 0x34 0x55
MISO: 0x-- 0x-- 0x-- 0x--

Master beschreibt die Adressen 5, 6 und 7 mit 0x20, 0x34 und 0x55


Deine Feststellung, dass "Nss immer für 2 Bytes auf 0 geht" kann in 
deinem Fall richtig sein, prinzipiell erlaubt der PN512 aber mehrere 
Registerzugriffe direkt hintereinander - wie oben beschrieben. Daher 
würde ich das Programm eher allgemeiner halten.


Good luck.

von Stephan V. (Firma: FH Gelsenkirchen) (devilx)


Lesenswert?

Hallo schon mal danke für die Hilfe

Dein Text bestätigt zum größten Teil das wovon ich ausgehe.

Aber nach meinem Verständnis ist die Adresse nur 6 Byte Groß Bit 0 
gehört nicht dazu.
Ansonsten habe ich das Datenblatt genauso verstanden wie du.

Und wenn ich dich richtig interpreteiere so würdest auch du davon 
ausgehen, dass NSS erst nach abgeschlossenem Vorgang, also bei einem 
Lesevorgang nach dem 0x00, wieder auf High geht?
Also der gesamte Vorgang in einem "Frame" stattfindet.

Bei mir ist es definitiv so das diese Frames immer nur 2 Bytes 
enthalten, das der Chip mehr könnte hab ich auch so verstanden.

Es scheint nur so zu sein das manche Lesevorgänge über mehrere Frames 
andauern.


Beispiel:
NSS:  0x01 0x00 0x00 0x01 0x00 0x00 0x01 0x00 0x00
MOSI: ---  0x80 0x81 ---  0x82 0x83 ---  0x05 0x20
MISO: ---  0x-- 0x02 ---  0x05 0x30 ---  0x02 0x--

Meine Interpretation:

Frame1:
Lesen Adressen: 0x80 0x81
Antwort für Adresse: 0x80

Frame2:
Lesen Adressen: 0x82 0x83
Antwort für Adresse: 0x81 0x82

Frame3:
Schreiben Adresse: 0x05
Daten für Adresse 0x05: 0x20
Antwort für Adresse: 0x83

MFG Stephan

von Tim R. (vref)


Lesenswert?

Stephan Van den boom schrieb:
> Und wenn ich dich richtig interpreteiere so würdest auch du davon
> ausgehen, dass NSS erst nach abgeschlossenem Vorgang, also bei einem
> Lesevorgang nach dem 0x00, wieder auf High geht?
> Also der gesamte Vorgang in einem "Frame" stattfindet.

Richtig.

>
> Bei mir ist es definitiv so das diese Frames immer nur 2 Bytes
> enthalten, das der Chip mehr könnte hab ich auch so verstanden.

Ok, das macht es dir einfacher.
>
> Es scheint nur so zu sein das manche Lesevorgänge über mehrere Frames
> andauern.

Ja. Die Firmware des Cypress scheint eben ein Register nach dem anderen 
in einzelnen Transfers abzufragen. Kann man so machen.

>
>
> Beispiel:
> NSS:  0x01 0x00 0x00 0x01 0x00 0x00 0x01 0x00 0x00
> MOSI: ---  0x80 0x81 ---  0x82 0x83 ---  0x05 0x20
> MISO: ---  0x-- 0x02 ---  0x05 0x30 ---  0x02 0x--
>
> Meine Interpretation:
>
> Frame1:
> Lesen Adressen: 0x80 0x81
> Antwort für Adresse: 0x80

Du hast recht, Bit 0 ist immer 0 und gehört nicht zur Adresse.
Also ist der erste Zugriff ein Read auf Register 0, mit der Antwort 0x02

Was beim Auslesen des Registers auf MOSI passiert (hier 0x81) ist egal, 
da die Transaktion direkt danach ja eh mit NSS=1 beendet wird. Schöner 
wäre hier natürlich eine 0x00 vom Cypress, das ist aber wie gesagt nur 
Kosmetik.

>
> Frame2:
> Lesen Adressen: 0x82 0x83
> Antwort für Adresse: 0x81 0x82

= Read auf Register 1  (  0x82 = binär 1_000001_0 = adresse 1 ) mit der 
Antwort 0x30

>
> Frame3:
> Schreiben Adresse: 0x05
> Daten für Adresse 0x05: 0x20
> Antwort für Adresse: 0x83

= Schreiben von Wert 0x20 in Adresse 2 (0x05 = binär 0_0000010_1).
Hier wundert mich die angesprochene Adresse allerdings, da Bit 0 ja 
immer 0 sein sollte und nicht Teil der Adresse ist...
Die Antwort vom Chip auf MISO ist beim Schreiben irrelevant.

von Stephan V. (Firma: FH Gelsenkirchen) (devilx)


Lesenswert?

Tim R. schrieb:
> = Schreiben von Wert 0x20 in Adresse 4.
> Hier wundert mich die angesprochene Adresse allerdings, da Bit 0 ja
> immer 0 sein sollte und nicht Teil der Adresse ist...
> Die Antwort vom Chip auf MOSI ist beim Schreiben irrelevant.

Ein Flüchtigkeitsfehler war ein langer Tag also nicht irritieren lassen.

Mosi: 0x81 0x83
Miso: 0x05 0x02
Wären demnach einfach Müll und müssten nicht interpretiert werden, so 
das die zu interpretierenden Bytes folgende wären:

> Beispiel:
> NSS:  0x01 0x00 0x00 0x01 0x00 0x00 0x01 0x00 0x00
> MOSI: ---  0x80 0x-- ---  0x82 0x-- ---  0x05 0x20
> MISO: ---  0x-- 0x02 ---  0x-- 0x30 ---  0x-- 0x--


MFG Stephan

von Tim R. (vref)


Lesenswert?

also nochmal an deinem Beispiel die Daten, die für dich wichtig sind:
1
        __              __              __              __
2
> NSS:    \____________/  \____________/  \____________/
3
> MOSI:     0x80 ----       0x82 ----       0x05 0x20
4
> MISO:     ---- 0x02       ---- 0x30       ---- ----


edit: ok, du hast es verstanden, hatte mein beispiel parallel zu deiner 
antwort "gemalt".
Fragt sich halt immernoch, was diese seltsame 0x05 beim schreiben soll 
(bit 0=1)

von Stephan V. (Firma: FH Gelsenkirchen) (devilx)


Lesenswert?

Super Verstanden klingt schon mal toll ^^


Tim R. schrieb:
> Fragt sich halt immernoch, was diese seltsame 0x05 beim schreiben soll
> (bit 0=1)

ich habe mich einfach an deinem Schreib beispiel orientiert da ich 
meinen Zettel in der FH liegen lassen hab.

Tim R. schrieb:
> Beispiel:
> MOSI: 0x05 0x20 0x34 0x55
> MISO: 0x-- 0x-- 0x-- 0x--

MFG Stephan

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.