SPI mit Fehlern?
Moderator: Guido Körber
-
- Posts: 97
- Joined: Wed Aug 03, 2011 3:46 pm
- Contact:
SPI mit Fehlern?
Mit der folgenden Routine werden Sektoren zu jed 512 Byte einer SD-Karte ausgelesen. Dies funktioniert bis zum Sektor 47. Im Sektor 48 ändert sich plötzlich das Verhalten des SPI-Bus. Tatsächlich kann die SD-Karte mit einem anderen Kontroller vollständig ausgelesen werden (also nicht nur bis zum Sektor47).
Dazu gibt es zwei Diagramme. In einem Diagramm ist die fehlerfreie SPI-Übertragung zu sehen. Im anderen Diagramm erkennt man, dass der SPI-Bus ohne erkennbaren Grund eine Pause einlegt und danach 6 Byte ganz schnell hintereinander einliest. Dies führt dann nach kurzer Zeit zum Absturz des Programms bzw. man erhält zunächst falsche Werte.
'Trigger to low (P0.0)
IOdatawrite(1) = ClearBit(IOdatawrite(1), 0)
intret = IowKitWrite(IOhandle, 0, IOdatawrite(0), 8)
'getting data from the SD-Card; 512 Byte
For lcounter = 1 To 512
IOspidata(0) = &H9
IOspidata(1) = 1 'reading 1 Byte
IOspidata(2) = &H0 'flags
intret = IowKitWrite(IOhandle, 1, IOspidata(0), 64)
IOspidata(2) = &HFF
intret = IowKitRead(IOhandle, 1, IOspidata(0), 64)
sdreadsector(lcounter) = IOspidata(2)
If datasetcounter = 1012 Then
'only one specific sector will be shown in the Immediate Window
Debug.Print(CStr(triggercounter) & " " & CStr(datasetcounter) & " value " & Convert.ToString(sdreadsector(lcounter), 16))
End If
Next lcounter
'Trigger to high (P0.0)
IOdatawrite(1) = SetBit(IOdatawrite(1), 0)
intret = IowKitWrite(IOhandle, 0, IOdatawrite(0), 8)
Dazu gibt es zwei Diagramme. In einem Diagramm ist die fehlerfreie SPI-Übertragung zu sehen. Im anderen Diagramm erkennt man, dass der SPI-Bus ohne erkennbaren Grund eine Pause einlegt und danach 6 Byte ganz schnell hintereinander einliest. Dies führt dann nach kurzer Zeit zum Absturz des Programms bzw. man erhält zunächst falsche Werte.
'Trigger to low (P0.0)
IOdatawrite(1) = ClearBit(IOdatawrite(1), 0)
intret = IowKitWrite(IOhandle, 0, IOdatawrite(0), 8)
'getting data from the SD-Card; 512 Byte
For lcounter = 1 To 512
IOspidata(0) = &H9
IOspidata(1) = 1 'reading 1 Byte
IOspidata(2) = &H0 'flags
intret = IowKitWrite(IOhandle, 1, IOspidata(0), 64)
IOspidata(2) = &HFF
intret = IowKitRead(IOhandle, 1, IOspidata(0), 64)
sdreadsector(lcounter) = IOspidata(2)
If datasetcounter = 1012 Then
'only one specific sector will be shown in the Immediate Window
Debug.Print(CStr(triggercounter) & " " & CStr(datasetcounter) & " value " & Convert.ToString(sdreadsector(lcounter), 16))
End If
Next lcounter
'Trigger to high (P0.0)
IOdatawrite(1) = SetBit(IOdatawrite(1), 0)
intret = IowKitWrite(IOhandle, 0, IOdatawrite(0), 8)
- Attachments
-
- SPI.mit.Fehler_k.gif (297.42 KiB) Viewed 9237 times
-
- SPI.ohne.Fehler_k.gif (270.9 KiB) Viewed 9237 times
-
- Site Admin
- Posts: 2856
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
Re: SPI mit Fehlern?
Also ohne Beschreibung was für Signale (abgesehen von Data und Clock, die sind ja zu erkennen) da gezeigt werden ist das leider nicht wirklich zu verstehen.
Aber eine Frage stellt sich mir direkt: Warum werden die Bytes einzeln gelesen? Der IOW56 kann bis zu 61 Datenbytes in einem SPI-Report transportieren, das erhöht den Durchsatz ganz gewaltig.
Aber eine Frage stellt sich mir direkt: Warum werden die Bytes einzeln gelesen? Der IOW56 kann bis zu 61 Datenbytes in einem SPI-Report transportieren, das erhöht den Durchsatz ganz gewaltig.
-
- Posts: 97
- Joined: Wed Aug 03, 2011 3:46 pm
- Contact:
Re: SPI mit Fehlern?
Also die Signale von oben nach unten:
oben:
Gelb: Triggersignal (P0.0 geht von high auf low)
Rot: SPI-Clock
Blau: MISO
unten:
dasselbe nochmal allerdings ein kleiner gezoomter Bereich
Das lesen von mehr als einem Byte funktioniert nicht mit SD-Karten.
oben:
Gelb: Triggersignal (P0.0 geht von high auf low)
Rot: SPI-Clock
Blau: MISO
unten:
dasselbe nochmal allerdings ein kleiner gezoomter Bereich
Das lesen von mehr als einem Byte funktioniert nicht mit SD-Karten.
-
- Site Admin
- Posts: 2856
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
Re: SPI mit Fehlern?
Das mit dem Lesen von einzelnen Bytes ist aber nicht schön. Sind Sie sicher, dass das nicht anders geht?
Betreffs der Verzögerungen: Siehe anderer Thread.
Betreffs der Verzögerungen: Siehe anderer Thread.
-
- Posts: 97
- Joined: Wed Aug 03, 2011 3:46 pm
- Contact:
Re: SPI mit Fehlern?
Aber beim SPI-Datenverkehr hole ich doch die Input-Reports ab. Das geht doch gar nicht anders. Beim SPI muss doch schreiben und lesen um Daten zu erhalten.
Der Trigger wird aufgrund der IF-Anweisung nur ein einziges mal ausgeführt. habe gerade nach der Write-Anweisung eine Read-Anweisung eingefügt, aber das hat die Verzögerung nicht geändert. Sie beträgt immer noch 7 Byte. Das heißt vor dem Trigger wurden schon 7 Byte übertragen.
Anbei nochmal der Code.
Der Trigger wird aufgrund der IF-Anweisung nur ein einziges mal ausgeführt. habe gerade nach der Write-Anweisung eine Read-Anweisung eingefügt, aber das hat die Verzögerung nicht geändert. Sie beträgt immer noch 7 Byte. Das heißt vor dem Trigger wurden schon 7 Byte übertragen.
Anbei nochmal der Code.
- Attachments
-
- WarriorSPIProblem.gif (16.36 KiB) Viewed 9224 times
-
- Site Admin
- Posts: 2856
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
Re: SPI mit Fehlern?
Der Report muss jedes mal abgeholt werden, sonst sammeln die sich im Puffer und man bekommt ggf. beim nächsten mal sofort einen Report, weil ja noch einer im Puffer war.
-
- Posts: 97
- Joined: Wed Aug 03, 2011 3:46 pm
- Contact:
Re: SPI mit Fehlern?
Innerhalb der Schleife For lcounter=1 To 512 bis Next lcounter
wird kein IO-Report erzeugt und die SPI-Antworten werden aufgefangen weil lesen über SPI nur mit Write/Read geht.
Wie kann es also sein, das ein paar der 512 Byte ordentlich gelesen werden und dann plötzlich kommt ein Aussetzer?
wird kein IO-Report erzeugt und die SPI-Antworten werden aufgefangen weil lesen über SPI nur mit Write/Read geht.
Wie kann es also sein, das ein paar der 512 Byte ordentlich gelesen werden und dann plötzlich kommt ein Aussetzer?
-
- Site Admin
- Posts: 2856
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
Re: SPI mit Fehlern?
Wie ist die Schaltung aufgebaut? Ist das auf dem Board das wir auch hier haben?
-
- Posts: 97
- Joined: Wed Aug 03, 2011 3:46 pm
- Contact:
Re: SPI mit Fehlern?
Nein, es ist eine direkte Verbindung zwischen dem IO-Warrior56 und einer SD-Karte. Der Fehler tritt beim Lesen der Daten auf. Die Initialisierung der SD-Karte funktioniert dagegen ohne Probleme. Die SD-Karte wird mit 3,3V betrieben. Die Pullup-Widerstände sind beim IO-Warrior abgeschaltet. Die Pins sind direkt miteinander verbunden (Clock, CS, MISO, MOSI).
-
- Site Admin
- Posts: 2856
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
Re: SPI mit Fehlern?
Haben Sie mal ein Bild davon? Ist für die SD-Karte ein Kondensator in der Nähe?
-
- Posts: 97
- Joined: Wed Aug 03, 2011 3:46 pm
- Contact:
Re: SPI mit Fehlern?
Anbei ein Foto vom Versuchsaufbau. IO-Warrior56 und SD-Karte sind über den SPI-Bus direkt miteinander verbunden. Die Spannungsversorgung der SD-Karte ist mit einem 100nF-Kondensator (SMD) abgeblockt.
-
- Site Admin
- Posts: 2856
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
Re: SPI mit Fehlern?
Ich les mich grad in die SD-Card Spec ein, wir werden mal versuchen das hier nachzustellen, wird aber wahrscheinlich nicht mehr vor Weihnachten.
-
- Posts: 97
- Joined: Wed Aug 03, 2011 3:46 pm
- Contact:
Re: SPI mit Fehlern?
Hallo Herr Körber,
gibt es denn hier etwas Neues?
Viele Grüße
Franz Peter Zantis
gibt es denn hier etwas Neues?
Viele Grüße
Franz Peter Zantis
-
- Site Admin
- Posts: 2856
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
Re: SPI mit Fehlern?
Die Einzelteile zum Testen sind da, mir ist momentan eine Erkältung dazwischen gekommen :(
-
- Site Admin
- Posts: 2856
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
Re: SPI mit Fehlern?
Eine Sache über die ich grad gestolpert bin: Die SPI Signale haben externe Pullups zu 3,3 V bekommen?
Was ich nicht verstehe ist, wo die Information her kommt, dass per SPI nur jeweils ein Byte aus der SD Karte gelesen werden kann. Die SD Spec ist ja sehr umfangreich, aber ich finde da nur Bezug auf Blockgrößen von max. 512 Byte.
Was ich nicht verstehe ist, wo die Information her kommt, dass per SPI nur jeweils ein Byte aus der SD Karte gelesen werden kann. Die SD Spec ist ja sehr umfangreich, aber ich finde da nur Bezug auf Blockgrößen von max. 512 Byte.