Forum: Mikrocontroller und Digitale Elektronik LPC2378 SD-Karte blockiert Reset


von Horst (Gast)


Lesenswert?

Hallo Forum,

ohne jetzt viel zu erklären und Code zu posten:

Was kann den LPC2378 daran hindern bei einem Reset per Taster diesen 
auch auszuführen? Es hilft erst ein PowerOn Reset oder das Entfernen der 
SD-Karte.

Zum Einsatz kommt FatFS von Chan und ich habe sein Beispiel V 0.10a 
inkl. MCI lowlevel Treiber für den LPC23xx in mein Projekt integriert. 
Ich führe momentan nur die Karteninitialisierung durch und versuche 
danach den Kartenstatus abzufragen. Mit dem Dateisystem an sich mache 
ich noch gar nichts.

Die Initialisierung scheint (meist) zu klappen.
Zumindest kann ich das anhand einiger eingefügter Debug ausgaben 
nachvollziehen.
Die erste Statusabfrage klappt auch.
Bei der zweiten Statusabfrage der Karte via FS_showDiskStatus() hängt 
sich das Programm auf und zeigt oben genanntes Verhalten.

Was kann den da so blockieren? Wenn ich das verstehe, kann ich auch 
besser nach dem Problem suchen...
Hat jemand eine Idee?

Auch wenn es vermutlich nicht viel hilft, anbei die Terminalausgabe der 
Initialisierung und der Statusabfrage...
1
di
2
After power_on()
3
CMD0 (1: success): 1
4
Card is 'idle' state
5
CardType: 12
6
Card is 'ready' state
7
Card is 'ident' state
8
CardRCA: 58916
9
Card is 'stby' state
10
Card is 'tran' state
11
Set wide bus mode
12
rc=0
13
14
du
15
rc=0
16
Drive size: 15523840 sectors
17
Erase block size: 24576 sectors
18
Card type: SDv2(Block)
19
CSD:
20
00000000: 40 0E 00 32 5B 59 00 00 3B 37 7F 80 0A 40 40 AE @..2[Y..;7...@@.
21
CID:
22
00000000: 03 53 44 53 55 30 38 47 80 71 8B A0 C5 00 BB 4E .SDSU08G.q.....N
23
OCR:
24
00000000: C0 FF 80 00 ....
25
26
du
27
þ

di löst die Initialisierung der Karte aus
du fragt den Status ab
nach der zweiten Statusabfrage hängt das System

Die Karte ist eine 8GB SDHC

von Horst (Gast)


Lesenswert?

Noch als Nachtrag, wenn das System blockiert, wird nach dem Entfernen 
der SD-Karte sofort neugestartet...

von leluno (Gast)


Lesenswert?

Beim LPC1768-Beispielcode von chan hat die Pinbelegung nicht gestimmt. 
Den Low-Level-Teil überprüfen, ob sck, miso, mosi und cs richtig 
initialisiert sind.

von Horst (Gast)


Lesenswert?

Ich bekomme aber doch bei der Initialisierung gültige Daten...
CardType: 12 besagt dass es eine SDHC (Version 2) mit Blockadressing 
ist, was auch stimmt.

Die 1. Statusabfrage liefert auch Daten (die mir aber nicht so viel 
sagen).
Erst beim 2. Versuch folgt der Absturz...

Mich wundert halt, dass der Controller dann so richtig weg ist, so dass 
auch kein Reset per Reset-Taster mehr hilft...

von Horst (Gast)


Lesenswert?

Das ist ja auch reproduzierbar.
Ein "di" also eine neue Initialisierung nach dem ersten "du" führt auch 
zum Absturz...

von leluno (Gast)


Lesenswert?

wird da nicht irgendwann die spi-Geschwindigkeit umgeschaltet? CPOl und 
CPHA richtig eingestellt?

von Jim M. (turboj)


Lesenswert?

Horst schrieb:
> Erase block size: 24576 sectors

Uh oh. Das ist IIRC im SD_STATUS Register, und ich hatte hier mal einen 
Kartentyp der sich beim Lesen dieses Registers derart aufgehängt hat, 
dass nur ein Power-cycle half.

Übrigens kennen SD Karten keinen Reset - man muss dafür die 
Stromversorgung abklemmen.

von Horst (Gast)


Lesenswert?

Jim Meba schrieb:
> Übrigens kennen SD Karten keinen Reset - man muss dafür die
> Stromversorgung abklemmen.

Das ist mir bekannt, trotzdem eine gute Idee das mal auszuprobieren.
Nur die Karte zu resetten. Dann weiß ich, dass sich die Karte 
aufhängt...

von Horst (Gast)


Lesenswert?

leluno schrieb:
> wird da nicht irgendwann die spi-Geschwindigkeit umgeschaltet? CPOl und
> CPHA richtig eingestellt?

Die Geschwindigkeit wird irgendwann erhöht. Es handelt sich hier aber 
nicht um SPI sondern um MCI...

von Horst (Gast)


Lesenswert?

Jim Meba schrieb:
> Horst schrieb:
>> Erase block size: 24576 sectors
>
> Uh oh. Das ist IIRC im SD_STATUS Register, und ich hatte hier mal einen
> Kartentyp der sich beim Lesen dieses Registers derart aufgehängt hat,
> dass nur ein Power-cycle half.

Aber warum reproduzierbar beim zweiten Aufruf? Und das bei mindestens 6 
verschiedenen Karten von mindestens 3 Herstellern...

von Horst (Gast)


Lesenswert?

Die MCI lowlevel Funktionen von Chan arbeiten mit zwei IRQs (MCI und 
DMA), das hat meine alte implementation nicht gemacht.
Evtl. gibt es auch ein Problem mit nested IRQs... aber eigentlich ist 
mir das Auftreten des Problems dafür zu reproduzierbar beim zweiten 
Aufruf...

von W.S. (Gast)


Lesenswert?

Das sieht mir nach einem Software-Schlamper-problem aus: Chan ist einer 
dieser Gesellen, die partout drauf bestehen, beim Initialisieren einen 
auf 0 geputzten RAM vorzufinden - bloß weil es irgendwo mal in einer 
C-Beschreibung stand, daß man davon ausgehen dürfte, daß aller 
Speicherplatz beim Systemstart abgelöscht sei.

Ich hatte mit Chan's FF auch seltsame Probleme dieser Art (aber ohne 
DMA), die sich verflüchtigten, als ich in dessen Init-Routine das 
Ablöschen globaler Variablen nachträglich eingebaut hatte.

W.S.

von Horst (Gast)


Lesenswert?

Hm, ich geh eigentlich auch davon aus, dass globale Variablen implizit 
mit 0 initialisiert werden.
Sehe aber auch den Zusammenhang mit meinem Problem nicht...
Beim 1. Durchlauf tut es doch!

von Horst (Gast)


Lesenswert?

Horst schrieb:
> Jim Meba schrieb:
>> Übrigens kennen SD Karten keinen Reset - man muss dafür die
>> Stromversorgung abklemmen.
>
> Das ist mir bekannt, trotzdem eine gute Idee das mal auszuprobieren.
> Nur die Karte zu resetten. Dann weiß ich, dass sich die Karte
> aufhängt...

Also wenn ich im Fehlerfall manuell die Versorgungsspannung der SD-Karte 
wegnehme, dann startet der uController sofort neu...

Hilft mir jetzt aber auch nicht so wahnsinnig viel weiter?!

von Horst (Gast)


Lesenswert?

So, habe mich mal wieder der SD Karte gewidmet und folgendes 
rausgefunden.
Wenn ich eine etwas kleinere Version meines Programmes aufspiele, dann 
kann ich auch bei der 8 GB Karte mehrfach den Status abfragen.

Folgendes Programm macht keine Probleme:
1
LPC2378 with 32 kB {0x7FFF} SRAM and 0x3400 kB fixed for Stack leaves 0x4BFF = 19455 kB for application! bss + data?
2
Size after:
3
   text     data      bss      dec      hex  filename
4
 132132      476    11860   144468    23454  fat_mci_demo.elf
5
6
fat_mci_demo.elf  :
7
section              size         addr
8
.text              132132            0
9
.data                 476   1073741824
10
.initdata             476       132132
11
.bss                 9452   1073742300
12
.stack              13312   1073751752
13
.usbram              2408   2144337920
14
.comment             1134            0
15
.debug_aranges       5840            0
16
.debug_pubnames     17569            0
17
.debug_info         92207            0
18
.debug_abbrev       24291            0
19
.debug_line         47429            0
20
.debug_frame        13608            0
21
.debug_str          26055            0
22
.debug_loc          68098            0
23
.debug_macinfo    2446589            0
24
.ARM.attributes        16            0
25
.debug_ranges        9984            0
26
Total             2911076

Bei diesem steigt es nach der 2. Statusabfrage aus:
1
LPC2378 with 32 kB {0x7FFF} SRAM and 0x3400 kB fixed for Stack leaves 0x4BFF = 19455 kB for application! bss + data?
2
Size after:
3
   text     data      bss      dec      hex  filename
4
 147800      484    13372   161656    27778  fat_mci_demo.elf
5
6
fat_mci_demo.elf  :
7
section              size         addr
8
.text              147800            0
9
.data                 484   1073741824
10
.initdata             484       147800
11
.bss                10412   1073742308
12
.stack              13312   1073752720
13
.usbram              2960   2144337920
14
.comment             1134            0
15
.debug_aranges       6080            0
16
.debug_pubnames     19264            0
17
.debug_info         95723            0
18
.debug_abbrev       24831            0
19
.debug_line         48880            0
20
.debug_frame        14348            0
21
.debug_str          27693            0
22
.debug_loc          69883            0
23
.debug_macinfo    2483910            0
24
.ARM.attributes        16            0
25
.debug_ranges       10208            0
26
Total             2977422

Ich vermute daher nun eher ein Problem mit dem SRAM bzw. Stack.

Momentanes Eclipse Setup (installed software list):
  - Eclipse Standard/SDK Kepler V 4.3.1
    - Eclipse Platform
    - Eclipse Standard/SDK Feature
  - Autotools support for CDT
  - C/C++ GDB Hardware Debugging
  - Embedded Systems Register Viw (SFR)
  - EmbSysRegView Data
  - Visual C++ support

  - OpenOCD 0.7.0

Kann ich mit OpenOCD und GDB irgendwie den SRAM Verbrauch bzw. den Stack 
zur Laufzeit ansehen? Kann man auf einen Zugriff auf eine bestimmte RAM 
Adresse triggern? Ich arbeite noch nicht so lange mit Eclipse und 
OpenOCD und kenne mich da nicht so gut aus.
Wäre über Hilfe sehr erfreut.

von Grundschüler (Gast)


Lesenswert?

Horst schrieb:
> Kann ich mit OpenOCD und GDB irgendwie den SRAM Verbrauch bzw. den Stack
> zur Laufzeit ansehen?

bei codeRed geht das. Da diese IDE auch auf Eclipse basiert, müsste es 
bei dir auch gehen.

Wenn du ein lcd hast, kannst du dir an verschiedenen Stellen im Code den 
Speicherinhalt anzeigen lassen. Das hilft manchmal weiter.

Für DMA muss der Speicherbereich festgelegt werden:
__SECTION(data,RAM1) uint8_t buffer[25600];
uint8_t *buf_rx =buffer+20480;
uint8_t *buf_tx =buffer+20992;

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.