x Mbed2リビジョン125
目的
I2C EEPROMのテスト
通販コード K-12061
//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, ...) {}