概要

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);
}