打印

eeprom数据保存

[复制链接]
881|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zeshoufx|  楼主 | 2020-10-23 22:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、硬件i2c初始化
采用I2C0与eeprom(AT24C02)进行通讯,直接上程序
void eeprom_set(void)
{
    //时钟使能
        rcu_periph_clock_enable(RCU_GPIOB);
        rcu_periph_clock_enable(RCU_I2C0);
       
        //采用标准I2C协议
        gpio_init(GPIOB,GPIO_MODE_AF_OD,GPIO_OSPEED_MAX,GPIO_PIN_6);
        gpio_init(GPIOB,GPIO_MODE_AF_OD,GPIO_OSPEED_MAX,GPIO_PIN_7);
       
        //设置时钟速率为400KHz
        i2c_clock_config(I2C0,400000,I2C_DTCY_2);
       
        //设置为I2C模式,GD32f303的地址为0xa0
        i2c_mode_addr_config(I2C0,I2C_I2CMODE_ENABLE,I2C_ADDFORMAT_7BITS,0xa0);
       
        //使能应答信号
        i2c_ack_config(I2C0,I2C_ACK_ENABLE);
       
        //使能I2C0
        i2c_enable(I2C0);
}


使用特权

评论回复
沙发
zeshoufx|  楼主 | 2020-10-23 22:20 | 只看该作者
二、向EEPROM写入一个字节
参照时序,直接写

void eeprom_write_byte(u8 data,u8 addr)
{
//等待I2C0总线释放
        while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY));
       
        //GD32F303产生起始信号并等待起始信号发送完成
    i2c_start_on_bus(I2C0);
    while(!i2c_flag_get(I2C0, I2C_FLAG_SBSEND));
       
        //发送从机地址并等待发送完成,清除从机地址发送完成标志
    i2c_master_addressing(I2C0, 0xa0, I2C_TRANSMITTER);
    while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND));
    i2c_flag_clear(I2C0,I2C_FLAG_ADDSEND);
       
        //等待当前发送缓冲区为空,发送待写入地址信息,等待写入完成
    while(SET != i2c_flag_get(I2C0, I2C_FLAG_TBE));
    i2c_data_transmit(I2C0, addr);
    while(!i2c_flag_get(I2C0, I2C_FLAG_BTC));
       
        //写入待写数据,并等待写入完成
    i2c_data_transmit(I2C0, data);
    while(!i2c_flag_get(I2C0, I2C_FLAG_BTC));
       
        //GD32F303产生停止信号
    i2c_stop_on_bus(I2C0);
   
    while(I2C_CTL0(I2C0)&0x0200);
}


使用特权

评论回复
板凳
zeshoufx|  楼主 | 2020-10-23 22:24 | 只看该作者
zeshoufx 发表于 2020-10-23 22:20
二、向EEPROM写入一个字节
参照时序,直接写

三、读取一个字节
这里需要注意发送和接受等方向,其他等没问题


使用特权

评论回复
地板
zeshoufx|  楼主 | 2020-10-23 22:25 | 只看该作者
zeshoufx 发表于 2020-10-23 22:24
三、读取一个字节
这里需要注意发送和接受等方向,其他等没问题
u8 eeprom_read_byte(u8 addr)
{
    u8 temp=0;
   
    while(i2c_flag_get(I2C0,I2C_FLAG_I2CBSY));
       
        i2c_start_on_bus(I2C0);
        while(!i2c_flag_get(I2C0,I2C_FLAG_SBSEND));
       
        i2c_master_addressing(I2C0,0xa0,I2C_TRANSMITTER);
        while(!i2c_flag_get(I2C0,I2C_FLAG_ADDSEND));
        i2c_flag_clear(I2C0,I2C_FLAG_ADDSEND);
       
        while(!i2c_flag_get(I2C0,I2C_FLAG_TBE));
        i2c_data_transmit(I2C0,addr);
        while(!i2c_flag_get(I2C0,I2C_FLAG_BTC));

       
        i2c_start_on_bus(I2C0);
        while(!i2c_flag_get(I2C0,I2C_FLAG_SBSEND));
       
        i2c_master_addressing(I2C0,0xa0,I2C_RECEIVER);
        i2c_ack_config(I2C0,I2C_ACK_DISABLE);
        while(!i2c_flag_get(I2C0,I2C_FLAG_ADDSEND));
        i2c_flag_clear(I2C0,I2C_FLAG_ADDSEND);
       
        i2c_data_receive(I2C0);
       
        i2c_stop_on_bus(I2C0);
        while(I2C_CTL0(I2C0)&0x0200);
        i2c_ack_config(I2C0,I2C_ACK_ENABLE);
       
    temp=i2c_data_receive(I2C0);
        return temp;
}


使用特权

评论回复
5
zeshoufx|  楼主 | 2020-10-23 22:28 | 只看该作者

四、向EEPROM写半字
很多时候为了向EEPRM保存数据不仅仅是u8类型的,,有的时候是u16或u32或者浮点型或者字符串等
void half_word_write(u16 data,u8 addr)
{
    eeprom_write_byte(data>>8,addr);
    eeprom_wait_standby_state();
    eeprom_write_byte(data&0xff,addr+1);
    eeprom_wait_standby_state();
}


使用特权

评论回复
6
zeshoufx|  楼主 | 2020-10-23 22:29 | 只看该作者
zeshoufx 发表于 2020-10-23 22:28
四、向EEPROM写半字
很多时候为了向EEPRM保存数据不仅仅是u8类型的,,有的时候是u16或u32或者浮点型或者 ...

五、读取半字
u16 half_word_read(u8 addr)
{
    u16 temp=0;
    u8 temp1,temp2;
   
    temp1=eeprom_read_byte(addr);
    eeprom_wait_standby_state();
    temp2=eeprom_read_byte(addr+1);
    eeprom_wait_standby_state();
    temp=temp1<<8|temp2;
   
    return temp;
}


使用特权

评论回复
7
zeshoufx|  楼主 | 2020-10-23 22:30 | 只看该作者

六、写入字
void word_write(u32 data,u8 addr)
{
    half_word_write(data>>16,addr);
    half_word_write(data&0xffff,addr+2);   
}


使用特权

评论回复
8
zeshoufx|  楼主 | 2020-10-23 22:31 | 只看该作者

七、读取字
u32 word_read(u8 addr)
{
    u32 temp=0;
    u16 temp1,temp2;

    temp1=half_word_read(addr);   
    temp2=half_word_read(addr+2);

    temp=temp1<<16|temp2;

    return temp;
}

使用特权

评论回复
9
zeshoufx|  楼主 | 2020-10-23 22:34 | 只看该作者
zeshoufx 发表于 2020-10-23 22:31
七、读取字
u32 word_read(u8 addr)
{

八、向EEPROM写入浮点数
采用联合体成员共用一段内存等特性,定义一个名为eeprom_float_data等联合体,成员包括浮点和u8类型数组。
union
{
    float f_data;
    u8 data[4];
}eeprom_float_data;

void float_value_write(u8 addr,float data)
{
    eeprom_float_data.f_data=data;
   
    eeprom_write_byte(eeprom_float_data.data[0],addr);
    eeprom_wait_standby_state();
    eeprom_write_byte(eeprom_float_data.data[1],addr+1);
    eeprom_wait_standby_state();
    eeprom_write_byte(eeprom_float_data.data[2],addr+2);
    eeprom_wait_standby_state();
    eeprom_write_byte(eeprom_float_data.data[3],addr+3);
    eeprom_wait_standby_state();
}


使用特权

评论回复
10
zeshoufx|  楼主 | 2020-10-23 22:35 | 只看该作者
zeshoufx 发表于 2020-10-23 22:34
八、向EEPROM写入浮点数
采用联合体成员共用一段内存等特性,定义一个名为eeprom_float_data等联合体,成 ...

九、浮点数等读取
float float_value_read(u8 addr)
{
    eeprom_float_data.data[0]=eeprom_read_byte(addr);
    eeprom_float_data.data[1]=eeprom_read_byte(addr+1);
    eeprom_float_data.data[2]=eeprom_read_byte(addr+2);
    eeprom_float_data.data[3]=eeprom_read_byte(addr+3);
   
    return eeprom_float_data.f_data;
}


使用特权

评论回复
11
zeshoufx|  楼主 | 2020-10-23 22:41 | 只看该作者
zeshoufx 发表于 2020-10-23 22:35
九、浮点数等读取

浮点数保存和读取效果

QQ图片20201023224055.gif (5.97 MB )

浮点数保存和读取

浮点数保存和读取

使用特权

评论回复
12
zeshoufx|  楼主 | 2020-10-23 22:50 | 只看该作者
zeshoufx 发表于 2020-10-23 22:41
浮点数保存和读取效果

整形变量保存与读取结果

QQ图片1.gif (6.66 MB )

整形变量等保存与读取

整形变量等保存与读取

使用特权

评论回复
13
zeshoufx|  楼主 | 2020-10-23 22:53 | 只看该作者
zeshoufx 发表于 2020-10-23 22:50
整形变量保存与读取结果

各种数据类型等保存与读取,gd32f30开发板案例工程

demo.zip

5.88 MB

各种数据类型保存与读取

使用特权

评论回复
14
isageko| | 2020-10-23 22:56 | 只看该作者
好详细啊 谢谢楼主啦 eeprom还没学到

使用特权

评论回复
15
linxi6414| | 2020-10-24 11:02 | 只看该作者
用的居然是模拟总线,不是片内自带的?这个也没有纠错处理,如果总线出错,不是一直卡死在while()里?

使用特权

评论回复
16
无法去污粉| | 2020-10-28 23:31 | 只看该作者
gd32f30开发板案例工程
demo还不是太大,下载很快,谢谢楼注

使用特权

评论回复
17
正圆椭圆| | 2020-10-29 20:30 | 只看该作者
现在很少看到eeprom了 不过多一项技能不压身

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

66

主题

1948

帖子

14

粉丝