LoginSignup
0
0

More than 1 year has passed since last update.

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

Posted at

x Mbed2リビジョン125

目的
I2C EEPROMのテスト

通販コード K-12061

o_con592.jpg


//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, ...) {}




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