Sonder Design Team / Memory25L16_fast

Dependents:   BlackBoard_Firmware_Fast_read_not_test

Fork of Memory by Sonder Design Team

Committer:
ThomasSonderDesign
Date:
Mon Apr 18 00:39:27 2016 +0000
Revision:
0:c2e41d203cdb
Child:
1:9d8c932d26ae
Library for basic communications with A25L08 memory. Includes functions for writing up to 3KB at a time. Please read the data sheet for further information.

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