第20章 AT24C02存储小数
第二十章 AT24C02存储小数
1. 硬件设计
参考第18章 硬件I2C实验
2. 软件设计
2.1 编程大纲
-
定义小数和长整数的数组和地址
-
主函数测试读写小数和长整数
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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步