Hi,
ich wollte mal fragen, ob einer von euch Erfahrungen mit Elm Chan's
FatFs System gesammelt hat. Ich habe jetzt verschiedenste Sachen
ausprobiert, bekomme das teil aber nicht zum laufen (nicht wie ich will
zumindest). Habe erst diese Anleitung probiert:
http://www.basementcode.com/avr/sd_fatfs/fatfs.php
Danach selbst an den Dateien editiert und Fehlersuche betrieben, die
mich allerdings auch nach Stunden nicht weiterbrachte. Jetzt habe ich
diese Anleitung gefunden:
http://www.frank-zhao.com/index.php?page=fat_sd
Problem ist bei dieser: Sie scheint zu funktionieren für meine 128mb
SD-Karte von "extreMEmory". Jedoch nicht bei meiner "Hama" mit 512mb und
nicht bei meiner "SanDisk" mit 2GB (die eigentlich in dem System
arbeiten soll).
Hat einer schonmal so eine SanDisk zum laufen gebracht und kennt
vielleicht ein grundlegendes Problem das ich übersehe?
Hallo,
ich habe gerade FatFs implementiert und kann jetzt Micro-SD Karten von
1GB (SanDisk) bis 16GB (Medion) problemlos lesen und schreiben.
Eigentlich sollte es nicht von der Karte abhängen wenn doch, folgende
Punkte abklären:
1. Wo tritt der Fehler auf? Beim Initialisieren, Lesen oder Schreiben?
2. Stimmt die Versogungsspannung der Karte? Manche Karten sind hier
pingeliger als andere. Eine Versorgung direkt aus einem Portpin halte
ich für sehr kritisch, besser einen Transistor/Mosfet nachschalten.
3. Zum Initialisieren muss die SPI-Taktfrequenz auf <= 400kHz
herabgesetzt werden, danach sind bis zu 25MHz erlaubt.
Welche Low-Level-Treiber benutzt Du? Die sind bei FatFS normalerweise
nicht dabei, ich habe sie mir daher selbst geschrieben. Nachdem diese
dann funktionierten, gab es mit FatFs keine Probleme mehr.
Gruss
Mike
Hi,
danke schonmal für deine Antwort.
Ich benutze die Low-Level Treiber, die in den Examples für AVRs dabei
sind (mmc.c und diskio.h).
1. Der Fehler tritt bei der Initialisierung auf. Scheint also doch ein
Low-Level-Problem zu sein. Hatte die eigentlich schon durchgeschaut und
nichts gefunden, was nicht auch so in den Manuals von SanDisk
dringewesen wäre (also welches Kommando welche Antwort braucht usw.).
2. Wir betreiben die Karte direkt mit einem 3,3V Schaltregler mit wenig
Spannungsrippel (genauen Wert kann ich erst heute Abend messen, glaube
es waren um die 8mV).
3. Zum Initialisieren haben wir die Frequenz auf 12,5 KHz, danach auf
4MHz.
>2. Wir betreiben die Karte direkt mit einem 3,3V Schaltregler mit wenig>Spannungsrippel (genauen Wert kann ich erst heute Abend messen, glaube>es waren um die 8mV).
Und wie ist die Karte an den AVR angeschlossen?
Ist direkt am PortB des ATMEGA32 angeschlossen (der läuft auch mit den
3,3V).
@Martin Wende:
Danke, tut jedoch nicht ^^
Den TimingDelay muss man da auch wieder über eine ISR einfügen, die alle
10ms ausgelöst wird, oder?
Habs so eingebunden wie's hier:
"http://www.mikrocontroller.net/articles/AVR_FAT32" angegeben ist,
jedoch scheint keine der Karten richtig zu initialisieren (getestet mit
128mb, 512mb und 2GB Karte).
Kann dummerweise nicht editieren:
Ja, blöderweise die main.c übersehn mit dem Beispiel drin, also hab den
Timer wie dort angegeben drin. Initialisierung klappt jedoch nicht.
Danke dafür,
hab jedoch ein Problem, das einzubinden. Habe ein C++ Projekt und
bekomme immer "undefined reference" für verschiedene Funktionen, wenn
ich nur die .h also die Headerfiles per "#include" einbinde. Binde ich
zusätzlich die .c Dateien per "#include" ein (ja, das tut man nicht und
nein, ich weiß mir nicht besser zu helfen), bekomme ich den Fehler:
"ISO C++ forbids incrementing a pointer of type 'void*'". hab jetzt alle
void* mal in char* geändert, scheint der kompiler (AtmelStudio) wohl zu
nehmen. Hab jetzt aber wieder das Problem einer "multiple definition of
'card_type'" die, denke ich zumindest, von meiner Einbindung von .c und
.h kommt.
Das is jetz aber doof, zu C++ kann ich absolut ganix sagen.
Schubs doch mal den Schaltplanausschnitt rüber.
Software SPI oder Hardware?
Zur Not schieb ich dir mal ne .hex Datei rüber die dann per UART ausgibt
ob er die Karte mit dieser lib initen kann oder nicht.
Ich habe probleme mit Sandisk 2Gb karten. Ich habe hier 4 verschiedene
karten von Sandisk-2Gb (micro-sd), alle 4 das gleiche bestellnr aber
ausserlicht sind die unterschiedlich (made in...; text an vorne oder
hintere seite). 2 von die Sandisks typen funktionieren gut, 2 davon
geben manchmal probleme mit
schreiben und sowieso mit formattieren.
Das formattieren kannst du sowieso als guten test benutzen um zu testen
ob bestimmte karten funktionieren oder nicht. Ich habe selber die
erfahrung das als die formattierung ohne problemen verlauft, hat man
nachdem auch keine probleme mit die karten.
Deswegen brache ich jetzt fuer alle 100 platine die ich habe Verbatim
2Gb sd-karten. Und hab ich mir noch 400 stueck extra davon gekauft fuer
zukunft
Patrick
Ich versuch jetzt nochmal die Initialisierung zum laufen zu bringen.
Hier der Schaltplanausschnitt (Stützkondensatoren fehlen, sind aber an
jedem Vcc Pin angebracht, 100nF).
Pins sind richtig verbunden, wie gesagt, mit der 128mb Karte hat's
schonmal getan, jedoch eben nicht zuverlässig.
Gut, dann bin ich vielleicht schonmal nicht ganz doof, wenn andere auch
schon Probleme mit den SanDisk Karten hatten ^^
Das mit dem formatieren werd ich versuchen, geht aber auch erst, wenn
die Initialisierung richtig funktioniert.
Klopp das mal rauf und Probiers aus.
//LED PA7: main läuft
//LED PA6: SD karte gefunden
//LED PA5: kein Dateisystem
//LED PA4: okidoki
Is aus nem funktionierenden Projekt, daraus die SD init rausextrahiert.
Folgender Code sollte nach meiner Interpretation mit CMD0 die SD in den
SPI Mode holen, mit CMD1 die SD initialisieren und mit CMD16 die Länge
auf 512 Byte stellen. Der SPI mode scheint zu gehen, die initialisierung
auch, jedoch kommt keine richtige Antwort auf das CMD16...
1
char SPI_Transmit(char Data)
2
{
3
//Start transmission
4
SPDR0 = Data;
5
//Wait for transmission complete
6
while(!(SPSR0 & (1<<SPIF0)))
7
;
8
return SPDR0;
9
}
10
11
12
int main(void)
13
{
14
/*** Set Direction and Port States ***/
15
IOInitialize();
16
PORT_LED = ~0b00001111;
17
18
//Set MOSI and SCK output, all others input
19
DDR_SD |= (1<<P_MOSI)|(1<<P_SCK);
20
PORT_SD &= ~((1<<P_SCK)|(1<<P_MOSI)|(1<<P_MISO));
21
//Enable SPI, Master
22
SPCR0 |= (1<<SPE0)|(1<<MSTR0);
23
//Set Clockrate fosc/128
24
SPCR0 |= ((1<<SPR00)|(1<<SPR10));
25
SPSR0 &= ~(1<<SPI2X0);
26
//PORT_SD &= ~(1<<P_CS_SD);
27
PORT_SD |= (1<<P_CS_SD);
28
_delay_ms(5);
29
30
31
//Send Clocks for Synchronization (by sending dummys)
32
for(int i=0; i<10; i++)
33
{
34
SPI_Transmit(0xFF);
35
}
36
//Chip enable SD-Card
37
PORT_SD &= ~(1<<P_CS_SD);
38
39
//Send CMD0 to get the SD-Card to SPI-Mode
40
SPI_Transmit(0x40);
41
SPI_Transmit(0x00);
42
SPI_Transmit(0x00);
43
SPI_Transmit(0x00);
44
SPI_Transmit(0x00);
45
SPI_Transmit(0x95); //CRC required
46
//Waiting for the SD-Card to confirm SPI-Idle-State
47
while(SPI_Transmit(0xFF) != 1)
48
;
49
50
bool initSD = false;
51
char initSDconfirmation = 0;
52
53
while(initSD == false)
54
{
55
//CMD1 to initialize the SD-Card
56
SPI_Transmit(0x41);
57
SPI_Transmit(0x00);
58
SPI_Transmit(0x00);
59
SPI_Transmit(0x00);
60
SPI_Transmit(0x00);
61
SPI_Transmit(0xFF); //CRC not longer required
62
63
//Look for one of the next 100 answers to be initialization-confirmation
Freddy schrieb:> Ergebnis: Tut sich absolut nichts.
Hab mal grad nen Mega32 rausgekramt und in die Platine gesteckt.
Jap tut sich nix, was ich sehr komisch finde, denn mit dem Mega644P
funktionierts.
Natürlich jeweils das Makefile angepasst...
Sehr Merkwürdig, da der Code weder Interrupts noch Timer nutzt.
Nur die Library und die SPI register beider Prozessoren sind gleich.
Geh doch mal vom LED debugging zum UART debugging über.
Also lass dir aufm UART ausgeben was die SD Karte zurücksendet oder
klemm nen Buspirat ran.
Hab nen Oszi drangehängt: CMD16 gibt ein "Illegal Command" aus. Hab kurz
gedacht es wäre, weil ich vergessen habe nochmal zwischen CMD1 und CMD16
ein 0xFF zu senden, damit die SD nochmal clocks bekommt, grad eine
1
while(SPI_Transmit(0xFF) != 0xFF)
2
;
reingemacht, ändert jedoch nichts, trotzdem illegal command...
den Fehler Nr.13, kein Dateisystem vorhanden.
Versucht mit f_mkfs zu formatieren-> gibt keinen Fehler aus, bringt aber
auch nichts.
Muss man bei der SD Formatierung am PC irgendwas bestimmtes beachten,
was ich grade völlig übersehe?!?
Danke schonmal =)
Problem gelöst: SD-Karte defekt. Haben's jetzt auf ner zweiten Platine
getestet mit anderer SD getestet, tut.
Danke für eure Bemühungen, mit so einem Ergebnis habe ich nicht
gerechnet. Auf dem Oszi schienen die Antworten der SD zu passen.