51 ISP IAP作用于EEPROM

ISP/IAP EEPROM

http://www.51hei.com/bbs/dpj-40283-1.html
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

具体实现代码:
-----------------------------------------------------------------------------------------------------------------------
#include
#include

#define  uchar unsigned char
#define uint  unsigned int
-----------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------
#define RDCommand0X01         //定义ISP操作命令
#define PrgCommand 0X02
#define EraseCommand 0X03

#define    error 1
#define OK  0

#define WaitTime0x01         //定义CPU的等待时间
-----------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------
sfrISP_DATA=0XE2;            //寄存器声明
sfr ISP_ADDRH=0XE3;
sfr ISP_SDDRL=0XE4;
sfr ISP_CMD=0XE5;
sfr ISP_TRIG=0XE6;
sfr ISP_CONTR=0XE7;
-----------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------
//打开ISP/IAP功能
void ISP_IAP_Enable(void)
{
   EA=0;                      //关中断
   ISP_CONTR=ISPCONTR &0X18;       //00011000
   ISP_CONTR=ISPCONTR | WaitTime;  //写入硬件延时
   ISP_CONTR=ISPCONTR |0X80;      //ISPEN=1
}
-----------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------
//关闭ISP/IAP功能
void ISP_IAP_Disable(void)
{
   ISP_CONTR=ISP_CONTR &0X7F;      //ISPEN=0
   ISP_TRIG=0X00;
   EA=1;                     //开中断   
}
-----------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------
//触发代码
void ISP_Trig(void)
{
   ISP_IAP_Enable();             //打开ISP/IAP功能
    ISP_TRIG=0X46;               //触发ISP/IAP命令字节1
    ISP_TRIG=0XB9;               //触发ISP/IAP命令字节2
   _nop_();
}
-----------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------
//指定地址---字节读
uchar  Byte_Read(uint byte_addr)
{
    ISP_ADDRH=(uchar)(byte_addr>>8);           //地址赋值
    ISP_ADDRL=(uchar)(byte_addr&0X00FF);
    ISP_CMD=ISP_CMD &0XF8;               //清除低三位
    ISP_CMD=ISP_CMD |RDCommand;            //写入读命令
   ISP_Trig();                            //触发执行
   ISP_IAP_Disable();                      //关闭ISP/IAP功能
    return(ISP_DATA);                     //返回读到的数据
}
-----------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------
//指定地址---扇区擦除
void Sector_Erase(uint sector_addr)
{
    uintSector_Addr;
    Sector_Addr=sector_addr &0XFE00;         //取扇区地址
    ISP_ADDRH=(uchar)(Sector_Addr>>8);
    ISP_ADDRL=0X00;
    ISP_CMD=ISP_CMD &0XF8;               //清空低三位
    ISP_CMD=ISP_CMD |EraseCommand;         //擦出命令3
   ISP_Trig();                            //触发执行
   ISP_IAP_Disable();                     //关闭ISP/IAP功能
}
-----------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------
//指定地址---字节写
void Byte_Write(uint byte_addr,uchar original_data)
{
    ISP_ADDRH=(uchar)(byte_addr>>8);          //取地址
    ISP_ADDRL=(uchar)(byte_addr & 0X00FF);
    ISP_CMD=ISP_CMD &0XF8;               //清除低三位
    ISP_CMD=ISP_CMD |PrgCommand;             //写命令2
    ISP_DATA=original_data;               //写入数据准备
   ISP_Trig();                            //触发执行
   ISP_IAP_Disable();                     //关闭ISP/IAP功能
}
-----------------------------------------------------------------------------------------------------------------------

最后对于代码的一些部分做一定的解释:

ISP_ADDRH= (uchar)(Sector_Addr>>8); //Sector_Addr右移8位,然后赋值给ISP_ADDRH
ISP_ADDRL= (uchar)(byte_addr & 0X00FF);//byte_addr与上0X00FF,赋值给ISP_ADDRL

次处:
dataFlash(EEPROM)的最小扇区的地址为:
2000H=0010 0000 0000 0000B ,
共计16为,而ISP_ADDRH共8位,
且为地址寄存器的高八位,右移8位,相当于舍去低8位,把地址寄存器的高8为赋予给ISP_ADDRH

对于寄存器地址,byte_addr与上0X00FF,取byte_addr的低8位,强制转换成uchar,然后赋值给ISP_ADDRL,且ISP_ADDRL为地址寄存器的低8.

下载

在这里插入图片描述
P3.0是RXD;
P3.1 TXD

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值