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