你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于STC89c52单片机eeprom的双字节读写问题

[复制链接]
梅子-395796 提问时间:2013-11-13 14:08 /
读写双字节时,是先写入8位,读出,然后改地址,再写入8位,读出,还是写入两个8单字节后,再读出(即 写-读-写-读模式还是写-写-读-读)。我现在遇到的问题是:我用分别写入高低8位后,再分别读这两个地方的值的时候(写-写-读-读),读出来的值是我最后一次写入的值。。。a 和c 都是unsigned int 型a=totaltime();//假设这条语句执行以后a的值为0x0001;  ah=a/256;//0x00;  al=a%256;//0x01;  sector_erase();  byte_program(ah,0x28,0x00);//写入0x00;  byte_program(al,0x28,0x01);//写入0x01;  c=byte_read(0x28,0x00) ;//这里读出的值为什么会是0x0001  c=c*256+byte_read(0x28,0x01);//这里读出的最后的值变成0x0101;c读出以后的值是0x0101;这是为什么。。。假设a执行后第一条后的值是0xabcd;到最后c的值尽然是0xcdcd;为什么呢???感觉我的地址参数写的没用啊。。。
收藏 评论1 发布时间:2013-11-13 14:08

举报

1个回答
LIUBEIHUA 回答时间:2013-11-17 18:51:40

RE:关于STC89c52单片机eeprom的双字节读写问题

给你一个双字节读写程序
union double_byte
{
        uint long_data;
        uchar single[2];
}segment;
uchar Byte_Read(uint addr);                //读一字节,调用前需打开ISP 功能
void Byte_Program(uint addr ,uchar Write_data);        //字节编程,调用前需打开ISP 功能
void Sector_Erase(uint add);                        //擦除扇区
void Isp_disable(void)
{        ISP_CONTR = 0;                //禁止ISP/IAP 操作
        ISP_CMD = 0;                //去除ISP/IAP 命令
        ISP_TRIG = 0;                //防止 ISP/IAP 命令误触发
        ISP_ADDRH = 0xff;        //地址指向非EEPROM地址区,防止误操作
        ISP_ADDRL = 0xff;        //地址指向非EEPROM地址区,防止误操作
}
//读一字节,调用前需打开ISP 功能,入口PTR = 字节地址,返回:A = 读出字节
uchar Byte_Read(uint addr)
{
        uchar Read_ISP_DATA;
        ISP_ADDRL = addr;            //地址低位
        ISP_ADDRH = addr>>8;    //送地址高位
        EA = 0;                /* 关中断 */
        ISP_CONTR = 0x81;      /*20M,是0x80 orl 1 */
        ISP_CMD = 1;           // 1表示字节读
        ISP_TRIG = 0x46;       //先送0x46再送 0xb9 ISP/IAP 触发寄存器,每次都需要如此
        ISP_TRIG = 0xb9;       //送完0xb9后 ISP/IAP 立即被触发启动
        _nop_();               //空指令
        _nop_();               //空指令
        Isp_disable();        
        EA = 1;                            /* 开中断 */
        Read_ISP_DATA=ISP_DATA;
        return(Read_ISP_DATA);
}
uint double_byte_Read(uint addr)
{        uchar byte_h, byte_l;
        byte_h=Byte_Read(addr);
        byte_l=Byte_Read(addr+1);
        segment.single[0]=byte_h;
        segment.single[1]=byte_l;
        return(segment.long_data);
}
//字节编程,调用前需打开IAP 功能,入口PTR = 字节地址, A= 须编程字节的数据
void Byte_Program(uint addr ,uchar Write_data)
{        ISP_DATA = Write_data;
        ISP_ADDRL = addr;            //地址低位
        ISP_ADDRH = addr>>8;    //送地址高位
        EA =  0;                     /* 关中断 */
        ISP_CONTR = 0x81;      
        ISP_CMD = 2;                //送扇区命令
        ISP_TRIG = 0x46;
        ISP_TRIG = 0xb9;
        _nop_();
        _nop_();
        Isp_disable();        
        EA = 1;                    /* 开中断 */
}
void double_byte_write(uint addr ,uint Write_data)
{        uchar byte_h, byte_l;
        segment.long_data=Write_data;
        byte_h = segment.single[0];
        byte_l = segment.single[1];
        Byte_Program(addr,byte_h);
        Byte_Program(addr+1,byte_l);
}

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版