Sonder Design Team / Memory
Committer:
AdminSonderDesign
Date:
Wed Feb 08 22:23:02 2017 +0000
Revision:
3:339efdc5134f
Parent:
1:9d8c932d26ae
Child:
4:bb4fd1147054
EA LPC11U35 Memory Test Feb 9th; You can print the pre-defined characters in different memory block and let you know how the internal memory works in the chips

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 0:c2e41d203cdb 70 void 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 0:c2e41d203cdb 93 }
ThomasSonderDesign 0:c2e41d203cdb 94
ThomasSonderDesign 0:c2e41d203cdb 95 /**
ThomasSonderDesign 0:c2e41d203cdb 96 * Writes a char array containg 'length' elements to memory sarting at address.
ThomasSonderDesign 0:c2e41d203cdb 97 *If length is greater than BufferSize (3840 bytes) the function will terminate
ThomasSonderDesign 0:c2e41d203cdb 98 *and return the start address.
ThomasSonderDesign 0:c2e41d203cdb 99 */
ThomasSonderDesign 0:c2e41d203cdb 100 int Memory::writeData(SPI my_spi, char buffer[], int address, int length)
ThomasSonderDesign 0:c2e41d203cdb 101 {
ThomasSonderDesign 0:c2e41d203cdb 102 if(length>bufferSize) {
ThomasSonderDesign 0:c2e41d203cdb 103 printf("\nLength %i exceeds Max Length\n",length);
ThomasSonderDesign 0:c2e41d203cdb 104 return address;
ThomasSonderDesign 0:c2e41d203cdb 105 }
ThomasSonderDesign 0:c2e41d203cdb 106 for(int i =0; i<length; i++) {
ThomasSonderDesign 0:c2e41d203cdb 107 if(address%256==0) { //Handle start and end of pages
ThomasSonderDesign 0:c2e41d203cdb 108 _cs_mem=1;
ThomasSonderDesign 0:c2e41d203cdb 109 wait_us(10);
ThomasSonderDesign 0:c2e41d203cdb 110 //wait for the WIP bit to go low
ThomasSonderDesign 0:c2e41d203cdb 111 _cs_mem=0; //Selet memory
ThomasSonderDesign 0:c2e41d203cdb 112 my_spi.write(0x05); //Send read status register command
ThomasSonderDesign 0:c2e41d203cdb 113 int byte1 = my_spi.write(dummy);//Send dummy byte to read status reg
ThomasSonderDesign 0:c2e41d203cdb 114 while ((byte1&1)>0) {
ThomasSonderDesign 0:c2e41d203cdb 115 wait_us(10);
ThomasSonderDesign 0:c2e41d203cdb 116 my_spi.write(0x05); //Send read status register command
ThomasSonderDesign 0:c2e41d203cdb 117 byte1 = my_spi.write(dummy);//Send dummy byte to read status reg
ThomasSonderDesign 0:c2e41d203cdb 118 }
ThomasSonderDesign 0:c2e41d203cdb 119 _cs_mem=1;
ThomasSonderDesign 0:c2e41d203cdb 120
ThomasSonderDesign 0:c2e41d203cdb 121 _cs_mem=0; //Selet memory
ThomasSonderDesign 0:c2e41d203cdb 122 my_spi.write(06); //Set Write Enable flag in the status reg
ThomasSonderDesign 0:c2e41d203cdb 123 _cs_mem=1;
ThomasSonderDesign 0:c2e41d203cdb 124 wait_us(10);
ThomasSonderDesign 0:c2e41d203cdb 125
ThomasSonderDesign 0:c2e41d203cdb 126 _cs_mem=0; //Selet memory
AdminSonderDesign 3:339efdc5134f 127 my_spi.write(0x02); //Send read comand
ThomasSonderDesign 0:c2e41d203cdb 128 my_spi.write(address>>16); //Send high address byte
ThomasSonderDesign 0:c2e41d203cdb 129 my_spi.write(address>>8); //Send middle adress byte
ThomasSonderDesign 0:c2e41d203cdb 130 my_spi.write(address); //Send low address
ThomasSonderDesign 0:c2e41d203cdb 131
ThomasSonderDesign 0:c2e41d203cdb 132 }
ThomasSonderDesign 0:c2e41d203cdb 133 my_spi.write(buffer[i]); //Write the calue of the buffer to memory
ThomasSonderDesign 0:c2e41d203cdb 134 wait_us(5);
AdminSonderDesign 3:339efdc5134f 135 address=address+1; //Increment address
ThomasSonderDesign 0:c2e41d203cdb 136 }
ThomasSonderDesign 0:c2e41d203cdb 137 _cs_mem=1;
ThomasSonderDesign 0:c2e41d203cdb 138 return address;
ThomasSonderDesign 0:c2e41d203cdb 139 }
ThomasSonderDesign 0:c2e41d203cdb 140
AdminSonderDesign 3:339efdc5134f 141 /**
AdminSonderDesign 3:339efdc5134f 142 * Arrange the data to the NEW address for icon refreshing
AdminSonderDesign 3:339efdc5134f 143 */
AdminSonderDesign 3:339efdc5134f 144 int Memory::arrangeData(SPI my_spi, int Address, int addressNew, int length)
AdminSonderDesign 3:339efdc5134f 145 {
AdminSonderDesign 3:339efdc5134f 146 char value[length];
AdminSonderDesign 3:339efdc5134f 147 _cs_mem = 1; //Ensure cs is deselected
AdminSonderDesign 3:339efdc5134f 148 wait_us(10);
AdminSonderDesign 3:339efdc5134f 149 _cs_mem = 0; //memory is selected
AdminSonderDesign 3:339efdc5134f 150 my_spi.write(0x03); //Send read command
AdminSonderDesign 3:339efdc5134f 151 my_spi.write(Address>>16); //Send high address byte
AdminSonderDesign 3:339efdc5134f 152 my_spi.write(Address>>8); //Send mid address byte
AdminSonderDesign 3:339efdc5134f 153 my_spi.write(Address); //Send low address byte
AdminSonderDesign 3:339efdc5134f 154
AdminSonderDesign 3:339efdc5134f 155
AdminSonderDesign 3:339efdc5134f 156 for(int i =0; i <length; i++) {
AdminSonderDesign 3:339efdc5134f 157 value[i]= my_spi.write(dummy);//Send dummy byte to read out value ate Address
AdminSonderDesign 3:339efdc5134f 158 Address++;
AdminSonderDesign 3:339efdc5134f 159 }
AdminSonderDesign 3:339efdc5134f 160 _cs_mem = 1;
AdminSonderDesign 3:339efdc5134f 161
AdminSonderDesign 3:339efdc5134f 162 wait_ms(50);//wait for command transfer
AdminSonderDesign 3:339efdc5134f 163
AdminSonderDesign 3:339efdc5134f 164 for(int i =0; i<length; i++) {
AdminSonderDesign 3:339efdc5134f 165 if(addressNew%256==0) { //Handle start and end of pages
AdminSonderDesign 3:339efdc5134f 166 _cs_mem=1;
AdminSonderDesign 3:339efdc5134f 167 wait_us(10);
AdminSonderDesign 3:339efdc5134f 168 //wait for the WIP bit to go low
AdminSonderDesign 3:339efdc5134f 169 _cs_mem=0; //Selet memory
AdminSonderDesign 3:339efdc5134f 170 my_spi.write(0x05); //Send read status register command
AdminSonderDesign 3:339efdc5134f 171 int byte1 = my_spi.write(dummy);//Send dummy byte to read status reg
AdminSonderDesign 3:339efdc5134f 172 while ((byte1&1)>0) {
AdminSonderDesign 3:339efdc5134f 173 wait_us(10);
AdminSonderDesign 3:339efdc5134f 174 my_spi.write(0x05); //Send read status register command
AdminSonderDesign 3:339efdc5134f 175 byte1 = my_spi.write(dummy);//Send dummy byte to read status reg
AdminSonderDesign 3:339efdc5134f 176 }
AdminSonderDesign 3:339efdc5134f 177 _cs_mem=1;
AdminSonderDesign 3:339efdc5134f 178
AdminSonderDesign 3:339efdc5134f 179 _cs_mem=0; //Selet memory
AdminSonderDesign 3:339efdc5134f 180 my_spi.write(06); //Set Write Enable flag in the status reg
AdminSonderDesign 3:339efdc5134f 181 _cs_mem=1;
AdminSonderDesign 3:339efdc5134f 182 wait_us(10);
AdminSonderDesign 3:339efdc5134f 183
AdminSonderDesign 3:339efdc5134f 184 _cs_mem=0; //Selet memory
AdminSonderDesign 3:339efdc5134f 185 my_spi.write(0x02); //Send read comand
AdminSonderDesign 3:339efdc5134f 186 my_spi.write(addressNew>>16); //Send high address byte
AdminSonderDesign 3:339efdc5134f 187 my_spi.write(addressNew>>8); //Send middle adress byte
AdminSonderDesign 3:339efdc5134f 188 my_spi.write(addressNew); //Send low address
AdminSonderDesign 3:339efdc5134f 189
AdminSonderDesign 3:339efdc5134f 190 }
AdminSonderDesign 3:339efdc5134f 191 my_spi.write(value[i]); //Write the calue of the buffer to memory
AdminSonderDesign 3:339efdc5134f 192 wait_us(5);
AdminSonderDesign 3:339efdc5134f 193 addressNew=addressNew+1; //Increment address
AdminSonderDesign 3:339efdc5134f 194 }
AdminSonderDesign 3:339efdc5134f 195 _cs_mem=1;
AdminSonderDesign 3:339efdc5134f 196 wait_ms(10); //Need to wait register response, otherwise will cause the output full of dummies
AdminSonderDesign 3:339efdc5134f 197 return addressNew;
AdminSonderDesign 3:339efdc5134f 198 }