Sonder Design Team / Memory25L16_fast

Dependents:   BlackBoard_Firmware_Fast_read_not_test

Fork of Memory by Sonder Design Team

Committer:
ThomasSonderDesign
Date:
Thu Jun 23 22:31:29 2016 +0000
Revision:
2:5c70c0334ed0
Parent:
1:9d8c932d26ae
Child:
6:c11cb6709b8b
Same as before but reduced buffer size and blockErase now returns a value

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ThomasSonderDesign 0:c2e41d203cdb 1 #include "mbed.h"
ThomasSonderDesign 0:c2e41d203cdb 2 #include "Memory.h"
ThomasSonderDesign 0:c2e41d203cdb 3
ThomasSonderDesign 0:c2e41d203cdb 4
ThomasSonderDesign 0:c2e41d203cdb 5 Memory::Memory(PinName chipSelect) : _cs_mem(chipSelect)
ThomasSonderDesign 0:c2e41d203cdb 6 {
ThomasSonderDesign 0:c2e41d203cdb 7 _cs_mem=1;
ThomasSonderDesign 0:c2e41d203cdb 8 }
ThomasSonderDesign 0:c2e41d203cdb 9 /**
ThomasSonderDesign 0:c2e41d203cdb 10 * Reads 'length' elements into a char array starting at the 24bit Address.
ThomasSonderDesign 0:c2e41d203cdb 11 *If length is greater than BufferSize (3840 bytes) the function will terminate
ThomasSonderDesign 0:c2e41d203cdb 12 *and return the start address.
ThomasSonderDesign 0:c2e41d203cdb 13 */
ThomasSonderDesign 0:c2e41d203cdb 14 int Memory::readData(SPI my_spi, char value [], int Address, int length)
ThomasSonderDesign 0:c2e41d203cdb 15 {
ThomasSonderDesign 0:c2e41d203cdb 16 if(length>bufferSize) {
ThomasSonderDesign 0:c2e41d203cdb 17 printf("\nLength %i exceeds Max Length\n",length);
ThomasSonderDesign 0:c2e41d203cdb 18 return Address;
ThomasSonderDesign 0:c2e41d203cdb 19 }
ThomasSonderDesign 0:c2e41d203cdb 20 _cs_mem = 1; //Ensure cs is deselected
ThomasSonderDesign 0:c2e41d203cdb 21 wait_us(10);
ThomasSonderDesign 0:c2e41d203cdb 22 _cs_mem = 0; //memory is selected
ThomasSonderDesign 0:c2e41d203cdb 23 my_spi.write(0x03); //Send read command
ThomasSonderDesign 0:c2e41d203cdb 24 my_spi.write(Address>>16); //Send high address byte
ThomasSonderDesign 0:c2e41d203cdb 25 my_spi.write(Address>>8); //Send mid address byte
ThomasSonderDesign 0:c2e41d203cdb 26 my_spi.write(Address); //Send low address byte
ThomasSonderDesign 0:c2e41d203cdb 27
ThomasSonderDesign 0:c2e41d203cdb 28
ThomasSonderDesign 0:c2e41d203cdb 29 for(int i =0; i <length; i++) {
ThomasSonderDesign 0:c2e41d203cdb 30 value[i]= my_spi.write(dummy);//Send dummy byte to read out value ate Address
ThomasSonderDesign 0:c2e41d203cdb 31 Address++;
ThomasSonderDesign 0:c2e41d203cdb 32 }
ThomasSonderDesign 0:c2e41d203cdb 33 _cs_mem = 1;
ThomasSonderDesign 0:c2e41d203cdb 34 return Address; //Return the address of the next unread byte
ThomasSonderDesign 0:c2e41d203cdb 35 }
ThomasSonderDesign 0:c2e41d203cdb 36
ThomasSonderDesign 0:c2e41d203cdb 37
ThomasSonderDesign 0:c2e41d203cdb 38 /**
ThomasSonderDesign 0:c2e41d203cdb 39 * Sector Erase, erases everything in the 4KB sector that includes Address
ThomasSonderDesign 0:c2e41d203cdb 40 */
ThomasSonderDesign 0:c2e41d203cdb 41 void Memory::sectorErase(SPI my_spi, long Address)
ThomasSonderDesign 0:c2e41d203cdb 42 {
ThomasSonderDesign 0:c2e41d203cdb 43 _cs_mem = 1;
ThomasSonderDesign 0:c2e41d203cdb 44 _cs_mem=0;
ThomasSonderDesign 0:c2e41d203cdb 45 my_spi.write(0x06); //Send Write enable command
ThomasSonderDesign 0:c2e41d203cdb 46 _cs_mem= 1;
ThomasSonderDesign 0:c2e41d203cdb 47 wait_us(5);
ThomasSonderDesign 0:c2e41d203cdb 48 _cs_mem=0;
ThomasSonderDesign 0:c2e41d203cdb 49 my_spi.write(0x20); //Send sector erase comand
ThomasSonderDesign 0:c2e41d203cdb 50 my_spi.write(Address>>16); //Send high address byte
ThomasSonderDesign 0:c2e41d203cdb 51 my_spi.write(Address>>8); //Send mid address byte
ThomasSonderDesign 0:c2e41d203cdb 52 my_spi.write(Address); //Send low address byte
ThomasSonderDesign 0:c2e41d203cdb 53 _cs_mem=1;
ThomasSonderDesign 0:c2e41d203cdb 54 wait_us(5);
ThomasSonderDesign 0:c2e41d203cdb 55
ThomasSonderDesign 0:c2e41d203cdb 56 //Pol the status register untill the Write In Progress bit is no longer set
ThomasSonderDesign 0:c2e41d203cdb 57 _cs_mem=0;
ThomasSonderDesign 0:c2e41d203cdb 58 my_spi.write(05);
ThomasSonderDesign 0:c2e41d203cdb 59 int byte1 = my_spi.write(dummy);
ThomasSonderDesign 0:c2e41d203cdb 60 while(byte1>0) {
ThomasSonderDesign 0:c2e41d203cdb 61 byte1 = my_spi.write(dummy);
ThomasSonderDesign 0:c2e41d203cdb 62 }
ThomasSonderDesign 0:c2e41d203cdb 63 _cs_mem=1;
ThomasSonderDesign 0:c2e41d203cdb 64 }
ThomasSonderDesign 0:c2e41d203cdb 65
ThomasSonderDesign 0:c2e41d203cdb 66
ThomasSonderDesign 0:c2e41d203cdb 67 /**
ThomasSonderDesign 0:c2e41d203cdb 68 * Block Erase, erases everything in a 4KB block that includes Address
ThomasSonderDesign 0:c2e41d203cdb 69 */
ThomasSonderDesign 2:5c70c0334ed0 70 int Memory::blockErase(SPI my_spi, int Address)
ThomasSonderDesign 0:c2e41d203cdb 71 {
ThomasSonderDesign 0:c2e41d203cdb 72 _cs_mem = 1;
ThomasSonderDesign 0:c2e41d203cdb 73 _cs_mem=0;
ThomasSonderDesign 0:c2e41d203cdb 74 my_spi.write(0x06); //Send Write enable command
ThomasSonderDesign 0:c2e41d203cdb 75 _cs_mem= 1;
ThomasSonderDesign 0:c2e41d203cdb 76 wait_us(5);
ThomasSonderDesign 0:c2e41d203cdb 77 _cs_mem=0;
ThomasSonderDesign 0:c2e41d203cdb 78 my_spi.write(0xD8); //Send sector erase comand
ThomasSonderDesign 0:c2e41d203cdb 79 my_spi.write((Address>>16)&0xff); //Send high address byte
ThomasSonderDesign 0:c2e41d203cdb 80 my_spi.write((Address>>8)&0xff); //Send mid address byte
ThomasSonderDesign 0:c2e41d203cdb 81 my_spi.write((Address)&0xff); //Send low address byte
ThomasSonderDesign 0:c2e41d203cdb 82 _cs_mem=1;
ThomasSonderDesign 0:c2e41d203cdb 83 wait_us(5);
ThomasSonderDesign 0:c2e41d203cdb 84
ThomasSonderDesign 0:c2e41d203cdb 85 //Pol the status register untill the Write In Progress bit is no longer set
ThomasSonderDesign 0:c2e41d203cdb 86 _cs_mem=0;
ThomasSonderDesign 0:c2e41d203cdb 87 my_spi.write(05);
ThomasSonderDesign 0:c2e41d203cdb 88 int byte1 = my_spi.write(dummy);
ThomasSonderDesign 0:c2e41d203cdb 89 while(byte1>0) {
ThomasSonderDesign 0:c2e41d203cdb 90 byte1 = my_spi.write(dummy);
ThomasSonderDesign 0:c2e41d203cdb 91 }
ThomasSonderDesign 0:c2e41d203cdb 92 _cs_mem=1;
ThomasSonderDesign 2:5c70c0334ed0 93 int returnVal = (Address/0x10000);
ThomasSonderDesign 2:5c70c0334ed0 94 returnVal*=0x10000;
ThomasSonderDesign 2:5c70c0334ed0 95 returnVal+=0x10000;
ThomasSonderDesign 2:5c70c0334ed0 96 return returnVal;
ThomasSonderDesign 0:c2e41d203cdb 97 }
ThomasSonderDesign 0:c2e41d203cdb 98
ThomasSonderDesign 0:c2e41d203cdb 99 /**
ThomasSonderDesign 0:c2e41d203cdb 100 * Writes a char array containg 'length' elements to memory sarting at address.
ThomasSonderDesign 0:c2e41d203cdb 101 *If length is greater than BufferSize (3840 bytes) the function will terminate
ThomasSonderDesign 0:c2e41d203cdb 102 *and return the start address.
ThomasSonderDesign 0:c2e41d203cdb 103 */
ThomasSonderDesign 0:c2e41d203cdb 104 int Memory::writeData(SPI my_spi, char buffer[], int address, int length)
ThomasSonderDesign 0:c2e41d203cdb 105 {
ThomasSonderDesign 0:c2e41d203cdb 106 if(length>bufferSize) {
ThomasSonderDesign 0:c2e41d203cdb 107 printf("\nLength %i exceeds Max Length\n",length);
ThomasSonderDesign 0:c2e41d203cdb 108 return address;
ThomasSonderDesign 0:c2e41d203cdb 109 }
ThomasSonderDesign 0:c2e41d203cdb 110 for(int i =0; i<length; i++) {
ThomasSonderDesign 0:c2e41d203cdb 111 if(address%256==0) { //Handle start and end of pages
ThomasSonderDesign 0:c2e41d203cdb 112 _cs_mem=1;
ThomasSonderDesign 0:c2e41d203cdb 113 wait_us(10);
ThomasSonderDesign 0:c2e41d203cdb 114 //wait for the WIP bit to go low
ThomasSonderDesign 0:c2e41d203cdb 115 _cs_mem=0; //Selet memory
ThomasSonderDesign 0:c2e41d203cdb 116 my_spi.write(0x05); //Send read status register command
ThomasSonderDesign 0:c2e41d203cdb 117 int byte1 = my_spi.write(dummy);//Send dummy byte to read status reg
ThomasSonderDesign 0:c2e41d203cdb 118 while ((byte1&1)>0) {
ThomasSonderDesign 0:c2e41d203cdb 119 wait_us(10);
ThomasSonderDesign 0:c2e41d203cdb 120 my_spi.write(0x05); //Send read status register command
ThomasSonderDesign 0:c2e41d203cdb 121 byte1 = my_spi.write(dummy);//Send dummy byte to read status reg
ThomasSonderDesign 0:c2e41d203cdb 122 }
ThomasSonderDesign 0:c2e41d203cdb 123 _cs_mem=1;
ThomasSonderDesign 0:c2e41d203cdb 124
ThomasSonderDesign 0:c2e41d203cdb 125 _cs_mem=0; //Selet memory
ThomasSonderDesign 0:c2e41d203cdb 126 my_spi.write(06); //Set Write Enable flag in the status reg
ThomasSonderDesign 0:c2e41d203cdb 127 _cs_mem=1;
ThomasSonderDesign 0:c2e41d203cdb 128 wait_us(10);
ThomasSonderDesign 0:c2e41d203cdb 129
ThomasSonderDesign 0:c2e41d203cdb 130 _cs_mem=0; //Selet memory
ThomasSonderDesign 0:c2e41d203cdb 131 my_spi.write(02); //Send read comand
ThomasSonderDesign 0:c2e41d203cdb 132 my_spi.write(address>>16); //Send high address byte
ThomasSonderDesign 0:c2e41d203cdb 133 my_spi.write(address>>8); //Send middle adress byte
ThomasSonderDesign 0:c2e41d203cdb 134 my_spi.write(address); //Send low address
ThomasSonderDesign 0:c2e41d203cdb 135
ThomasSonderDesign 0:c2e41d203cdb 136 }
ThomasSonderDesign 0:c2e41d203cdb 137 my_spi.write(buffer[i]); //Write the calue of the buffer to memory
ThomasSonderDesign 0:c2e41d203cdb 138 wait_us(5);
ThomasSonderDesign 0:c2e41d203cdb 139 address=address++; //Increment address
ThomasSonderDesign 0:c2e41d203cdb 140 }
ThomasSonderDesign 0:c2e41d203cdb 141 _cs_mem=1;
ThomasSonderDesign 0:c2e41d203cdb 142 return address;
ThomasSonderDesign 0:c2e41d203cdb 143 }
ThomasSonderDesign 0:c2e41d203cdb 144