Compact Flash Library

The Compact Flash Library provides routines for accessing data on Compact Flash card (abbr. CF further in text). CF cards are widely used memory elements, commonly used with digital cameras. Great capacity and excellent access time of only a few microseconds make them very attractive for the microcontroller applications.

In CF card, data is divided into sectors. One sector usually comprises 512 bytes. Routines for file handling, the Cf_Fat routines, are not performed directly but successively through 512B buffer.

  Important :

Library Dependency Tree

Compact Flash Library Dependency Tree

External dependencies of Compact Flash Library

The following variables must be defined in all projects using Compact Flash Library: Description : Example :
var CF_Data_Port : byte; sfr; external; Compact Flash Data Port. var CF_Data_Port : byte at PORTD;
var CF_RDY : sbit; sfr; external; Ready signal line. var CF_RDY : sbit at RB7_bit;
var CF_WE : sbit; sfr; external; Write Enable signal line. var CF_WE : sbit at LATB6_bit;
var CF_OE : sbit; sfr; external; Output Enable signal line. var CF_OE : sbit at LATB5_bit;
var CF_CD1 : sbit; sfr; external; Chip Detect signal line. var CF_CD1 : sbit at RB4_bit;
var CF_CE1 : sbit; sfr; external; Chip Enable signal line. var CF_CE1 : sbit at LATB3_bit;
var CF_A2 : sbit; sfr; external; Address pin 2. var CF_A2 : sbit at LAT2_bit;
var CF_A1 : sbit; sfr; external; Address pin 1. var CF_A1 : sbit at LATB1_bit;
var CF_A0 : sbit; sfr; external; Address pin 0. var CF_A0 : sbit at LATB0_bit;
var CF_RDY_direction : sbit; sfr; external; Direction of the Ready pin. var CF_RDY_direction : sbit at TRISB7_bit;
var CF_WE_direction : sbit; sfr; external; Direction of the Write Enable pin. var CF_WE_direction : sbit at TRISB6_bit;
var CF_OE_direction : sbit; sfr; external; Direction of the Output Enable pin. var CF_OE_direction : sbit at TRISB5_bit;
var CF_CD1_direction : sbit; sfr; external; Direction of the Chip Detect pin. var CF_CD1_direction : sbit at TRISB4_bit;
var CF_CE1_direction : sbit; sfr; external; Direction of the Chip Enable pin. var CF_CE1_direction : sbit at TRISB3_bit;
var CF_A2_direction : sbit; sfr; external; Direction of the Address 2 pin. var CF_A2_direction : sbit at TRISB2_bit;
var CF_A1_direction : sbit; sfr; external; Direction of the Address 1 pin. var CF_A1_direction : sbit at TRISB1_bit;
var CF_A0_direction : sbit; sfr; external; Direction of the Address 0 pin. var CF_A0_direction : sbit at TRISB0_bit;

Library Routines

Routines for file handling:

The following routine is for the internal use by compiler only:

Cf_Init

Prototype

procedure Cf_Init();

Returns

Nothing.

Description

Initializes ports appropriately for communication with CF card.

Requires

Global variables :

  • CF_Data_Port : Compact Flash data port
  • CF_RDY : Ready signal line
  • CF_WE : Write enable signal line
  • CF_OE : Output enable signal line
  • CF_CD1 : Chip detect signal line
  • CF_CE1 : Enable signal line
  • CF_A2 : Address pin 2
  • CF_A1 : Address pin 1
  • CF_A0 : Address pin 0

  • CF_RDY_direction : Direction of the Ready pin
  • CF_WE_direction : Direction of the Write enable pin
  • CF_OE_direction : Direction of the Output enable pin
  • CF_CD1_direction : Direction of the Chip detect pin
  • CF_CE1_direction : Direction of the Chip enable pin
  • CF_A2_direction : Direction of the Address 2 pin
  • CF_A1_direction : Direction of the Address 1 pin
  • CF_A0_direction : Direction of the Address 0 pin
must be defined before using this function.

Example
var
 // set compact flash pinout
  Cf_Data_Port : byte at PORTD;

  CF_RDY : sbit at RB7_bit;
  CF_WE  : sbit at LATB6_bit;  // for writing to output pin always use latch (PIC18 family)
  CF_OE  : sbit at LATB5_bit;  // for writing to output pin always use latch (PIC18 family)
  CF_CD1 : sbit at RB4_bit;
  CF_CE1 : sbit at LATB3_bit;  // for writing to output pin always use latch (PIC18 family)
  CF_A2  : sbit at LATB2_bit;  // for writing to output pin always use latch (PIC18 family)
  CF_A1  : sbit at LATB1_bit;  // for writing to output pin always use latch (PIC18 family)
  CF_A0  : sbit at LATB0_bit;  // for writing to output pin always use latch (PIC18 family)

  CF_RDY_direction : sbit at TRISB7_bit;
  CF_WE_direction  : sbit at TRISB6_bit;
  CF_OE_direction  : sbit at TRISB5_bit;
  CF_CD1_direction : sbit at TRISB4_bit;
  CF_CE1_direction : sbit at TRISB3_bit;
  CF_A2_direction  : sbit at TRISB2_bit;
  CF_A1_direction  : sbit at TRISB1_bit;
  CF_A0_direction  : sbit at TRISB0_bit;
 // end of cf pinout

//  Init CF
begin
  Cf_Init();
end;

Cf_Detect

Prototype

function CF_Detect() : byte;

Returns

  • 1 - if CF card was detected
  • 0 - otherwise

Description

Checks for presence of CF card by reading the chip detect pin.

Requires

The corresponding MCU ports must be appropriately initialized for CF card. See Cf_Init.

Example
// Wait until CF card is inserted:
while (Cf_Detect() = 0) do
  nop;

Cf_Enable

Prototype

procedure Cf_Enable();

Returns

Nothing.

Description

Enables the device. Routine needs to be called only if you have disabled the device by means of the Cf_Disable routine. These two routines in conjunction allow you to free/occupy data line when working with multiple devices.

Requires

The corresponding MCU ports must be appropriately initialized for CF card. See Cf_Init.

Example
// enable compact flash
Cf_Enable();

Cf_Disable

Prototype

procedure Cf_Disable();

Returns

Nothing.

Description

Routine disables the device and frees the data lines for other devices. To enable the device again, call Cf_Enable. These two routines in conjunction allow you to free/occupy data line when working with multiple devices.

Requires

The corresponding MCU ports must be appropriately initialized for CF card. See Cf_Init.

Example
// disable compact flash
Cf_Disable();

Cf_Read_Init

Prototype

procedure Cf_Read_Init(address : dword; sector_count : byte);

Returns

Nothing.

Description

Initializes CF card for reading.

Parameters :

  • address: the first sector to be prepared for reading operation.
  • sector_count: number of sectors to be prepared for reading operation.

Requires

The corresponding MCU ports must be appropriately initialized for CF card. See Cf_Init.

Example
// initialize compact flash for reading from sector 590
Cf_Read_Init(590, 1);

Cf_Read_Byte

Prototype

function CF_Read_Byte() : byte;

Returns

Returns a byte read from Compact Flash sector buffer.

  Note : Higher byte of the unsigned return value is cleared.
Description

Reads one byte from Compact Flash sector buffer location currently pointed to by internal read pointers. These pointers will be autoicremented upon reading.

Requires

The corresponding MCU ports must be appropriately initialized for CF card. See Cf_Init.

CF card must be initialized for reading operation. See Cf_Read_Init.

Example
// Read a byte from compact flash:
var data : byte;
...
data := Cf_Read_Byte();

Cf_Write_Init

Prototype

procedure Cf_Write_Init(address : dword; sectcnt : byte);

Returns

Nothing.

Description

Initializes CF card for writing.

Parameters :

  • address: the first sector to be prepared for writing operation.
  • sectcnt: number of sectors to be prepared for writing operation.

Requires

The corresponding MCU ports must be appropriately initialized for CF card. See Cf_Init.

Example
// initialize compact flash for writing to sector 590
Cf_Write_Init(590, 1);

Cf_Write_Byte

Prototype

procedure Cf_Write_Byte(data_ : byte);

Returns

Nothing.

Description

Writes a byte to Compact Flash sector buffer location currently pointed to by writing pointers. These pointers will be autoicremented upon reading. When sector buffer is full, its content will be transfered to appropriate flash memory sector.

Parameters :

  • data_: byte to be written.
Requires

The corresponding MCU ports must be appropriately initialized for CF card. See Cf_Init.

CF card must be initialized for writing operation. See Cf_Write_Init.

Example
var data_ : byte;
...
data_ := 0xAA;
Cf_Write_Byte(data);

Cf_Read_Sector

Prototype

procedure Cf_Read_Sector(sector_number : dword; var buffer : array[512] of byte);

Returns

Nothing.

Description

Reads one sector (512 bytes). Read data is stored into buffer provided by the buffer parameter.

Parameters :

  • sector_number: sector to be read.
  • buffer: data buffer of at least 512 bytes in length.
Requires

The corresponding MCU ports must be appropriately initialized for CF card. See Cf_Init.

Example
// read sector 22
var data_ : array[512] of byte;
...
Cf_Read_Sector(22, data_);

Cf_Write_Sector

Prototype

procedure Cf_Write_Sector(sector_number : dword; var buffer : array[512] of byte);

Returns

Nothing.

Description

Writes 512 bytes of data provided by the buffer parameter to one CF sector.

Parameters :

  • sector_number: sector to be written to.
  • buffer: data buffer of 512 bytes in length.
Requires

The corresponding MCU ports must be appropriately initialized for CF card. See Cf_Init.

Example
// write to sector 22
var data_ : array[512] of byte;
...
Cf_Write_Sector(22, data_);

Cf_Fat_Init

Prototype

function Cf_Fat_Init(): byte;

Returns

  • 0 - if CF card was detected and successfully initialized
  • 1 - if FAT16 boot sector was not found
  • 255 - if card was not detected

Description

Initializes CF card, reads CF FAT16 boot sector and extracts data needed by the library.

Requires

Nothing.

Example
//init the FAT library
if (Cf_Fat_Init() = 0) then
  begin
  ...
  end

Cf_Fat_QuickFormat

Prototype

function Cf_Fat_QuickFormat(var cf_fat_label : string[11]) : byte;

Returns

  • 0 - if CF card was detected, successfully formated and initialized
  • 1 - if FAT16 format was unseccessful
  • 255 - if card was not detected

Description

Formats to FAT16 and initializes CF card.

Parameters :

  • cf_fat_label: volume label (11 characters in length). If less than 11 characters are provided, the label will be padded with spaces. If an empty string is passed, the volume will not be labeled.
  Note :
  • This routine can be used instead or in conjunction with Cf_Fat_Init routine.
  • If CF card already contains a valid boot sector, it will remain unchanged (except volume label field) and only FAT and ROOT tables will be erased. Also, the new volume label will be set.
Requires

Nothing.

Example
// format and initialize the FAT library
if (Cf_Fat_QuickFormat('mikroE') = 0) then
begin
  ...
end;

Cf_Fat_Assign

Prototype

function Cf_Fat_Assign(var filename: array[12] of char; file_cre_attr: byte): byte;

Returns

  • 0 if file does not exist and no new file is created.
  • 1 if file already exists or file does not exist but a new file is created.

Description

Assigns file for file operations (read, write, delete...). All subsequent file operations will be applied to the assigned file.

Parameters :

  • filename: name of the file that should be assigned for file operations. The file name should be in DOS 8.3 (file_name.extension) format. The file name and extension will be automatically padded with spaces by the library if they have less than length required (i.e. "mikro.tx" -> "mikro .tx "), so the user does not have to take care of that. s The file name and extension are case insensitive. The library will convert them to the proper case automatically, so the user does not have to take care of that.

    Also, in order to keep backward compatibility with the first version of this library, file names can be entered as UPPERCASE string of 11 bytes in length with no dot character between the file name and extension (i.e. "MIKROELETXT" -> MIKROELE.TXT). In this case the last 3 characters of the string are considered to be file extension.

  • file_cre_attr: file creation and attributs flags. Each bit corresponds to the appropriate file attribut:
  • Bit Mask Description
    0 0x01 Read Only
    1 0x02 Hidden
    2 0x04 System
    3 0x08 Volume Label
    4 0x10 Subdirectory
    5 0x20 Archive
    6 0x40 Device (internal use only, never found on disk)
    7 0x80 File creation flag. If the file does not exist and this flag is set, a new file with specified name will be created.

      Note : Long File Names (LFN) are not supported.

Requires

CF card and CF library must be initialized for file operations. See Cf_Fat_Init.

Example
// create file with archive attribut if it does not already exist
Cf_Fat_Assign('MIKRO007.TXT',0xA0);

Cf_Fat_Reset

Prototype

procedure Cf_Fat_Reset(var size: dword);

Returns

Nothing.

Description

Opens currently assigned file for reading.

Parameters :

  • size: buffer to store file size to. After file has been open for reading its size is returned through this parameter.

Requires

CF card and CF library must be initialized for file operations. See Cf_Fat_Init.

File must be previously assigned. See Cf_Fat_Assign.

Example
var size : dword;
...
Cf_Fat_Reset(size);

Cf_Fat_Read

Prototype

procedure Cf_Fat_Read(var bdata: byte);

Returns

Nothing.

Description

Reads a byte from currently assigned file opened for reading. Upon function execution file pointers will be set to the next character in the file.

Parameters :

  • bdata: buffer to store read byte to. Upon this function execution read byte is returned through this parameter.

Requires

CF card and CF library must be initialized for file operations. See Cf_Fat_Init.

File must be previously assigned. See Cf_Fat_Assign.

File must be open for reading. See Cf_Fat_Reset.

Example
var character : byte;
...
Cf_Fat_Read(character);

Cf_Fat_Rewrite

Prototype

procedure Cf_Fat_Rewrite();

Returns

Nothing.

Description

Opens currently assigned file for writing. If the file is not empty its content will be erased.

Requires

CF card and CF library must be initialized for file operations. See Cf_Fat_Init.

The file must be previously assigned. See Cf_Fat_Assign.

Example
// open file for writing
Cf_Fat_Rewrite();

Cf_Fat_Append

Prototype

procedure Cf_Fat_Append();

Returns

Nothing.

Description

Opens currently assigned file for appending. Upon this function execution file pointers will be positioned after the last byte in the file, so any subsequent file writing operation will start from there.

Requires

CF card and CF library must be initialized for file operations. See Cf_Fat_Init.

File must be previously assigned. See Cf_Fat_Assign.

Example
// open file for appending
Cf_Fat_Append();

Cf_Fat_Delete

Prototype

procedure Cf_Fat_Delete();

Returns

Nothing.

Description

Deletes currently assigned file from CF card.

Requires

CF card and CF library must be initialized for file operations. See Cf_Fat_Init.

File must be previously assigned. See Cf_Fat_Assign.

Example
// delete current file
Cf_Fat_Delete();

Cf_Fat_Write

Prototype

procedure Cf_Fat_Write(var fdata: array[512] of byte; data_len: word);

Returns

Nothing.

Description

Writes requested number of bytes to currently assigned file opened for writing.

Parameters :

  • fdata: data to be written.
  • data_len: number of bytes to be written.

Requires

CF card and CF library must be initialized for file operations. See Cf_Fat_Init.

File must be previously assigned. See Cf_Fat_Assign.

File must be open for writing. See Cf_Fat_Rewrite or Cf_Fat_Append.

Example
var file_contents : array[42] of byte;
...
Cf_Fat_Write(file_contents, 42); // write data to the assigned file

Cf_Fat_Set_File_Date

Prototype

procedure Cf_Fat_Set_File_Date(year: word; month: byte; day: byte; hours: byte; mins: byte; seconds: byte);

Returns

Nothing.

Description

Sets the date/time stamp. Any subsequent file writing operation will write this stamp to currently assigned file's time/date attributs.

Parameters :

  • year: year attribute. Valid values: 1980-2107
  • month: month attribute. Valid values: 1-12
  • day: day attribute. Valid values: 1-31
  • hours: hours attribute. Valid values: 0-23
  • mins: minutes attribute. Valid values: 0-59
  • seconds: seconds attribute. Valid values: 0-59

Requires

CF card and CF library must be initialized for file operations. See Cf_Fat_Init.

File must be previously assigned. See Cf_Fat_Assign.

File must be open for writing. See Cf_Fat_Rewrite or Cf_Fat_Append.

Example
Cf_Fat_Set_File_Date(2005,9,30,17,41,0);

Cf_Fat_Get_File_Date

Prototype

procedure Cf_Fat_Get_File_Date(var year: word; var month: byte; var day: byte; var hours: byte; var mins: byte);

Returns

Nothing.

Description

Reads time/date attributes of currently assigned file.

Parameters :

  • year: buffer to store year attribute to. Upon function execution year attribute is returned through this parameter.
  • month: buffer to store month attribute to. Upon function execution month attribute is returned through this parameter.
  • day: buffer to store day attribute to. Upon function execution day attribute is returned through this parameter.
  • hours: buffer to store hours attribute to. Upon function execution hours attribute is returned through this parameter.
  • mins: buffer to store minutes attribute to. Upon function execution minutes attribute is returned through this parameter.

Requires

CF card and CF library must be initialized for file operations. See Cf_Fat_Init.

File must be previously assigned. See Cf_Fat_Assign.

Example
var year : word;
    month, day, hours, mins : byte;
...
Cf_Fat_Get_File_Date(year, month, day, hours, mins);

Cf_Fat_Get_File_Date_Modified

Prototype

procedure Cf_Fat_Get_File_Date_Modified(var year: word; var month: byte; var day: byte; var hours: byte; var mins: byte);

Returns

Nothing.

Description

Retrieves the last modification date/time of the currently assigned file.

Parameters :

  • year: buffer to store year of modification attribute to. Upon function execution year of modification attribute is returned through this parameter.
  • month: buffer to store month of modification attribute to. Upon function execution month of modification attribute is returned through this parameter.
  • day: buffer to store day of modification attribute to. Upon function execution day of modification attribute is returned through this parameter.
  • hours: buffer to store hours of modification attribute to. Upon function execution hours of modification attribute is returned through this parameter.
  • mins: buffer to store minutes of modification attribute to. Upon function execution minutes of modification attribute is returned through this parameter.

Requires

CF card and CF library must be initialized for file operations. See Cf_Fat_Init.

File must be previously assigned. See Cf_Fat_Assign.

Example
var year : word;
    month, day, hours, mins : byte;
...
Cf_Fat_Get_File_Date_Modified(year, month, day, hours, mins);

Cf_Fat_Get_File_Size

Prototype

function Cf_Fat_Get_File_Size(): dword;

Returns

Size of the currently assigned file in bytes.

Description

This function reads size of currently assigned file in bytes.

Requires

CF card and CF library must be initialized for file operations. See Cf_Fat_Init.

File must be previously assigned. See Cf_Fat_Assign.

Example
var my_file_size : dword;
...
my_file_size := Cf_Fat_Get_File_Size();

Cf_Fat_Get_Swap_File

Prototype

function Cf_Fat_Get_Swap_File(sectors_cnt: longint; var filename : string[11]; file_attr : byte): dword;

Returns

  • Number of the start sector for the newly created swap file, if there was enough free space on CF card to create file of required size.
  • 0 - otherwise.

Description

This function is used to create a swap file of predefined name and size on the CF media. If a file with specified name already exists on the media, search for consecutive sectors will ignore sectors occupied by this file. Therefore, it is recommended to erase such file if it exists before calling this function. If it is not erased and there is still enough space for a new swap file, this function will delete it after allocating new memory space for a new swap file.

The purpose of the swap file is to make reading and writing to CF media as fast as possible, by using the Cf_Read_Sector() and Cf_Write_Sector() functions directly, without potentially damaging the FAT system. The swap file can be considered as a "window" on the media where the user can freely write/read data. Its main purpose in the library is to be used for fast data acquisition; when the time-critical acquisition has finished, the data can be re-written into a "normal" file, and formatted in the most suitable way.

Parameters:

  • sectors_cnt: number of consecutive sectors that user wants the swap file to have.
  • filename: name of the file that should be assigned for file operations. The file name should be in DOS 8.3 (file_name.extension) format. The file name and extension will be automatically padded with spaces by the library if they have less than length required (i.e. "mikro.tx" -> "mikro .tx "), so the user does not have to take care of that. The file name and extension are case insensitive. The library will convert them to the proper case automatically, so the user does not have to take care of that.

    Also, in order to keep backward compatibility with the first version of this library, file names can be entered as UPPERCASE string of 11 bytes in length with no dot character between the file name and extension (i.e. "MIKROELETXT" -> MIKROELE.TXT). In this case the last 3 characters of the string are considered to be file extension.

  • file_attr: file creation and attributs flags. Each bit corresponds to the appropriate file attribut:
  • Bit Mask Description
    0 0x01 Read Only
    1 0x02 Hidden
    2 0x04 System
    3 0x08 Volume Label
    4 0x10 Subdirectory
    5 0x20 Archive
    6 0x40 Device (internal use only, never found on disk)
    7 0x80 Not used

      Note : Long File Names (LFN) are not supported.
Requires

CF card and CF library must be initialized for file operations. See Cf_Fat_Init.

Example
// Try to create a swap file with archive atribute, whose size will be at least 1000 sectors.
//               If it succeeds, it sends the No. of start sector over UART
var size : dword;
...
size := Cf_Fat_Get_Swap_File(1000, "mikroE.txt", 0x20);
if (size <> 0) then
begin
  UART1_Write(0xAA);
  UART1_Write(Lo(size));
  UART1_Write(Hi(size));
  UART1_Write(Higher(size));
  UART1_Write(Highest(size));
  UART1_Write(0xAA);
end
...

Library Example

The following example demonstrates various aspects of the Cf_Fat16 library :

Copy Code To ClipboardCopy Code To Clipboard
program CF_Fat16_Test;

var
 // set compact flash pinout
  Cf_Data_Port : byte at PORTD;

  CF_RDY : sbit at RB7_bit;
  CF_WE  : sbit at LATB6_bit;  // for writing to output pin always use latch (PIC18 family)
  CF_OE  : sbit at LATB5_bit;  // for writing to output pin always use latch (PIC18 family)
  CF_CD1 : sbit at RB4_bit;
  CF_CE1 : sbit at LATB3_bit;  // for writing to output pin always use latch (PIC18 family)
  CF_A2  : sbit at LATB2_bit;  // for writing to output pin always use latch (PIC18 family)
  CF_A1  : sbit at LATB1_bit;  // for writing to output pin always use latch (PIC18 family)
  CF_A0  : sbit at LATB0_bit;  // for writing to output pin always use latch (PIC18 family)

  CF_RDY_direction : sbit at TRISB7_bit;
  CF_WE_direction  : sbit at TRISB6_bit;
  CF_OE_direction  : sbit at TRISB5_bit;
  CF_CD1_direction : sbit at TRISB4_bit;
  CF_CE1_direction : sbit at TRISB3_bit;
  CF_A2_direction  : sbit at TRISB2_bit;
  CF_A1_direction  : sbit at TRISB1_bit;
  CF_A0_direction  : sbit at TRISB0_bit;
 // end of cf pinout

const LINE_LEN = 37;
var
  err_txt : string[20];
  file_contents : string[LINE_LEN];

  filename : string[14];   // File names

  character : byte;
  loop, loop2 : byte;
  i, size : longint;

  Buffer : array[512] of byte;

// UART write text and new line (carriage return + line feed)
procedure UART1_Write_Line( var uart_text : string );
  begin
    UART1_Write_Text(uart_text);
    UART1_Write(13);
    UART1_Write(10);
  end;

//-------------- Creates new file and writes some data to it
procedure M_Create_New_File();
begin
  filename[7] := 'A';
  Cf_Fat_Set_File_Date(2010, 4, 19, 9, 0, 0); // Set file date & time info
  Cf_Fat_Assign(filename, 0xA0);       // Will not find file and then create file
  Cf_Fat_Rewrite();                    // To clear file and start with new data
  for loop:=1 to 90 do                 //  We want 5 files on the MMC card
    begin
      UART1_Write('.');
      file_contents[0] := loop div 10 + 48;
      file_contents[1] := loop mod 10 + 48;
      Cf_Fat_Write(file_contents, LINE_LEN-1);   // write data to the assigned file
    end;
end;

//-------------- Creates many new files and writes data to them
procedure M_Create_Multiple_Files();
begin
  for loop2 := 'B' to 'Z' do
    begin
      UART1_Write(loop2);                   // this line can slow down the performance
      filename[7] := loop2;                 // set filename
      Cf_Fat_Set_File_Date(2010, 4, 19, 9, 0, 0); // Set file date & time info
      Cf_Fat_Assign(filename, 0xA0);        // find existing file or create a new one
      Cf_Fat_Rewrite();                     // To clear file and start with new data
      for loop := 1 to 44 do
        begin
          file_contents[0] := loop div 10 + 48;
          file_contents[1] := loop mod 10 + 48;
          Cf_Fat_Write(file_contents, LINE_LEN-1); // write data to the assigned file
        end;
    end;
end;

//-------------- Opens an existing file and rewrites it
procedure M_Open_File_Rewrite();
begin
  filename[7] := 'C';               // Set filename for single-file tests
  Cf_Fat_Assign(filename, 0);
  Cf_Fat_Rewrite();
  for loop := 1 to 55 do
    begin
      file_contents[0] := byte(loop div 10 + 48);
      file_contents[1] := byte(loop mod 10 + 48);
      Cf_Fat_Write(file_contents, LINE_LEN-1); // write data to the assigned file
    end;
end;

//-------------- Opens an existing file and appends data to it
//               (and alters the date/time stamp)
procedure M_Open_File_Append();
 begin
   filename[7] := 'B';
   Cf_Fat_Assign(filename, 0);
   Cf_Fat_Set_File_Date(2010, 4, 19, 9, 20, 0);
   Cf_Fat_Append;
   file_contents := ' for mikroElektronika 2010';     // Prepare file for append
   file_contents[26] := 10;             // LF
   Cf_Fat_Write(file_contents, 27);    // Write data to assigned file
 end;

//-------------- Opens an existing file, reads data from it and puts it to USART
procedure M_Open_File_Read();
begin
  filename[7] := 'B';
  Cf_Fat_Assign(filename, 0);
  Cf_Fat_Reset(size);              // To read file, procedure returns size of file
  while size > 0 do
    begin
      Cf_Fat_Read(character);
      UART1_Write(character);      // Write data to USART
      Dec(size);
    end;
end;

//-------------- Deletes a file. If file doesn't exist, it will first be created
//               and then deleted.
procedure M_Delete_File();
begin
  filename[7] := 'F';
  Cf_Fat_Assign(filename, 0);
  Cf_Fat_Delete();
end;

//-------------- Tests whether file exists, and if so sends its creation date
//               and file size via USART
procedure M_Test_File_Exist();
var
  fsize : longint;
  year : word;
  month, day, hour, minute : byte;
  outstr : array[12] of char;
begin
  filename[7] := 'B';         // uncomment this line to search for file that DOES exists
//  filename[7] := 'F';       // uncomment this line to search for file that DOES NOT exist
  if Cf_Fat_Assign(filename, 0) <> 0 then
    begin
      //--- file has been found - get its date
      Cf_Fat_Get_File_Date(year,month,day,hour,minute);
      UART1_Write_Text(' created: ');
      WordToStr(year, outstr);
      UART1_Write_Text(outstr);
      ByteToStr(month, outstr);
      UART1_Write_Text(outstr);
      WordToStr(day, outstr);
      UART1_Write_Text(outstr);
      WordToStr(hour, outstr);
      UART1_Write_Text(outstr);
      WordToStr(minute, outstr);
      UART1_Write_Text(outstr);

    //--- file has been found - get its modified date
      Cf_Fat_Get_File_Date_Modified(year, month, day, hour, minute);
      UART1_Write_Text(' modified: ');
      WordToStr(year, outstr);
      UART1_Write_Text(outstr);
      ByteToStr(month, outstr);
      UART1_Write_Text(outstr);
      WordToStr(day, outstr);
      UART1_Write_Text(outstr);
      WordToStr(hour, outstr);
      UART1_Write_Text(outstr);
      WordToStr(minute, outstr);
      UART1_Write_Text(outstr);

      //--- get file size
      fsize := Cf_Fat_Get_File_Size;
      LongIntToStr(fsize, outstr);
      UART1_Write_Line(outstr);
    end
  else begin
    //--- file was not found - signal it
    UART1_Write(0x55);
    Delay_ms(1000);
    UART1_Write(0x55);
  end;
end;


//-------------- Tries to create a swap file, whose size will be at least 100
//               sectors (see Help for details)
procedure M_Create_Swap_File();
  var i : word;

  begin
    for i:=0 to 511 do
      Buffer[i] := i;

    size := Cf_Fat_Get_Swap_File(5000, 'mikroE.txt', 0x20);   // see help on this function for details

    if (size <> 0) then
      begin
        LongIntToStr(size, err_txt);
        UART1_Write_Line(err_txt);

        for i:=0 to 4999 do
          begin
            Cf_Write_Sector(size, Buffer);
            Inc(size);
            UART1_Write('.');
          end;
      end;
  end;


//-------------- Main. Uncomment the function(s) to test the desired operation(s)
begin
     err_txt := 'FAT16 not found';
     file_contents := 'XX CF FAT16 library by Anton Rieckert';
     filename := 'MIKRO00xTXT';

     // we will use PORTC to signal test end
     ADCON1 := ADCON1 or 0x0F;                  // Configure AN pins as digital
     CMCON  := CMCON or 7;                      // Turn off comparators

     UART1_Init(19200);                         // Set up USART for file reading
     Delay_ms(10);
     UART1_Write_Line('PIC-Started');           // PIC present report

     // --- Init the FAT library
     // --- use Cf_Fat_QuickFormat instead of init routine if a format is needed
     if Cf_Fat_Init() = 0 then
       begin
         Delay_ms(2000);                // wait for a while until the card is stabilized
                                        // period depends on used CF card
         //--- Test start
         UART1_Write_Line('Test Start.');
         M_Create_New_File();
         M_Create_Multiple_Files();
         M_Open_File_Rewrite();
         M_Open_File_Append();
         M_Open_File_Read();
         M_Delete_File();
         M_Test_File_Exist();
         M_Create_Swap_File();
         UART1_Write_Line('Test End.');
       end
     else
       begin
         UART1_Write_Line(err_txt);    // Note: Cf_Fat_Init tries to initialize a card more than once.
                                       //       If card is not present, initialization may last longer (depending on clock speed)
       end;
end.

HW Connection

Pin diagram of CF memory card

Pin diagram of CF memory card

Copyright (c) 2002-2012 mikroElektronika. All rights reserved.
What do you think about this topic ? Send us feedback!
Want more examples and libraries? 
Find them on LibStock - A place for the code