Everspin Technologies, Inc. / Mbed 2 deprecated MRAM_MR25H00-EVAL

Dependencies:   mbed

Committer:
EverBen
Date:
Mon Feb 29 21:51:12 2016 +0000
Revision:
1:d840fdc82450
Parent:
0:e37acb3371f0
Initial release

Who changed what in which revision?

UserRevisionLine numberNew contents of line
utlinebacker 0:e37acb3371f0 1 /*
utlinebacker 0:e37acb3371f0 2 * Everspin Technologies - The MRAM Company
EverBen 1:d840fdc82450 3 * MR25H00-EVAL SHIELD
EverBen 1:d840fdc82450 4 * SPI MRAM Demonstration Program
utlinebacker 0:e37acb3371f0 5 */
utlinebacker 0:e37acb3371f0 6
utlinebacker 0:e37acb3371f0 7 #include "mbed.h"
utlinebacker 0:e37acb3371f0 8
EverBen 1:d840fdc82450 9 //====MRAM Device Density in WORDS/BYTES======
EverBen 1:d840fdc82450 10 //|| 4Mbit ---> MRAM_SIZE = 0x80000 ||
EverBen 1:d840fdc82450 11 //|| 1Mbit ---> MRAM_SIZE = 0x20000 ||
EverBen 1:d840fdc82450 12 //|| 256kbit ---> MRAM_SIZE = 0x8000 ||
EverBen 1:d840fdc82450 13 //============================================
EverBen 1:d840fdc82450 14 #define MRAM_SIZE 0x80000
EverBen 1:d840fdc82450 15
EverBen 1:d840fdc82450 16 //Frequency settings for UART and SPI
utlinebacker 0:e37acb3371f0 17 #define SERIAL_BAUD 115200
utlinebacker 0:e37acb3371f0 18 #define SPI_FREQ 40000000
utlinebacker 0:e37acb3371f0 19
EverBen 1:d840fdc82450 20 #define BUFFER_SIZE 64
EverBen 1:d840fdc82450 21
EverBen 1:d840fdc82450 22 //SPI Mode Commands
utlinebacker 0:e37acb3371f0 23 #define CMD_WREN 0x06
utlinebacker 0:e37acb3371f0 24 #define CMD_WRDI 0x04
EverBen 1:d840fdc82450 25 #define CMD_RDSR 0x05
utlinebacker 0:e37acb3371f0 26 #define CMD_WRSR 0x01
utlinebacker 0:e37acb3371f0 27 #define CMD_READ 0x03
utlinebacker 0:e37acb3371f0 28 #define CMD_WRITE 0x02
utlinebacker 0:e37acb3371f0 29 #define CMD_SLEEP 0xB9
utlinebacker 0:e37acb3371f0 30 #define CMD_WAKE 0xAB
utlinebacker 0:e37acb3371f0 31
utlinebacker 0:e37acb3371f0 32 //pin setup for interfacing with the device
EverBen 1:d840fdc82450 33 SPI MRAM(D11, D12, D13, NC); // mosi, miso, sclk
utlinebacker 0:e37acb3371f0 34 DigitalOut SS(D10);
utlinebacker 0:e37acb3371f0 35 DigitalOut WP(D9);
utlinebacker 0:e37acb3371f0 36 DigitalOut HOLD(D8);
utlinebacker 0:e37acb3371f0 37
utlinebacker 0:e37acb3371f0 38 //create a serial object for output to the terminal
utlinebacker 0:e37acb3371f0 39 Serial pc(SERIAL_TX, SERIAL_RX);
utlinebacker 0:e37acb3371f0 40
EverBen 1:d840fdc82450 41 char wrbuf[BUFFER_SIZE] = {0};
EverBen 1:d840fdc82450 42 char rdbuf[BUFFER_SIZE] = {0};
utlinebacker 0:e37acb3371f0 43
EverBen 1:d840fdc82450 44 ///////////////////////////////////////////////////////
EverBen 1:d840fdc82450 45 //MRAM local functions
EverBen 1:d840fdc82450 46 ///////////////////////////////////////////////////////
EverBen 1:d840fdc82450 47
EverBen 1:d840fdc82450 48 //MR25Hxx read wrapper function
EverBen 1:d840fdc82450 49 void mram_read (int addr, char *buf, int len)
utlinebacker 0:e37acb3371f0 50 {
utlinebacker 0:e37acb3371f0 51 int i;
utlinebacker 0:e37acb3371f0 52
utlinebacker 0:e37acb3371f0 53 SS=0;
EverBen 1:d840fdc82450 54 MRAM.write(CMD_READ);
EverBen 1:d840fdc82450 55 MRAM.write((addr >> 16) & 0xff);
EverBen 1:d840fdc82450 56 MRAM.write((addr >> 8) & 0xff);
EverBen 1:d840fdc82450 57 MRAM.write(addr & 0xff);
utlinebacker 0:e37acb3371f0 58
utlinebacker 0:e37acb3371f0 59 for (i = 0; i < len; i ++) {
EverBen 1:d840fdc82450 60 rdbuf[i] = MRAM.write(0);
utlinebacker 0:e37acb3371f0 61 }
utlinebacker 0:e37acb3371f0 62
utlinebacker 0:e37acb3371f0 63 SS=1;
EverBen 1:d840fdc82450 64 return;
utlinebacker 0:e37acb3371f0 65 }
utlinebacker 0:e37acb3371f0 66
EverBen 1:d840fdc82450 67 //MR25Hxx write wrapper function
EverBen 1:d840fdc82450 68 void mram_write (int addr, char *buf, int len)
utlinebacker 0:e37acb3371f0 69 {
utlinebacker 0:e37acb3371f0 70 int i;
utlinebacker 0:e37acb3371f0 71
utlinebacker 0:e37acb3371f0 72 SS=0;
EverBen 1:d840fdc82450 73 MRAM.write(CMD_WRITE);
EverBen 1:d840fdc82450 74 MRAM.write((addr >> 16) & 0xff);
EverBen 1:d840fdc82450 75 MRAM.write((addr >> 8) & 0xff);
EverBen 1:d840fdc82450 76 MRAM.write(addr & 0xff);
utlinebacker 0:e37acb3371f0 77
utlinebacker 0:e37acb3371f0 78 for (i = 0; i < len; i ++) {
EverBen 1:d840fdc82450 79 MRAM.write(wrbuf[i]);
utlinebacker 0:e37acb3371f0 80 }
utlinebacker 0:e37acb3371f0 81
utlinebacker 0:e37acb3371f0 82 SS=1;
EverBen 1:d840fdc82450 83 return;
EverBen 1:d840fdc82450 84 }
EverBen 1:d840fdc82450 85
EverBen 1:d840fdc82450 86 //Put the device to sleep
EverBen 1:d840fdc82450 87 void mram_sleep (void)
EverBen 1:d840fdc82450 88 {
EverBen 1:d840fdc82450 89 WP=1;
EverBen 1:d840fdc82450 90 SS=0;
EverBen 1:d840fdc82450 91 MRAM.write(CMD_SLEEP);
EverBen 1:d840fdc82450 92 SS=1;
EverBen 1:d840fdc82450 93 return;
EverBen 1:d840fdc82450 94 }
EverBen 1:d840fdc82450 95
EverBen 1:d840fdc82450 96 //Wake the device from sleep
EverBen 1:d840fdc82450 97 void mram_wake (void)
EverBen 1:d840fdc82450 98 {
EverBen 1:d840fdc82450 99 WP=1;
EverBen 1:d840fdc82450 100 SS=0;
EverBen 1:d840fdc82450 101 MRAM.write(CMD_WAKE);
EverBen 1:d840fdc82450 102 SS=1;
EverBen 1:d840fdc82450 103 return;
utlinebacker 0:e37acb3371f0 104 }
utlinebacker 0:e37acb3371f0 105
utlinebacker 0:e37acb3371f0 106 //Enable writes
EverBen 1:d840fdc82450 107 void mram_wren (void)
utlinebacker 0:e37acb3371f0 108 {
utlinebacker 0:e37acb3371f0 109 WP=1;
utlinebacker 0:e37acb3371f0 110 SS=0;
EverBen 1:d840fdc82450 111 MRAM.write(CMD_WREN);
utlinebacker 0:e37acb3371f0 112 SS=1;
EverBen 1:d840fdc82450 113 return;
utlinebacker 0:e37acb3371f0 114 }
utlinebacker 0:e37acb3371f0 115
utlinebacker 0:e37acb3371f0 116 //Disable writes
EverBen 1:d840fdc82450 117 void mram_wrdi (void)
utlinebacker 0:e37acb3371f0 118 {
utlinebacker 0:e37acb3371f0 119 SS=0;
EverBen 1:d840fdc82450 120 MRAM.write(CMD_WRDI);
utlinebacker 0:e37acb3371f0 121 SS=1;
utlinebacker 0:e37acb3371f0 122
utlinebacker 0:e37acb3371f0 123 WP=0;
EverBen 1:d840fdc82450 124 return;
utlinebacker 0:e37acb3371f0 125 }
utlinebacker 0:e37acb3371f0 126
utlinebacker 0:e37acb3371f0 127
EverBen 1:d840fdc82450 128 /////////////////////////////////////////////////////////////////////////////
EverBen 1:d840fdc82450 129 //main function showing basic usage with a nvm performance test
EverBen 1:d840fdc82450 130 /////////////////////////////////////////////////////////////////////////////
utlinebacker 0:e37acb3371f0 131 int main()
utlinebacker 0:e37acb3371f0 132 {
utlinebacker 0:e37acb3371f0 133 int i,j;
utlinebacker 0:e37acb3371f0 134 int run_cnt = 0;
utlinebacker 0:e37acb3371f0 135 Timer t;
utlinebacker 0:e37acb3371f0 136
utlinebacker 0:e37acb3371f0 137 HOLD=1; //make sure HOLD is released
utlinebacker 0:e37acb3371f0 138
EverBen 1:d840fdc82450 139 MRAM.frequency(SPI_FREQ); //setup SPI frequency
utlinebacker 0:e37acb3371f0 140 pc.baud(SERIAL_BAUD); //setup UART baud
EverBen 1:d840fdc82450 141 memset(rdbuf,0,BUFFER_SIZE); //init read buffer
utlinebacker 0:e37acb3371f0 142
utlinebacker 0:e37acb3371f0 143 pc.printf("\r\n\r\n");
utlinebacker 0:e37acb3371f0 144 pc.printf("================================================\r\n");
utlinebacker 0:e37acb3371f0 145 pc.printf("|| Everspin Technologies ||\r\n");
utlinebacker 0:e37acb3371f0 146 pc.printf("|| The MRAM Company ||\r\n");
utlinebacker 0:e37acb3371f0 147 pc.printf("================================================\r\n");
EverBen 1:d840fdc82450 148 pc.printf("|| MR25H00-EVAL mbed Example ||\r\n");
EverBen 1:d840fdc82450 149 pc.printf("================================================\r\n\r\n");
EverBen 1:d840fdc82450 150
EverBen 1:d840fdc82450 151 mram_wake(); //make sure the device is awake
EverBen 1:d840fdc82450 152 wait_us(500); //wait sleep mode exit time (tRDP)
EverBen 1:d840fdc82450 153
utlinebacker 0:e37acb3371f0 154 //check the last word of the mem to see if this demo has ever been run on the mram... initialize if not.
EverBen 1:d840fdc82450 155 mram_read(MRAM_SIZE-1, rdbuf, 1);
utlinebacker 0:e37acb3371f0 156 if(rdbuf[0] != 0xAA) {
utlinebacker 0:e37acb3371f0 157 mram_wren(); //Enable writes to MRAM
utlinebacker 0:e37acb3371f0 158 pc.printf("First time running... init MRAM!\r\n");
EverBen 1:d840fdc82450 159 memset(wrbuf,0,BUFFER_SIZE);
EverBen 1:d840fdc82450 160 mram_write(0, wrbuf, BUFFER_SIZE);
utlinebacker 0:e37acb3371f0 161 wrbuf[0] = 0xAA;
EverBen 1:d840fdc82450 162 mram_write(MRAM_SIZE-1, wrbuf, 1);
utlinebacker 0:e37acb3371f0 163 mram_wrdi();
utlinebacker 0:e37acb3371f0 164 }
utlinebacker 0:e37acb3371f0 165
utlinebacker 0:e37acb3371f0 166 while(1) {
utlinebacker 0:e37acb3371f0 167
EverBen 1:d840fdc82450 168 mram_read(0, rdbuf, BUFFER_SIZE);
utlinebacker 0:e37acb3371f0 169 run_cnt = rdbuf[0] + 1;
utlinebacker 0:e37acb3371f0 170
utlinebacker 0:e37acb3371f0 171 pc.printf("MRAM Read: Show Test Count\r\n");
utlinebacker 0:e37acb3371f0 172
EverBen 1:d840fdc82450 173 for (i = 0; i < BUFFER_SIZE; i ++) {
utlinebacker 0:e37acb3371f0 174 pc.printf(" %02x", rdbuf[i]);
utlinebacker 0:e37acb3371f0 175 if ((i & 0x0f) == 0x0f)
utlinebacker 0:e37acb3371f0 176 pc.printf("\r\n");
utlinebacker 0:e37acb3371f0 177 }
utlinebacker 0:e37acb3371f0 178
EverBen 1:d840fdc82450 179 pc.printf("\r\nWrite / Read(w/ Verify) time for %d bits @ 40MHz:\r\n\r\n", MRAM_SIZE*8);
utlinebacker 0:e37acb3371f0 180 mram_wren();
EverBen 1:d840fdc82450 181 pc.printf("MRAM writing: ");
utlinebacker 0:e37acb3371f0 182 t.reset();
utlinebacker 0:e37acb3371f0 183 t.start();
EverBen 1:d840fdc82450 184 for (i = 0; i < MRAM_SIZE; i += BUFFER_SIZE) {
EverBen 1:d840fdc82450 185 for(j = 0; j < BUFFER_SIZE; j++) {
utlinebacker 0:e37acb3371f0 186 wrbuf[j] = run_cnt & 0xff;
utlinebacker 0:e37acb3371f0 187 }
EverBen 1:d840fdc82450 188 mram_write(i, wrbuf, BUFFER_SIZE);
utlinebacker 0:e37acb3371f0 189 }
utlinebacker 0:e37acb3371f0 190 t.stop();
EverBen 1:d840fdc82450 191 pc.printf("Time: %f s Rate: %f KBytes/sec\r\n\r\n", t.read(), (float)MRAM_SIZE / 1024 / t.read());
utlinebacker 0:e37acb3371f0 192 mram_wrdi();
utlinebacker 0:e37acb3371f0 193
EverBen 1:d840fdc82450 194 printf("MRAM reading: ");
utlinebacker 0:e37acb3371f0 195 t.reset();
utlinebacker 0:e37acb3371f0 196 t.start();
EverBen 1:d840fdc82450 197 for (i = 0; i < MRAM_SIZE; i += BUFFER_SIZE) {
EverBen 1:d840fdc82450 198 mram_read(i, rdbuf, BUFFER_SIZE);
EverBen 1:d840fdc82450 199 for(j = 0; j < BUFFER_SIZE; j++) {
utlinebacker 0:e37acb3371f0 200 if (rdbuf[j] != (run_cnt & 0xff)) {
utlinebacker 0:e37acb3371f0 201 pc.printf("Error %d\r\n", i+j);
utlinebacker 0:e37acb3371f0 202 break;
utlinebacker 0:e37acb3371f0 203 }
utlinebacker 0:e37acb3371f0 204 }
utlinebacker 0:e37acb3371f0 205 }
utlinebacker 0:e37acb3371f0 206 t.stop();
EverBen 1:d840fdc82450 207 pc.printf("Time: %f s Rate: %f KBytes/sec\r\n\r\n", t.read(), (float)MRAM_SIZE / 1024 / t.read());
utlinebacker 0:e37acb3371f0 208
utlinebacker 0:e37acb3371f0 209 mram_wren();
utlinebacker 0:e37acb3371f0 210 wrbuf[0] = 0xAA; //rewrite init word
EverBen 1:d840fdc82450 211 mram_write(MRAM_SIZE-1, wrbuf, 1);
EverBen 1:d840fdc82450 212 memset(rdbuf, 0, BUFFER_SIZE);
utlinebacker 0:e37acb3371f0 213 mram_wrdi();
utlinebacker 0:e37acb3371f0 214
EverBen 1:d840fdc82450 215 pc.printf("Device entering Sleep... \r\n\r\n");
EverBen 1:d840fdc82450 216 mram_sleep();
EverBen 1:d840fdc82450 217 wait_us(5); //wait sleep mode entry time (tDP)
EverBen 1:d840fdc82450 218
utlinebacker 0:e37acb3371f0 219 pc.printf("Press any key to run again...\r\n\r\n\r\n");
utlinebacker 0:e37acb3371f0 220
EverBen 1:d840fdc82450 221 while(!pc.getc()); //wait for keyboard input to rerun test
EverBen 1:d840fdc82450 222
EverBen 1:d840fdc82450 223 mram_wake();
EverBen 1:d840fdc82450 224 wait_us(500); //wait sleep mode exit time (tRDP)
utlinebacker 0:e37acb3371f0 225 }
utlinebacker 0:e37acb3371f0 226
utlinebacker 0:e37acb3371f0 227 }