Fujitsu MB85RSxx serial FRAM test program

Dependencies:   mbed MB85RSxx_SPI

Connectivity

MB82RSxx pinmbed LPC1114FN28 pinmbed LPC1768 pinArudino form factor
1 (_CS)9 (dp9)8 (p8)D10
2 (SO)1 (dp1)6 (p6)D12
3 (_WP)21 (VDD)40 (VOUT)3V3
4 (VSS)22 (GND)1 (GND)GND
5 (SI)2 (dp2)5 (p5)D11
6 (SCK)6 (dp6)7 (p7)D13
7 (_HOLD)21 (VDD)40 (VOUT)3V3
8 (VDD)21 (VDD)40 (VOUT)3V3
Committer:
MACRUM
Date:
Sun Apr 16 10:54:15 2017 +0000
Revision:
0:20b32d13a758
Child:
1:bdf8b378dbc9
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MACRUM 0:20b32d13a758 1 #include "mbed.h"
MACRUM 0:20b32d13a758 2
MACRUM 0:20b32d13a758 3 DigitalOut myled(LED1);
MACRUM 0:20b32d13a758 4 Serial pc(USBTX, USBRX);
MACRUM 0:20b32d13a758 5
MACRUM 0:20b32d13a758 6 #if defined(TARGET_LPC1768)
MACRUM 0:20b32d13a758 7 SPI _spi(p5, p6, p7); // mosi, miso, sclk
MACRUM 0:20b32d13a758 8 DigitalOut _cs(p8);
MACRUM 0:20b32d13a758 9 #elif defined(TARGET_LPC1114)
MACRUM 0:20b32d13a758 10 SPI _spi(dp2, dp1, dp6); // mosi, miso, sclk
MACRUM 0:20b32d13a758 11 DigitalOut _cs(dp9);
MACRUM 0:20b32d13a758 12 #else // Arduino R3 Shield form factor
MACRUM 0:20b32d13a758 13 SPI _spi(D11, D12, D13); // mosi, miso, sclk
MACRUM 0:20b32d13a758 14 DigitalOut _cs(D10);
MACRUM 0:20b32d13a758 15 #endif
MACRUM 0:20b32d13a758 16
MACRUM 0:20b32d13a758 17 #define MB85_WREN 0x06
MACRUM 0:20b32d13a758 18 #define MB85_WRDI 0x04
MACRUM 0:20b32d13a758 19 #define MB85_RDSR 0x05
MACRUM 0:20b32d13a758 20 #define MB85_WRSR 0x01
MACRUM 0:20b32d13a758 21 #define MB85_READ 0x03
MACRUM 0:20b32d13a758 22 #define MB85_WRITE 0x02
MACRUM 0:20b32d13a758 23 #define MB85_RDID 0x9F
MACRUM 0:20b32d13a758 24 #define MB85_FSTRD 0x0B
MACRUM 0:20b32d13a758 25 #define MB85_SLEEP 0xB9
MACRUM 0:20b32d13a758 26
MACRUM 0:20b32d13a758 27 #define MB85_DENSITY_64K 0x3
MACRUM 0:20b32d13a758 28 #define MB85_DENSITY_256K 0x5
MACRUM 0:20b32d13a758 29 #define MB85_DENSITY_512K 0x6
MACRUM 0:20b32d13a758 30 #define MB85_DENSITY_1M 0x7
MACRUM 0:20b32d13a758 31 #define MB85_DENSITY_2M 0x8
MACRUM 0:20b32d13a758 32
MACRUM 0:20b32d13a758 33 static int _address_bits = 0;
MACRUM 0:20b32d13a758 34
MACRUM 0:20b32d13a758 35 int read_device_id(uint8_t* device_id)
MACRUM 0:20b32d13a758 36 {
MACRUM 0:20b32d13a758 37 _cs = 0;
MACRUM 0:20b32d13a758 38 _spi.write(MB85_RDID);
MACRUM 0:20b32d13a758 39 for (int i = 0; i < 4; i++) {
MACRUM 0:20b32d13a758 40 *device_id++ = (uint8_t)_spi.write(0);
MACRUM 0:20b32d13a758 41 }
MACRUM 0:20b32d13a758 42 _cs = 1;
MACRUM 0:20b32d13a758 43
MACRUM 0:20b32d13a758 44 return 0;
MACRUM 0:20b32d13a758 45 }
MACRUM 0:20b32d13a758 46
MACRUM 0:20b32d13a758 47 uint8_t read_status()
MACRUM 0:20b32d13a758 48 {
MACRUM 0:20b32d13a758 49 _cs = 0;
MACRUM 0:20b32d13a758 50 _spi.write(MB85_RDSR);
MACRUM 0:20b32d13a758 51 uint8_t st = (uint8_t)_spi.write(0);
MACRUM 0:20b32d13a758 52 _cs = 1;
MACRUM 0:20b32d13a758 53
MACRUM 0:20b32d13a758 54 return st;
MACRUM 0:20b32d13a758 55 }
MACRUM 0:20b32d13a758 56
MACRUM 0:20b32d13a758 57 int read(uint32_t address, uint8_t* data, uint32_t len)
MACRUM 0:20b32d13a758 58 {
MACRUM 0:20b32d13a758 59 _cs = 0;
MACRUM 0:20b32d13a758 60
MACRUM 0:20b32d13a758 61 _spi.write(MB85_READ);
MACRUM 0:20b32d13a758 62 if (_address_bits == 24) {
MACRUM 0:20b32d13a758 63 _spi.write((uint8_t)((address >> 16) & 0xFF));
MACRUM 0:20b32d13a758 64 }
MACRUM 0:20b32d13a758 65 _spi.write((uint8_t)((address >> 8) & 0xFF));
MACRUM 0:20b32d13a758 66 _spi.write((uint8_t)((address >> 0) & 0xFF));
MACRUM 0:20b32d13a758 67 for (uint32_t i = 0; i < len; i++) {
MACRUM 0:20b32d13a758 68 *data++ = (uint8_t)_spi.write(0);
MACRUM 0:20b32d13a758 69 }
MACRUM 0:20b32d13a758 70 _cs = 1;
MACRUM 0:20b32d13a758 71
MACRUM 0:20b32d13a758 72 return 0;
MACRUM 0:20b32d13a758 73 }
MACRUM 0:20b32d13a758 74
MACRUM 0:20b32d13a758 75 uint8_t read(uint32_t address)
MACRUM 0:20b32d13a758 76 {
MACRUM 0:20b32d13a758 77 uint8_t data;
MACRUM 0:20b32d13a758 78 _cs = 0;
MACRUM 0:20b32d13a758 79 _spi.write(MB85_READ);
MACRUM 0:20b32d13a758 80 if (_address_bits == 24) {
MACRUM 0:20b32d13a758 81 _spi.write((uint8_t)((address >> 16) & 0xFF));
MACRUM 0:20b32d13a758 82 }
MACRUM 0:20b32d13a758 83 _spi.write((uint8_t)((address >> 8) & 0xFF));
MACRUM 0:20b32d13a758 84 _spi.write((uint8_t)((address >> 0) & 0xFF));
MACRUM 0:20b32d13a758 85 data = (uint8_t)_spi.write(0);
MACRUM 0:20b32d13a758 86 _cs = 1;
MACRUM 0:20b32d13a758 87
MACRUM 0:20b32d13a758 88 return data;
MACRUM 0:20b32d13a758 89 }
MACRUM 0:20b32d13a758 90
MACRUM 0:20b32d13a758 91 int write(uint32_t address, uint8_t* data, uint32_t len)
MACRUM 0:20b32d13a758 92 {
MACRUM 0:20b32d13a758 93 _cs = 0;
MACRUM 0:20b32d13a758 94 _spi.write(MB85_WRITE);
MACRUM 0:20b32d13a758 95 if (_address_bits == 24) {
MACRUM 0:20b32d13a758 96 _spi.write((uint8_t)((address >> 16) & 0xFF));
MACRUM 0:20b32d13a758 97 }
MACRUM 0:20b32d13a758 98 _spi.write((uint8_t)((address >> 8) & 0xFF));
MACRUM 0:20b32d13a758 99 _spi.write((uint8_t)((address >> 0) & 0xFF));
MACRUM 0:20b32d13a758 100 for (uint32_t i = 0; i < len; i++) {
MACRUM 0:20b32d13a758 101 _spi.write(*data++);
MACRUM 0:20b32d13a758 102 }
MACRUM 0:20b32d13a758 103 _cs = 1;
MACRUM 0:20b32d13a758 104
MACRUM 0:20b32d13a758 105 return 0;
MACRUM 0:20b32d13a758 106 }
MACRUM 0:20b32d13a758 107
MACRUM 0:20b32d13a758 108 int write(uint32_t address, uint8_t data)
MACRUM 0:20b32d13a758 109 {
MACRUM 0:20b32d13a758 110 _cs = 0;
MACRUM 0:20b32d13a758 111 _spi.write(MB85_WRITE);
MACRUM 0:20b32d13a758 112 if (_address_bits == 24) {
MACRUM 0:20b32d13a758 113 _spi.write((uint8_t)((address >> 16) & 0xFF));
MACRUM 0:20b32d13a758 114 }
MACRUM 0:20b32d13a758 115 _spi.write((uint8_t)((address >> 8) & 0xFF));
MACRUM 0:20b32d13a758 116 _spi.write((uint8_t)((address >> 0) & 0xFF));
MACRUM 0:20b32d13a758 117 _spi.write(data);
MACRUM 0:20b32d13a758 118 _cs = 1;
MACRUM 0:20b32d13a758 119
MACRUM 0:20b32d13a758 120 return 0;
MACRUM 0:20b32d13a758 121 }
MACRUM 0:20b32d13a758 122
MACRUM 0:20b32d13a758 123 int fill(uint32_t address, uint8_t data, uint32_t len)
MACRUM 0:20b32d13a758 124 {
MACRUM 0:20b32d13a758 125 _cs = 0;
MACRUM 0:20b32d13a758 126 _spi.write(MB85_WRITE);
MACRUM 0:20b32d13a758 127 if (_address_bits == 24) {
MACRUM 0:20b32d13a758 128 _spi.write((uint8_t)((address >> 16) & 0xFF));
MACRUM 0:20b32d13a758 129 }
MACRUM 0:20b32d13a758 130 _spi.write((uint8_t)((address >> 8) & 0xFF));
MACRUM 0:20b32d13a758 131 _spi.write((uint8_t)((address >> 0) & 0xFF));
MACRUM 0:20b32d13a758 132 for (uint32_t i = 0; i < len; i++) {
MACRUM 0:20b32d13a758 133 _spi.write(data);
MACRUM 0:20b32d13a758 134 }
MACRUM 0:20b32d13a758 135 _cs = 1;
MACRUM 0:20b32d13a758 136
MACRUM 0:20b32d13a758 137 return 0;
MACRUM 0:20b32d13a758 138 }
MACRUM 0:20b32d13a758 139
MACRUM 0:20b32d13a758 140 void write_enable()
MACRUM 0:20b32d13a758 141 {
MACRUM 0:20b32d13a758 142 _cs = 0;
MACRUM 0:20b32d13a758 143 _spi.write(MB85_WREN);
MACRUM 0:20b32d13a758 144 _cs = 1;
MACRUM 0:20b32d13a758 145 }
MACRUM 0:20b32d13a758 146
MACRUM 0:20b32d13a758 147 void write_disable()
MACRUM 0:20b32d13a758 148 {
MACRUM 0:20b32d13a758 149 _cs = 0;
MACRUM 0:20b32d13a758 150 _spi.write(MB85_WRDI);
MACRUM 0:20b32d13a758 151 _cs = 1;
MACRUM 0:20b32d13a758 152 }
MACRUM 0:20b32d13a758 153
MACRUM 0:20b32d13a758 154 int main() {
MACRUM 0:20b32d13a758 155 uint8_t buf[16];
MACRUM 0:20b32d13a758 156 uint32_t address;
MACRUM 0:20b32d13a758 157
MACRUM 0:20b32d13a758 158 pc.baud(115200);
MACRUM 0:20b32d13a758 159 pc.printf("\nFujitsu MB85RSxxx FRAM test program\n\n");
MACRUM 0:20b32d13a758 160
MACRUM 0:20b32d13a758 161 // Initialize SPI
MACRUM 0:20b32d13a758 162 _spi.format(8, 0);
MACRUM 0:20b32d13a758 163 _cs = 1;
MACRUM 0:20b32d13a758 164
MACRUM 0:20b32d13a758 165 // Read device ID and detect memory density for addressing
MACRUM 0:20b32d13a758 166 read_device_id(buf);
MACRUM 0:20b32d13a758 167 if ((buf[2] & 0x1F) > MB85_DENSITY_512K) {
MACRUM 0:20b32d13a758 168 _address_bits = 24;
MACRUM 0:20b32d13a758 169 } else {
MACRUM 0:20b32d13a758 170 _address_bits = 16;
MACRUM 0:20b32d13a758 171 }
MACRUM 0:20b32d13a758 172 pc.printf("read device ID = 0x%x 0x%x 0x%x 0x%x\n", buf[0], buf[1], buf[2], buf[3]);
MACRUM 0:20b32d13a758 173 write_enable();
MACRUM 0:20b32d13a758 174 pc.printf("read status (WREN) = 0x%x\n", read_status());
MACRUM 0:20b32d13a758 175 write_disable();
MACRUM 0:20b32d13a758 176 pc.printf("read status (WRDI) = 0x%x\n", read_status());
MACRUM 0:20b32d13a758 177
MACRUM 0:20b32d13a758 178 // Write 0 data
MACRUM 0:20b32d13a758 179 write_enable();
MACRUM 0:20b32d13a758 180 fill(0, 0, 256);
MACRUM 0:20b32d13a758 181
MACRUM 0:20b32d13a758 182 // Prepare write data
MACRUM 0:20b32d13a758 183 for (int i = 0; i < 16; i++) {
MACRUM 0:20b32d13a758 184 buf[i] = i;
MACRUM 0:20b32d13a758 185 }
MACRUM 0:20b32d13a758 186
MACRUM 0:20b32d13a758 187 // Write data with write enable
MACRUM 0:20b32d13a758 188 write_enable();
MACRUM 0:20b32d13a758 189 write(0x00, buf, 16);
MACRUM 0:20b32d13a758 190
MACRUM 0:20b32d13a758 191 // Attempt to write data (not written)
MACRUM 0:20b32d13a758 192 write(0x10, buf, 16);
MACRUM 0:20b32d13a758 193
MACRUM 0:20b32d13a758 194 // Write data with write enable
MACRUM 0:20b32d13a758 195 write_enable();
MACRUM 0:20b32d13a758 196 write(0x20, buf, 16);
MACRUM 0:20b32d13a758 197
MACRUM 0:20b32d13a758 198 // Read data
MACRUM 0:20b32d13a758 199 for (address = 0; address < 0x80; address += 16) {
MACRUM 0:20b32d13a758 200 read(address, buf, 16);
MACRUM 0:20b32d13a758 201 pc.printf("%08X : ", address);
MACRUM 0:20b32d13a758 202 for (int i = 0; i < 16; i++) {
MACRUM 0:20b32d13a758 203 pc.printf("%02X ", buf[i]);
MACRUM 0:20b32d13a758 204 }
MACRUM 0:20b32d13a758 205 pc.printf("\n");
MACRUM 0:20b32d13a758 206 }
MACRUM 0:20b32d13a758 207
MACRUM 0:20b32d13a758 208 // Write number from 0 to 255
MACRUM 0:20b32d13a758 209 pc.printf("\n");
MACRUM 0:20b32d13a758 210 for (address = 0; address < 0x100; address++) {
MACRUM 0:20b32d13a758 211 write_enable();
MACRUM 0:20b32d13a758 212 write(address, (uint8_t)address);
MACRUM 0:20b32d13a758 213 }
MACRUM 0:20b32d13a758 214 // Read data
MACRUM 0:20b32d13a758 215 for (address = 0; address < 0x100; address += 16) {
MACRUM 0:20b32d13a758 216 read(address, buf, 16);
MACRUM 0:20b32d13a758 217 pc.printf("%08X : ", address);
MACRUM 0:20b32d13a758 218 for (int i = 0; i < 16; i++) {
MACRUM 0:20b32d13a758 219 pc.printf("%02X ", buf[i]);
MACRUM 0:20b32d13a758 220 }
MACRUM 0:20b32d13a758 221 pc.printf("\n");
MACRUM 0:20b32d13a758 222 }
MACRUM 0:20b32d13a758 223
MACRUM 0:20b32d13a758 224 while(1) {
MACRUM 0:20b32d13a758 225 myled = 1;
MACRUM 0:20b32d13a758 226 wait(0.2);
MACRUM 0:20b32d13a758 227 myled = 0;
MACRUM 0:20b32d13a758 228 wait(0.2);
MACRUM 0:20b32d13a758 229 }
MACRUM 0:20b32d13a758 230 }