概要

I2C接続されたEEP-ROM AT24C1024B(秋月電子のページへ移動します)の0~3FFFh番地を読み出しRS232Cに送信します。
パソコン側ではターミナルソフト(例えばTera Termなど)を使用します。

ターミナルソフトの設定

ボー・レート 19200
データ 8bit
パリティ 無し
ストップ 1bit
フロー制御 無し

ターミナルソフト受信例

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_r1c.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_r1c.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モジュールの初期化後、256byteごとにメモリにEEP-ROMの内容を読み出し、RS232Cへ16進形式で出力します。

/*
 * I2C EEP-ROM AT24C1024B リードテスト Version 1.00
 * File:        eeprom_r1c.c
 * Target:      PIC18F14K50 48MHz
 * コンパイラ:   Microchip MPLAB XC8 C Compiler V1.20
 * 書き込み:     PICKit 3
 * リリース:     2013/10/08 20:00
 *
 * I2C EEP-ROMのアドレス 00000h~003ffhを読み込みRS232Cに16進ダンプする
 *              各端子の接続
 *              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

char rs232c_buf[32];
char rom_buf[256];

void hex_dump(unsigned char* buf,unsigned int size,unsigned short long ads){
    putrsUSART("ads : 0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f\n\r");
    for(int n=0;n<size;n++){
        if( (n & 0xf)==0){
            sprintf(rs232c_buf,"%5.5lx:",(unsigned long int)ads+n);
            putsUSART(rs232c_buf);
        }
        sprintf(rs232c_buf,"%.2x ",rom_buf[n]);
        putsUSART(rs232c_buf);
        if( (n & 0xf)==0xf)
            putrsUSART("\n\r");
    }
    putrsUSART("\n\r");
}

void main(void) {
    signed char ret;

    ANSEL=0;
    ANSELH=0;
    SLRCON=0;

    TRISA=0;
    TRISB=0b11110000;
    TRISC=0b00000010;
    PORTC=0;
 
    Delay10KTCYx( 240);  //  2μs*(48MHz/4)= 24

    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;

    unsigned short long test_ads=0;
    int n=0;

    for(int n=0;n<4;n++){
        for(int i=0;i<256;i++)
            rom_buf[i]=0;
        sprintf(rs232c_buf,"Read %5.5lx\n\r",(unsigned long)test_ads);
        putsUSART(rs232c_buf);
        if(ret=i2c_eepromRB(I2CROM_ADS,rom_buf,test_ads,256)){
            sprintf(rs232c_buf,"\tError %i\n\r",(int)ret);
            putsUSART(rs232c_buf);
        }
        else
            hex_dump(rom_buf,256,test_ads);
        test_ads+=0x100;
    }
    while(1);
}