【转】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数据库的通用程序(二) 这几天又用到了该功能了,所以又改进了一版,增加了全量抽取和批量抽取两个参数.并且可以设置 ...
随机推荐
- node01-创建服务器
node学习笔记目录:node01-创建服务器 node02-util node03-events node04-buffer node05-fs node06-path node07-http no ...
- MediaElement.js对不同浏览器的支持
目前已经有很多html5播放器可以使用,使用html5播放器可以轻松的在页面中插入媒体视频,从而使我们的web页面变得更加丰富多彩,所以今天向大家推荐一款非常优秀的html5播放器MediaEleme ...
- Ubuntu下三个实用的录屏软件
Ubuntu下三个实用的录屏软件 Kazam 优点: 易安装 可选择区域录制,也可全屏录制 有录屏和截图功能 安装: sudo apt-get install kazam 展示: Simple Scr ...
- LINK1123:failure during conversion to COFF:file invalid or corrupt
参考 http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=20726500&id=4528320 试了微软官方说明:http ...
- eclipse 搭建python环境
1.安装eclipse + jdk windows下面就直接下载,双击安装就完了. Linux下: 安装eclipse: 安装完之后,可直接运行eclipse: 快捷方式在: 安装jidk: 2. ...
- 利用Queue队列实现FIFO的算法
#!/usr/bin/env python # -*- coding: utf-8 -*- # learn <<Problem Solving with Algorithms and Da ...
- 2.goldengate日常维护命令(转载)
goldengate日常维护命令 发表于 2013 年 7 月 4 日 由 Asysdba 1.查看进程状态 GGSCI (PONY) 2> info all 2.查看进程详细状态,有助于排错 ...
- 犀利的报表系统,发票据与报表开发的快速利器,AgileEAS.NET SOA中间件GReport使用指南
一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...
- 浏览器-10 Chromium 移动版
移动版 chromium 的iOS版和Android是为两个流行的移动操作系统设计的, UI方面进行了 较大的重新设计; 两者从外观上看颇为相似,但是其内部的渲染引擎的差别非常的大,原因在于iOS对应 ...
- python 线程之 数据同步 Queue
Queue:将数据从一个线程发往另外一个线程比较通用的方式是使用queue模块的Queue类 1, 首先创建一个Queue模块的对象,创建Queue对象可以传递maxsize也可以不传递 2. 使用对 ...