目的
I2C EEPROMのテスト
秋月で売っているEEPROM 通販コード K-12061
//SER_I2C_EEPROM_lib_test1_UNO_1
#include <Arduino.h>
#include <Wire.h>
//eepromのアドレス
unsigned int eerpom_address = 0;
//アドレスを0にする
void init_address() {
eerpom_address = 0;
}
//アドレスに値をセットする
void set_address(unsigned int ad1) {
eerpom_address = ad1;
}
//アドレスの値を読み出す
unsigned int read_address() {
return (eerpom_address);
}
//アドレスの値に1つインクリメントする
void inc_address() {
eerpom_address++;
}
//一文字の読み出し
unsigned char eeprom_char() {
unsigned char ad_h = (read_address() >> 8) & 0xff;
unsigned char ad_l = read_address() & 0xff;
inc_address();//アドレスを1つ進める
Wire.beginTransmission(0x50);
//アドレス
Wire.write(ad_h); // H
Wire.write(ad_l); // L
Wire.endTransmission();
//データ
Wire.requestFrom(0x50, 1);
while (Wire.available() == 0 ) {}
return (Wire.read());
}//eeprom_char
//連続読み セグメントを跨がない事?
void eeprom_read(unsigned char *str1, unsigned int len1) {
unsigned char ad_h = (read_address() >> 8) & 0xff;
unsigned char ad_l = read_address() & 0xff;
//読み込みアドレスの設定
//ダミー書き込み
Wire.beginTransmission(0x50);
//アドレス
Wire.write(ad_h); //H
Wire.write(ad_l); //L
//データ
Wire.endTransmission();
//delay(1);
//バイト連続読み
unsigned int ii = 0;
unsigned char s[32 + 1];
if (len1 >= 32) {
len1 = 32;
}
Wire.requestFrom(0x50, len1);
//データが続くだけ読む
while (Wire.available()) { // 要求より短いデータが来る可能性あり
str1[ii++] = (int)Wire.read(); // 1バイトを受信
inc_address();//アドレスを1つ進める
}//while
}//eeprom_read
void eeprom_write(unsigned char ch1) {
unsigned char ad_h = (read_address() >> 8) & 0xff;
unsigned char ad_l = read_address() & 0xff;
Wire.beginTransmission(0x50);
//アドレス
Wire.write(ad_h); //H
Wire.write(ad_l); //L
//データ
Wire.write(ch1);
Wire.endTransmission();
delay(5);
//アドレスを1つ進める
inc_address();
}//eeprom_write
void eeprom_puts(char *str1) {
//文字の中身がゼロか
while (*str1) {
//一文字出力
eeprom_write(*str1 ++);
} //while
}//eeprom_puts
void eeprom_write_s(unsigned char *str1, unsigned int len1) {
for (int ii = 0; ii < len1; ii++) {
//一文字出力
eeprom_write(*str1 ++);
}//for
}//eeprom_write_s
//初期化処理
void setup() {
//シリアルの初期化
Serial.begin(9600);
Serial.println("\r\n<START>\r\n");
//I2Cの初期化
Wire.begin();
//一文字書き込みテスト
init_address(); //アドレスを0にセット
eeprom_write( (unsigned char)'@' );
Serial.println(" '@' Eeprom Write OK!!");
//一文字の読み込みテスト
init_address(); //アドレスを0にセット
Serial.println( (char)eeprom_char() );
//文字列の書き込みテスト
init_address(); //アドレスを0にセット
eeprom_puts("Hello world!!\r\n ");
Serial.println(" 'Hello world!!' Eeprom Write OK!!");
//文字列の読み込みテスト
init_address(); //アドレスを0にセット
unsigned char str[32+1];
eeprom_read(str,16);str[16]=0;
Serial.println( (char *)str );
}//setup
//メインループ
void loop()
{
}//loop
テストプログラム
#include <iostream>
using namespace std;
//クラスの定義
struct _Wire {
void beginTransmission(int add); //メソッドの宣言
void endTransmission(); //メソッドの宣言
void requestFrom(int add,int ln); //メソッドの宣言
void write(unsigned char ch); //メソッドの宣言
unsigned char read(); //メソッドの宣言
int available(); //メソッドの宣言
};
//メソッドの定義
void _Wire::beginTransmission(int add)
{
printf("[beginTransmission] %x\r\n",add);
}//begin
//メソッドの定義
void _Wire::endTransmission()
{
printf("[endTransmission]\r\n");
}//begin
int p_ln=0;
//メソッドの定義
void _Wire::requestFrom(int add,int ln)
{
p_ln = ln;
printf("[requestFrom]\r\n");
}//begin
//メソッドの定義
void _Wire::write(unsigned char ch)
{
printf("[write] %x\r\n",ch);
}//begin
//メソッドの定義
unsigned char _Wire::read()
{
printf("[read]\r\n");
return( (unsigned char)'#' );
}//begin
//メソッドの定義
int _Wire::available()
{
int re;
if(p_ln <= 0) { re = 0; }
else { re = 1; p_ln--;}
printf("[available]\r\n");
return(re);
}//begin
//実体の作成
_Wire Wire;
void delay(int a) {
printf("[delay] %d\r\n",a);
}
//eepromのアドレス
unsigned int eerpom_address = 0;
//アドレスを0にする
void init_address() {
eerpom_address = 0;
}
//アドレスに値をセットする
void set_address(unsigned int ad1) {
eerpom_address = ad1;
}
//アドレスの値を読み出す
unsigned int read_address() {
return(eerpom_address);
}
//アドレスの値に1つインクリメントする
void inc_address() {
eerpom_address++;
}
//一文字の読み出し
unsigned char eeprom_char(){
unsigned char ad_h = (read_address() >> 8) & 0xff;
unsigned char ad_l = read_address() & 0xff;
inc_address();//アドレスを1つ進める
Wire.beginTransmission(0x50);
//アドレス
Wire.write(ad_h); // H
Wire.write(ad_l); // L
Wire.endTransmission();
//データ
Wire.requestFrom(0x50, 1);
while (Wire.available() == 0 ) {}
return(Wire.read());
}//eeprom_char
//連続読み セグメントを跨がない事?
void eeprom_read(unsigned char *str1,unsigned int len1) {
unsigned char ad_h = (read_address() >> 8) & 0xff;
unsigned char ad_l = read_address() & 0xff;
//読み込みアドレスの設定
//ダミー書き込み
Wire.beginTransmission(0x50);
//アドレス
Wire.write(ad_h); //H
Wire.write(ad_l); //L
//データ
Wire.endTransmission();
//delay(1);
//バイト連続読み
unsigned int ii=0;
unsigned char s[32+1];
if(len1 >= 32) { len1 = 32; }
Wire.requestFrom(0x50, len1);
//データが続くだけ読む
while(Wire.available()) { // 要求より短いデータが来る可能性あり
str1[ii++] = (int)Wire.read(); // 1バイトを受信
inc_address();//アドレスを1つ進める
}//while
}//eeprom_read
void eeprom_write(unsigned char ch1) {
unsigned char ad_h = (read_address() >> 8) & 0xff;
unsigned char ad_l = read_address() & 0xff;
Wire.beginTransmission(0x50);
//アドレス
Wire.write(ad_h); //H
Wire.write(ad_l); //L
//データ
Wire.write(ch1);
Wire.endTransmission();
delay(5);
//アドレスを1つ進める
inc_address();
}//eeprom_write
void eeprom_puts(char *str1) {
//文字の中身がゼロか
while (*str1) {
//一文字出力
eeprom_write(*str1 ++);
} //while
}//eeprom_puts
void eeprom_write_s(unsigned char *str1,unsigned int len1) {
for(int ii=0;ii<len1;ii++){
//一文字出力
eeprom_write(*str1 ++);
}//for
}//eeprom_write_s
int main(void){
// Your code here!
//Wire.beginTransmission(0x50);
//Wire.endTransmission();
//Wire.requestFrom(0x50,16);
//Wire.write( (unsigned char)'@' );
//int a = Wire.read();
//int b = Wire.available();
//eeprom_write( (unsigned char)'0' );
//eeprom_write( (unsigned char)'1' );
//char str[3] = {'0','1',0};
//eeprom_puts("01");
//unsigned char str[3] = {'0','1',0};
//eeprom_write_s(str,2);
//printf("%c \r\n",eeprom_char() );
unsigned char str[32+1];
eeprom_read(str,16);
printf("%s",str);
}