A ferroelectric random access memory or F-RAM is nonvolatile and performs reads and writes similar to a RAM.

Dependents:   Memoria

Committer:
yangcq88517
Date:
Tue Feb 03 19:56:43 2015 +0000
Revision:
0:e4b7a2f63736
Child:
1:b9f6d029c760
FM24V10

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yangcq88517 0:e4b7a2f63736 1 #include "FM24V10.h"
yangcq88517 0:e4b7a2f63736 2
yangcq88517 0:e4b7a2f63736 3 // A1 pin ground == false
yangcq88517 0:e4b7a2f63736 4 // A2 pin ground == false
yangcq88517 0:e4b7a2f63736 5 FM24V10::FM24V10(PinName sda, PinName scl, bool A1, bool A2): _i2c_bus(sda,scl)
yangcq88517 0:e4b7a2f63736 6 {
yangcq88517 0:e4b7a2f63736 7 _speed = FREQUENCY_FULL;
yangcq88517 0:e4b7a2f63736 8 Init(A1, A2);
yangcq88517 0:e4b7a2f63736 9 }
yangcq88517 0:e4b7a2f63736 10
yangcq88517 0:e4b7a2f63736 11 FM24V10::FM24V10(PinName sda, PinName scl, bool A1, bool A2, SPEED_MODE speed): _i2c_bus(sda,scl)
yangcq88517 0:e4b7a2f63736 12 {
yangcq88517 0:e4b7a2f63736 13 switch (speed) {
yangcq88517 0:e4b7a2f63736 14 case STANDARD:
yangcq88517 0:e4b7a2f63736 15 _speed = FREQUENCY_STANDARD;
yangcq88517 0:e4b7a2f63736 16 break;
yangcq88517 0:e4b7a2f63736 17 case FULL:
yangcq88517 0:e4b7a2f63736 18 _speed = FREQUENCY_FULL;
yangcq88517 0:e4b7a2f63736 19 break;
yangcq88517 0:e4b7a2f63736 20 case FAST:
yangcq88517 0:e4b7a2f63736 21 _speed = FREQUENCY_FAST;
yangcq88517 0:e4b7a2f63736 22 break;
yangcq88517 0:e4b7a2f63736 23 case HIGH:
yangcq88517 0:e4b7a2f63736 24 _speed = FREQUENCY_HIGH;
yangcq88517 0:e4b7a2f63736 25 break;
yangcq88517 0:e4b7a2f63736 26 }
yangcq88517 0:e4b7a2f63736 27 Init(A1, A2);
yangcq88517 0:e4b7a2f63736 28 }
yangcq88517 0:e4b7a2f63736 29
yangcq88517 0:e4b7a2f63736 30 void FM24V10::Init(bool A1, bool A2)
yangcq88517 0:e4b7a2f63736 31 {
yangcq88517 0:e4b7a2f63736 32 _i2c_bus.frequency(_speed);
yangcq88517 0:e4b7a2f63736 33
yangcq88517 0:e4b7a2f63736 34 _addr = 0xA0;
yangcq88517 0:e4b7a2f63736 35
yangcq88517 0:e4b7a2f63736 36 if (A1)
yangcq88517 0:e4b7a2f63736 37 _addr |= 0x04;
yangcq88517 0:e4b7a2f63736 38
yangcq88517 0:e4b7a2f63736 39 if (A2)
yangcq88517 0:e4b7a2f63736 40 _addr |= 0x08;
yangcq88517 0:e4b7a2f63736 41 }
yangcq88517 0:e4b7a2f63736 42
yangcq88517 0:e4b7a2f63736 43 void FM24V10::GetSlaveAddress(int position)
yangcq88517 0:e4b7a2f63736 44 {
yangcq88517 0:e4b7a2f63736 45 if ((position >> 16) == 0x01)
yangcq88517 0:e4b7a2f63736 46 _addr |= 0x02;
yangcq88517 0:e4b7a2f63736 47 else _addr &= 0xFD;
yangcq88517 0:e4b7a2f63736 48 }
yangcq88517 0:e4b7a2f63736 49
yangcq88517 0:e4b7a2f63736 50 void FM24V10::WriteShort(int position, int value, bool Hs_mode)
yangcq88517 0:e4b7a2f63736 51 {
yangcq88517 0:e4b7a2f63736 52 WriteShort(position, &value, 1, Hs_mode);
yangcq88517 0:e4b7a2f63736 53 }
yangcq88517 0:e4b7a2f63736 54
yangcq88517 0:e4b7a2f63736 55 // position from 0x000000 to 0x01FFFF
yangcq88517 0:e4b7a2f63736 56 void FM24V10::WriteShort(int position, int * value, int size, bool Hs_mode)
yangcq88517 0:e4b7a2f63736 57 {
yangcq88517 0:e4b7a2f63736 58 GetSlaveAddress(position);
yangcq88517 0:e4b7a2f63736 59
yangcq88517 0:e4b7a2f63736 60 if (Hs_mode)
yangcq88517 0:e4b7a2f63736 61 StartHS();
yangcq88517 0:e4b7a2f63736 62
yangcq88517 0:e4b7a2f63736 63 _i2c_bus.start();
yangcq88517 0:e4b7a2f63736 64
yangcq88517 0:e4b7a2f63736 65 _i2c_bus.write(_addr);
yangcq88517 0:e4b7a2f63736 66 _i2c_bus.write(position >> 8);
yangcq88517 0:e4b7a2f63736 67 _i2c_bus.write(position);
yangcq88517 0:e4b7a2f63736 68
yangcq88517 0:e4b7a2f63736 69 for (int i = 0 ; i< size; i++) {
yangcq88517 0:e4b7a2f63736 70 _i2c_bus.write(*(value + i) >> 8);
yangcq88517 0:e4b7a2f63736 71 _i2c_bus.write(*(value + i));
yangcq88517 0:e4b7a2f63736 72 }
yangcq88517 0:e4b7a2f63736 73
yangcq88517 0:e4b7a2f63736 74 _i2c_bus.stop();
yangcq88517 0:e4b7a2f63736 75
yangcq88517 0:e4b7a2f63736 76 if (Hs_mode)
yangcq88517 0:e4b7a2f63736 77 StopHS();
yangcq88517 0:e4b7a2f63736 78 }
yangcq88517 0:e4b7a2f63736 79
yangcq88517 0:e4b7a2f63736 80 int FM24V10::ReadShort(int position, bool Hs_mode)
yangcq88517 0:e4b7a2f63736 81 {
yangcq88517 0:e4b7a2f63736 82 ReadShort(position, &result, 1,Hs_mode);
yangcq88517 0:e4b7a2f63736 83 return result;
yangcq88517 0:e4b7a2f63736 84 }
yangcq88517 0:e4b7a2f63736 85
yangcq88517 0:e4b7a2f63736 86 // position from 0x000000 to 0x01FFFF
yangcq88517 0:e4b7a2f63736 87 void FM24V10::ReadShort(int position, int * value, int size, bool Hs_mode)
yangcq88517 0:e4b7a2f63736 88 {
yangcq88517 0:e4b7a2f63736 89 GetSlaveAddress(position);
yangcq88517 0:e4b7a2f63736 90
yangcq88517 0:e4b7a2f63736 91 if (Hs_mode)
yangcq88517 0:e4b7a2f63736 92 StartHS();
yangcq88517 0:e4b7a2f63736 93
yangcq88517 0:e4b7a2f63736 94 _i2c_bus.start();
yangcq88517 0:e4b7a2f63736 95 _i2c_bus.write(_addr);
yangcq88517 0:e4b7a2f63736 96 _i2c_bus.write(position >> 8);
yangcq88517 0:e4b7a2f63736 97 _i2c_bus.write(position);
yangcq88517 0:e4b7a2f63736 98
yangcq88517 0:e4b7a2f63736 99 _i2c_bus.start();
yangcq88517 0:e4b7a2f63736 100 _i2c_bus.write(_addr | 0x01);
yangcq88517 0:e4b7a2f63736 101
yangcq88517 0:e4b7a2f63736 102 for (int i = 0; i< size; i++) {
yangcq88517 0:e4b7a2f63736 103 *(value + i) = _i2c_bus.read(1) << 8;
yangcq88517 0:e4b7a2f63736 104
yangcq88517 0:e4b7a2f63736 105 if (i == size - 1)
yangcq88517 0:e4b7a2f63736 106 *(value + i) |= _i2c_bus.read(0);
yangcq88517 0:e4b7a2f63736 107 else
yangcq88517 0:e4b7a2f63736 108 *(value + i) |= _i2c_bus.read(1);
yangcq88517 0:e4b7a2f63736 109 }
yangcq88517 0:e4b7a2f63736 110
yangcq88517 0:e4b7a2f63736 111 _i2c_bus.stop();
yangcq88517 0:e4b7a2f63736 112
yangcq88517 0:e4b7a2f63736 113 if (Hs_mode)
yangcq88517 0:e4b7a2f63736 114 StopHS();
yangcq88517 0:e4b7a2f63736 115 }
yangcq88517 0:e4b7a2f63736 116
yangcq88517 0:e4b7a2f63736 117 void FM24V10::StartHS()
yangcq88517 0:e4b7a2f63736 118 {
yangcq88517 0:e4b7a2f63736 119 _i2c_bus.start();
yangcq88517 0:e4b7a2f63736 120 _i2c_bus.write(HS_COMMAND);
yangcq88517 0:e4b7a2f63736 121 _i2c_bus.frequency(FREQUENCY_HIGH);
yangcq88517 0:e4b7a2f63736 122 }
yangcq88517 0:e4b7a2f63736 123
yangcq88517 0:e4b7a2f63736 124 void FM24V10::StopHS()
yangcq88517 0:e4b7a2f63736 125 {
yangcq88517 0:e4b7a2f63736 126 _i2c_bus.frequency(_speed);
yangcq88517 0:e4b7a2f63736 127 }