MR25H00-EVAL Demo Program Demo program for Everspin SPI MRAM using the MR25H00-EVAL shield.

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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 }