Driver library for Microchip I2C EERAM (47x04 and 47x16) 4 kbit or 16 kbit EEPROM backed SRAM.

Dependents:   EERAM_example

EERAM.cpp

Committer:
vargham
Date:
2017-04-25
Revision:
0:19f9af07424a
Child:
1:6028bc22d82f

File content as of revision 0:19f9af07424a:

/**
* @file    eeram_main.cpp
* @brief   Example program for Microchip I2C EERAM devices (47x04 and 47x16)
* @author  Mark Peter Vargha, vmp@varghamarkpeter.hu
* @version 1.0.0
*
* Copyright (c) 2017
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

#include "mbed.h"
#include "EERAM.h"

#define PIN_I2C_SDA PC_9
#define PIN_I2C_SCL PA_8

#define I2C_FREQUENCY 1000000

Serial serial(PA_9, PA_10);  //Tx, Rx
I2C i2c(PIN_I2C_SDA, PIN_I2C_SCL); //SDA, SCL
EERAM eeram(i2c, 2048);

void printI2C()
{
    //0x41  Discovery Touch
    //0x18  EERAM control
    //0x50  EERAM memory

    int error;
    int address;
    int nDevices = 0;

    serial.printf("Scanning I2C devices...\r\n");

    for(address = 1; address < 127; address++ )
    {
        i2c.start();
        error = i2c.write(address << 1); //We shift it left because mbed takes in 8 bit addreses
        i2c.stop();
        if (error == 1)
        {
            serial.printf("I2C device found at address 0x%X\r\n", address); //Returns 7-bit addres
            nDevices++;
        }

    }
    serial.printf("I2C scan finished.\r\n");
    if (nDevices == 0)
    {
        serial.printf("No I2C devices found.\r\n");
    }

}

void fillTestData(char data[], uint8_t start, int length)
{
    for (int i = 0; i < length; i++) data[i] = start + i;
}

void eeramDataTest()
{
    const int testDataLength = 16;
    char data[testDataLength];

    //Write
    //eeram.fillMemory(0xFF);

    fillTestData(data, 0x0, testDataLength);
    serial.printf("Write %d bytes to 0x0: %d\r\n", testDataLength, eeram.write(0x0, data, testDataLength));

    fillTestData(data, 0x50, testDataLength);
    serial.printf("Write %d bytes to 0x500: %d\r\n", testDataLength, eeram.write(0x500, data, testDataLength));

    fillTestData(data, 0x70, testDataLength);
    serial.printf("Write %d bytes to 0x700: %d\r\n", testDataLength, eeram.write(0x700, data, testDataLength));

    //Dump
    serial.printf("Dump contents 0x0, 16\r\n");
    eeram.dump(serial, 0x0, testDataLength);
    serial.printf("Dump contents 0x500, 16\r\n");
    eeram.dump(serial, 0x500, testDataLength);
    serial.printf("Dump contents 0x700, 16\r\n");
    eeram.dump(serial, 0x700, testDataLength);
    //serial.printf("Dump all\r\n");
    //eeram.dump(serial);
    serial.printf("Dump done\r\n");

    //Read back
    fillTestData(data, 0x0, testDataLength);
    serial.printf("Read back 16 bytes from 0x500: %d\r\n", eeram.read(0x500, data, testDataLength));
    serial.printf("%.4X ", 0x500);
    for (int i = 0; i < testDataLength; i++)
    {
        serial.printf("%.2X ", data[i]);
    }
    serial.printf("\r\n");
}

void eeramRegisterTest()
{
    eeram.dumpRegisters(serial);
}

int main()
{
    serial.baud(460800);
    i2c.frequency(I2C_FREQUENCY); //Hz
    serial.printf("\r\nI2C EERAM example\r\n");

    //printI2C();

    serial.printf("Is EERAM device ready?\r\n");
    while (!eeram.isReady());
    serial.printf("Device is ready.\r\n");

    eeram.readStatus();
    eeram.setAutoStoreEnabled(true);
    eeram.setProtectedMemoryArea(U64);
    eeram.writeStatusIfChanged(true);
    serial.printf("Status: %.2X\r\n", eeram.getStatus());

    eeramDataTest();

    eeramRegisterTest();

    //eeram.store(true);
    //eeram.recall(true);

    while (true)
    {

    }
}