exercise SPI SerialFlash library on k64f with winbond flash
Dependencies: SerialFlash mbed
main.cpp
- Committer:
- manitou
- Date:
- 2016-04-14
- Revision:
- 1:de16126bae4c
- Parent:
- 0:9f1de2388e5a
File content as of revision 1:de16126bae4c:
// SPI serial flash test from teensy SerialFlash
// SPI pins CS on 6
// TODO SPI CS pins part of class definitions
#include "mbed.h"
#include "SerialFlash.h"
void dump(int addr, int lines) {
int i;
char buf[16];
while(lines--){
SerialFlash.read(addr,buf,16);
addr += 16;
for(i=0;i<16;i++) printf("%02x ",buf[i]);
printf("|");
for(i=0;i<16;i++){
if (buf[i] < ' ' | buf[i] > '\177') printf("?");
else printf("%c",buf[i]);
}
printf("|\n");
}
}
void meta() {
// paul's file system meta data
int i,files,deleted,capacity, avail;
uint32_t maxfiles, stringsize, buff, dir[2];
uint16_t hash;
uint8_t id[3];
printf("meta data: magic(4),strsize/4(2),maxfiles(2) hashes*2\n");
dump(0,2);
SerialFlash.read(4,&buff,4);
maxfiles = buff & 0xffff;
stringsize = (buff & 0xFFFF0000) >> 14;
printf("maxfiles %d stringsize %d\n",maxfiles,stringsize);
printf("dir: entry(10): addr(4),lth(4),str/4(2)\n");
dump(8 + maxfiles*2,3);
printf("strings\n");
dump(8 + 12*maxfiles,3);
printf("first data block\n");
i = 8 + maxfiles*2 + maxfiles*10 + stringsize;
dump(i,1);
files=deleted=hash=0;
for(i=0;i<maxfiles;i++) {
SerialFlash.read(8+2*i,&hash,2);
if (hash == 0xffff) break;
if (hash) files++;
else deleted++;
}
printf("files %d deleted %d\n",files,deleted);
SerialFlash.opendir();
while (1) {
char filename[64];
uint32_t filesize;
if (SerialFlash.readdir(filename, sizeof(filename), filesize)) {
printf("%s %d bytes\n",filename,filesize);
} else {
break; // no more files
}
}
SerialFlash.readID(id);
capacity = SerialFlash.capacity(id);
printf("Capacity %d ",capacity);
// read last dir entry i-1, could round up to 256
SerialFlash.read(8 + maxfiles*2 + (i-1)*10,dir,8);
avail = capacity - (dir[0] + dir[1]);
printf(" free %d\n",avail);
}
void erase() {
printf("erasing ...");
SerialFlash.eraseAll();
while (SerialFlash.ready() == false);
printf(" done\n");
}
void dofile(char *filename, unsigned long length) {
printf("create %s %d bytes\n",filename,length);
// check if this file is already on the Flash chip
if (SerialFlash.exists(filename)) {
printf("file exists, removing\n");
SerialFlash.remove(filename);
}
// create the file on the Flash chip and copy data
if (SerialFlash.create(filename, length)) {
char buf[256];
unsigned int n;
int i;
wait(.002);
SerialFlashFile ff = SerialFlash.open(filename);
if (ff) {
// copy data loop
while (length) {
for(i=0;i<sizeof(buf);i++) buf[i]=i;
if (length >= 256) n =256;
else n = length;
ff.write(buf, n);
length -= n;
printf(".");
}
ff.close();
printf("\n");
// check some data
ff = SerialFlash.open("TST.DAT");
printf("checking flash addr %d\n",ff.getFlashAddress());
dump(ff.getFlashAddress(),2);
int n,errs=0;
while(1) {
n=ff.read(buf,sizeof(buf));
if (n <= 0) break;
for (i=0;i<sizeof(buf);i++) if (buf[i] != i) errs++;
}
ff.close();
printf("errs %d\n",errs);
} else {
printf(" error opening freshly created file!\n");
}
} else {
printf(" unable to create file\n");
}
}
int main()
{
uint8_t id[3];
SerialFlash.begin();
//erase();
//dofile("TST.DAT",1024);
while (true) {
SerialFlash.readID(id);
printf("%x %x %x\n",id[0],id[1],id[2]);
dump(0,2);
meta();
wait(4.0);
}
}