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

Dependencies:   mbed

Committer:
okini3939
Date:
Fri Nov 09 06:23:54 2012 +0000
Revision:
1:a7b1803dfa44
Parent:
0:c5ba7d914282
fix

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:c5ba7d914282 1 /*
okini3939 0:c5ba7d914282 2 * SPI RAM 23LC1024 (Microchip)
okini3939 1:a7b1803dfa44 3 * 1Mbit
okini3939 0:c5ba7d914282 4 */
okini3939 0:c5ba7d914282 5 #include "mbed.h"
okini3939 0:c5ba7d914282 6
okini3939 0:c5ba7d914282 7 #define CMD_READ 0x03
okini3939 0:c5ba7d914282 8 #define CMD_WRITE 0x02
okini3939 0:c5ba7d914282 9 #define CMD_RDMR 0x05
okini3939 0:c5ba7d914282 10 #define CMD_WRMR 0x01
okini3939 0:c5ba7d914282 11
okini3939 0:c5ba7d914282 12 DigitalOut myled(LED1);
okini3939 0:c5ba7d914282 13 Serial pc(USBTX, USBRX);
okini3939 0:c5ba7d914282 14
okini3939 0:c5ba7d914282 15 SPI spi(p11, p12, p13); // mosi, miso, sclk
okini3939 1:a7b1803dfa44 16 DigitalOut cs(p17), hold(p18);
okini3939 0:c5ba7d914282 17
okini3939 0:c5ba7d914282 18 int ram_write (int addr, char *buf, int len) {
okini3939 0:c5ba7d914282 19 int i;
okini3939 0:c5ba7d914282 20
okini3939 0:c5ba7d914282 21 cs = 0;
okini3939 0:c5ba7d914282 22 spi.write(CMD_WRITE);
okini3939 0:c5ba7d914282 23 spi.write((addr >> 16) & 0xff);
okini3939 0:c5ba7d914282 24 spi.write((addr >> 8) & 0xff);
okini3939 0:c5ba7d914282 25 spi.write(addr & 0xff);
okini3939 0:c5ba7d914282 26
okini3939 0:c5ba7d914282 27 for (i = 0; i < len; i ++) {
okini3939 0:c5ba7d914282 28 spi.write(buf[i]);
okini3939 0:c5ba7d914282 29 }
okini3939 0:c5ba7d914282 30 cs = 1;
okini3939 0:c5ba7d914282 31 return i;
okini3939 0:c5ba7d914282 32 }
okini3939 0:c5ba7d914282 33
okini3939 0:c5ba7d914282 34 int ram_read (int addr, char *buf, int len) {
okini3939 0:c5ba7d914282 35 int i;
okini3939 0:c5ba7d914282 36
okini3939 0:c5ba7d914282 37 cs = 0;
okini3939 0:c5ba7d914282 38 spi.write(CMD_READ);
okini3939 0:c5ba7d914282 39 spi.write((addr >> 16) & 0xff);
okini3939 0:c5ba7d914282 40 spi.write((addr >> 8) & 0xff);
okini3939 0:c5ba7d914282 41 spi.write(addr & 0xff);
okini3939 0:c5ba7d914282 42
okini3939 0:c5ba7d914282 43 for (i = 0; i < len; i ++) {
okini3939 0:c5ba7d914282 44 buf[i] = spi.write(0);
okini3939 0:c5ba7d914282 45 }
okini3939 0:c5ba7d914282 46 cs = 1;
okini3939 0:c5ba7d914282 47 return i;
okini3939 0:c5ba7d914282 48 }
okini3939 0:c5ba7d914282 49
okini3939 0:c5ba7d914282 50 int main() {
okini3939 0:c5ba7d914282 51 int i;
okini3939 0:c5ba7d914282 52 char buf[256];
okini3939 1:a7b1803dfa44 53 Timer t;
okini3939 0:c5ba7d914282 54
okini3939 0:c5ba7d914282 55 cs = 1;
okini3939 1:a7b1803dfa44 56 hold = 1;
okini3939 0:c5ba7d914282 57 pc.baud(115200);
okini3939 1:a7b1803dfa44 58 spi.frequency(16000000);
okini3939 0:c5ba7d914282 59 wait_ms(500);
okini3939 0:c5ba7d914282 60
okini3939 0:c5ba7d914282 61 cs = 0;
okini3939 0:c5ba7d914282 62 spi.write(CMD_RDMR);
okini3939 0:c5ba7d914282 63 printf("RAM mode: %02x\r\n", spi.write(0));
okini3939 0:c5ba7d914282 64 cs = 1;
okini3939 0:c5ba7d914282 65
okini3939 1:a7b1803dfa44 66 printf("\r\nHELLO test\r\n");
okini3939 1:a7b1803dfa44 67
okini3939 0:c5ba7d914282 68 printf("RAM write\r\n");
okini3939 0:c5ba7d914282 69 strcpy(buf, "Hello!");
okini3939 0:c5ba7d914282 70 ram_write(0, buf, 6);
okini3939 0:c5ba7d914282 71
okini3939 0:c5ba7d914282 72 for (i = 0; i < 256; i ++) {
okini3939 0:c5ba7d914282 73 buf[i] = i;
okini3939 0:c5ba7d914282 74 }
okini3939 0:c5ba7d914282 75 ram_write(6, buf, 256);
okini3939 0:c5ba7d914282 76
okini3939 1:a7b1803dfa44 77 wait(1);
okini3939 0:c5ba7d914282 78 memset(buf, 0, 256);
okini3939 0:c5ba7d914282 79
okini3939 0:c5ba7d914282 80 printf("RAM read\r\n");
okini3939 0:c5ba7d914282 81 ram_read(0, buf, 256);
okini3939 0:c5ba7d914282 82 for (i = 0; i < 256; i ++) {
okini3939 0:c5ba7d914282 83 printf(" %02x", buf[i]);
okini3939 0:c5ba7d914282 84 if ((i & 0x0f) == 0x0f)
okini3939 0:c5ba7d914282 85 printf("\r\n");
okini3939 0:c5ba7d914282 86 }
okini3939 0:c5ba7d914282 87
okini3939 1:a7b1803dfa44 88 wait(1);
okini3939 1:a7b1803dfa44 89
okini3939 1:a7b1803dfa44 90 printf("\r\nWrite/Read time\r\n");
okini3939 1:a7b1803dfa44 91
okini3939 1:a7b1803dfa44 92 printf("RAM write\r\n");
okini3939 1:a7b1803dfa44 93 t.reset();
okini3939 1:a7b1803dfa44 94 t.start();
okini3939 1:a7b1803dfa44 95 for (i = 0; i < 0x20000; i += 256) {
okini3939 1:a7b1803dfa44 96 buf[0] = (i >> 8) & 0xff;
okini3939 1:a7b1803dfa44 97 ram_write(i, buf, 256);
okini3939 1:a7b1803dfa44 98 if ((i & 0x0fff) == 0) printf(".");
okini3939 0:c5ba7d914282 99 }
okini3939 1:a7b1803dfa44 100 t.stop();
okini3939 1:a7b1803dfa44 101 printf("\r\ntime %f, %f KBytes/sec\r\n", t.read(), (float)0x20000 / 1024 / t.read());
okini3939 1:a7b1803dfa44 102
okini3939 1:a7b1803dfa44 103 wait(1);
okini3939 1:a7b1803dfa44 104
okini3939 1:a7b1803dfa44 105 printf("RAM read\r\n");
okini3939 1:a7b1803dfa44 106 t.reset();
okini3939 1:a7b1803dfa44 107 t.start();
okini3939 1:a7b1803dfa44 108 for (i = 0; i < 0x20000; i += 256) {
okini3939 1:a7b1803dfa44 109 ram_read(i, buf, 256);
okini3939 1:a7b1803dfa44 110 if (buf[0] != ((i >> 8) & 0xff)) {
okini3939 1:a7b1803dfa44 111 printf("error %d\r\n", i);
okini3939 1:a7b1803dfa44 112 break;
okini3939 1:a7b1803dfa44 113 }
okini3939 1:a7b1803dfa44 114 if ((i & 0x0fff) == 0) printf(".");
okini3939 1:a7b1803dfa44 115 }
okini3939 1:a7b1803dfa44 116 t.stop();
okini3939 1:a7b1803dfa44 117 printf("\r\ntime %f, %f KBytes/sec\r\n", t.read(), 0x20000 / 1024 / t.read());
okini3939 1:a7b1803dfa44 118
okini3939 0:c5ba7d914282 119 }