【转】24Cxx 系列EEPROM通用程序及应用
关于I2C 学习的时候介绍得最多的就是24C02 这里存储EEPROM了,但学的时候基本只是讲讲简单的I2C 的总线数据传输而已,即使先gooogle上搜索也绝大部分这这样的文章,很少有说到如何在实际情况中如何使用的程序。
24Cxx系列数据块存储时也是比较讲究的,
图为 几类不同容量的芯片的存储空间结构,24C16以下空间的大于8位后的寻址高位地址在片选地址中选择,详细看芯片手册。另外要注意的就是字节页,一次连续写入的数据量不能超过一页的数据量。有些老款的芯片甚至不支持跨页写入。为了适用也参照不跨页写入的方法写这个程序。而读取数据没有这个限制,只要单片机开辟的缓存够大,可以一直连续读下去。
/*****24Cxx Seriel EEPROM*************************/
#define EEPROM 8
/********
01 -> 24C01; 02 -> 24C02; 04 -> 24C04; 08 -> 24C08;
16 -> 24C16; 32 -> 24C32; 64 -> 24C64; 128 -> 24C128;
256-> 24C256; 512 -> 24C512;
*****/ #if EEPROM==1
#define PAGE_SIZE 8
#define EE_SIZE 0x007F
#elif EEPROM==2
#define PAGE_SIZE 16
#define EE_SIZE 0x00FF
#elif EEPROM==4
#define PAGE_SIZE 16
#define EE_SIZE 0x01FF
#elif EEPROM==8
#define PAGE_SIZE 16
#define EE_SIZE 0x03FF
#elif EEPROM==16
#define PAGE_SIZE 16
#define EE_SIZE 0x07FF
#elif EEPROM==32
#define PAGE_SIZE 32
#define EE_SIZE 0x0FFF
#elif EEPROM==64
#define PAGE_SIZE 32
#define EE_SIZE 0x1FFF
#elif EEPROM==128
#define PAGE_SIZE 64
#define EE_SIZE 0x3FFF
#elif EEPROM==256
#define PAGE_SIZE 64
#define EE_SIZE 0x7FFF
#elif EEPROM==512
#define PAGE_SIZE 128
#define EE_SIZE 0xFFFF #endif
顶层用于外部程序调用的函数只有两个,读和写两个情况而已
unsigned char EEPROM_Write(unsigned char* pBuffer,unsigned int WriteAddress,unsigned char NumbyteToWrite);
unsigned char EEPROM_Read(unsigned char* pBuffer,unsigned int ReadAddress,unsigned char NumbyteToWrite);
pBuffer:要存储或读出来的数据所在的变量存储区字符串头指针;
WriteAddress/ReadAddress:要存入EEPROM所在的存储空间的第一个存储空间地址;
NumbyteToWrite:数据写入或读出的字节个数;
这样的应用比较简单 例如在头文件中分配了两类数据的存储空间起始地址DATA1、DATA2
#define DATA1 0x0010
#define DATA2 0x0050
存储数据所在缓存 EE_Buffer[20],应用程序如下写法:
EEPROM_Write(EE_Buffer,DATA1,);
这样EE_Buffer内的数据便被写入EEPROM中 0x10~0x30 的数据存储空间中了。
合理的分配陪EEPROM 的存储空间对数据管理非常重要。甚至于可以作为一个小型黑匣子一样。
unsigned char EEPROM_Write(unsigned char* pBuffer,unsigned int WriteAddress,unsigned char NumbyteToWrite)
{
unsigned char TempBuffer,Temp2Buffer;
if((WriteAddress+NumbyteToWrite) > EE_SIZE) //判断是否超出存储空间
{
return ;
}
else
{// 连续写入两次避免因EMC等因素造成的写入失败情况
IIC_WriteBuffer(pBuffer,WriteAddress,NumbyteToWrite);
IIC_WriteBuffer(pBuffer,WriteAddress,NumbyteToWrite); //读取eeprom 的数据与缓存中的数据对比 相同为确认写入成功
IIC_ReadBuffer(&TempBuffer,WriteAddress+NumbyteToWrite-,);
Temp2Buffer=*(pBuffer+NumbyteToWrite-);
if(TempBuffer==Temp2Buffer)
return ;
else
return ;
}
} unsigned char EEPROM_Read(unsigned char* pBuffer,unsigned int ReadAddress,unsigned char NumbyteToWrite)
{
if((ReadAddress+NumbyteToWrite) > EE_SIZE)
{
return ;
}
else
{
IIC_ReadBuffer(pBuffer,ReadAddress,NumbyteToWrite);
IIC_ReadBuffer(pBuffer,ReadAddress,NumbyteToWrite);
return ;
}
}
static void IIC_ReadBuffer(unsigned char* pBuffer,unsigned int ReadAddress,unsigned char NumbyteToWrite);
static void IIC_WriteBuffer(unsigned char* pBuffer,unsigned int WriteAddress,unsigned char NumByteToWrite); void IIC_ReadBuffer(unsigned char* pBuffer,unsigned int ReadAddress,unsigned char NumbyteToWrite)
{
u8 PageAddress=;
/******pageAddress is over 8bit***********/
/******判断存储地址是否超过8位************/
#if EEPROM < 32
PageAddress=(u8)(ReadAddress>>)&0x0E|ReadAddress_EEPROM;
#else
PageAddress=WriteAddress_EEPROM;
#endif IIC_ReadPage(pBuffer,PageAddress,ReadAddress,NumbyteToWrite);
}
void IIC_WriteBuffer(unsigned char* pBuffer,unsigned int WriteAddress,unsigned char NumByteToWrite)
{
u8 NumOfPage=,NumOfSingle=; //
u16 Part=;//
u8 PageAddress=;
/******pageAddress is over 8bit***********/
/******判断存储地址是否超过8位************/
#if EEPROM < 32
PageAddress=(u8)(WriteAddress>>)&0x0E|WriteAddress_EEPROM;
#else
PageAddress=WriteAddress_EEPROM;
#endif /*********判断起始地址与跨页地址的字节个数********/
Part=WriteAddress/PAGE_SIZE;
if(Part!=)
{
Part=PAGE_SIZE*(Part+)-WriteAddress;
}
else
{
Part=PAGE_SIZE-WriteAddress;
}
/******/
if(Part >= NumByteToWrite)
{
/***写入的数据个数小于跨页剩余的个数可直接写入 ***/
IIC_WritePage(pBuffer,PageAddress,WriteAddress,NumByteToWrite);
}
else
{
NumOfPage = (NumByteToWrite-Part)/PAGE_SIZE;
NumOfSingle = (NumByteToWrite-Part)%PAGE_SIZE;
pBuffer = IIC_WritePage(pBuffer,PageAddress,WriteAddress,Part);
/***1.写入的数据个数大于跨页剩余的个数先把剩余的跨页个数填充满 ***/
NumByteToWrite -= Part;
WriteAddress += Part; while(NumOfPage--)
{
pBuffer = IIC_WritePage(pBuffer,PageAddress,WriteAddress,PAGE_SIZE);
/***2.按计算的数据量占页面数,连续写入页面*******/
WriteAddress += PAGE_SIZE; }
if(NumOfSingle!=)
{
IIC_WritePage(pBuffer,PageAddress,WriteAddress,NumOfSingle);
/***3.补充页面写完后超出的不足一页数据量的数据***/
}
}
}
【转】24Cxx 系列EEPROM通用程序及应用的更多相关文章
- 硬件和软件兼容i2c协议的24Cxx系列EEPROM存储器(转)
源:硬件和软件兼容i2c协议的24Cxx系列EEPROM存储器 硬件上由于24c01的A0A1A2管脚不允许悬空,故暂时的想法是兼容24c02 ---24c16 使用一个dip8封装的芯片插座,A0 ...
- 使用Prism6 建立 Windows 10 通用程序.
使用Prism6 建立 Windows 10 通用程序. 目标: 使用prism6,建立Windows 通用程序项目. 1, 解决方案—添加新建项目—通用—空白应用—输入名称—确定—确定 2 ,引用上 ...
- Win10通用程序 UWP版HtmlAgilityPack UWP应用使用示例
Win10 UWP版HtmlAgilityPack,UWP应用使用示例下载. Win10 发布了一个多星期,sdk是随着一起发布的,我安装好vs2015和sdk 开发UWP 通用程序. 在做网络解析的 ...
- 使用 Visual Studio 生成通用的 XAML 应用程序 (Windows Phone 和 Windows 通用程序)
在Build会议上,我们发布了新的版本---Windows Phone 8.1. Windows 8.1 平台.作为开发人员,这意味着您现在可以生成 XAML 和 HTML 的通用程序,并通过分享大量 ...
- Sprite Kit教程:制作一个通用程序 2
注1:本文译自Sprite Kit Tutorial: Making a Universal App: Part 2 目录 动画的定义:可行性 属性列表 添加游戏逻辑 添加音效 何去何从 上一篇文章中 ...
- 用 MVC 5 的 EF6 Code First 入门 系列:MVC程序中实体框架的Code First迁移和部署
用 MVC 5 的 EF6 Code First 入门 系列:MVC程序中实体框架的Code First迁移和部署 这是微软官方SignalR 2.0教程Getting Started with En ...
- ABAP表抛FTP通用程序
主要功能: 1.支持R3所有表(标准.自建)下传,下传方式为FTP 2.支持输出字段选择及顺序调整 3.支持动态条件,不同的表会有不同的选择条件,根据不同的条件选择需要下传的数据 4.支持单表.多表. ...
- Delphi Excel导入 的通用程序转载
Delphi Excel导入 的通用程序 (-- ::)转载▼ 标签: it 分类: Delphi相关 步骤: 连excel(自己知道其格式,最好是没个字段在数据一一对应) 读excel数据,填入到数 ...
- hive表增量抽取到mysql(关系数据库)的通用程序(三)
hive表增量抽取到oracle数据库的通用程序(一) hive表增量抽取到oracle数据库的通用程序(二) 这几天又用到了该功能了,所以又改进了一版,增加了全量抽取和批量抽取两个参数.并且可以设置 ...
随机推荐
- [Android Pro] 常用的android工具类和库
reference to : http://blog.csdn.net/lovexieyuan520/article/details/50614086 这篇博客主要记录我认为比较有用的Android ...
- jQuery Mobile学习笔记
1.获取jQuery mobile 文件,访问jQuerymobile网站下载 (貌似使用jquery mobile后,jquery会自动在网页中添加一些class类,第一次知道的我是被吓呆的!!) ...
- 利用stack结构,将中缀表达式转换为后缀表达式并求值的算法实现
#!/usr/bin/env python # -*- coding: utf-8 -*- # learn <<Problem Solving with Algorithms and Da ...
- winform TreeView的一些用法以及异步加载
今天,主要弄了一下对于树型控件的一些方法,以及异步加载.参考: http://www.cnblogs.com/greatverve/archive/2012/03/23/winform-treevie ...
- java基础(四)
一.面向对象的三个基本特征: 1.封装,将对象的实现细节隐藏起来,并通过公共接口暴露相关功能: 2.继承,代码复用的表现,当子类继承父类后,子类作为一种特殊的父类,直接获得父类的属性和方法: 3.多态 ...
- 【CentOS】磁盘管理与vim编译器
一.查看硬盘或目录容量 1.df [-hmkiT] -h 查看系统磁盘使用情况 -m 使用MBytes显示结果 -k 使用KBytes显示结果 -i 查看inode -T 查看Type 2 ...
- poj 1141 Brackets Sequence (区间dp)
题目链接:http://poj.org/problem?id=1141 题解:求已知子串最短的括号完备的全序列 代码: #include<iostream> #include<cst ...
- 2016 Multi-University Training Contest 1 J.Subway
Subway Time Limit: 7000/3500 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Su ...
- 1.1 Quartz 2D 绘图
本文并非最终版本,如有更新或更正会第一时间置顶,联系方式详见文末 如果觉得本文内容过长,请前往本人 “简书” Quartz2D 绘图主要步骤: 1. 获取[图形上下文]对象 —— (拿到草稿纸 ...
- php 小函数
1 变量函数 a.is_xxx函数用来判断变量类型 is_numeric (PHP 4, PHP 5) — 检测变量是否为数字或数字字符串 is_int.is_integer.is_long,判断变 ...