山本ワールド
I2C EEP-ROM AT24C1024B ライトテスト
概要
I2C接続されたEEP-ROM AT24C1024B(秋月電子のページへ移動します)の0~3FFFh番地にデータを書き込みます。書き込み状況をRS232Cに送信します。
パソコン側ではターミナルソフト(例えばTera Termなど)を使用します。RS232Cを使用しなくても書き込み自体はできます。
ターミナルソフトの設定
ボー・レート 19200
データ 8bit
パリティ 無し
ストップ 1bit
フロー制御 無し
書き込みデータの例
書き込みデーターは0~0xffまで順番に1ずつ値を増やした規則性のあるデーターです。ads : 0 1 2 3 4 5 6 7 8 9 a b c d e f 00000:00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 00010:10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f回路は次のとおりである。
回路図(PNG) 回路図(PDF) 回路図(DXF)
プログラムの説明
ソースファイル
以下のファイルで構成されているeeprom_w3c.c・・・ メインプログラム i2c_eep.c ・・・ I2C EEPROM AT24C1024B 読み書きライブラリー Version 1.00 i2c_eep.h ・・・ I2C EEPROM AT24C1024B 読み書きライブラリー Version 1.00 i2c_ex.c ・・・ I2C 拡張ライブラリー Version 1.00 i2c_ex.h ・・・ I2C 拡張ライブラリー Version 1.00
ソースファイルのダウンロード eeprom_w3c.zip
i2c_eep.c
I2C EEP-ROM AT24C1024Bをブロック読み書きをサポートするライブラリである。
最大2個接続して256kbyteのアドレス空間をリニアにアクセスできる。
ただしページサイズ(256byte)を超えたり、ページ境界をまたいでアクセスすることはできない。
詳細は以下のリンクを参照されたい
i2c_eep.c
i2c_ex.c
詳細は以下のリンクを参照されたい
i2c_ex.c
eeprom_r1c.c
メインプログラムである。USART、I2Cモジュールの初期化後、0~0xffのテストデータを作成し、256byteごとにメモリからEEP-ROMへ書き出します。RS232Cへ書き込み状況を出力します。
/*
* I2C EEP-ROM AT24C1024B ライトテスト Version 1.00
* File: eeprom_w3c.c
* Target: PIC18F14K50 48MHz
* コンパイラ: Microchip MPLAB XC8 C Compiler V1.20
* 書き込み: PICKit 3
* リリース: 2013/10/08 20:00
*
* I2C EEP-ROMのアドレス 00000h?003ffhに0,1,2,3,4・・・0ffhを書き込む
* RS232Cを使用しているが接続しなくても動作可能
* 各端子の接続
* RC0 out :LED0
* RC2 out :LCD RS
* RC3 out :LCD E
* RC4-RC7 out :LCD DB4-DB7
* SCL :I2C EEPROM
* SDA :I2C EEPROM
* RX :MAX232C R2OUT
* TX :MAX232C T2IN
*/
#include <stdio.h>
#include <stdlib.h>
#include <p18f14k50.h>
#include <plib\delays.h>
#include <plib\i2c.h>
#include <plib\usart.h>
#include "i2c_eep.h"
#pragma config FOSC = HS,CPUDIV = NOCLKDIV,PLLEN=ON,WDTEN=OFF,LVP=OFF,MCLRE=OFF
#define I2CROM_ADS 0xa8 // 0xa8 10101000 0x00000?0x0ffff
#define LED0 PORTCbits.RC0
char rom_buf[256];
char rs232c_buf[64];
void make_test_ptn0(unsigned char* buf,unsigned int size){
for(int n=0;n<size;n++)
buf[n]=n;
}
void main(void) {
signed char ret;
ANSEL=0;
ANSELH=0;
SLRCON=0;
TRISA=0;
TRISB=0b11110000;
TRISC=0b00000010;
OpenUSART(USART_TX_INT_OFF & USART_RX_INT_OFF & USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_CONT_RX & USART_BRGH_HIGH,155);
OpenI2C(MASTER,SLEW_ON); // マスター
SSPADD=230;
putrsUSART("\n\rI2C EEPROM Write Test\n\r");
Delay10KTCYx(240); // 200ms * (48MHz/4)=2,400,000
Delay10KTCYx(240); // 200ms * (48MHz/4)=2,400,000
LED0=1;
unsigned short long test_ads=0;
int n;
for(n=0;n<4;n++){
make_test_ptn0(rom_buf,256);
sprintf(rs232c_buf,"Write %5.5lx %2.2x %2.2x\n\r",(unsigned long)test_ads,rom_buf[0],rom_buf[1]);
putsUSART(rs232c_buf);
if(ret=i2c_eepromWB(I2CROM_ADS,rom_buf,test_ads,256)){
sprintf(rs232c_buf,"Error %i:%lx\n\r",(int)ret,(unsigned long)test_ads);
putsUSART(rs232c_buf);
}
test_ads+=0x100;
}
while(1);
}
Copyright (C) 2012 山本ワールド All Rights Reserved.