搜索

eeprom数据保存

[复制链接]
241|16
 楼主 | 2020-10-23 22:18 | 显示全部楼层 |阅读模式
一、硬件i2c初始化
采用I2C0与eeprom(AT24C02)进行通讯,直接上程序
  1. void eeprom_set(void)
  2. {
  3.     //时钟使能
  4.         rcu_periph_clock_enable(RCU_GPIOB);
  5.         rcu_periph_clock_enable(RCU_I2C0);
  6.        
  7.         //采用标准I2C协议
  8.         gpio_init(GPIOB,GPIO_MODE_AF_OD,GPIO_OSPEED_MAX,GPIO_PIN_6);
  9.         gpio_init(GPIOB,GPIO_MODE_AF_OD,GPIO_OSPEED_MAX,GPIO_PIN_7);
  10.        
  11.         //设置时钟速率为400KHz
  12.         i2c_clock_config(I2C0,400000,I2C_DTCY_2);
  13.        
  14.         //设置为I2C模式,GD32f303的地址为0xa0
  15.         i2c_mode_addr_config(I2C0,I2C_I2CMODE_ENABLE,I2C_ADDFORMAT_7BITS,0xa0);
  16.        
  17.         //使能应答信号
  18.         i2c_ack_config(I2C0,I2C_ACK_ENABLE);
  19.        
  20.         //使能I2C0
  21.         i2c_enable(I2C0);
  22. }
复制代码


使用特权

评论回复
 楼主 | 2020-10-23 22:20 | 显示全部楼层
二、向EEPROM写入一个字节
参照时序,直接写
91865f92e6957912f.png
  1. void eeprom_write_byte(u8 data,u8 addr)
  2. {
  3. //等待I2C0总线释放
  4.         while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY));
  5.        
  6.         //GD32F303产生起始信号并等待起始信号发送完成
  7.     i2c_start_on_bus(I2C0);
  8.     while(!i2c_flag_get(I2C0, I2C_FLAG_SBSEND));
  9.        
  10.         //发送从机地址并等待发送完成,清除从机地址发送完成标志
  11.     i2c_master_addressing(I2C0, 0xa0, I2C_TRANSMITTER);
  12.     while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND));
  13.     i2c_flag_clear(I2C0,I2C_FLAG_ADDSEND);
  14.        
  15.         //等待当前发送缓冲区为空,发送待写入地址信息,等待写入完成
  16.     while(SET != i2c_flag_get(I2C0, I2C_FLAG_TBE));
  17.     i2c_data_transmit(I2C0, addr);
  18.     while(!i2c_flag_get(I2C0, I2C_FLAG_BTC));
  19.        
  20.         //写入待写数据,并等待写入完成
  21.     i2c_data_transmit(I2C0, data);
  22.     while(!i2c_flag_get(I2C0, I2C_FLAG_BTC));
  23.        
  24.         //GD32F303产生停止信号
  25.     i2c_stop_on_bus(I2C0);
  26.    
  27.     while(I2C_CTL0(I2C0)&0x0200);
  28. }
复制代码


使用特权

评论回复
 楼主 | 2020-10-23 22:24 | 显示全部楼层
zeshoufx 发表于 2020-10-23 22:20
二、向EEPROM写入一个字节
参照时序,直接写

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

使用特权

评论回复
 楼主 | 2020-10-23 22:25 | 显示全部楼层
zeshoufx 发表于 2020-10-23 22:24
三、读取一个字节
这里需要注意发送和接受等方向,其他等没问题
  1. u8 eeprom_read_byte(u8 addr)
  2. {
  3.     u8 temp=0;
  4.    
  5.     while(i2c_flag_get(I2C0,I2C_FLAG_I2CBSY));
  6.        
  7.         i2c_start_on_bus(I2C0);
  8.         while(!i2c_flag_get(I2C0,I2C_FLAG_SBSEND));
  9.        
  10.         i2c_master_addressing(I2C0,0xa0,I2C_TRANSMITTER);
  11.         while(!i2c_flag_get(I2C0,I2C_FLAG_ADDSEND));
  12.         i2c_flag_clear(I2C0,I2C_FLAG_ADDSEND);
  13.        
  14.         while(!i2c_flag_get(I2C0,I2C_FLAG_TBE));
  15.         i2c_data_transmit(I2C0,addr);
  16.         while(!i2c_flag_get(I2C0,I2C_FLAG_BTC));

  17.        
  18.         i2c_start_on_bus(I2C0);
  19.         while(!i2c_flag_get(I2C0,I2C_FLAG_SBSEND));
  20.        
  21.         i2c_master_addressing(I2C0,0xa0,I2C_RECEIVER);
  22.         i2c_ack_config(I2C0,I2C_ACK_DISABLE);
  23.         while(!i2c_flag_get(I2C0,I2C_FLAG_ADDSEND));
  24.         i2c_flag_clear(I2C0,I2C_FLAG_ADDSEND);
  25.        
  26.         i2c_data_receive(I2C0);
  27.        
  28.         i2c_stop_on_bus(I2C0);
  29.         while(I2C_CTL0(I2C0)&0x0200);
  30.         i2c_ack_config(I2C0,I2C_ACK_ENABLE);
  31.        
  32.     temp=i2c_data_receive(I2C0);
  33.         return temp;
  34. }
复制代码


使用特权

评论回复
 楼主 | 2020-10-23 22:28 | 显示全部楼层

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


使用特权

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

五、读取半字
  1. u16 half_word_read(u8 addr)
  2. {
  3.     u16 temp=0;
  4.     u8 temp1,temp2;
  5.    
  6.     temp1=eeprom_read_byte(addr);
  7.     eeprom_wait_standby_state();
  8.     temp2=eeprom_read_byte(addr+1);
  9.     eeprom_wait_standby_state();
  10.     temp=temp1<<8|temp2;
  11.    
  12.     return temp;
  13. }
复制代码


使用特权

评论回复
 楼主 | 2020-10-23 22:30 | 显示全部楼层

六、写入字
  1. void word_write(u32 data,u8 addr)
  2. {
  3.     half_word_write(data>>16,addr);
  4.     half_word_write(data&0xffff,addr+2);   
  5. }
复制代码


使用特权

评论回复
 楼主 | 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;
}

使用特权

评论回复
 楼主 | 2020-10-23 22:34 | 显示全部楼层
zeshoufx 发表于 2020-10-23 22:31
七、读取字
u32 word_read(u8 addr)
{

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

  6. void float_value_write(u8 addr,float data)
  7. {
  8.     eeprom_float_data.f_data=data;
  9.    
  10.     eeprom_write_byte(eeprom_float_data.data[0],addr);
  11.     eeprom_wait_standby_state();
  12.     eeprom_write_byte(eeprom_float_data.data[1],addr+1);
  13.     eeprom_wait_standby_state();
  14.     eeprom_write_byte(eeprom_float_data.data[2],addr+2);
  15.     eeprom_wait_standby_state();
  16.     eeprom_write_byte(eeprom_float_data.data[3],addr+3);
  17.     eeprom_wait_standby_state();
  18. }
复制代码


使用特权

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

九、浮点数等读取
  1. float float_value_read(u8 addr)
  2. {
  3.     eeprom_float_data.data[0]=eeprom_read_byte(addr);
  4.     eeprom_float_data.data[1]=eeprom_read_byte(addr+1);
  5.     eeprom_float_data.data[2]=eeprom_read_byte(addr+2);
  6.     eeprom_float_data.data[3]=eeprom_read_byte(addr+3);
  7.    
  8.     return eeprom_float_data.f_data;
  9. }
复制代码


使用特权

评论回复
 楼主 | 2020-10-23 22:41 | 显示全部楼层
zeshoufx 发表于 2020-10-23 22:35
九、浮点数等读取

浮点数保存和读取效果

浮点数保存和读取

浮点数保存和读取

使用特权

评论回复
 楼主 | 2020-10-23 22:50 | 显示全部楼层
zeshoufx 发表于 2020-10-23 22:41
浮点数保存和读取效果

整形变量保存与读取结果

整形变量等保存与读取

整形变量等保存与读取

使用特权

评论回复
 楼主 | 2020-10-23 22:53 | 显示全部楼层
zeshoufx 发表于 2020-10-23 22:50
整形变量保存与读取结果

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

demo.zip

5.88 MB, 下载次数: 3

各种数据类型保存与读取

使用特权

评论回复
| 2020-10-23 22:56 | 显示全部楼层
好详细啊 谢谢楼主啦 eeprom还没学到

使用特权

评论回复
| 2020-10-24 11:02 | 显示全部楼层
用的居然是模拟总线,不是片内自带的?这个也没有纠错处理,如果总线出错,不是一直卡死在while()里?

使用特权

评论回复
| 2020-10-28 23:31 | 显示全部楼层
gd32f30开发板案例工程
demo还不是太大,下载很快,谢谢楼注

使用特权

评论回复
| 2020-10-29 20:30 | 显示全部楼层
现在很少看到eeprom了 不过多一项技能不压身

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 我要提问 投诉建议 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表