Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: BlackBoard_Firmware_Fast_read_not_test
Fork of Memory by
Memory.cpp@1:9d8c932d26ae, 2016-05-05 (annotated)
- 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?
| User | Revision | Line number | New 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 |
