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 Mar 08 22:59:15 2016 +0000
Revision:
1:b9f6d029c760
Parent:
0:e4b7a2f63736
16 bit value only

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