源:硬件和软件兼容i2c协议的24Cxx系列EEPROM存储器

硬件上由于24c01的A0A1A2管脚不允许悬空,故暂时的想法是兼容24c02 ---24c16

使用一个dip8封装的芯片插座,A0 A1 A2管脚都悬空即可,换芯片方便

软件上24c02地址只有8位,而其他型号是大于8位的,故地址参数使用16位

256个字节作为一个大页,即largePage,测试芯片24c04空间有512字节

上代码,求测试和讨论

#include "MY51.H"
//转载请注明:http://xouou.iteye.com 求测试讨论
//stc89c52rc,11.0592MHz晶振
sbit sda=P2^; //总线连接口定义
sbit scl=P2^; //总线连接口定义 void delayus() //需要4个机器周期,大概4.34us
{
; //晶振频率11.0592M,机器周期为1.085微秒
} void iic_start() //启动信号
{
sda=;
scl=;
delayus(); //sda和scl同为高电平保持4.7us以上
_nop_(); //1.085us,共5.78us
sda=; //下降沿
delayus(); //sda低电平保持4us以上 ,这里是4.34us满足要求
} void iic_stop() //停止信号
{
sda=;_nop_(); //准备状态
scl=;
delayus(); //该状态稳定时间要求保持4us以上
sda=; //scl高电平期间,sda来一个上升沿
delayus(); //sda保持4.7us以上,4.34加上函数返回时间大于4.7us
//注:此时scl和sda都为1
} void iic_sendByte(u8 byteData) //mcu发送一个字节
{
u8 i;
u8 temp=byteData;
for(i=;i<;i++)
{
temp=temp<<; //移动后最高位到了PSW寄存器的CY位中
scl=; //准备
_nop_(); //稳定一下
sda=CY; //将待发送的数据一位位的放到sda上
_nop_();
scl=; //每一个高电平期间,ic器件都会将数据取走
_nop_();
} scl=; //如果写成scl=1;sda=1就是停止信号,不能这么写
_nop_();
sda=; //释放总线,数据总线不用时要释放
_nop_();
} u8 iic_readByte() //读一个字节
{
u8 i,temp;
scl=; //准备读数据
_nop_();
sda=; //释放总线
_nop_(); for(i=;i<;i++)
{
scl=; //mcu开始取数据
delayus(); //scl为高电平后,ic器件就会将1位数据送到sda上
//总共用时不会大于4.34us,然后就可以让mcu读sda了
temp=(temp<<)|sda; //读一位保存到temp中
scl=;
delayus();
}
return temp;
} bool iic_checkACK() //处理应答信号
{
u8 errCounts=; //定义超时量为255次
scl=;
_nop_(); while(sda) //在一段时间内检测到sda=0的话认为是应答信号
{
if(==errCounts)
{
scl=; //钳住总线
_nop_();
return FALSE; //没有应答信号
}
errCounts--;
} scl=; //钳住总线,为下1次通信做准备
_nop_();
return TRUE; //成功处理应答信号
} void iic_init() //总线初始化
{
scl=;
sda=;
delayus();
} void iic_sendACK(bool b_ACK) //发送应答或非应答信号
{
scl=; //准备
_nop_(); if(b_ACK) //ACK 发送应该信号
{
sda=;
}
else //unACK 发送非应答信号
{
sda=;
} _nop_();
scl=;
delayus(); //大于4us的延时
scl=; //钳住scl,以便继续接收数据
_nop_();
} void AT24Cxx_writeByte(u16 address,u8 dataByte)//向24cxx写一字节数据
{
u8 largePage = address/; //24c04是512字节(寻址范围0~511),largePage最大值是1
u8 addressOffset = address%; //largePage=0的话地址范围是(0~255)
iic_start();
iic_sendByte(0xa0|(largePage<<));//控制字,前4位固定1010,后三位是器件地址,末位0是写
iic_checkACK(); //mcu处理应答信号
iic_sendByte(addressOffset); //指定要写入的器件内地址在 largePage块中的偏移
iic_checkACK();
iic_sendByte(dataByte); //写数据
iic_checkACK();
iic_stop();
delayms();
//按字节写入时,24cxx在接收到停止信号后将数据擦写到内部,这需要时间
//并且在这段时间内不会响应总线上的任何请求,故让mcu有2毫秒以上的等待
} void AT24Cxx_writeData(u16 address,u8 numBytes,u8* buf)//写入任意长度数据(最大256字节)
{
while(numBytes--)
{
AT24Cxx_writeByte(address++,*buf++);
}
} void AT24Cxx_readData(u16 beginAddr,u8 dataSize,u8* buf)//读取任意长度字节到缓冲区buf中
{
u8 largePage = beginAddr/; //计算largePage,256字节为一大页
u8 addressOffset = beginAddr%; //计算相对于largePage的偏移
iic_start(); //起始信号
iic_sendByte(0xa0|(largePage<<)); //控制字,写
iic_checkACK(); //处理应答信号
iic_sendByte(addressOffset); //要读取的目标地址偏移
iic_checkACK(); //处理应答信号
iic_start(); //发送起始信号
iic_sendByte(0xa1|(largePage<<)); //控制字,读
iic_checkACK(); //处理应答信号
while(dataSize--) //读取dataSize个字节,最大256个字节
{ //dataSize用u16类型会暴掉ram的
*buf++=iic_readByte(); //读取一个个字节并保存到缓冲区buf中
iic_sendACK(dataSize); //发送应答,当dataSize为0时mcu发送非应答
}
iic_stop(); //发送停止信号
} void main()//测试
{
u8 buf[]; //接受数据的缓冲区
u8 arr[]={0x06,,,,,0x55,0x33}; //待写入的数据 iic_init(); //总线初始化
AT24Cxx_writeData(0x00+,sizeof(arr),arr); //向指定地址处开始写入7字节的数据 P1=0xff; //调试代码,用P1口的led显示
delayms(); //调试代码 AT24Cxx_readData(0x00+,sizeof(buf),buf); //从指定地址开始读3个字节
P1=buf[]; //也就是2 //led灯显示数值 while()
{
P1=~P1;
delayms();
}
}
//my51.h中主要用到
#include <reg52.h> #include "mytype.h" void delayms(u16 ms) //软延时函数
{
u16 i,j;
for(i=ms;i>;i--)
{
for(j=;j>;j--)
{}
}
}
对代码进行了改进
去掉了在写数据时的
delayms();
这句软延时代码低效 ,而且没有保障 改成加一个检测函数
bool check_icWriteComplete() //检测eeprom是否对内部擦写完成
{
iic_start();
iic_sendByte(0xa0);
return iic_checkACK();
}

硬件和软件兼容i2c协议的24Cxx系列EEPROM存储器(转)的更多相关文章

  1. 【转】24Cxx 系列EEPROM通用程序及应用

    关于I2C 学习的时候介绍得最多的就是24C02 这里存储EEPROM了,但学的时候基本只是讲讲简单的I2C 的总线数据传输而已,即使先gooogle上搜索也绝大部分这这样的文章,很少有说到如何在实际 ...

  2. STC8H开发(十二): I2C驱动AT24C08,AT24C32系列EEPROM存储

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...

  3. 安装 SQL Server 2012 的硬件和软件要求(官方全面)

    以下各节列出了安装和运行 SQL Server 2012 的最低硬件和软件要求. 有关 SharePoint 集成模式下 Analysis Services 的要求的详细信息,请参阅硬件和软件要求(S ...

  4. 安装 SQL Server 2005 的硬件和软件要求(官方全面)

    SQL Server 2005 安装要求 本主题介绍了安装 SQL Server 205 的硬件和软件要求,以及查看安装文档的说明. 硬件和软件要求(32 位和 64 位) 访问 SQL Server ...

  5. 安装 SQL Server 2008 R2 的硬件和软件要求(转)

    以下各部分列出了安装和运行 SQL Server 2008 R2 的最低硬件和软件要求.有关 SharePoint 集成模式下的 Analysis Services 的要求的详细信息,请参阅硬件和软件 ...

  6. (原创) 巩固理解I2C协议(MCU,经验)

        题外话:这几天天气突然转冷了.今天已是11月23日了,查查黄历,昨天(11月22日)刚好是小雪,一夜温度骤降,果然老祖先的经验有灵验!冬天来了,还是多加加衣服,注意保暖! 1.Abstract ...

  7. 软件模拟I2C通讯

    I2C协议概述,有相当详细的名词解释: 通信数量受限于地址空间和400Pf总线电容. 所有的数据传输过程中,SDA线的电平变化必须在SCL为低电平时进行,SDA线的电平在SCL线为高电平时要保持稳定. ...

  8. UART、SPI、I2C协议异同点

    I2C.SPI.UART都是常见的低速板级通信协议,目前主流的SoC都内置了这些通讯协议的控制器,同样,各种传感器.Touch控制器.指纹模块.蓝牙模块.WIFI模块也都兼容这三种通信方式的一种或几种 ...

  9. i2c 协议解析

    1.基本概念 主机            初始化发送,产生时钟信号和终止发送的器件 从机            被主机寻址的器件 发送器        发送数据到总线的器件 接收器        从总 ...

随机推荐

  1. apicloud本地测试安卓测试包安装

    1.liutingdeMacBook-Pro:~ js-lt$ which adb 2.liutingdeMacBook-Pro:~ js-lt$ ls 3.liutingdeMacBook-Pro: ...

  2. linux的学习系列 2--文件系统

    Linux中的所有数据都被保存在文件中,所有的文件被分配到不同的目录.目录是一种类似于树的结构,称为文件系统. 当你使用Linux时,大部分时间都会和文件打交道,通过本节可以了解基本的文件操作,如创建 ...

  3. HDU 2579/BFS/ Dating with girls(2)

    题目链接 /* 题意是是传统的迷宫加上一个条件,墙壁在k的整倍数时刻会消失,那么求到达出口的最短时间. 关键点在于某个点最多被走k次,标记vis[x][y][time%k]即可. */ #includ ...

  4. php 四种基础算法 ---- 快速排序法

    4.快速排序法 代码: function quick_sort($arr) {    //先判断是否需要继续进行    $length = count($arr);    if($length < ...

  5. [转]于Fragment和Activity之间onCreateOptionsMenu的问题

    Fragment和Activity一样,可以重写onCreateOptionsMenu方法来设定自己的菜单,其实这两个地方使用onCreateOptionsMenu的目的和效果都是完全一样的,但是由于 ...

  6. gameUnity 0.15 beta 网络游戏框架

    增加了 换人 和换衣服 ,加入了动画事件.beta版本 0.15测试版本 目前就到此,正式版本 会在7月底  和 0.2版本一起推出.届时,换装系统 将不仅仅是 换装备,而是有 换装后 打怪的体验,更 ...

  7. 代码创建xml文档并写入指定节点

    //首先创建 XmlDocument xml文档 XmlDocument xml = new XmlDocument(); //创建根节点 config XmlElement config = xml ...

  8. java 接口参数

    Example6_5.java interface SpeakHello { void speakHello(); } class Chinese implements SpeakHello { pu ...

  9. ThinkPHP 框架执行流程分析

    总体来说,应用的流程涉及到几个文件:Index.phpThinkPHP.phpThink.class.phpApp.class.phpDispatcher.class.phpThinkPHP/Mode ...

  10. Struts2 语法--action

    xml的注释: <!--叨叨叨叨--> web.xml注释格式": <?xml version="1.0" encoding="UTF-8&q ...