2 FAT16 WriteFile Example Sketch
7 Code Description: Uses an Arduino Duemillanove or Arduino Pro to write a string to a file.
9 Circuit Description: Uses the SparkFun microSD shield. (http://www.sparkfun.com/commerce/product_info.php?products_id=9520)
11 Attributions: Special thanks to Roland Riegel for providing an open source FAT library
12 for AVR microcontrollers. See more of his projects here:
13 http://www.roland-riegel.de/
15 This code is provided under the Creative Commons Attribution License. More information can be found here:
16 http://creativecommons.org/licenses/by/3.0/
18 (Use our code freely! Please just remember to give us credit where it's due. Thanks!)
21 //Add libraries to support FAT16 on the SD Card.
22 //(Note: If you already have these libraries installed in the directory, they'll have to remove in order to compile this.)
23 #include <byteordering.h>
25 #include <fat_config.h>
26 #include <partition.h>
27 #include <partition_config.h>
28 #include <sd-reader_config.h>
30 #include <sd_raw_config.h>
32 //Define the pin numbers
38 //This is the amount of data to be fetched from the SD card for each read.
39 #define BUFFERSIZE 256
44 uint8_t find_file_in_dir(struct fat_fs_struct* fs, struct fat_dir_struct* dd, const char* name, struct fat_dir_entry_struct* dir_entry);
45 struct fat_file_struct* open_file_in_dir(struct fat_fs_struct* fs, struct fat_dir_struct* dd, const char* name);
46 char init_filesystem(void);
47 char get_next_filename(struct fat_dir_struct* cur_dir, char * new_file);
48 char buffer[BUFFERSIZE]="Testing\n";
51 struct fat_dir_struct* dd; //FAT16 directory
52 struct fat_dir_entry_struct dir_entry; //FAT16 directory entry (A.K.A. a file)
54 struct fat_fs_struct* fs; //FAT16 File System
55 struct partition_struct* partition; //FAT16 Partition
57 struct fat_file_struct * file_handle; //FAT16 File Handle
61 //Set up the pins for the Serial communication
66 //Set up the pins for the microSD shield
68 pinMode(MOSI, OUTPUT);
76 int bytes_read=0; //Keeps track of how many bytes are read when accessing a file on the SD card.
79 init_filesystem(); //Initialize the FAT16 file system on the SD card.
81 //Create a file named Test.txt. If the file already exists, delete it and create a new one.
82 if(!fat_create_file(dd, "Test.txt", &dir_entry)){
83 fat_delete_file(fs, &dir_entry);
84 fat_create_file(dd, "Test.txt", &dir_entry);
86 //Open the file that's just been created
87 file_handle=open_file_in_dir(fs, dd, "Test.txt");
88 //Write some initial data to the file
89 fat_write_file(file_handle, (const uint8_t*)buffer, strlen(buffer));
90 sd_raw_sync(); //An SD sync must be performed after each write operation
91 fat_close_file(file_handle); //Close the file.
93 //Open the file (now we're at the beginning of the file again.
94 open_file_in_dir(fs, dd, "Test.txt");
95 //Read the contents of the file (up to 512 bytes)
96 bytes_read = fat_read_file(file_handle, (uint8_t*)buffer, BUFFERSIZE);
97 //Print the contents of the file
98 Serial.println((const char*)buffer);
99 //Now go to the end of the file to write some data.
100 fat_seek_file(file_handle, 0, FAT_SEEK_END);
101 sprintf(buffer, "%d", count++);
102 //Write the new 'buffer' string to the end of the file
103 fat_write_file(file_handle, (const uint8_t*)buffer, strlen(buffer));
105 //Close the file, we're finished!
106 fat_close_file(file_handle);
113 uint8_t find_file_in_dir(struct fat_fs_struct* fs, struct fat_dir_struct* dd, const char* name, struct fat_dir_entry_struct* dir_entry)
115 fat_reset_dir(dd); //Make sure to start from the beginning of the directory!
116 while(fat_read_dir(dd, dir_entry))
118 if(strcmp(dir_entry->long_name, name) == 0)
128 struct fat_file_struct* open_file_in_dir(struct fat_fs_struct* fs, struct fat_dir_struct* dd, const char* name)
130 struct fat_dir_entry_struct file_entry;
131 if(!find_file_in_dir(fs, dd, name, &file_entry))
134 return fat_open_file(fs, &file_entry);
137 char init_filesystem(void)
145 //open first partition
146 partition = partition_open(sd_raw_read,
147 sd_raw_read_interval,
148 #if SD_RAW_WRITE_SUPPORT
150 sd_raw_write_interval,
160 //If the partition did not open, assume the storage device
161 //is a "superfloppy", i.e. has no MBR.
162 partition = partition_open(sd_raw_read,
163 sd_raw_read_interval,
164 #if SD_RAW_WRITE_SUPPORT
166 sd_raw_write_interval,
180 fs = fat_open(partition);
186 //Open root directory
187 fat_get_dir_entry_of_path(fs, "/", &dir_entry);
188 dd=fat_open_dir(fs, &dir_entry);
197 char get_next_filename(struct fat_dir_struct* cur_dir, char * new_file)
199 //'dir_entry' is a global variable of type directory_entry_struct
201 //Get the next file from the root directory
202 if(fat_read_dir(cur_dir, &dir_entry))
204 sprintf(new_file, "%s", dir_entry.long_name);
205 Serial.println((const char *)new_file);
208 //If another file isn't found, return 0