SPI PRAM NP8P128A13 (Micron) 128Mbit see: http://mbed.org/users/okini3939/notebook/extend-memory/

Dependencies:   mbed

Committer:
okini3939
Date:
Fri Nov 09 06:24:22 2012 +0000
Revision:
1:3a2094fa7c4c
Parent:
0:4d4598bd9119
fix
;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:4d4598bd9119 1 /*
okini3939 1:3a2094fa7c4c 2 * SPI PRAM NP8P128A13TSM60E (Micron)
okini3939 0:4d4598bd9119 3 * 128Mbit
okini3939 0:4d4598bd9119 4 */
okini3939 0:4d4598bd9119 5 #include "mbed.h"
okini3939 0:4d4598bd9119 6
okini3939 0:4d4598bd9119 7 #define CMD_WREN 0x06 // Write enable
okini3939 0:4d4598bd9119 8 #define CMD_WRDI 0x04 // Write disable
okini3939 0:4d4598bd9119 9 #define CMD_RDID 0x9f // Read identification
okini3939 0:4d4598bd9119 10 #define CMD_RDSR 0x05 // Read status register
okini3939 0:4d4598bd9119 11 #define CMD_WRSR 0x01 // Write status registe
okini3939 0:4d4598bd9119 12 #define CMD_READ 0x03 // Read data bytes
okini3939 0:4d4598bd9119 13 #define CMD_FREAD 0x0b // Read data bytes at higher speed
okini3939 0:4d4598bd9119 14 #define CMD_PP 0x02 // Page program (legacy program)
okini3939 0:4d4598bd9119 15 #define CMD_PP_BA 0x22 // Page program (bit-alterable write)
okini3939 0:4d4598bd9119 16 #define CMD_PP_1S 0xd1 // Page program (On all 1s)
okini3939 0:4d4598bd9119 17 #define CMD_SE 0xd8 // Sector erase
okini3939 0:4d4598bd9119 18
okini3939 0:4d4598bd9119 19 DigitalOut myled(LED1);
okini3939 0:4d4598bd9119 20 Serial pc(USBTX, USBRX);
okini3939 0:4d4598bd9119 21
okini3939 0:4d4598bd9119 22 SPI spi(p11, p12, p13); // mosi, miso, sclk
okini3939 0:4d4598bd9119 23 DigitalOut cs(p14), hold(p15), reset(p16);
okini3939 0:4d4598bd9119 24
okini3939 0:4d4598bd9119 25 int ram_status () {
okini3939 0:4d4598bd9119 26 int r;
okini3939 0:4d4598bd9119 27
okini3939 0:4d4598bd9119 28 cs = 0;
okini3939 0:4d4598bd9119 29 spi.write(CMD_RDSR);
okini3939 0:4d4598bd9119 30 r = spi.write(0);
okini3939 0:4d4598bd9119 31 cs = 1;
okini3939 0:4d4598bd9119 32 return r;
okini3939 0:4d4598bd9119 33 }
okini3939 0:4d4598bd9119 34
okini3939 0:4d4598bd9119 35 int ram_write (int addr, char *buf, int len) {
okini3939 0:4d4598bd9119 36 int i;
okini3939 0:4d4598bd9119 37
okini3939 0:4d4598bd9119 38 while (ram_status() & 1) {
okini3939 0:4d4598bd9119 39 // write in progress
okini3939 0:4d4598bd9119 40 }
okini3939 0:4d4598bd9119 41
okini3939 0:4d4598bd9119 42 cs = 0;
okini3939 0:4d4598bd9119 43 spi.write(CMD_WREN);
okini3939 0:4d4598bd9119 44 cs = 1;
okini3939 0:4d4598bd9119 45 wait_us(10);
okini3939 0:4d4598bd9119 46
okini3939 0:4d4598bd9119 47 cs = 0;
okini3939 0:4d4598bd9119 48 spi.write(CMD_PP_BA);
okini3939 0:4d4598bd9119 49 spi.write((addr >> 16) & 0xff);
okini3939 0:4d4598bd9119 50 spi.write((addr >> 8) & 0xff);
okini3939 0:4d4598bd9119 51 spi.write(addr & 0xff);
okini3939 0:4d4598bd9119 52
okini3939 1:3a2094fa7c4c 53 len = len - (addr & 0x3f);
okini3939 0:4d4598bd9119 54 for (i = 0; i < len; i ++) {
okini3939 0:4d4598bd9119 55 spi.write(buf[i]);
okini3939 0:4d4598bd9119 56 }
okini3939 0:4d4598bd9119 57 cs = 1;
okini3939 0:4d4598bd9119 58 return i;
okini3939 0:4d4598bd9119 59 }
okini3939 0:4d4598bd9119 60
okini3939 0:4d4598bd9119 61 int ram_read (int addr, char *buf, int len) {
okini3939 0:4d4598bd9119 62 int i;
okini3939 0:4d4598bd9119 63
okini3939 0:4d4598bd9119 64 cs = 0;
okini3939 0:4d4598bd9119 65 spi.write(CMD_READ);
okini3939 0:4d4598bd9119 66 spi.write((addr >> 16) & 0xff);
okini3939 0:4d4598bd9119 67 spi.write((addr >> 8) & 0xff);
okini3939 0:4d4598bd9119 68 spi.write(addr & 0xff);
okini3939 0:4d4598bd9119 69
okini3939 0:4d4598bd9119 70 for (i = 0; i < len; i ++) {
okini3939 0:4d4598bd9119 71 buf[i] = spi.write(0);
okini3939 0:4d4598bd9119 72 }
okini3939 0:4d4598bd9119 73 cs = 1;
okini3939 0:4d4598bd9119 74 return i;
okini3939 0:4d4598bd9119 75 }
okini3939 0:4d4598bd9119 76
okini3939 0:4d4598bd9119 77 int main() {
okini3939 1:3a2094fa7c4c 78 int i, j;
okini3939 0:4d4598bd9119 79 char buf[64];
okini3939 1:3a2094fa7c4c 80 Timer t;
okini3939 0:4d4598bd9119 81
okini3939 0:4d4598bd9119 82 cs = 1;
okini3939 0:4d4598bd9119 83 hold = 1;
okini3939 0:4d4598bd9119 84 reset = 0;
okini3939 0:4d4598bd9119 85 pc.baud(115200);
okini3939 1:3a2094fa7c4c 86 spi.frequency(16000000);
okini3939 0:4d4598bd9119 87 wait_ms(10);
okini3939 0:4d4598bd9119 88 reset = 1;
okini3939 0:4d4598bd9119 89 wait_ms(500);
okini3939 0:4d4598bd9119 90
okini3939 0:4d4598bd9119 91 cs = 0;
okini3939 0:4d4598bd9119 92 spi.write(CMD_RDID);
okini3939 0:4d4598bd9119 93 printf("RAM Manufacturer ID : %02x\r\n", spi.write(0));
okini3939 0:4d4598bd9119 94 i = (spi.write(0) << 8) | spi.write(0);
okini3939 0:4d4598bd9119 95 printf("RAM Device ID : %04x\r\n", i);
okini3939 0:4d4598bd9119 96 cs = 1;
okini3939 0:4d4598bd9119 97 wait_ms(10);
okini3939 0:4d4598bd9119 98
okini3939 0:4d4598bd9119 99 printf("Status Register : %02x\r\n", ram_status());
okini3939 0:4d4598bd9119 100
okini3939 1:3a2094fa7c4c 101 printf("\r\nHELLO test\r\n");
okini3939 1:3a2094fa7c4c 102
okini3939 0:4d4598bd9119 103 printf("RAM write\r\n");
okini3939 0:4d4598bd9119 104 strcpy(buf, "Hello!");
okini3939 0:4d4598bd9119 105 ram_write(0, buf, 6);
okini3939 1:3a2094fa7c4c 106
okini3939 0:4d4598bd9119 107 for (i = 0; i < 64; i ++) {
okini3939 0:4d4598bd9119 108 buf[i] = i;
okini3939 0:4d4598bd9119 109 }
okini3939 1:3a2094fa7c4c 110 ram_write(6, buf, 64 - 6);
okini3939 0:4d4598bd9119 111
okini3939 1:3a2094fa7c4c 112 wait(1);
okini3939 0:4d4598bd9119 113 memset(buf, 0, 64);
okini3939 1:3a2094fa7c4c 114
okini3939 0:4d4598bd9119 115 printf("RAM read\r\n");
okini3939 0:4d4598bd9119 116 ram_read(0, buf, 64);
okini3939 0:4d4598bd9119 117 for (i = 0; i < 64; i ++) {
okini3939 0:4d4598bd9119 118 printf(" %02x", buf[i]);
okini3939 0:4d4598bd9119 119 if ((i & 0x0f) == 0x0f)
okini3939 0:4d4598bd9119 120 printf("\r\n");
okini3939 0:4d4598bd9119 121 }
okini3939 0:4d4598bd9119 122
okini3939 1:3a2094fa7c4c 123 wait(1);
okini3939 1:3a2094fa7c4c 124
okini3939 1:3a2094fa7c4c 125 printf("\r\nWrite/Read time\r\n");
okini3939 1:3a2094fa7c4c 126
okini3939 1:3a2094fa7c4c 127 printf("RAM write\r\n");
okini3939 1:3a2094fa7c4c 128 t.reset();
okini3939 1:3a2094fa7c4c 129 t.start();
okini3939 1:3a2094fa7c4c 130 for (i = 0; i < 0x1000000; i += 64) {
okini3939 1:3a2094fa7c4c 131 buf[0] = (i >> 6) & 0xff;
okini3939 1:3a2094fa7c4c 132 ram_write(i, buf, 64);
okini3939 1:3a2094fa7c4c 133 if ((i & 0x0ffff) == 0) printf(".");
okini3939 0:4d4598bd9119 134 }
okini3939 1:3a2094fa7c4c 135 t.stop();
okini3939 1:3a2094fa7c4c 136 printf("\r\ntime %f, %f KBytes/sec\r\n", t.read(), (float)0x1000000 / 1024 / t.read());
okini3939 1:3a2094fa7c4c 137
okini3939 1:3a2094fa7c4c 138 wait(1);
okini3939 1:3a2094fa7c4c 139
okini3939 1:3a2094fa7c4c 140 printf("RAM read\r\n");
okini3939 1:3a2094fa7c4c 141 t.reset();
okini3939 1:3a2094fa7c4c 142 t.start();
okini3939 1:3a2094fa7c4c 143 for (i = 0; i < 0x1000000; i += 64) {
okini3939 1:3a2094fa7c4c 144 ram_read(i, buf, 64);
okini3939 1:3a2094fa7c4c 145 if (buf[0] != ((i >> 6) & 0xff)) {
okini3939 1:3a2094fa7c4c 146 printf("error %d\r\n", i);
okini3939 1:3a2094fa7c4c 147 break;
okini3939 1:3a2094fa7c4c 148 }
okini3939 1:3a2094fa7c4c 149 if ((i & 0x0ffff) == 0) printf(".");
okini3939 1:3a2094fa7c4c 150 }
okini3939 1:3a2094fa7c4c 151 t.stop();
okini3939 1:3a2094fa7c4c 152 printf("\r\ntime %f, %f KBytes/sec\r\n", t.read(), (float)0x1000000 / 1024 / t.read());
okini3939 1:3a2094fa7c4c 153
okini3939 0:4d4598bd9119 154 }