Fujitsu MB85RSxx serial FRAM test program
Dependencies: mbed MB85RSxx_SPI
Connectivity
MB82RSxx pin | mbed LPC1114FN28 pin | mbed LPC1768 pin | Arudino 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 |
main.cpp@0:20b32d13a758, 2017-04-16 (annotated)
- 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?
User | Revision | Line number | New 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 | } |