山本ワールド
I2C EEP-ROM AT24C1024B リードテスト
概要
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);
}
Copyright (C) 2012 山本ワールド All Rights Reserved.