Fujitsu MB85RCxx I2C FRAM test program
Dependencies: mbed MB85RCxx_I2C
Connectivity
MB82RCxx pin | mbed LPC1114FN28 pin | mbed LPC1768 pin | Arudino form factor |
---|---|---|---|
1 (A0) | 22 (GND) | 1 (GND) | GND |
2 (A1) | 22 (GND) | 1 (GND) | GND |
3 (A2) | 22 (GND) | 1 (GND) | GND |
4 (VSS) | 22 (GND) | 1 (GND) | GND |
5 (SDA) | 2 (dp5) | 9 (p9) | D14 |
6 (SCL) | 6 (dp27) | 10 (p10) | D15 |
7 (WP) | 22 (GND) | 1 (GND) | GND |
8 (VDD) | 21 (VDD) | 40 (VOUT) | 3V3 |
Note
SDA and SCL must be pulled-up by 2.2k-ohm registers.
main.cpp@0:7e86fd056d40, 2017-04-20 (annotated)
- Committer:
- MACRUM
- Date:
- Thu Apr 20 12:12:11 2017 +0000
- Revision:
- 0:7e86fd056d40
- Child:
- 1:e15a9be72b69
Initial commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MACRUM | 0:7e86fd056d40 | 1 | #include "mbed.h" |
MACRUM | 0:7e86fd056d40 | 2 | |
MACRUM | 0:7e86fd056d40 | 3 | DigitalOut myled(LED1); |
MACRUM | 0:7e86fd056d40 | 4 | Serial pc(USBTX, USBRX); |
MACRUM | 0:7e86fd056d40 | 5 | |
MACRUM | 0:7e86fd056d40 | 6 | #if defined(TARGET_LPC1768) |
MACRUM | 0:7e86fd056d40 | 7 | I2C _i2c(p9, p10); |
MACRUM | 0:7e86fd056d40 | 8 | #elif defined(TARGET_LPC1114) |
MACRUM | 0:7e86fd056d40 | 9 | I2C _i2c(dp5, dp27); |
MACRUM | 0:7e86fd056d40 | 10 | #else |
MACRUM | 0:7e86fd056d40 | 11 | I2C _i2c(D14, D15); |
MACRUM | 0:7e86fd056d40 | 12 | #endif |
MACRUM | 0:7e86fd056d40 | 13 | |
MACRUM | 0:7e86fd056d40 | 14 | #define MB85_DENSITY_64K 0x3 |
MACRUM | 0:7e86fd056d40 | 15 | #define MB85_DENSITY_256K 0x5 |
MACRUM | 0:7e86fd056d40 | 16 | #define MB85_DENSITY_512K 0x6 |
MACRUM | 0:7e86fd056d40 | 17 | #define MB85_DENSITY_1M 0x7 |
MACRUM | 0:7e86fd056d40 | 18 | #define MB85_DENSITY_2M 0x8 |
MACRUM | 0:7e86fd056d40 | 19 | #define MB85RC_I2C_ADDRESS 0xA0 |
MACRUM | 0:7e86fd056d40 | 20 | #define I2C_WRITE 0 |
MACRUM | 0:7e86fd056d40 | 21 | #define I2C_READ 1 |
MACRUM | 0:7e86fd056d40 | 22 | |
MACRUM | 0:7e86fd056d40 | 23 | int read_device_id(char* device_id) |
MACRUM | 0:7e86fd056d40 | 24 | { |
MACRUM | 0:7e86fd056d40 | 25 | char buf; |
MACRUM | 0:7e86fd056d40 | 26 | |
MACRUM | 0:7e86fd056d40 | 27 | buf = MB85RC_I2C_ADDRESS; |
MACRUM | 0:7e86fd056d40 | 28 | _i2c.write(0xF8, &buf, 1, true); |
MACRUM | 0:7e86fd056d40 | 29 | _i2c.read(0xF9, device_id, 3); |
MACRUM | 0:7e86fd056d40 | 30 | |
MACRUM | 0:7e86fd056d40 | 31 | return 0; |
MACRUM | 0:7e86fd056d40 | 32 | } |
MACRUM | 0:7e86fd056d40 | 33 | |
MACRUM | 0:7e86fd056d40 | 34 | int read(uint32_t address, char *buf, uint32_t len) |
MACRUM | 0:7e86fd056d40 | 35 | { |
MACRUM | 0:7e86fd056d40 | 36 | char byte_address[2]; |
MACRUM | 0:7e86fd056d40 | 37 | char i2c_adrs = (MB85RC_I2C_ADDRESS | ((address >> 15) & 0x02)); |
MACRUM | 0:7e86fd056d40 | 38 | |
MACRUM | 0:7e86fd056d40 | 39 | byte_address[0] = ((address >> 8) & 0xFF); |
MACRUM | 0:7e86fd056d40 | 40 | byte_address[1] = ((address >> 0) & 0xFF); |
MACRUM | 0:7e86fd056d40 | 41 | _i2c.write(i2c_adrs, byte_address, 2, true); |
MACRUM | 0:7e86fd056d40 | 42 | _i2c.read(i2c_adrs, buf, len); |
MACRUM | 0:7e86fd056d40 | 43 | |
MACRUM | 0:7e86fd056d40 | 44 | return 0; |
MACRUM | 0:7e86fd056d40 | 45 | } |
MACRUM | 0:7e86fd056d40 | 46 | |
MACRUM | 0:7e86fd056d40 | 47 | int write(uint32_t address, char *buf, uint32_t len) |
MACRUM | 0:7e86fd056d40 | 48 | { |
MACRUM | 0:7e86fd056d40 | 49 | char byte_address[2]; |
MACRUM | 0:7e86fd056d40 | 50 | char i2c_adrs = (MB85RC_I2C_ADDRESS | ((address >> 15) & 0x02)); |
MACRUM | 0:7e86fd056d40 | 51 | |
MACRUM | 0:7e86fd056d40 | 52 | byte_address[0] = ((address >> 8) & 0xFF); |
MACRUM | 0:7e86fd056d40 | 53 | byte_address[1] = ((address >> 0) & 0xFF); |
MACRUM | 0:7e86fd056d40 | 54 | _i2c.write(i2c_adrs, byte_address, 2, true); |
MACRUM | 0:7e86fd056d40 | 55 | for (uint32_t i = 0; i < len; i++) { |
MACRUM | 0:7e86fd056d40 | 56 | _i2c.write(*buf++); |
MACRUM | 0:7e86fd056d40 | 57 | } |
MACRUM | 0:7e86fd056d40 | 58 | |
MACRUM | 0:7e86fd056d40 | 59 | return 0; |
MACRUM | 0:7e86fd056d40 | 60 | } |
MACRUM | 0:7e86fd056d40 | 61 | |
MACRUM | 0:7e86fd056d40 | 62 | int write(uint32_t address, char buf) |
MACRUM | 0:7e86fd056d40 | 63 | { |
MACRUM | 0:7e86fd056d40 | 64 | char byte_address[2]; |
MACRUM | 0:7e86fd056d40 | 65 | char i2c_adrs = (MB85RC_I2C_ADDRESS | ((address >> 15) & 0x02)); |
MACRUM | 0:7e86fd056d40 | 66 | |
MACRUM | 0:7e86fd056d40 | 67 | byte_address[0] = ((address >> 8) & 0xFF); |
MACRUM | 0:7e86fd056d40 | 68 | byte_address[1] = ((address >> 0) & 0xFF); |
MACRUM | 0:7e86fd056d40 | 69 | _i2c.write(i2c_adrs, byte_address, 2, true); |
MACRUM | 0:7e86fd056d40 | 70 | _i2c.write(buf); |
MACRUM | 0:7e86fd056d40 | 71 | |
MACRUM | 0:7e86fd056d40 | 72 | return 0; |
MACRUM | 0:7e86fd056d40 | 73 | } |
MACRUM | 0:7e86fd056d40 | 74 | |
MACRUM | 0:7e86fd056d40 | 75 | int fill(uint32_t address, uint8_t data, uint32_t len) |
MACRUM | 0:7e86fd056d40 | 76 | { |
MACRUM | 0:7e86fd056d40 | 77 | char byte_address[2]; |
MACRUM | 0:7e86fd056d40 | 78 | char i2c_adrs = (MB85RC_I2C_ADDRESS | ((address >> 15) & 0x02)); |
MACRUM | 0:7e86fd056d40 | 79 | |
MACRUM | 0:7e86fd056d40 | 80 | byte_address[0] = ((address >> 8) & 0xFF); |
MACRUM | 0:7e86fd056d40 | 81 | byte_address[1] = ((address >> 0) & 0xFF); |
MACRUM | 0:7e86fd056d40 | 82 | _i2c.write(i2c_adrs, byte_address, 2, true); |
MACRUM | 0:7e86fd056d40 | 83 | for (uint32_t i = 0; i < len; i++) { |
MACRUM | 0:7e86fd056d40 | 84 | _i2c.write(data); |
MACRUM | 0:7e86fd056d40 | 85 | } |
MACRUM | 0:7e86fd056d40 | 86 | return 0; |
MACRUM | 0:7e86fd056d40 | 87 | } |
MACRUM | 0:7e86fd056d40 | 88 | |
MACRUM | 0:7e86fd056d40 | 89 | int main() { |
MACRUM | 0:7e86fd056d40 | 90 | char buf[16]; |
MACRUM | 0:7e86fd056d40 | 91 | uint32_t address; |
MACRUM | 0:7e86fd056d40 | 92 | |
MACRUM | 0:7e86fd056d40 | 93 | pc.baud(115200); |
MACRUM | 0:7e86fd056d40 | 94 | pc.printf("\nFujitsu MB85RCxxx FRAM test program\n\n"); |
MACRUM | 0:7e86fd056d40 | 95 | |
MACRUM | 0:7e86fd056d40 | 96 | _i2c.frequency(400000); |
MACRUM | 0:7e86fd056d40 | 97 | read_device_id(buf); |
MACRUM | 0:7e86fd056d40 | 98 | |
MACRUM | 0:7e86fd056d40 | 99 | pc.printf("read device ID = 0x%x 0x%x 0x%x\n\n", buf[0], buf[1], buf[2]); |
MACRUM | 0:7e86fd056d40 | 100 | |
MACRUM | 0:7e86fd056d40 | 101 | fill(0, 0, 256); |
MACRUM | 0:7e86fd056d40 | 102 | |
MACRUM | 0:7e86fd056d40 | 103 | for (int i = 0; i < 16; i++) { |
MACRUM | 0:7e86fd056d40 | 104 | buf[i] = i; |
MACRUM | 0:7e86fd056d40 | 105 | } |
MACRUM | 0:7e86fd056d40 | 106 | write(0, buf, 16); |
MACRUM | 0:7e86fd056d40 | 107 | |
MACRUM | 0:7e86fd056d40 | 108 | for (address = 0; address < 0x80; address += 16) { |
MACRUM | 0:7e86fd056d40 | 109 | read(address, buf, 16); |
MACRUM | 0:7e86fd056d40 | 110 | pc.printf("%08X : ", address); |
MACRUM | 0:7e86fd056d40 | 111 | for (int i = 0; i < 16; i++) { |
MACRUM | 0:7e86fd056d40 | 112 | pc.printf("%02X ", buf[i]); |
MACRUM | 0:7e86fd056d40 | 113 | } |
MACRUM | 0:7e86fd056d40 | 114 | pc.printf("\n"); |
MACRUM | 0:7e86fd056d40 | 115 | } |
MACRUM | 0:7e86fd056d40 | 116 | |
MACRUM | 0:7e86fd056d40 | 117 | pc.printf("\n"); |
MACRUM | 0:7e86fd056d40 | 118 | for (address = 0; address < 0x100; address++) { |
MACRUM | 0:7e86fd056d40 | 119 | write(address, (uint8_t)address); |
MACRUM | 0:7e86fd056d40 | 120 | } |
MACRUM | 0:7e86fd056d40 | 121 | for (address = 0; address < 0x100; address += 16) { |
MACRUM | 0:7e86fd056d40 | 122 | read(address, buf, 16); |
MACRUM | 0:7e86fd056d40 | 123 | pc.printf("%08X : ", address); |
MACRUM | 0:7e86fd056d40 | 124 | for (int i = 0; i < 16; i++) { |
MACRUM | 0:7e86fd056d40 | 125 | pc.printf("%02X ", buf[i]); |
MACRUM | 0:7e86fd056d40 | 126 | } |
MACRUM | 0:7e86fd056d40 | 127 | pc.printf("\n"); |
MACRUM | 0:7e86fd056d40 | 128 | } |
MACRUM | 0:7e86fd056d40 | 129 | |
MACRUM | 0:7e86fd056d40 | 130 | while(1) { |
MACRUM | 0:7e86fd056d40 | 131 | myled = 1; |
MACRUM | 0:7e86fd056d40 | 132 | wait(0.2); |
MACRUM | 0:7e86fd056d40 | 133 | myled = 0; |
MACRUM | 0:7e86fd056d40 | 134 | wait(0.2); |
MACRUM | 0:7e86fd056d40 | 135 | } |
MACRUM | 0:7e86fd056d40 | 136 | } |