exercise SPI SerialFlash library on k64f with winbond flash

Dependencies:   SerialFlash mbed

Committer:
manitou
Date:
Thu Apr 14 12:05:33 2016 +0000
Revision:
0:9f1de2388e5a
test SerialFlash library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
manitou 0:9f1de2388e5a 1 // SPI serial flash test from teensy SerialFlash
manitou 0:9f1de2388e5a 2 // SPI pins CS on 6
manitou 0:9f1de2388e5a 3 // TODO SPI CS pins part of class definitions
manitou 0:9f1de2388e5a 4 #include "mbed.h"
manitou 0:9f1de2388e5a 5 #include "SerialFlash.h"
manitou 0:9f1de2388e5a 6
manitou 0:9f1de2388e5a 7 void dump(int addr, int lines) {
manitou 0:9f1de2388e5a 8 int i;
manitou 0:9f1de2388e5a 9 char buf[16];
manitou 0:9f1de2388e5a 10
manitou 0:9f1de2388e5a 11 while(lines--){
manitou 0:9f1de2388e5a 12 SerialFlash.read(addr,buf,16);
manitou 0:9f1de2388e5a 13 addr += 16;
manitou 0:9f1de2388e5a 14 for(i=0;i<16;i++) printf("%02x ",buf[i]);
manitou 0:9f1de2388e5a 15 printf("|");
manitou 0:9f1de2388e5a 16 for(i=0;i<16;i++){
manitou 0:9f1de2388e5a 17 if (buf[i] < ' ' | buf[i] > '\177') printf("?");
manitou 0:9f1de2388e5a 18 else printf("%c",buf[i]);
manitou 0:9f1de2388e5a 19 }
manitou 0:9f1de2388e5a 20 printf("|\n");
manitou 0:9f1de2388e5a 21 }
manitou 0:9f1de2388e5a 22 }
manitou 0:9f1de2388e5a 23
manitou 0:9f1de2388e5a 24 void meta() {
manitou 0:9f1de2388e5a 25 // paul's file system meta data
manitou 0:9f1de2388e5a 26 int i,files,deleted,capacity, avail;
manitou 0:9f1de2388e5a 27 uint32_t maxfiles, stringsize, buff, dir[2];
manitou 0:9f1de2388e5a 28 uint16_t hash;
manitou 0:9f1de2388e5a 29 uint8_t id[3];
manitou 0:9f1de2388e5a 30
manitou 0:9f1de2388e5a 31 printf("meta data: magic(4),strsize/4(2),maxfiles(2) hashes*2\n");
manitou 0:9f1de2388e5a 32 dump(0,2);
manitou 0:9f1de2388e5a 33 SerialFlash.read(4,&buff,4);
manitou 0:9f1de2388e5a 34 maxfiles = buff & 0xffff;
manitou 0:9f1de2388e5a 35 stringsize = (buff & 0xFFFF0000) >> 14;
manitou 0:9f1de2388e5a 36 printf("maxfiles %d stringsize %d\n",maxfiles,stringsize);
manitou 0:9f1de2388e5a 37 printf("dir: entry(10): addr(4),lth(4),str/4(2)\n");
manitou 0:9f1de2388e5a 38 dump(8 + maxfiles*2,3);
manitou 0:9f1de2388e5a 39 printf("strings\n");
manitou 0:9f1de2388e5a 40 dump(8 + 12*maxfiles,3);
manitou 0:9f1de2388e5a 41 printf("first data block\n");
manitou 0:9f1de2388e5a 42 i = 8 + maxfiles*2 + maxfiles*10 + stringsize;
manitou 0:9f1de2388e5a 43 dump(i,1);
manitou 0:9f1de2388e5a 44 files=deleted=hash=0;
manitou 0:9f1de2388e5a 45 for(i=0;i<maxfiles;i++) {
manitou 0:9f1de2388e5a 46 SerialFlash.read(8+2*i,&hash,2);
manitou 0:9f1de2388e5a 47 if (hash == 0xffff) break;
manitou 0:9f1de2388e5a 48 if (hash) files++;
manitou 0:9f1de2388e5a 49 else deleted++;
manitou 0:9f1de2388e5a 50 }
manitou 0:9f1de2388e5a 51 printf("files %d deleted %d\n",files,deleted);
manitou 0:9f1de2388e5a 52 SerialFlash.opendir();
manitou 0:9f1de2388e5a 53 while (1) {
manitou 0:9f1de2388e5a 54 char filename[64];
manitou 0:9f1de2388e5a 55 uint32_t filesize;
manitou 0:9f1de2388e5a 56
manitou 0:9f1de2388e5a 57 if (SerialFlash.readdir(filename, sizeof(filename), filesize)) {
manitou 0:9f1de2388e5a 58 printf("%s %d bytes\n",filename,filesize);
manitou 0:9f1de2388e5a 59 } else {
manitou 0:9f1de2388e5a 60 break; // no more files
manitou 0:9f1de2388e5a 61 }
manitou 0:9f1de2388e5a 62 }
manitou 0:9f1de2388e5a 63
manitou 0:9f1de2388e5a 64 SerialFlash.readID(id);
manitou 0:9f1de2388e5a 65 capacity = SerialFlash.capacity(id);
manitou 0:9f1de2388e5a 66 printf("Capacity %d ",capacity);
manitou 0:9f1de2388e5a 67 // read last dir entry i-1, could round up to 256
manitou 0:9f1de2388e5a 68 SerialFlash.read(8 + maxfiles*2 + (i-1)*10,dir,8);
manitou 0:9f1de2388e5a 69 avail = capacity - (dir[0] + dir[1]);
manitou 0:9f1de2388e5a 70 printf(" free %d\n",avail);
manitou 0:9f1de2388e5a 71 }
manitou 0:9f1de2388e5a 72
manitou 0:9f1de2388e5a 73 void erase() {
manitou 0:9f1de2388e5a 74 printf("erasing ...");
manitou 0:9f1de2388e5a 75 SerialFlash.eraseAll();
manitou 0:9f1de2388e5a 76 while (SerialFlash.ready() == false);
manitou 0:9f1de2388e5a 77 printf(" done\n");
manitou 0:9f1de2388e5a 78 }
manitou 0:9f1de2388e5a 79
manitou 0:9f1de2388e5a 80 void dofile(char *filename, unsigned long length) {
manitou 0:9f1de2388e5a 81 printf("create %s %d bytes\n",filename,length);
manitou 0:9f1de2388e5a 82
manitou 0:9f1de2388e5a 83 // check if this file is already on the Flash chip
manitou 0:9f1de2388e5a 84 if (SerialFlash.exists(filename)) {
manitou 0:9f1de2388e5a 85 printf("file exists, removing\n");
manitou 0:9f1de2388e5a 86 SerialFlash.remove(filename);
manitou 0:9f1de2388e5a 87 }
manitou 0:9f1de2388e5a 88
manitou 0:9f1de2388e5a 89 // create the file on the Flash chip and copy data
manitou 0:9f1de2388e5a 90 if (SerialFlash.create(filename, length)) {
manitou 0:9f1de2388e5a 91 char buf[256];
manitou 0:9f1de2388e5a 92 unsigned int n;
manitou 0:9f1de2388e5a 93 int i;
manitou 0:9f1de2388e5a 94 wait(.002);
manitou 0:9f1de2388e5a 95 SerialFlashFile ff = SerialFlash.open(filename);
manitou 0:9f1de2388e5a 96 if (ff) {
manitou 0:9f1de2388e5a 97 // copy data loop
manitou 0:9f1de2388e5a 98 while (length) {
manitou 0:9f1de2388e5a 99
manitou 0:9f1de2388e5a 100
manitou 0:9f1de2388e5a 101 for(i=0;i<sizeof(buf);i++) buf[i]=i;
manitou 0:9f1de2388e5a 102 if (length >= 256) n =256;
manitou 0:9f1de2388e5a 103 else n = length;
manitou 0:9f1de2388e5a 104 ff.write(buf, n);
manitou 0:9f1de2388e5a 105 length -= n;
manitou 0:9f1de2388e5a 106 printf(".");
manitou 0:9f1de2388e5a 107 }
manitou 0:9f1de2388e5a 108 ff.close();
manitou 0:9f1de2388e5a 109 printf("\n");
manitou 0:9f1de2388e5a 110 // check some data
manitou 0:9f1de2388e5a 111 ff = SerialFlash.open("TST.DAT");
manitou 0:9f1de2388e5a 112 printf("checking flash addr %d\n",ff.getFlashAddress());
manitou 0:9f1de2388e5a 113 dump(ff.getFlashAddress(),2);
manitou 0:9f1de2388e5a 114 int n,errs=0;
manitou 0:9f1de2388e5a 115 while(1) {
manitou 0:9f1de2388e5a 116 n=ff.read(buf,sizeof(buf));
manitou 0:9f1de2388e5a 117 if (n <= 0) break;
manitou 0:9f1de2388e5a 118 for (i=0;i<sizeof(buf);i++) if (buf[i] != i) errs++;
manitou 0:9f1de2388e5a 119 }
manitou 0:9f1de2388e5a 120 ff.close();
manitou 0:9f1de2388e5a 121 printf("errs %d\n",errs);
manitou 0:9f1de2388e5a 122 } else {
manitou 0:9f1de2388e5a 123 printf(" error opening freshly created file!\n");
manitou 0:9f1de2388e5a 124 }
manitou 0:9f1de2388e5a 125 } else {
manitou 0:9f1de2388e5a 126 printf(" unable to create file\n");
manitou 0:9f1de2388e5a 127 }
manitou 0:9f1de2388e5a 128 }
manitou 0:9f1de2388e5a 129
manitou 0:9f1de2388e5a 130 int main()
manitou 0:9f1de2388e5a 131 {
manitou 0:9f1de2388e5a 132 uint8_t id[3];
manitou 0:9f1de2388e5a 133 SerialFlash.begin();
manitou 0:9f1de2388e5a 134 //erase();
manitou 0:9f1de2388e5a 135 //dofile("TST.DAT",1024);
manitou 0:9f1de2388e5a 136 while (true) {
manitou 0:9f1de2388e5a 137 SerialFlash.readID(id);
manitou 0:9f1de2388e5a 138 printf("%x %x %x\n",id[0],id[1],id[2]);
manitou 0:9f1de2388e5a 139 dump(0,2);
manitou 0:9f1de2388e5a 140 meta();
manitou 0:9f1de2388e5a 141 wait(4.0);
manitou 0:9f1de2388e5a 142 }
manitou 0:9f1de2388e5a 143 }