Sonder Design Team / Memory25L16_fast

Dependents:   BlackBoard_Firmware_Fast_read_not_test

Fork of Memory by Sonder Design Team

Committer:
ThomasSonderDesign
Date:
Thu May 05 02:54:11 2016 +0000
Revision:
1:9d8c932d26ae
Parent:
0:c2e41d203cdb
Child:
2:5c70c0334ed0
Child:
3:339efdc5134f
Should write display images to 25L08 EEPROM over UART. It uses an accompanying python script called UARTMemoryWrite.py. It seems to run into memory overflow when calling writeFrame and freazes.

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
ThomasSonderDesign 0:c2e41d203cdb 127 my_spi.write(02); //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);
ThomasSonderDesign 0:c2e41d203cdb 135 address=address++; //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