LoginSignup
0
0

More than 1 year has passed since last update.

Arduino UNOでI2C EEPROで遊ぶ3(ライブラリもどき)

Last updated at Posted at 2022-07-16

目的
I2C EEPROMのテスト

秋月で売っているEEPROM 通販コード K-12061

o_con576.jpg

o_con578.jpg


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




0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0