Hallo,
ich arbeite gerade mit dem FAT32 Treiber und dem 4bit Interface für die SD-Karte.
Die Karte wird initialisiert und ich kann die Disksize auslesen.
Wenn ich mit der Funktion F16_WriteSector auf die Karte schreibe, dann stehen in dem Sektor nur Nullen. Ich übergebe der Funktion einen Zeiger auf ein 512byte Array, welches ich zuvor mit Werten fülle.
(Alles Sektoren habe ich zuvor mit FF überschreiben lassen.)
d.h der Sektor wird beschrieben, halt nur nicht mit den gewünschten Daten.
Ist das Schreiben und Lesen sektorweise noch möglich mit dem FAT32 Treiber?
Hat jemand diese Funktionen in seiner Anwendung?
Vielleicht sehe ich den Wald vor lauter Bäumen auch nicht.
Wenn ich mit der Funktion F16_Blockwrite in eine Datei schreibe, dann finde ich die Daten auf der Karte.
Ich möchte in meiner Anwendung einfach so schnell wie nur möglich auf die Karte schreiben, die
Dateiverwaltung ist dabei nicht so wichtig.
program PaSDTest;
{$NOSHADOW}
{ $WG} {global Warnings off}
Device = xmega256A3U, VCC=3.3;
{ $BOOTRST $20000} {Reset Jump to $20000}
Define_Fuses
// Override_Fuses;
NoteBook = A;
COMport = USB;
LockBits0 = [];
FuseBits0 = [];
FuseBits1 = [];
FuseBits2 = [];
ProgMode = PDI;
Import SysTick, FAT16_32;
From System Import ;
Define
// The XMegas don't provide any Oscillator fuses.
// So the application must setup the desired values
// possible OSC types: extXTAL, extClock, ext32kHz, int32Khz, int2MHz, int32MHz
OSCtype = int2MHz,
PLLmul = 16,
prescB = 1,
prescB = 1, overdrive;
SysTick = 10; {msec}
StackSize = $0300, iData;
FrameSize = $0300, iData;
FAT16 = SDIO,PortD.0,PortD.5,PortD.7,iData;
F16_FileHandles = 2;
F16_DirLevels = 2;
F16_StrLen = 50;
F16_MMCspeed = fast;
uses UFAT16_32;
Implementation
{$IDATA}
{--------------------------------------------------------------}
{ Type Declarations }
type
{--------------------------------------------------------------}
{ Const Declarations }
{--------------------------------------------------------------}
{ Var Declarations }
{$IDATA}
var LED1[@PortA,3] : bit;
var bool : boolean;
var SizeSD : longword;
var SizeSDFree : longword;
var SizeSDused : longword;
var Buffer_T : array[0..255] of word;
var Buffer_R : array[0..255] of word;
var ptr:pointer;
var Res: word;
var ll : word;
var i: word;
{--------------------------------------------------------------}
{ functions }
procedure init;
begin
DDRA := %00011010;
end;
{--------------------------------------------------------------}
{ Main Program }
{$IDATA}
begin
init;
EnableInts($87);
F16_DiskInit;
mdelay(100);
F16_DiskReset;
mdelay(100);
for i:=0 to 255 do
Buffer_T[i]:=i+ 256 *i;
endfor;
if F16_CheckDisk then
LED1:= FALSE; // LED on
Buffer_T[0]:=$AA;
ptr:= @Buffer_T;
F16_WriteSector(50000,ptr);
endif;
mdelay(200);
LED1:= TRUE; // LED off
loop
if F16_CheckDisk then
SizeSD:= F16_GetDiskSize;
SizeSDFree:= F16_GetDiskFree;
sizeSDused:= F16_GetDiskUsed;
endif;
Toggle(LED1);
mdelay(100);
endloop;
end PaSDTest.
Vielen Dank für die Unterstützung im voraus.
Torsten
ich arbeite gerade mit dem FAT32 Treiber und dem 4bit Interface für die SD-Karte.
Die Karte wird initialisiert und ich kann die Disksize auslesen.
Wenn ich mit der Funktion F16_WriteSector auf die Karte schreibe, dann stehen in dem Sektor nur Nullen. Ich übergebe der Funktion einen Zeiger auf ein 512byte Array, welches ich zuvor mit Werten fülle.
(Alles Sektoren habe ich zuvor mit FF überschreiben lassen.)
d.h der Sektor wird beschrieben, halt nur nicht mit den gewünschten Daten.
Ist das Schreiben und Lesen sektorweise noch möglich mit dem FAT32 Treiber?
Hat jemand diese Funktionen in seiner Anwendung?
Vielleicht sehe ich den Wald vor lauter Bäumen auch nicht.
Wenn ich mit der Funktion F16_Blockwrite in eine Datei schreibe, dann finde ich die Daten auf der Karte.
Ich möchte in meiner Anwendung einfach so schnell wie nur möglich auf die Karte schreiben, die
Dateiverwaltung ist dabei nicht so wichtig.
Code
program PaSDTest;
{$NOSHADOW}
{ $WG} {global Warnings off}
Device = xmega256A3U, VCC=3.3;
{ $BOOTRST $20000} {Reset Jump to $20000}
Define_Fuses
// Override_Fuses;
NoteBook = A;
COMport = USB;
LockBits0 = [];
FuseBits0 = [];
FuseBits1 = [];
FuseBits2 = [];
ProgMode = PDI;
Import SysTick, FAT16_32;
From System Import ;
Define
// The XMegas don't provide any Oscillator fuses.
// So the application must setup the desired values
// possible OSC types: extXTAL, extClock, ext32kHz, int32Khz, int2MHz, int32MHz
OSCtype = int2MHz,
PLLmul = 16,
prescB = 1,
prescB = 1, overdrive;
SysTick = 10; {msec}
StackSize = $0300, iData;
FrameSize = $0300, iData;
FAT16 = SDIO,PortD.0,PortD.5,PortD.7,iData;
F16_FileHandles = 2;
F16_DirLevels = 2;
F16_StrLen = 50;
F16_MMCspeed = fast;
uses UFAT16_32;
Implementation
{$IDATA}
{--------------------------------------------------------------}
{ Type Declarations }
type
{--------------------------------------------------------------}
{ Const Declarations }
{--------------------------------------------------------------}
{ Var Declarations }
{$IDATA}
var LED1[@PortA,3] : bit;
var bool : boolean;
var SizeSD : longword;
var SizeSDFree : longword;
var SizeSDused : longword;
var Buffer_T : array[0..255] of word;
var Buffer_R : array[0..255] of word;
var ptr:pointer;
var Res: word;
var ll : word;
var i: word;
{--------------------------------------------------------------}
{ functions }
procedure init;
begin
DDRA := %00011010;
end;
{--------------------------------------------------------------}
{ Main Program }
{$IDATA}
begin
init;
EnableInts($87);
F16_DiskInit;
mdelay(100);
F16_DiskReset;
mdelay(100);
for i:=0 to 255 do
Buffer_T[i]:=i+ 256 *i;
endfor;
if F16_CheckDisk then
LED1:= FALSE; // LED on
Buffer_T[0]:=$AA;
ptr:= @Buffer_T;
F16_WriteSector(50000,ptr);
endif;
mdelay(200);
LED1:= TRUE; // LED off
loop
if F16_CheckDisk then
SizeSD:= F16_GetDiskSize;
SizeSDFree:= F16_GetDiskFree;
sizeSDused:= F16_GetDiskUsed;
endif;
Toggle(LED1);
mdelay(100);
endloop;
end PaSDTest.
Vielen Dank für die Unterstützung im voraus.
Torsten