24FC1025

Dependents:   Hybrid_EEPROM

EEPROM_24FC1025.cpp

Committer:
Gaku0606
Date:
2017-03-13
Revision:
0:d6cc210c71cc

File content as of revision 0:d6cc210c71cc:

#include "EEPROM_24FC1025.h"

EEPROM_24FC1025::EEPROM_24FC1025(I2C &i2cBus, int A0, int A1){
    _i2c = &i2cBus;
    _i2c->frequency(400000);//400kHz
    if(A0 == 0 && A1 == 0){
        uniqueAddr = 0b00000000; 
    }
    else if(A0 == 1 && A1 == 0){
        uniqueAddr = 0b00000010;   
    }
    else if(A0 == 0 && A1 == 1){
        uniqueAddr = 0b00000100;   
    } 
    else if(A0 == 1 && A1 == 1){
        uniqueAddr = 0b00000110;   
    }
    //for 24FC1025
    size = 131072;//128 kbyte
}

int EEPROM_24FC1025::checkAddr(uint32_t addr){
    if(addr > size) return 0;
    else    return 1;
}

int EEPROM_24FC1025::read(uint32_t regAddr, uint8_t *data, int length){
  
    int slaveAddr;
    char cmd[2];
    int ack = 0;
    
    //check over address
    if(checkAddr(regAddr) == 0) return -1;
    
    //set control byte
    if(regAddr < 0x00010000){
        slaveAddr = (CONTROL_BYTE | SEGMENT0 | uniqueAddr) & 0xFE;//0b10100xx0
    }
    else{
        slaveAddr = (CONTROL_BYTE | SEGMENT1 | uniqueAddr) & 0xFE;//0b10101xx0   
        regAddr -= 0x00010000;
    }
    //set register address
    cmd[0] = (char)(regAddr >> 8);//high byte
    cmd[1] = (char)(regAddr);// & 0xFF);//low byte
    
    //send control byte and register address
    ack = _i2c->write(slaveAddr, cmd, 2, true); 
    if(ack != 0) {
        printf("write error\r\n");
        return;
    }
    //receive date
    slaveAddr = slaveAddr | 0x01;//0b1010yxx1
    ack = _i2c->read(slaveAddr, (char*)&*data, length, false);
    if(ack != 0) {
        printf("read error\r\n");
        return;
    }
    return 0;
    
}

 
int EEPROM_24FC1025::write(uint32_t regAddr, uint8_t data){
    char cmd[3] = {0};
    int slaveAddr = 0;
        //check over address
    if(checkAddr(regAddr) == 0) return -1;
    
    //set control byte
    if(regAddr < 0x00010000){
        slaveAddr = (CONTROL_BYTE | SEGMENT0 | uniqueAddr) & 0xFE;//0b10100xx0
    }
    else{
        slaveAddr = (CONTROL_BYTE | SEGMENT1 | uniqueAddr) & 0xFE;//0b10101xx0   
        regAddr -= 0x00010000;
    }
    cmd[0] = (char)(regAddr >> 8);
    cmd[1] = (char)(regAddr & 0xFF);
    cmd[2] = (char)data;
    
    _i2c->write(slaveAddr, cmd, 3, false);

    return 0;
}