一、以24C02为例,比较两份规格书。

另一个型号

比较后可以发现在,上面页写:16字节,下面的页写:8字节,对于页写8字节的24C02页写超过8字节,会出错。

二、兼容两个类型的程序
////
// 功能名称: EEPROM页读写
// 适应芯片: 24C02
//--------------------------------------------------------------------------------//
//程序说明:
// 地址和数据可以随意改动,数据的范围为0~255,
// 超过的范围请参考连写或连读
//注意事项:
// 1.案例为PMS154C,其他芯片原理都相同
// 2.连读或连写请参考对应的程序
//
//

//#define _5us 5*4
//bit SCL : PA.3;//用于产生器件所有数据发送或接收的时钟
//bit SDA : PA.4;//用于器件所有数据的发送或接收

//byte Address;
//byte data;
//byte Read_Data;
//byte Write_Data;

static void init(void)//初始化函数
{
WDRESET
SCL = 1;
.delay _5us;
SDA = 1;//控制信号拉高
.delay _5us;
}

static void start(void)//启动信号子函数//向ROM发送一个开始的信号
{
WDRESET
SDA = 1;
.delay _5us;
SCL = 1;
.delay _5us;
SDA = 0;
.delay _5us;
}

static void stop(void)//停止信号子函数//向ROM发送一个停止的信号
{
WDRESET
SDA = 0;
.delay _5us;
SCl = 1;
.delay _5us;
SDA = 1;
.delay _5us;
}

static void respons(void)//应答信号子函数//接收一信号后应答
{
WDRESET
$ SDA in,pull;
.delay 1004;
SCL = 1;
.delay _5us;
while(SDA==1)
{ nop;}//WDRESET;}
SCL = 0;
.delay _5us;
$ SDA out,high;
.delay 100
4;
}

static void sendack(void)//
{
SDA = 0;
.delay _5us;
SCL = 1;
.delay _5us;
SCL = 0;
.delay _5us;
}

static void write_byte(void)//写入一个字节数据//向E2PROM写数据
{
byte temp = 0,i = 8;
WDRESET
while(i–)
{
SCL = 0;//数据可以改变
.delay _5us;
temp = data & 0x80;//保留最高位
if(temp)//写一位
SDA = 1;
else
SDA = 0;
.delay _5us;
data <<= 1;//要存的数据左移一位
SCL = 1;//数据稳定不能写了
.delay _5us;
}
SCL = 0;
.delay _5us;
SDA = 1;//稳定数据
.delay _5us;
}

static void read_byte(void)//读回一个字节
{
byte i = 8;
WDRESET
SCL = 0;//数据改变
.delay _5us;
SDA = 1;//可读信号
.delay _5us;
$ SDA in,pull;
.delay 1004;
Read_Data = 0;
while(i–)
{
Read_Data = Read_Data << 1;//写入时从高位写,读出时也一样
SCL = 1;//数据稳定,可从SDA读出一位
.delay _5us;
if(SDA)
Read_Data = Read_Data | 0x01;
else
Read_Data = Read_Data & 0xfe;
SCL = 0;//数据改变准备下一位
.delay _5us;
}
$ SDA out,high;
.delay 100
4;
}

static void write_add(void)//片内随意地址写任意数//根据起始地址、数据个数及数据写入E2PROM中
{ //Write_Data address变量
start();//起始

data = 0xa0;//E2PROM地址(ATC02为0xa0)//器件地址+写控制位
write_byte();
respons();//应答data = address;//写入数据要存放的地址
write_byte();
respons();//应答data = Write_Data;//写入数据
write_byte();
respons();//应答stop();//终止

}

void Nwrite_add(void)//片内随意地址写任意数//根据起始地址、数据个数及数据写入E2PROM中
{
Nwrite_add2A();
.delay 5000*4;
Nwrite_add2B();
}

void Nwrite_add2A(void)//片内随意地址写任意数//根据起始地址、数据个数及数据写入E2PROM中
{ //Write_Data address变量
start();//起始

data = 0xa0;//E2PROM地址(ATC02为0xa0)//器件地址+写控制位
write_byte();
respons();//应答address=0x0;
data = address;//写入数据要存放的地址
write_byte();
respons();//应答data = freq_value[0];//写入第一个数据
write_byte();
respons();//应答data = freq_value[1];//写入第二个数据
write_byte();
respons();//应答

//------连写几个数据就加几个下面的语句--------
data = freq_value[2];//写入第三个数据
write_byte();
respons();//应答
data = freq_value[3];//写入第三个数据
write_byte();
respons();//应答
data = freq_value[4];//写入第三个数据
write_byte();
respons();//应答
data = freq_value[5];//写入第三个数据
write_byte();
respons();//应答
data = freq_value[6];//写入第三个数据
write_byte();
respons();//应答
data = freq_value[7];//写入第三个数据
write_byte();
respons();//应答
/*
data = freq_value[8];//写入第三个数据
write_byte();
respons();//应答
data = freq_value[9];//写入第三个数据
write_byte();
respons();//应答
data = freq_value[10];//写入第三个数据
write_byte();
respons();//应答
data = freq_value[11];//写入第三个数据
write_byte();
respons();//应答
data = freq_value[12];//写入第三个数据
write_byte();
respons();//应答
data = freq_value[13];//写入第三个数据
write_byte();
respons();//应答
data = freq_value[14];//写入第三个数据
write_byte();
respons();//应答
data = freq_value[15];//写入第三个数据
write_byte();
respons();//应答
*/
//--------------------------------------------
stop();//终止
}

void Nwrite_add2B(void)//片内随意地址写任意数//根据起始地址、数据个数及数据写入E2PROM中
{ //Write_Data address变量
start();//起始

data = 0xa0;//E2PROM地址(ATC02为0xa0)//器件地址+写控制位
write_byte();
respons();//应答address=0x0;
data = address;//写入数据要存放的地址
data += 8;        //1k 和 2k 是8byte
write_byte();
respons();//应答

/*
data = freq_value[0];//写入第一个数据
write_byte();
respons();//应答

data = freq_value[1];//写入第二个数据
write_byte();
respons();//应答

//------连写几个数据就加几个下面的语句--------
data = freq_value[2];//写入第三个数据
write_byte();
respons();//应答
data = freq_value[3];//写入第三个数据
write_byte();
respons();//应答
data = freq_value[4];//写入第三个数据
write_byte();
respons();//应答
data = freq_value[5];//写入第三个数据
write_byte();
respons();//应答
data = freq_value[6];//写入第三个数据
write_byte();
respons();//应答
data = freq_value[7];//写入第三个数据
write_byte();
respons();//应答
*/
data = freq_value[8];//写入第三个数据
write_byte();
respons();//应答
data = freq_value[9];//写入第三个数据
write_byte();
respons();//应答
data = freq_value[10];//写入第三个数据
write_byte();
respons();//应答
data = freq_value[11];//写入第三个数据
write_byte();
respons();//应答
data = freq_value[12];//写入第三个数据
write_byte();
respons();//应答
data = freq_value[13];//写入第三个数据
write_byte();
respons();//应答
data = freq_value[14];//写入第三个数据
write_byte();
respons();//应答
data = freq_value[15];//写入第三个数据
write_byte();
respons();//应答
//--------------------------------------------
stop();//终止
}

static void read_add(void)//片内随意地址读数据//根据起始地址和读出个数,从E2PROM中读出一串数据
{ //address变量
start();//起始

data = 0xa0;//器件地址+写控制位
write_byte();
respons();//应答data = address;//数据地址
write_byte();
respons();//应答start();//起始data = 0xa1;//器件地址+读控制位
write_byte();
respons();read_byte();
.delay 1000*4;stop();//停止

}

//freq_value[12]

static void Nread_add(void)//片内随意地址读数据//根据起始地址和读出个数,从E2PROM中读出一串数据
{ //address变量
start();//起始

data = 0xa0;//器件地址+写控制位
write_byte();
respons();//应答address = 12;
data = address;//数据地址
write_byte();
respons();//应答start();//起始data = 0xa1;//器件地址+读控制位
write_byte();
respons();read_byte();//读出第一个地址的数据
freq_value[12] = Read_Data;
.delay 1000*4;//延时一下
sendack();//应答,连续读数据之间必须应答,否则数据读取失败
read_byte();//读出第二个地址的数据
freq_value[13] = Read_Data;
.delay 1000*4;//延时一下

//---------连续读几位就写几次下面的语句-----------
sendack();//应答
read_byte();//读出第三个地址的数据
freq_value[14] = Read_Data;
.delay 10004;//延时一下
//---------连续读几位就写几次下面的语句-----------
sendack();//应答
read_byte();//读出第三个地址的数据
freq_value[15] = Read_Data;
.delay 1000
4;//延时一下
//------------------------------------------------
stop();//停止
}

应广单片机例程EERPOM页写中一个BUG相关推荐

  1. 应广单片机adc_应广单片机adc和pwm例程

    应广单片机Otp单核系列主要有以下几个系列,15x系列为纯iO,13x系列为带12bit的adc,17x系列为带8bit的adc,现在我用pms132B写个adc/pwm例程,方便大家快速上手.不多说 ...

  2. 应广单片机adc和pwm例程

    应广单片机Otp单核系列主要有以下几个系列,15x系列为纯iO,13x系列为带12bit的adc,17x系列为带8bit的adc,现在我用pms132B写个adc/pwm例程,方便大家快速上手.不多说 ...

  3. 应广单片机adc_(1条消息) 应广单片机adc和pwm例程

    应广单片机Otp单核系列主要有以下几个系列,15x系列为纯iO,13x系列为带12bit的adc,17x系列为带8bit的adc,现在我用pms132B写个adc/pwm例程,方便大家快速上手.不多说 ...

  4. 应广单片机红外发射例程

    应广单片机红外发射例程,采用PMS150G,其他的MCU型号直接修改就好 //--------------PMS150G---------- // _@ // |1vdd gnd8| // |2pa7 ...

  5. 应广单片机PFS123按键中断控制数码管显示例程

    目录 应广单片机PFS123按键中断控制数码管显示视频 led数码管图片 应广单片机PFS123按键中断控制数码管显示代码 应广科技网址,开发工具,PMS123规格书:http://www.padau ...

  6. 二、应广单片机点亮一个灯

    上一节介绍基础,由于时间仓促,写得十分模糊.这一节开始从一个个实际例子,向大家展示应广单片机的各项功能.由于看本文的读者层次不相同,这里全部按照初学者视之. 废话少说,上例程: //========= ...

  7. 手机c语言mini,一、应广单片机的Mini-C语言基础

    一.概述 项目需要性价比高一点的芯片,在澄海这边,台湾的芯片占了很大的市场.台湾芯片的特点是便宜,没办法,玩具出口生产量太大,1分钱的差价都有可能累积出大价钱.选型时选了应广单片机.对于用惯了C开发的 ...

  8. 应广单片机_呼吸灯理解

    计数器的介绍 对于应广单片机来说,它提供了3种计数器,分别为 TM2\TM3\T16 其中对于TM2\TM3来说,是属于PWM计数器,用法是简单的,但是要求比较高,需要对应的引脚来达到它的要求 从芯片 ...

  9. 应广单片机开发案例应广单片机11bitPWM配置

    应广单片机有两种硬件pwm,一种是8bit,另外一种是11bit,8bit的配置稍微简单一些.现在以pms133/psm134为例子,贴一个11bit pwm配置的例子.修改一下可以应用于应广其他系列 ...

最新文章

  1. php获取会员数据代码,php将会员数据导入到ucenter的代码
  2. 征战蓝桥 —— 题解目录
  3. spring bean 小记
  4. 多核分布式队列的实现:“偷”与“自私”的运用(1)
  5. python可以调试吗_python调试的几种方法
  6. canvas添加水印
  7. Flink开发需要的环境
  8. python 基础代谢率计算_Python入门案例(三):BMR(基础代谢率)计算器
  9. java计算机毕业设计教务排课系统(附源码、数据库)
  10. Word页面视图下不显示内容但web视图下可以显示的问题
  11. 经纬财富:宜昌炒白银和炒黄金有什么不同?
  12. sap外币重估流程图_SAP外币评估配置及操作OK
  13. IE 浏览器 判断 增加 支持 IE8 IE9 IE10 IE11等 IE浏览器(是不是IE浏览器判断)
  14. SpringMVC @GetMapping注解路径冲突问题
  15. 二维码生成、扫描、图片识别(Zxing)
  16. 5 Ways To Boost Typing Speed And Accuracy
  17. django 类视图装饰器_灵活视图处理的模式,第2部分–使用装饰器
  18. java中对象的清除 正确的说法是_下列关于Java中垃圾回收的相关说法,正确的是()...
  19. ERROR Error: command failed: yarn
  20. Java 集合深入理解(13):Stack 栈

热门文章

  1. int const, const int *,int *const,int const *const 区别
  2. 新一代DaaS产品:数聚核DataN产品社区交流会 | 华坤道威专访
  3. 小刘的BUG (MySQL错误:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using passw)
  4. 808《数据结构》参考答案
  5. 【要找能给你解决问题的人解决问题】
  6. 【NOI2015】【BZOJ4199】品酒大会
  7. 互联网快讯:华为正式开启二手机业务;法院审理认定阿卡索赔猿辅导20万;极米高性能投影产品获用户青睐;谷歌Pixel 6 Pro首次放弃使用高通基带
  8. 福昕阅读器【上下分屏】阅读同一个PDF,上下文对照参考阅读,非常方便
  9. 计算机均价的公式,【转】二手笔记本电脑的价格计算方法和举例
  10. TreeView 四技