概要

I2C EEP-ROM AT24C1024B(秋月電子のページへ移動します)をブロック読み書きをサポートするライブラリである。 最大2個接続して256kbyteのアドレス空間をリニアにアクセスできる。 ただしページサイズ(256byte)を超えたり、ページ境界をまたいでアクセスすることはできない。
使用する場合はi2c_eep.hをインクルードしi2c_eep.cをプロジェクトに追加してください
I2Cバスの仕様については、次のページに記述がある。
http://www.nxp.com/documents/user_manual/UM10204_JA.pdf

プログラムの説明

ソースファイル

以下のファイルで構成されている
i2c_eep.c   ・・・ I2C EEPROM AT24C1024B 読み書きライブラリー Version 1.00
i2c_eep.h   ・・・ I2C EEPROM AT24C1024B 読み書きライブラリー Version 1.00

サブルーチン

I2C EEP-ROMはアドレス指定が64kbyteまでしか指定できないので、超える領域はスレーブアドレスに16bit目を含ませている。
本ライブラリではアドレス指定は17bitまで可能であるため、スレーブアドレスは変更する必要がない。
同様に2つのEEPROMが連続したスレーブアドレス領域に接続されている場合、リニアにアドレス指定ができる。書き込み中の場合ACKを返さない場合があるのでリトライ処理をしている。

スレーブアドレス0xa8と0xacで連続した領域に接続されているとき。(本ページの回路図どおりに接続した場合)
スレーブアドレス0xa8 アドレス 0x1ffffで指定した場合、実際のEEP-ROMはスレーブアドレス 0xaa(1個目のROM) アドレス ffffがアクセスされる。
スレーブアドレス0xa8 アドレス 0x3ffffで指定した場合、実際のEEP-ROMはスレーブアドレス 0xae(2個目のROM) アドレス ffffがアクセスされる。

サポートする関数

i2c_eepromWB

ブロックライト

i2c_eepromRB

ブロックリード

ソースコード

i2c_eep.h

/*
 * I2C EEPROM AT24C1024B 読み書きライブラリー Version 1.00
 * File:        i2c_eep.c
 * Target:      PIC18F14K50 48Mhz
 * コンパイラ:   Microchip MPLAB XC8 C Compiler V1.20
 * 書き込み:     PICKit 3
 * リリース:     2013/09/29 15:00
 *
*/

#ifndef I2C_EEP_H
#define	I2C_EEP_H

#include "i2c_ex.h"

//  I2C EEPROM AT24C1024B ブロック書き込み
signed char i2c_eepromWB(unsigned char sads,void* buf,unsigned short long ads,unsigned int size);

//  I2C EEPROM AT24C1024B ブロック読み込み
signed char i2c_eepromRB(unsigned char sads,void* buf,unsigned short long ads,unsigned int size);

// スレーブアドレスを設定
#define I2CROM_ADS   0xa8

#endif  //  I2CEEP_H


i2c_eep.c

/*
 * I2C EEPROM AT24C1024B 読み書きライブラリー Version 1.00
 * File:        i2c_eep.c
 * Target:      PIC18F14K50 48Mhz
 * コンパイラ:   Microchip MPLAB XC8 C Compiler V1.20
 * 書き込み:     PICKit 3
 * リリース:     2013/09/29 15:00
 *
*/

#include <p18f14k50.h>
#include <plib\delays.h>
#include <plib\i2c.h>
#include "i2c_ex.h"

signed char _i2c_eepromWB(unsigned char sads,void* p,unsigned short long ads,unsigned int size){
    unsigned char* buf=p;
    unsigned int n;
    signed char ret;
    do{
        SSPCON1bits.WCOL=0;
        IdleI2C();
        StartI2C();
        while(SSPCON2bits.SEN);
        if(PIR2bits.BCLIF)
            return -10;
    }while(SSPCON1bits.WCOL);
    unsigned char adsu=(ads>>15) & 0b1110;
    if(ret=i2c_write(sads | adsu )) // 上位3bitをスレーブアドレスと合成
        return ret-2;
    if(ret=i2c_write(ads >> 8))
        return ret-4;
    if(ret=i2c_write(ads & 0xff))
        return ret-6;
    for(n=0;n>15) & 0b1110;
    if(ret=i2c_write(sads | adsu)) // 上位3bitをスレーブアドレスと合成
        return ret-2;
    if(ret=i2c_write(ads >> 8)) //  上位8bit
        return ret-4;
    if(ret=i2c_write(ads & 0xff))   //  下位8bit
        return ret-6;
    RestartI2C();   //  RSEN=1
    while(SSPCON2bits.RSEN);
    if(ret=i2c_write(sads  | adsu | 1)) // 上位3bitをスレーブアドレスと合成
        return ret-8;
    while(DataRdyI2C());
    for(n=0;n<size-1;n++){
        PIR1bits.SSPIF=0;
        SSPCON2bits.ACKDT=0;
        buf[n]=ReadI2C();
        SSPCON1bits.SSPOV=0;
        SSPCON2bits.ACKEN=1;
        while(SSPCON2bits.ACKEN);
        SSPCON1bits.SSPOV=0;
        IdleI2C();
    }

    PIR1bits.SSPIF=0;
    while(DataRdyI2C());
 
    SSPCON2bits.ACKDT=1;
    buf[n]=ReadI2C();
    SSPCON2bits.ACKEN=1;
    while(SSPCON2bits.ACKEN);
    SSPCON1bits.SSPOV=0;
    IdleI2C();

    SSPCON2bits.RCEN=0;
    
    PIR1bits.SSPIF=0;
    SSPCON1bits.WCOL=0;
    StopI2C();
    while(SSPCON2bits.PEN);
    return 0;
}

//  I2C EEPROM AT24C1024B ブロック読み込み

signed char i2c_eepromRB(unsigned char sads,void* p,unsigned short long ads,unsigned int size){
    unsigned char try=TRY;
    signed char ret;
    do{
        if( (ret=_i2c_eepromRB(sads, p,ads,size)) == 0 )
            break;
        Delay1TCYx( 240);  //  2μs*(48MHz/4)= 24
    }while(--try);
    return ret;
}