STM32L010でI2C EEPROで遊ぶ6(ライブラリーもどき)

x Mbed2リビジョン125

目的
I2C EEPROMのテスト

通販コード　K-12061

![o_con592.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/53f1d419-8f5e-52d0-7c4e-f511ece6eb2d.jpeg)



```c++

//SER_I2C_EEPROM_lib1_010_1

#include "mbed.h"

I2C i2c(PA_10, PA_9); //010

//四桁の変換
//#define DIV10(n) (((n*409)+((n*154)>>8))>>12)
int DIV10(int n)
{
    return    (((n*409)+((n*154)>>8))>>12)    ;
}
char data[16];
char *itoa9999(int d)
{

    data[4] = 0;
    data[3] = '0' + (  d - (DIV10(d) * 10)  );  // '0'+(d%10)
    d = DIV10(d);
    data[2] = '0' + (  d - (DIV10(d) * 10)  );  // '0'+(d%10)
    d = DIV10(d);
    data[1] = '0' + (  d - (DIV10(d) * 10)  );  // '0'+(d%10)
    data[0] = '0' +  DIV10(d);                  // '0'+(d/10)

    return (data);

}//itoa99

//仮想シリアルへの一文字出力 9600bps
DigitalOut TX(PA_2);
//DigitalIn  RX(PA_3);
#define UART_DELAY 101 //  1/9600 98-105
int pc_putc(char ch)
{
    TX=1;
    TX=0;//Start
    wait_us(UART_DELAY);

    for(int ii=0; ii<8; ii++) { //Data x 8
        TX=(ch>>ii)&1;
        wait_us(UART_DELAY);
    }; //for

    TX=1;//Stop
    wait_us(UART_DELAY);

    return(0);
} //pc_putc


//文字列の表示 nana_seg
int pc_puts(char *str1)
{
    //文字の中身がゼロか
    while(*str1) {
        pc_putc( *str1 ++);
    } //while

    //戻り値
    return(0);
}//pc_puts


//eepromのアドレス
int eerpom_address = 0;

//アドレスを0にする
void init_address()
{
    eerpom_address = 0;
}

//アドレスに値をセットする
void set_address(int ad1)
{
    eerpom_address = ad1;
}

//アドレスの値を読み出す
int read_address()
{
    return (eerpom_address);
}

//アドレスの値に1つインクリメントする
void inc_address()
{
    eerpom_address++;
}

//アドレスの値に足しこむ
void add_address(int ad1)
{
    eerpom_address=eerpom_address+ad1;
}


//一文字の読み出し
char eeprom_char()
{

    char ad_hl[2];
    char data_read[1];

    //アドレス
    //set address
    ad_hl[0] =    read_address() >> 8   ;
    ad_hl[1] =    read_address() & 0xff ;
    inc_address();
    //pc_puts( itoa9999(ad_hl[0]) );
    //pc_puts( "#" );
    //pc_puts( itoa9999(ad_hl[1]) );
    //pc_puts( " " );
    i2c.write(0xA0, ad_hl, 2); //addres 0

    //データの読み込み
    // Read temperature register
    i2c.read(0xA0, data_read,1,false);
    //data_read[0] = 123;
    pc_puts( itoa9999(data_read[0]) );
    pc_puts("\r\n");
    //printf("%c",data_read[0]);

    return(data_read[0]);

}//eeprom_char


//連続読み セグメントを跨がない事?
void eeprom_read(char *str1, int len1) {


    char ad_hl[2];

    //アドレス
    //set address
    ad_hl[0] =    read_address() >> 8   ;
    ad_hl[1] =    read_address() & 0xff ;
    add_address(len1);

    //pc_puts( itoa9999(ad_hl[0]) );
    //pc_puts( "#" );
    //pc_puts( itoa9999(ad_hl[1]) );
    //pc_puts( " " );
    i2c.write(0xA0, ad_hl, 2); //addres 0

     //データの読み込み
     // Read temperature register
     i2c.read(0xA0, str1, len1, false);
     //data_read[0] = 123;
     pc_puts( "Read len=" );
     pc_puts( itoa9999(len1) );
     pc_puts("\r\n");


}//eeprom_read


//一文字書き込み
void eeprom_write(char ch1)
{

    char data1[3];

    //アドレス
    //set address
    data1[0] =    read_address() >> 8   ;
    data1[1] =    read_address() & 0xff ;
    inc_address();
    //pc_puts( itoa9999(data1[0]) );
    //pc_puts( "#" );
    //pc_puts( itoa9999(data1[1]) );
    //pc_puts( " " );
    //データ
    data1[2] = ch1;
    //書き込み
    i2c.write(0xA0, data1, 3); //addres 0

    //pc_puts( itoa9999(data1[2]) );
    //pc_puts("\r\n");
    //printf("[%d]",data1[2]);
    //printf("\r\n");

    wait_ms(5);

}//eeprom_write


//文字列の出力
void eeprom_puts(char *str1) {

  //文字の中身がゼロか
  while (*str1) {

    //一文字出力
    eeprom_write(*str1 ++);

  } //while

}//eeprom_puts



//連続書き込み先頭2バイトは、予約で無視される
//例　"@@1234"の場合は、"1234"が書き込まれる@@は、破壊される
//len1は、予約の2バイトも含む長さ
void eeprom_write_s(char *str1, int len1) {

    //アドレス
    //set address
    str1[0] =    read_address() >> 8   ;
    str1[1] =    read_address() & 0xff ;
    add_address(len1 - 2);
    //pc_puts( itoa9999(data1[0]) );
    //pc_puts( "#" );
    //pc_puts( itoa9999(data1[1]) );
    //pc_puts( " " );
    //データ
    //str1[2] = ii;
    //書き込み
    i2c.write(0xA0, str1, len1); //addres 0

    pc_puts( "Write len=" );
    pc_puts( itoa9999(len1) );
    pc_puts("\r\n");

}//eeprom_write_s




int main()
{

    //char data_read[32+1]; //バッファー

    pc_puts("\r\n<START>\r\n");
    pc_puts("--------------------------\r\n");


    init_address();
    eeprom_write('@');

    pc_puts(" '@' Eeprom Write OK!!\r\n");

    init_address();
    char a = eeprom_char();

    pc_puts(" Eeprom Read OK!!\r\n");
    pc_putc( a );
    pc_puts("\r\n");

    pc_puts("--------------------------\r\n");

    //文字列の書き込みテスト
    init_address(); //アドレスを0にセット
    eeprom_puts("Hello world!!\r\n       ");

    pc_puts("'Hello world!!' Eeprom Write OK!!");


    //文字列の読み込みテスト
    init_address(); //アドレスを0にセット
    char str[32+1];
    eeprom_read(str,16);str[16]=0;
    pc_puts( (char *)str );

    pc_puts("--------------------------\r\n");


    pc_puts("eeprom_write_s [@@0123456789]\r\n");

    //             123456789012
    char buff[] = "@@0123456789";

    init_address(); //アドレスを0にセット
    eeprom_write_s( buff, 10+2);

    init_address(); //アドレスを0にセット
    eeprom_read(str,10);str[10]=0;
    pc_puts( (char *)str );

}//main

//容量削減
void error(const char* format, ...) {}




```