FAT_32 und F16_WriteSector

  • 1
  • 2
  • Page 1 of 2
Torsten
Benutzer
Avatar
Gender:
Location: Bad Doberan
Age: 59
Posts: 62
Registered: 11 / 2005
Subject:

FAT_32 und F16_WriteSector

 · 
Posted: 02.08.2016 - 16:05  ·  #1
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.

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
miparo
Administrator
Avatar
Gender:
Location: Germany
Age: 58
Posts: 959
Registered: 09 / 2007
Subject:

Re: FAT_32 und F16_WriteSector

 · 
Posted: 02.08.2016 - 20:05  ·  #2
Hi Torsten,
du willst die Karte im RAW Modus voll schreiben ohne FAT System ?

Ansonsten wäre ja F16_FileCreate(...., 4GB) und dann mit BlockRandomWrite zu arbeiten eine Alternative.

miparo
Torsten
Benutzer
Avatar
Gender:
Location: Bad Doberan
Age: 59
Posts: 62
Registered: 11 / 2005
Subject:

Re: FAT_32 und F16_WriteSector

 · 
Posted: 02.08.2016 - 20:39  ·  #3
Hallo miparo,

ich habe bei dem FAT16 Treiber die Erfahrung gemacht, dass ich mit dem Schreiben der Sektoren den geringsten Overhead habe.
In dem Projekt werden Daten von einem ADC auf der SD Karte gespeichert.
Hast du Erfahrungen bezüglich der Schreibgeschwingkeit bei den unterschiedlichen Funktionen?

Die SD Karte braucht unterschiedliche Zeiten (intern) zum schreiben der Daten. Die Daten vom ADC müssen gepuffer werden und so ein kleiner Controller hat davon nicht besonders viel.

Es wäre schon toll, wenn man die schnellste Version zum Schreiben der Daten nutzen könnte.

Torsten
miparo
Administrator
Avatar
Gender:
Location: Germany
Age: 58
Posts: 959
Registered: 09 / 2007
Subject:

Re: FAT_32 und F16_WriteSector

 · 
Posted: 02.08.2016 - 20:56  ·  #4
Hi Torsten,
Dann hast du aber kein FAT Sytem mehr!

F16_Read/WriteSector waren früher für den IOS Zugriff , den es aber nicht mehr gibt.
Im Handbuch vergessen ?

Im neuen Treiber greifen alle Funktionen direkt auf den internen privaten _BufSec[511] zu.

Um diesen nutzen zu können habe ich mal einen neuen
ptrFATBuf512 : pointer; // public pointer to _BufSec , NUR im RAW Modus zu verwenden
definiert. So kannst du direkt den internen Treiber Buffer befüllen und wegschreiben.

Alternativ:
Intern macht F16_Write/ReadSector allerdings ein CopyBlock, was du mit { $DEFINE F16_USEBUFSEC} abstellen kannst.
Und so auf den ptrFATBuf512 arbeiten kannst.

Beides geht.

Anbei eine neue FAT32 Unit.
Bitte mal berichten.

Danke
miparo
Torsten
Benutzer
Avatar
Gender:
Location: Bad Doberan
Age: 59
Posts: 62
Registered: 11 / 2005
Subject:

Re: FAT_32 und F16_WriteSector

 · 
Posted: 02.08.2016 - 21:06  ·  #5
Hallo miparo,
Super schnell!

Ich werde es morgen testen.

Torsten
Torsten
Benutzer
Avatar
Gender:
Location: Bad Doberan
Age: 59
Posts: 62
Registered: 11 / 2005
Subject:

Re: FAT_32 und F16_WriteSector

 · 
Posted: 03.08.2016 - 14:47  ·  #6
Hallo miparo,

ich habe heute den geänderten Treiber probiert. Es funktioniert,vielen Dank!
Ich habe den { $DEFINE F16_USEBUFSEC} benutzt und dann die Funktion writesector aufgerufen.
Mit dem SDIO-Interface habe ich bei einem CPU clock von 40MHz ca. 240Kbyte/sec. erreicht, habe dann noch die SPI Version getestet und bin dort bis auf 290kByte/sec. gekommen.
(fastmode 290kByte/sec
standard 150kByte/sec)
Das Ergebnis hat mich etwas überrascht, ich dachte mit dem 4-bit Interface erreiche ich die max. Übertragungsrate.
Habe ich mich an einer Stelle selbst überlistet oder ist es wirklich so.
In dem Testprogramm habe ich 100000 Sektoren geschrieben dabei jeweils einen Timer ausgelesen und diesen Wert mit in den Sektor getan, sonst hat das Programm weiter nicht gemacht.

Torsten
miparo
Administrator
Avatar
Gender:
Location: Germany
Age: 58
Posts: 959
Registered: 09 / 2007
Subject:

Re: FAT_32 und F16_WriteSector

 · 
Posted: 03.08.2016 - 15:54  ·  #7
Hi Thorsten,
in deinem Fall wäre HW SPI mit DMA am besten, da solltes du auf > 600kB/s.
Das verdoppelt mindenstens den Duchsatz und dann noch ein multiple write , da sollte was zusammen kommen :)

miparo
miparo
Administrator
Avatar
Gender:
Location: Germany
Age: 58
Posts: 959
Registered: 09 / 2007
Subject:

Re: FAT_32 und F16_WriteSector

 · 
Posted: 03.08.2016 - 18:24  ·  #8
Ich habe gerade mal HW SPI mit DMA getestet und da komme ich auf Datenraten von > 750kB/s :)
Also Luft nach oben ist noch genug da.

Aber wo kommen die Daten so schnell her ?
  • 1
  • 2
  • Page 1 of 2
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 15 · Cache Hits: 14   137   151 · Page-Gen-Time: 0.042717s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI