MR25H00-EVAL Demo Program Demo program for Everspin SPI MRAM using the MR25H00-EVAL shield.
Dependencies: mbed
main.cpp
00001 /* 00002 * Everspin Technologies - The MRAM Company 00003 * MR25H00-EVAL SHIELD 00004 * SPI MRAM Demonstration Program 00005 */ 00006 00007 #include "mbed.h" 00008 00009 //====MRAM Device Density in WORDS/BYTES====== 00010 //|| 4Mbit ---> MRAM_SIZE = 0x80000 || 00011 //|| 1Mbit ---> MRAM_SIZE = 0x20000 || 00012 //|| 256kbit ---> MRAM_SIZE = 0x8000 || 00013 //============================================ 00014 #define MRAM_SIZE 0x80000 00015 00016 //Frequency settings for UART and SPI 00017 #define SERIAL_BAUD 115200 00018 #define SPI_FREQ 40000000 00019 00020 #define BUFFER_SIZE 64 00021 00022 //SPI Mode Commands 00023 #define CMD_WREN 0x06 00024 #define CMD_WRDI 0x04 00025 #define CMD_RDSR 0x05 00026 #define CMD_WRSR 0x01 00027 #define CMD_READ 0x03 00028 #define CMD_WRITE 0x02 00029 #define CMD_SLEEP 0xB9 00030 #define CMD_WAKE 0xAB 00031 00032 //pin setup for interfacing with the device 00033 SPI MRAM(D11, D12, D13, NC); // mosi, miso, sclk 00034 DigitalOut SS(D10); 00035 DigitalOut WP(D9); 00036 DigitalOut HOLD(D8); 00037 00038 //create a serial object for output to the terminal 00039 Serial pc(SERIAL_TX, SERIAL_RX); 00040 00041 char wrbuf[BUFFER_SIZE] = {0}; 00042 char rdbuf[BUFFER_SIZE] = {0}; 00043 00044 /////////////////////////////////////////////////////// 00045 //MRAM local functions 00046 /////////////////////////////////////////////////////// 00047 00048 //MR25Hxx read wrapper function 00049 void mram_read (int addr, char *buf, int len) 00050 { 00051 int i; 00052 00053 SS=0; 00054 MRAM.write(CMD_READ); 00055 MRAM.write((addr >> 16) & 0xff); 00056 MRAM.write((addr >> 8) & 0xff); 00057 MRAM.write(addr & 0xff); 00058 00059 for (i = 0; i < len; i ++) { 00060 rdbuf[i] = MRAM.write(0); 00061 } 00062 00063 SS=1; 00064 return; 00065 } 00066 00067 //MR25Hxx write wrapper function 00068 void mram_write (int addr, char *buf, int len) 00069 { 00070 int i; 00071 00072 SS=0; 00073 MRAM.write(CMD_WRITE); 00074 MRAM.write((addr >> 16) & 0xff); 00075 MRAM.write((addr >> 8) & 0xff); 00076 MRAM.write(addr & 0xff); 00077 00078 for (i = 0; i < len; i ++) { 00079 MRAM.write(wrbuf[i]); 00080 } 00081 00082 SS=1; 00083 return; 00084 } 00085 00086 //Put the device to sleep 00087 void mram_sleep (void) 00088 { 00089 WP=1; 00090 SS=0; 00091 MRAM.write(CMD_SLEEP); 00092 SS=1; 00093 return; 00094 } 00095 00096 //Wake the device from sleep 00097 void mram_wake (void) 00098 { 00099 WP=1; 00100 SS=0; 00101 MRAM.write(CMD_WAKE); 00102 SS=1; 00103 return; 00104 } 00105 00106 //Enable writes 00107 void mram_wren (void) 00108 { 00109 WP=1; 00110 SS=0; 00111 MRAM.write(CMD_WREN); 00112 SS=1; 00113 return; 00114 } 00115 00116 //Disable writes 00117 void mram_wrdi (void) 00118 { 00119 SS=0; 00120 MRAM.write(CMD_WRDI); 00121 SS=1; 00122 00123 WP=0; 00124 return; 00125 } 00126 00127 00128 ///////////////////////////////////////////////////////////////////////////// 00129 //main function showing basic usage with a nvm performance test 00130 ///////////////////////////////////////////////////////////////////////////// 00131 int main() 00132 { 00133 int i,j; 00134 int run_cnt = 0; 00135 Timer t; 00136 00137 HOLD=1; //make sure HOLD is released 00138 00139 MRAM.frequency(SPI_FREQ); //setup SPI frequency 00140 pc.baud(SERIAL_BAUD); //setup UART baud 00141 memset(rdbuf,0,BUFFER_SIZE); //init read buffer 00142 00143 pc.printf("\r\n\r\n"); 00144 pc.printf("================================================\r\n"); 00145 pc.printf("|| Everspin Technologies ||\r\n"); 00146 pc.printf("|| The MRAM Company ||\r\n"); 00147 pc.printf("================================================\r\n"); 00148 pc.printf("|| MR25H00-EVAL mbed Example ||\r\n"); 00149 pc.printf("================================================\r\n\r\n"); 00150 00151 mram_wake(); //make sure the device is awake 00152 wait_us(500); //wait sleep mode exit time (tRDP) 00153 00154 //check the last word of the mem to see if this demo has ever been run on the mram... initialize if not. 00155 mram_read(MRAM_SIZE-1, rdbuf, 1); 00156 if(rdbuf[0] != 0xAA) { 00157 mram_wren(); //Enable writes to MRAM 00158 pc.printf("First time running... init MRAM!\r\n"); 00159 memset(wrbuf,0,BUFFER_SIZE); 00160 mram_write(0, wrbuf, BUFFER_SIZE); 00161 wrbuf[0] = 0xAA; 00162 mram_write(MRAM_SIZE-1, wrbuf, 1); 00163 mram_wrdi(); 00164 } 00165 00166 while(1) { 00167 00168 mram_read(0, rdbuf, BUFFER_SIZE); 00169 run_cnt = rdbuf[0] + 1; 00170 00171 pc.printf("MRAM Read: Show Test Count\r\n"); 00172 00173 for (i = 0; i < BUFFER_SIZE; i ++) { 00174 pc.printf(" %02x", rdbuf[i]); 00175 if ((i & 0x0f) == 0x0f) 00176 pc.printf("\r\n"); 00177 } 00178 00179 pc.printf("\r\nWrite / Read(w/ Verify) time for %d bits @ 40MHz:\r\n\r\n", MRAM_SIZE*8); 00180 mram_wren(); 00181 pc.printf("MRAM writing: "); 00182 t.reset(); 00183 t.start(); 00184 for (i = 0; i < MRAM_SIZE; i += BUFFER_SIZE) { 00185 for(j = 0; j < BUFFER_SIZE; j++) { 00186 wrbuf[j] = run_cnt & 0xff; 00187 } 00188 mram_write(i, wrbuf, BUFFER_SIZE); 00189 } 00190 t.stop(); 00191 pc.printf("Time: %f s Rate: %f KBytes/sec\r\n\r\n", t.read(), (float)MRAM_SIZE / 1024 / t.read()); 00192 mram_wrdi(); 00193 00194 printf("MRAM reading: "); 00195 t.reset(); 00196 t.start(); 00197 for (i = 0; i < MRAM_SIZE; i += BUFFER_SIZE) { 00198 mram_read(i, rdbuf, BUFFER_SIZE); 00199 for(j = 0; j < BUFFER_SIZE; j++) { 00200 if (rdbuf[j] != (run_cnt & 0xff)) { 00201 pc.printf("Error %d\r\n", i+j); 00202 break; 00203 } 00204 } 00205 } 00206 t.stop(); 00207 pc.printf("Time: %f s Rate: %f KBytes/sec\r\n\r\n", t.read(), (float)MRAM_SIZE / 1024 / t.read()); 00208 00209 mram_wren(); 00210 wrbuf[0] = 0xAA; //rewrite init word 00211 mram_write(MRAM_SIZE-1, wrbuf, 1); 00212 memset(rdbuf, 0, BUFFER_SIZE); 00213 mram_wrdi(); 00214 00215 pc.printf("Device entering Sleep... \r\n\r\n"); 00216 mram_sleep(); 00217 wait_us(5); //wait sleep mode entry time (tDP) 00218 00219 pc.printf("Press any key to run again...\r\n\r\n\r\n"); 00220 00221 while(!pc.getc()); //wait for keyboard input to rerun test 00222 00223 mram_wake(); 00224 wait_us(500); //wait sleep mode exit time (tRDP) 00225 } 00226 00227 }
Generated on Wed Jul 20 2022 01:55:49 by 1.7.2