打印

紧急求助:FLASH问题

[复制链接]
1499|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
爱好学习者|  楼主 | 2014-5-5 09:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

写操作:
void Write_Flash(unsigned int Flash_Addr,unsigned char Flash_Data)
{
Erase();
GIE=0;
CFGS=0;
PMADRL=Flash_Addr&0xFF;
PMADRH=(Flash_Addr>>8)&0xff;
FREE=0;
LWLO=1;
WREN=1;
PMDATL =Flash_Data;
LWLO=0;
UnLock();
DelayMS(2);
WREN=0;
GIE=1; }
读操作:
void Read_Flash(unsigned int Flash_Addr)
{
PMADRL=Flash_Addr&0xFF;
PMADRH=(Flash_Addr>>8)&0x3f;
CFGS=0;
RD=1;
_nop();
_nop(); //while(RD);
PROG_DATA_LO=PMDATL;
PROG_DATA_HI=PMDATH; }
为什么读出来的数据为FF
沙发
huangxz| | 2014-5-5 10:21 | 只看该作者
你用的是c18吗,不是有个api吗,怎么不用啊

使用特权

评论回复
板凳
爱好学习者|  楼主 | 2014-5-5 11:24 | 只看该作者
不是

使用特权

评论回复
地板
huangxz| | 2014-5-5 12:08 | 只看该作者
那你的IDE里面也应该有啊,对于flash的操作还是相对复杂,如果这个都自己去调,那你还不如用汇编语言呢

使用特权

评论回复
5
爱好学习者|  楼主 | 2014-5-5 12:33 | 只看该作者
我只是想问我上面的程序有没有什么问题,还不是要改变现在的思路

使用特权

评论回复
6
yewuyi| | 2014-5-5 13:12 | 只看该作者
读写内部的EEPROM或者FLASH,要执行一个向某个寄存器送0X55和0XAA的动作。

打开你所用C编译器的安装目录,其中有一些DEMO程序,找到和读写内部FLASH相关DEMO程序,参照那个写一个适合自己用的即可。

使用特权

评论回复
7
爱好学习者|  楼主 | 2014-5-5 13:22 | 只看该作者
yewuyi 发表于 2014-5-5 13:12
读写内部的EEPROM或者FLASH,要执行一个向某个寄存器送0X55和0XAA的动作。

打开你所用C编译器的安装目录, ...

我的UNLock就是解锁程序,也就是向寄存器写0x55和0xaa的动作

使用特权

评论回复
8
yewuyi| | 2014-5-5 13:39 | 只看该作者
void                 EEpromWrite(void)
{
if(WriteEeprom){
               if(WR){}
               else{
                   if(Fcase<WriteMenuByte){
                                          EEADRH=0x00;
                                          EEADRL=Fcase;   //赋EEPROM写入地址
                                          EEDATL=Menu.MenuCaseSpace[Fcase];//赋EEPROM写入数值
                                          CFGS=DataSpace;                  //指定访问闪存区或EEPROM区
                                          EEPGD=EepromSpace;               //指定访问EEPROM区
                                          WREN=AllowWrite;                 //容许内部EEPROM写操作
                                          GIE=false;                       //发送写序列码前必须写禁止中断
                                          EECON2=0x55;                     //发送写序列码   
                                          EECON2=0xaa;
                                          WR=StartWrite;                   //启动写操作
                                          GIE=true;
                                          Fcase++;
                                          }
                  else{
                       WREN=DisAllowWrite;//禁止EEPROM/FLASH写操作
                       WriteEeprom=false;
                       }
                   }
               }
}


这是我的一个向内部EEPROM写数据的代码,写FLASH与此类似,你可以此作为参考,写0x55和0xaa的操作和其他一些指令操作直接顺序写,不要再弄成什么函数了。

使用特权

评论回复
9
yewuyi| | 2014-5-5 13:39 | 只看该作者
#define              DataSpace            0
#define              ConfigSpace          1
#define              EepromSpace          0
#define              FlashSpace           1
#define              DisAllowWrite        0
#define              AllowWrite           1
#define              StartWrite           1

使用特权

评论回复
10
兰天白云| | 2014-5-10 17:35 | 只看该作者
写0x55和0xAA有严格的时序,楼主你注意到了吗

使用特权

评论回复
11
爱好学习者|  楼主 | 2014-5-12 07:40 | 只看该作者
谢谢楼上各位的帮助,问题已解决

使用特权

评论回复
12
wangtao478552| | 2015-1-21 16:05 | 只看该作者
爱好学习者 发表于 2014-5-12 07:40
谢谢楼上各位的帮助,问题已解决

怎么解决的楼主

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

73

帖子

0

粉丝