F16_BlockRead liefert sporadisch true nach Entfernen der SD Karte

Thomas.AC
Benutzer
Avatar
Gender: n/a
Age: 43
Posts: 308
Registered: 07 / 2013
Subject:

F16_BlockRead liefert sporadisch true nach Entfernen der SD Karte

 · 
Posted: 27.03.2014 - 12:08  ·  #1
Hallo liebes Forum,

bei mir tritt die Situation auf, das F16_Blockread sporadisch "true" liefert, obwohl die SD-Card während des Betriebs entfernt wurde. Die Anzahl gelesener Bytes beträgt in diesem Fall laut F16_Blockread 512 Bytes.
Ich möchte die Ursache klären und brauche dazu die Hilfe aus diesem tollen Forum.

Gruß

Thomas.AC

Code

program test;

{ $W+}
{$NOSHADOW}

Device = xmega128A4U, VCC = 3.3;
Import SysTick;
Import FAT16_32, SerPortE0;
From System Import Longword, SystemTime32;
Define
  OSCtype        = int2MHz,PLLmul=16,prescA=1,prescB=1,prescC=1,overdrive;
  SysTick        = 10, adj;
  StackSize      = 64, iData;
  FrameSize      = 256, iData;
  SerPortE0      = 19200;        // USART to PC
  TxBufferE0     = 32, iData;
  RxBufferE0     = 32, iData;
  //SysLEDblink    = mSec300;           {10..1000 msec}
  //SysLEDBlink0   = PortQ.3, low;     {LEDon = low level}
  //FAT16         = SDIO, PortA.0, PortD.5, PortD.7, iData; //4-bit port,CMD,CLK
  FAT16           = SPI_D, PortD.4, iData;  // SPI_X, SS-Port, SS-PIN, data area
  F16_FileHandles = 2;
  F16_DirLevels   = 1;
  F16_MMCspeed    = superfast; // standard, slow, fast, superfast
  F16_StrLen = 20;
//uses SerialIOmod;
Uses UFAT16_32;

Implementation

{$IDATA}

const

var
  fileBuffer0,fileBuffer1   : array[0..511] of byte;
  F0,F1           : File of Byte;
  SR              : TSearchRec;
  FileName        : tFileName;
  c               : char;
  count           : word;
  flag            : boolean;

procedure InitPorts;
begin
  // pullup on SPI MISO

end;

// -----------------------------------------------------------------------------
Function ListDir : boolean;
var LastDir : TSearchRec;
begin
  Writeln(SeroutE0, 'List Volume Items');
  if F16_FindFirst ('', '*.*', faAnyFile, SR) then
    repeat
      Filename:= SR.Name;
      Writeln(SeroutE0, '  - ' + SR.name);
    until not F16_FindNext(SR);
  endif;
  return(true);
end;

// -----------------------------------------------------------------------------
function InitSDCard : boolean;
var
  bool : boolean;
  SizeMB : longword;
begin
  Writeln(SeroutE0,  'TEST');
  if F16_DiskInit then
    Writeln(SeroutE0, 'MMC init ok!');
  else
    Writeln(SeroutE0, 'MMC init fail!');
    Return(false);
  endif;
  if F16_DiskReset then
    Writeln(SeroutE0, 'MMC reset ok!');
  else
    Writeln(SeroutE0, 'MMC reset fail!');
    Return(false);
  endif;
  if F16_CheckDisk then     // we check for an existing FAT16 system
    SizeMB := F16_GetDiskSize;
    Writeln(SeroutE0, 'Card Size total ' + LongToStr(SizeMB) + ' kbyte');
    SizeMB := F16_GetDiskFree;
    Writeln(SeroutE0, 'Unused size  ' + LongToStr(SizeMB) + ' kbyte');
    SizeMB := F16_GetDiskUsed;
    Writeln(SeroutE0, 'Used size ' + LongToStr(SizeMB) + ' kbyte');
  else
    Writeln(SeroutE0, 'CheckDisk fail!');
    Return(false);
  endif;
  ListDir;
  Return(true);
end;

{ Main Program }
{******************************************************************************}
begin
  EnableInts($87);
  PIN6CTRLD := PIN6CTRLD or %00011000; // pullup on SPI MISO
  InitSDCard;
  if F16_FileAssign(F0, '', '1.wav') then
    Writeln(SeroutE0,'FileAssign F0 with 1.wav OK');
  else
    Writeln(SeroutE0,'FileAssign F0 with 1.wav fail!');
  endif;
  if F16_FileReset(F0) then
    Writeln(SeroutE0,'FileReset F0 OK');
  else
    Writeln(SeroutE0,'FileReset F0 fail!');
  endif;
  if F16_FileAssign(F1, '', '1.wav') then
    Writeln(SeroutE0,'FileAssign F1 with 1.wav OK');
  else
    Writeln(SeroutE0,'FileAssign F1 with 1.wav fail!');
  endif;
  if F16_FileReset(F1) then
    Writeln(SeroutE0,'FileReset F1 OK');
  else
    Writeln(SeroutE0,'FileReset F1 fail!');
  endif;
  loop
    // remove SD card and watch your terminal
    if F16_BlockRead(F0,@fileBuffer0,512,count) then
      if flag then
        Writeln(SeroutE0,'Whats that? BlockRead okay after removing card?'
                         +IntToStr(count));
      endif;
    else
      flag := true;
    endif;
    mDelay(4); 
  endloop;
end test.
Attachments
Blockread
Filename: blockread.png
Filesize: 38.31 KB
Title: Blockread
Download counter: 146
miparo
Administrator
Avatar
Gender:
Location: Germany
Age: 58
Posts: 959
Registered: 09 / 2007
Subject:

Re: F16_BlockRead liefert sporadisch true nach Entfernen der SD Karte

 · 
Posted: 27.03.2014 - 15:45  ·  #2
Hallo Thomas.AC ,
Ich habe mal versucht es im Treiber abzufangen was aber nicht an allen Stellen funktioniert.
Sicherlich wäre es besser wenn Du den Card Detect Pin benutzen würdest.

Bitte mal die neue Version 3.74 testen. Danke

Gruß
miparo


Code

Implementation

Alias
  SerOutX = SerOutC0;

//.....
begin
  EnableInts($87);
  PIN6CTRLD:= PIN6CTRLD or %00011000; // pullup on SPI MISO
  InitSDCard;
  if F16_FileAssign(F0, '', '1.wav') then
    Writeln(SerOutX, 'FileAssign F0 with 1.wav OK');
  else
    Writeln(SerOutX, 'FileAssign F0 with 1.wav fail!');
  endif;
  if F16_FileReset(F0) then
    Writeln(SerOutX, 'FileReset F0 OK');
  else
    Writeln(SerOutX, 'FileReset F0 fail!');
  endif;
  if F16_FileAssign(F1, '', '1.wav') then
    Writeln(SerOutX, 'FileAssign F1 with 1.wav OK');
  else
    Writeln(SerOutX, 'FileAssign F1 with 1.wav fail!');
  endif;
  if F16_FileReset(F1) then
    Writeln(SerOutX, 'FileReset F1 OK');
  else
    Writeln(SerOutX, 'FileReset F1 fail!');
  endif;
  loop
    // remove SD card and watch your terminal
    if F16_BlockRead(F0, @fileBuffer0, 512, count) then
      if flag then
        Writeln(SerOutX, 'Whats that? BlockRead okay after removing card?'
               + IntToStr(count));
      else
         Writeln(SerOutX, 'BlockRead OK '+ IntToStr(count));
      endif;
    else
      flag:= true;
       Writeln(SerOutX, 'BlockRead error !! '+ IntToStr(count));
    endif;
    mDelay(400);
  endloop;
end Problems.




Code

TEST
MMC init ok!
MMC reset TEST
MMC init ok!
MMC reset ok!
Card Size total 7774208 kbyte
Unused size  7761472 kbyte
Used size 8640 kbyte
List Volume Items
  - 1.WAV
FileAssign F0 with 1.wav OK
FileReset F0 OK
FileAssign F1 with 1.wav OK
FileReset F1 OK
BlockRead OK 512
BlockRead OK 512
BlockRead OK 512
BlockRead OK 512
BlockRead OK 512
BlockRead OK 512
BlockRead OK 512
BlockRead OK 512
BlockRead OK 512
BlockRead OK 512
BlockRead error !! 0
BlockRead error !! 0
BlockRead error !! 0
BlockRead error !! 0
BlockRead error !! 0
BlockRead error !! 0
BlockRead error !! 0
BlockRead error !! 0
Thomas.AC
Benutzer
Avatar
Gender: n/a
Age: 43
Posts: 308
Registered: 07 / 2013
Subject:

Re: F16_BlockRead liefert sporadisch true nach Entfernen der SD Karte

 · 
Posted: 28.03.2014 - 09:48  ·  #3
Danke miparo,
funktioniert besser.

Das Abfragen des "Card Detect pin" bringt ja nix wenn die Karte plötzlich stirbt.
In meinem Fall lese ich kontinuierlich Datenblöcke von der Karte. Ich brauche die Sicherheit, dass ich eine Karte, die während des Betriebs stirbt, erkenne.

Sind folgende Annahmen richtig?
1.) Die Karte stirbt währen eines Lesezugriffs -> Blockread liefert fehlerhaft true, da der physikalische Zugriff auf die Karte bereits gestartet wurde.
2.) Ein erneuter Blockread mit Blocksize < 512 bytes könnte immer noch fehlerhaft true liefern, da diese angeforderten Daten noch vom vorherigen Zugriff im RAM liegen.
3.) Ein erneuter Blockread mit Blocksize >= 512 liefert auf jeden Fall false, da spätestens jetzt ein neuer physikalischer Kartenzugriff erfolgen muss nachdem die Karte kaputt gegangen ist.

Und noch eine Frage: Wann liefert F16_CheckDisk false?

Gruß

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

Re: F16_BlockRead liefert sporadisch true nach Entfernen der SD Karte

 · 
Posted: 28.03.2014 - 12:05  ·  #4
Hallo Thomas.AC ,
Funktioniert besser oder funktioniert es nun ?

Blockread liefert immer ein false bei fehlender Karte, da dies auf unterster Ebene geprüft wird.
Ein CheckCardPin vor jedem Aufruf wäre ja auch möglich und sicherer.
F16_CheckDisk muss ich später mal schauen.

Gruß
miparo
Thomas.AC
Benutzer
Avatar
Gender: n/a
Age: 43
Posts: 308
Registered: 07 / 2013
Subject:

Re: F16_BlockRead liefert sporadisch true nach Entfernen der SD Karte

 · 
Posted: 28.03.2014 - 12:57  ·  #5
Hallo miparo,

es funktioniert.
Ich hatte noch einen Effekt in meinem Programm (nicht im Testprogramm), den ich auf Anhieb nicht erklären konnte.
Dieser Effekt trat bei mir auf, da die Ausführungszeit von Blockread extrem groß wird (wegen timeout im treiber), wenn man die Karte entfernt.
Deshalb hatte ich erst einmal nur geschrieben "funktioniert besser".

Vielen Dank für deine Mühen!

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

Re: F16_BlockRead liefert sporadisch true nach Entfernen der SD Karte

 · 
Posted: 28.03.2014 - 13:21  ·  #6
Sehr schön :)
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: 16 · Cache Hits: 15   109   124 · Page-Gen-Time: 0.034431s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI