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.
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.
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
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.
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
Hmm Keiner der da fitt ist oder eine Idee hat? wollte nach Möglichkeit heute Abend das Programm anpassen. MFG Stephan
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.
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
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.
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
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)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.