24FC1025

Dependents:   Hybrid_EEPROM

Committer:
Gaku0606
Date:
Mon Mar 13 07:03:05 2017 +0000
Revision:
0:d6cc210c71cc
??;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Gaku0606 0:d6cc210c71cc 1 #include "EEPROM_24FC1025.h"
Gaku0606 0:d6cc210c71cc 2
Gaku0606 0:d6cc210c71cc 3 EEPROM_24FC1025::EEPROM_24FC1025(I2C &i2cBus, int A0, int A1){
Gaku0606 0:d6cc210c71cc 4 _i2c = &i2cBus;
Gaku0606 0:d6cc210c71cc 5 _i2c->frequency(400000);//400kHz
Gaku0606 0:d6cc210c71cc 6 if(A0 == 0 && A1 == 0){
Gaku0606 0:d6cc210c71cc 7 uniqueAddr = 0b00000000;
Gaku0606 0:d6cc210c71cc 8 }
Gaku0606 0:d6cc210c71cc 9 else if(A0 == 1 && A1 == 0){
Gaku0606 0:d6cc210c71cc 10 uniqueAddr = 0b00000010;
Gaku0606 0:d6cc210c71cc 11 }
Gaku0606 0:d6cc210c71cc 12 else if(A0 == 0 && A1 == 1){
Gaku0606 0:d6cc210c71cc 13 uniqueAddr = 0b00000100;
Gaku0606 0:d6cc210c71cc 14 }
Gaku0606 0:d6cc210c71cc 15 else if(A0 == 1 && A1 == 1){
Gaku0606 0:d6cc210c71cc 16 uniqueAddr = 0b00000110;
Gaku0606 0:d6cc210c71cc 17 }
Gaku0606 0:d6cc210c71cc 18 //for 24FC1025
Gaku0606 0:d6cc210c71cc 19 size = 131072;//128 kbyte
Gaku0606 0:d6cc210c71cc 20 }
Gaku0606 0:d6cc210c71cc 21
Gaku0606 0:d6cc210c71cc 22 int EEPROM_24FC1025::checkAddr(uint32_t addr){
Gaku0606 0:d6cc210c71cc 23 if(addr > size) return 0;
Gaku0606 0:d6cc210c71cc 24 else return 1;
Gaku0606 0:d6cc210c71cc 25 }
Gaku0606 0:d6cc210c71cc 26
Gaku0606 0:d6cc210c71cc 27 int EEPROM_24FC1025::read(uint32_t regAddr, uint8_t *data, int length){
Gaku0606 0:d6cc210c71cc 28
Gaku0606 0:d6cc210c71cc 29 int slaveAddr;
Gaku0606 0:d6cc210c71cc 30 char cmd[2];
Gaku0606 0:d6cc210c71cc 31 int ack = 0;
Gaku0606 0:d6cc210c71cc 32
Gaku0606 0:d6cc210c71cc 33 //check over address
Gaku0606 0:d6cc210c71cc 34 if(checkAddr(regAddr) == 0) return -1;
Gaku0606 0:d6cc210c71cc 35
Gaku0606 0:d6cc210c71cc 36 //set control byte
Gaku0606 0:d6cc210c71cc 37 if(regAddr < 0x00010000){
Gaku0606 0:d6cc210c71cc 38 slaveAddr = (CONTROL_BYTE | SEGMENT0 | uniqueAddr) & 0xFE;//0b10100xx0
Gaku0606 0:d6cc210c71cc 39 }
Gaku0606 0:d6cc210c71cc 40 else{
Gaku0606 0:d6cc210c71cc 41 slaveAddr = (CONTROL_BYTE | SEGMENT1 | uniqueAddr) & 0xFE;//0b10101xx0
Gaku0606 0:d6cc210c71cc 42 regAddr -= 0x00010000;
Gaku0606 0:d6cc210c71cc 43 }
Gaku0606 0:d6cc210c71cc 44 //set register address
Gaku0606 0:d6cc210c71cc 45 cmd[0] = (char)(regAddr >> 8);//high byte
Gaku0606 0:d6cc210c71cc 46 cmd[1] = (char)(regAddr);// & 0xFF);//low byte
Gaku0606 0:d6cc210c71cc 47
Gaku0606 0:d6cc210c71cc 48 //send control byte and register address
Gaku0606 0:d6cc210c71cc 49 ack = _i2c->write(slaveAddr, cmd, 2, true);
Gaku0606 0:d6cc210c71cc 50 if(ack != 0) {
Gaku0606 0:d6cc210c71cc 51 printf("write error\r\n");
Gaku0606 0:d6cc210c71cc 52 return;
Gaku0606 0:d6cc210c71cc 53 }
Gaku0606 0:d6cc210c71cc 54 //receive date
Gaku0606 0:d6cc210c71cc 55 slaveAddr = slaveAddr | 0x01;//0b1010yxx1
Gaku0606 0:d6cc210c71cc 56 ack = _i2c->read(slaveAddr, (char*)&*data, length, false);
Gaku0606 0:d6cc210c71cc 57 if(ack != 0) {
Gaku0606 0:d6cc210c71cc 58 printf("read error\r\n");
Gaku0606 0:d6cc210c71cc 59 return;
Gaku0606 0:d6cc210c71cc 60 }
Gaku0606 0:d6cc210c71cc 61 return 0;
Gaku0606 0:d6cc210c71cc 62
Gaku0606 0:d6cc210c71cc 63 }
Gaku0606 0:d6cc210c71cc 64
Gaku0606 0:d6cc210c71cc 65
Gaku0606 0:d6cc210c71cc 66 int EEPROM_24FC1025::write(uint32_t regAddr, uint8_t data){
Gaku0606 0:d6cc210c71cc 67 char cmd[3] = {0};
Gaku0606 0:d6cc210c71cc 68 int slaveAddr = 0;
Gaku0606 0:d6cc210c71cc 69 //check over address
Gaku0606 0:d6cc210c71cc 70 if(checkAddr(regAddr) == 0) return -1;
Gaku0606 0:d6cc210c71cc 71
Gaku0606 0:d6cc210c71cc 72 //set control byte
Gaku0606 0:d6cc210c71cc 73 if(regAddr < 0x00010000){
Gaku0606 0:d6cc210c71cc 74 slaveAddr = (CONTROL_BYTE | SEGMENT0 | uniqueAddr) & 0xFE;//0b10100xx0
Gaku0606 0:d6cc210c71cc 75 }
Gaku0606 0:d6cc210c71cc 76 else{
Gaku0606 0:d6cc210c71cc 77 slaveAddr = (CONTROL_BYTE | SEGMENT1 | uniqueAddr) & 0xFE;//0b10101xx0
Gaku0606 0:d6cc210c71cc 78 regAddr -= 0x00010000;
Gaku0606 0:d6cc210c71cc 79 }
Gaku0606 0:d6cc210c71cc 80 cmd[0] = (char)(regAddr >> 8);
Gaku0606 0:d6cc210c71cc 81 cmd[1] = (char)(regAddr & 0xFF);
Gaku0606 0:d6cc210c71cc 82 cmd[2] = (char)data;
Gaku0606 0:d6cc210c71cc 83
Gaku0606 0:d6cc210c71cc 84 _i2c->write(slaveAddr, cmd, 3, false);
Gaku0606 0:d6cc210c71cc 85
Gaku0606 0:d6cc210c71cc 86 return 0;
Gaku0606 0:d6cc210c71cc 87 }