SPI RAM 23LC1024 (Microchip) 1Mbit see: http://mbed.org/users/okini3939/notebook/extend-memory/

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 /*
00002  * SPI RAM 23LC1024 (Microchip)
00003  *   1Mbit
00004  */
00005 #include "mbed.h"
00006 
00007 #define CMD_READ    0x03
00008 #define CMD_WRITE   0x02
00009 #define CMD_RDMR    0x05
00010 #define CMD_WRMR    0x01
00011 
00012 DigitalOut myled(LED1);
00013 Serial pc(USBTX, USBRX);
00014 
00015 SPI spi(p11, p12, p13); // mosi, miso, sclk
00016 DigitalOut cs(p17), hold(p18);
00017 
00018 int ram_write (int addr, char *buf, int len) {
00019     int i;
00020 
00021     cs = 0;
00022     spi.write(CMD_WRITE);
00023     spi.write((addr >> 16) & 0xff);
00024     spi.write((addr >> 8) & 0xff);
00025     spi.write(addr & 0xff);
00026 
00027     for (i = 0; i < len; i ++) {
00028         spi.write(buf[i]);
00029     }
00030     cs = 1;
00031     return i;
00032 }
00033 
00034 int ram_read (int addr, char *buf, int len) {
00035     int i;
00036 
00037     cs = 0;
00038     spi.write(CMD_READ);
00039     spi.write((addr >> 16) & 0xff);
00040     spi.write((addr >> 8) & 0xff);
00041     spi.write(addr & 0xff);
00042 
00043     for (i = 0; i < len; i ++) {
00044         buf[i] = spi.write(0);
00045     }
00046     cs = 1;
00047     return i;
00048 }
00049 
00050 int main() {
00051     int i;
00052     char buf[256];
00053     Timer t;
00054 
00055     cs = 1;
00056     hold = 1;
00057     pc.baud(115200);
00058     spi.frequency(16000000);
00059     wait_ms(500);
00060     
00061     cs = 0;
00062     spi.write(CMD_RDMR);
00063     printf("RAM mode: %02x\r\n", spi.write(0));
00064     cs = 1;
00065     
00066     printf("\r\nHELLO test\r\n");
00067     
00068     printf("RAM write\r\n");
00069     strcpy(buf, "Hello!");
00070     ram_write(0, buf, 6);
00071     
00072     for (i = 0; i < 256; i ++) {
00073         buf[i] = i;
00074     }
00075     ram_write(6, buf, 256);
00076 
00077     wait(1);
00078     memset(buf, 0, 256);
00079     
00080     printf("RAM read\r\n");
00081     ram_read(0, buf, 256);
00082     for (i = 0; i < 256; i ++) {
00083         printf(" %02x", buf[i]);
00084         if ((i & 0x0f) == 0x0f)
00085             printf("\r\n");
00086     }
00087 
00088     wait(1);
00089 
00090     printf("\r\nWrite/Read time\r\n");
00091 
00092     printf("RAM write\r\n");
00093     t.reset();
00094     t.start();
00095     for (i = 0; i < 0x20000; i += 256) {
00096         buf[0] = (i >> 8) & 0xff;
00097         ram_write(i, buf, 256);
00098         if ((i & 0x0fff) == 0) printf(".");
00099     }
00100     t.stop();
00101     printf("\r\ntime %f, %f KBytes/sec\r\n", t.read(), (float)0x20000 / 1024 / t.read());
00102 
00103     wait(1);
00104 
00105     printf("RAM read\r\n");
00106     t.reset();
00107     t.start();
00108     for (i = 0; i < 0x20000; i += 256) {
00109         ram_read(i, buf, 256);
00110         if (buf[0] != ((i >> 8) & 0xff)) {
00111             printf("error %d\r\n", i);
00112             break;
00113         }
00114         if ((i & 0x0fff) == 0) printf(".");
00115     }
00116     t.stop();
00117     printf("\r\ntime %f, %f KBytes/sec\r\n", t.read(), 0x20000 / 1024 / t.read());
00118 
00119 }