exercise SPI SerialFlash library on k64f with winbond flash
Dependencies: SerialFlash mbed
main.cpp@1:de16126bae4c, 2016-04-14 (annotated)
- Committer:
- manitou
- Date:
- Thu Apr 14 12:07:28 2016 +0000
- Revision:
- 1:de16126bae4c
- Parent:
- 0:9f1de2388e5a
exercise SPI SerialFlash library on k64f with winbond flash
Who changed what in which revision?
User | Revision | Line number | New 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 | } |