人若无名 便可潜心练剑.|

hazy1k

园龄:7个月粉丝:14关注:0

2024-09-04 10:54阅读: 21评论: 0推荐: 0

第20章 AT24C02存储小数

第二十章 AT24C02存储小数

1. 硬件设计

参考第18章 硬件I2C实验

2. 软件设计

2.1 编程大纲

  1. 定义小数和长整数的数组和地址

  2. 主函数测试读写小数和长整数

2.2 代码分析

这里就主要讲解主函数啦,因为其他部分是和硬件I2C一样的

#include "stm32f10x.h"
#include "usart.h"
#include "I2C.h"
#include "led.h"
#include <string.h>

#define double_addr 10 // 小数存储地址
#define long_addr 70 // 长整数存储地址

uint8_t flag = 0;
uint8_t i;
long double double_buf[7] = {0};
int long_buf[7] = {0};

int main(void)
{
	LED_Init();
	USART_Config();
	I2C_EE_Init();
	printf("这是一个EEPROM读写小数和长整数的程序\r\n");
	I2C_EE_BufferRead(&flag, 0, 1); // 读取标志位
	if(flag != 0xEE) // 如果有标志位0xCD,表示之前已经写入过数据
	{
		printf("没有找到之前写入的数据,开始写入数据\r\n");
		flag = 0xEE; // 写入标志位
		I2C_EE_BufferWrite(&flag, 0, 1); // 写入标志位
		for(i = 0; i < 7; i++)
		{
			double_buf[i] = i+0.1; // 写入小数数据
			long_buf[i] = i*100+1; // 写入长整数数据
		}
		// 写入数据
		I2C_EE_BufferWrite((void*)double_buf, double_addr, sizeof(double_buf));
		I2C_EE_BufferWrite((void*)long_buf, long_addr, sizeof(long_buf));
		printf("我们向EEPROM写入的数据为:\r\n");
		for(i = 0; i < 7; i++)
		{
			printf("小数 = %LF\r\n", double_buf[i]);
			printf("长整数 = %d\r\n", long_buf[i]);
		}
		printf("写入数据成功,复位开发板,进行数据效验\r\n");
	}
	else // 如果有标志位0xCD,表示之前已经写入过数据
	{
		printf("找到之前写入的数据,开始读取数据\r\n");
		// 读取数据
		I2C_EE_BufferRead((void*)double_buf, double_addr, sizeof(double_buf));
		I2C_EE_BufferRead((void*)long_buf, long_addr, sizeof(long_buf));
		printf("我们读取的EEPROM数据为:\r\n");
		for(i = 0; i < 7; i++)
		{
			printf("小数 = %LF\r\n", double_buf[i]);
			printf("长整数 = %d\r\n", long_buf[i]);
		}
	}
	while(1)
	{
	}
}

3. 小结

我们简单解释一下主函数吧,其他地方均与硬件I2C实验无异

  • 首先就是定义两个数组,作为缓冲区了,然后再宏定义了小数和长整数的数据存储地址

  • led,usart,i2c初始化搞起来

  • 再根据标志位来判断EEPROM内是否有数据,我们在开头就写了uint8_t cal_flag = 0;那么是没有标志位,所以我们需要进行写入操作

  if(cal_flag != 0xCD )    /*若标志等于0xcd,表示之前已有写入数据*/
  {      
    printf("\r\n没有检测到数据标志,FLASH没有存储数据,即将进行小数写入实验\r\n");
    cal_flag = 0xCD; // 给一个标志位
    I2C_EE_BufferWrite(&cal_flag, 0, 1); // 写入标志位到FLASH 
    for(k = 0; k < 7; k++ ) // 生成要存放至EEPROM的数据
    {
      double_buffer[k] = k +0.1;
      int_bufffer[k]=k*500+1 ;
    }
    /*写入小数数据到地址10*/
    I2C_EE_BufferWrite((void*)double_buffer, DOUBLE_ADDR, sizeof(double_buffer));
    /*写入整数数据到地址70*/
    I2C_EE_BufferWrite((void*)int_bufffer, LONGINT_ADDR, sizeof(int_bufffer));
    printf("向芯片写入数据:");
    // 打印我们写入的数据
    for(k = 0; k < 7; k++ )
    {
      printf("小数tx = %LF\r\n",double_buffer[k]);
      printf("整数tx = %d\r\n",int_bufffer[k]);
    }
    printf("\r\n请复位开发板,以读取数据进行检验\r\n");      
    }  

看注释应该能看个大概吧,那么我们再讲解一下:首先flag不是我们要的,于是就赋给它我们需要的嘛。用I2C_EE_BufferWrite()这个函数,把标志位写入后,我们需要写入小数和长整数数据了,通过for循环写入还有I2C_EE_BufferWrite()这个函数,之后再打印一下咯

  • 好了,现在EEPROM已经有我们写入的数据了,接下来只需读就行了
  else // 此时EEPROM已经有数据
  {      
    printf("\r\n检测到数据标志\r\n");

        /*读取小数数据*/
    I2C_EE_BufferRead((void*)double_buffer, DOUBLE_ADDR, sizeof(double_buffer));
        /*读取整数数据*/
    I2C_EE_BufferRead((void*)int_bufffer, LONGINT_ADDR, sizeof(int_bufffer));
        printf("\r\n从芯片读到数据:\r\n");            
    for( k=0; k<7; k++ )
        {
            printf("小数 rx = %LF \r\n",double_buffer[k]);
            printf("整数 rx = %d \r\n",int_bufffer[k]);                
        }
  }   

读取比写入更简单,只需I2C_EE_BufferRead()这个函数即可,函数参数是:读取的数据的缓冲区指针,接收数据的EEPROM地址,从EEPROM读取的字节数。

缓冲区就是我们一开始就定义的哪个,接收数据地址我们也宏定义了,字节数嘛就要sizeof这个函数

之后通过for循环打印出来我们读出的数据就行啦


2024.9.4 一次修订,后期不在维护

2025.1.20 稍微修改了一下程序

本文作者:hazy1k

本文链接:https://www.cnblogs.com/hazy1k/p/18396030

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   hazy1k  阅读(21)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起