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);
    }
}