STM32L010でI2C EEPROで遊ぶ5(読み書き関数化)



x Mbed2リビジョン125

目的
I2C EEPROMのテスト

通販コード　K-12061

![o_con591.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/aa8b940f-2f12-b46c-69ea-c19ed290f762.jpeg)


```c++


//SER_I2C_EEPROM_read_write_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++;
}


//一文字の読み出し
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_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


int main()
{

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

    pc_puts("\r\n<START>\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");

}//main

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




```


https://paiza.io/ja/projects/new?language=c


テストプログラム


```c++



#include <stdio.h>


//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 i2c_write(int ad1, char *str1, int len1) {
    
    printf("i2c_write\r\n");
    printf("ad[%x] ",ad1);
    printf("ln[%d] ",len1);
    int h = str1[0];
    printf("[%d]" ,h  );
    int l = str1[1];
    printf("[%d] ",l  );
    
    if(len1 >= 3) {
        printf("[%d] ",str1[2]  );
    }//if
    
    printf("\r\n");
}//i2c_write

void i2c_read(int ad1, char *str1 , int len1, int f1) {

    printf("i2c_read\r\n");
    printf("ad[%x] ",ad1);
    printf("ln[%d] ",len1);
    
    char *p = "@1234567890123456789012345678901234567890";
    for(int ii=0;ii<len1;ii++){
        str1[ii]=p[ii];
    }//for
    

    printf("\r\n");    
    
}//i2c_read





#define false 0

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


    char ad_hl[2];
    char data_read[32+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]);

}//eeprom_char


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");

}//eeprom_write


int main(void){
    // Your code here!

    //set_address(0x0110);

    init_address();
    eeprom_write('@');

    init_address();
    char a = eeprom_char();
    
    

    //printf("%d\r\n",read_address() );

    
}




```