[C语言] 求解,关于C8051闪存擦除的问题

[复制链接]
2651|16
 楼主| 入门小生 发表于 2015-12-28 09:48 | 显示全部楼层 |阅读模式
C8051, TE, AD, rc, RS
用的的C8051F310,程序如下,很简单的一个檫除问题。
#include<c8051f310.h>
#include <stdio.h>
unsigned char a;
bit c;
char EA_SAVE;
void FLASH_PageErase(unsigned int addr);
void FLASH_ByteWrite(unsigned int addr,char byte);
unsigned char FLASH_ByteRead(unsigned int addr);

void main()
{
char b=5;
PCA0MD &= ~0x40;
FLASH_PageErase(0);
        while(1)
                {
       
                a = FLASH_ByteRead(0);
                        if (a == 0)
                                {
                               
                                        FLASH_ByteWrite(0,b);
                                }
                        c=RSTSRC^6;
                        P2 = FLASH_ByteRead(0);
                }
               
}
//擦除
void FLASH_PageErase(unsigned int addr)
        {
                bit EA_SAVE=EA;
                char xdata*data pwrite;
                RSTSRC=0x00;
                VDM0CN=0x80;
                RSTSRC=0x02;
                EA=0;
                pwrite=(char xdata*)addr;
                FLKEY=0xA5;
                FLKEY=0xF1;
                PSCTL|=0x03;
                *pwrite=0;
                RSTSRC=0x00;
                VDM0CN=0x80;
                RSTSRC=0x02;
                PSCTL&=~0x03;
                EA=EA_SAVE;
        }
//写入
void FLASH_ByteWrite(unsigned int addr,char byt)
        {
                bit EA_SAVE=EA;
                char xdata*data pwrite;
                RSTSRC=0x00;
                VDM0CN=0x80;
                RSTSRC=0x02;
                EA=0;
                pwrite=(char xdata*)addr;
                FLKEY=0xA5;
                FLKEY=0xF1;
                PSCTL|=0x01;
                *pwrite=byt;
                RSTSRC=0x00;
                VDM0CN=0x80;
                RSTSRC=0x02;
                PSCTL&=~0x01;
                EA=EA_SAVE;
        }
//读取
unsigned char FLASH_ByteRead(unsigned int addr)
        {
                bit EA_SAVE=EA;
                char code*data pread;
                unsigned char byte;
                RSTSRC=0x00;
                VDM0CN=0x80;
                RSTSRC=0x02;
                EA=0;
                pread=(char code*)addr;
                byte =*pread;
                RSTSRC=0x00;
                VDM0CN=0x80;
                RSTSRC=0x02;
                EA=EA_SAVE;
                return byte;
        }
 楼主| 入门小生 发表于 2015-12-28 09:50 | 显示全部楼层
是程序有错了吗?实现不了 始终不能往里面存东西,也就判断不了读取是否成功了。。各位帮帮忙
 楼主| 入门小生 发表于 2015-12-28 09:52 来自手机 | 显示全部楼层
调试过程中 一执行到查处功能 机器代码一直就是mov R7,A
 楼主| 入门小生 发表于 2015-12-28 10:06 | 显示全部楼层
就是这样的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
ywlzh 发表于 2015-12-28 10:21 | 显示全部楼层
你去官网上找一下89C51的pdf文档,有例程有讲解,我记得我以前是用的EEPROM,不是flash,"预擦除必先写1",还有你说的是不是写进去了,你可以在程序开始的时候读你断电前写进去的东西并显示来
gaoxueyan 发表于 2015-12-28 11:17 | 显示全部楼层
你为什么只擦FLASH地址为0的地方呢?有些地方时不能擦的,你操作倒数第二个扇区试试,而且注意电源复位
 楼主| 入门小生 发表于 2015-12-28 12:01 | 显示全部楼层
gaoxueyan 发表于 2015-12-28 11:17
你为什么只擦FLASH地址为0的地方呢?有些地方时不能擦的,你操作倒数第二个扇区试试,而且注意电源复位 ...

不行,错误复位了,我擦除了地址3BFE的 ,返回的是FF,还有我发现一个问题我写0地址的时候 为什么返回值是0呢? 也没有复位 难道被锁存了?
ff8zgs 发表于 2015-12-28 12:05 | 显示全部楼层
第一 你擦除的地址不对,你擦除了第一个扇区 知道第一个扇区都是干嘛的吗 ,有mcu启动代码,中断向量等等 ,不应该擦除 这个扇区,找个其他扇区,然后flah擦除后 读取出来应该是 0xff  所以这里又有问题。flah操作代码没有问题 ,是 你处理不对 ,多看看datasheet
tjlwl 发表于 2015-12-28 12:56 来自手机 | 显示全部楼层
要定义你擦除的地址,在该地址上擦除,写入,读取
 楼主| 入门小生 发表于 2015-12-28 13:01 | 显示全部楼层
ff8zgs 发表于 2015-12-28 12:05
第一 你擦除的地址不对,你擦除了第一个扇区 知道第一个扇区都是干嘛的吗 ,有mcu启动代码,中断向量等等  ...

谢谢呀 我去改改试试
 楼主| 入门小生 发表于 2015-12-28 13:02 | 显示全部楼层
tjlwl 发表于 2015-12-28 12:56
要定义你擦除的地址,在该地址上擦除,写入,读取

这个定义了的呀
 楼主| 入门小生 发表于 2015-12-28 13:49 来自手机 | 显示全部楼层
我把地址改了。 返回的数一直都是FF
 楼主| 入门小生 发表于 2015-12-28 13:53 来自手机 | 显示全部楼层
为什么复位的标志位一开始就是置1的
ningling_21 发表于 2015-12-28 15:27 | 显示全部楼层
入门小生 发表于 2015-12-28 13:53
为什么复位的标志位一开始就是置1的

不同的复位源 会产生不同的复位寄存器的值
 楼主| 入门小生 发表于 2015-12-28 15:49 来自手机 | 显示全部楼层
谢谢大家的耐心指导,现在flash基本没有问题了。
xbyu520 发表于 2015-12-28 21:38 来自手机 | 显示全部楼层
透露你一个秘密,其实有个官方文档里写的好好的,复制过来就行
gaoxueyan 发表于 2015-12-29 11:41 | 显示全部楼层
好了就好
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

30

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部