LoginSignup
0
0

More than 1 year has passed since last update.

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

Posted at

x Mbed2リビジョン125

目的
I2C EEPROMのテスト

通販コード K-12061

o_con591.jpg



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




テストプログラム




#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() );

    
}




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