山本ワールド
I2C EEPROM AT24C1024B 読み書きライブラリー
概要
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;
}
Copyright (C) 2012 山本ワールド All Rights Reserved.