exercise SPI SerialFlash library on k64f with winbond flash
Dependencies: SerialFlash mbed
Diff: main.cpp
- Revision:
- 0:9f1de2388e5a
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Thu Apr 14 12:05:33 2016 +0000 @@ -0,0 +1,143 @@ +// 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); + } +} \ No newline at end of file