打印

PIC12F617内部flash的读写问题

[复制链接]
5296|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
feng00x|  楼主 | 2013-4-18 08:47 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
读写内部flash时,仿真发现flash的地址寄存器PMADRH、PMADRL和数据寄存器PMDATH、PMDATL都没有变化;
而且PMCON1有异常,其值与PCL寄存器一致,如图:



写保护已关

读写函数:
/******************************************************************************
*        读数据
******************************************************************************/
uint ReadByte(uint addr)
{
        uint buff;
        PMADRH = (addr>>8) & 0x07;
        PMADRL = addr & 0xff;
        RD = 1;
        NOP();
        NOP();
        buff = ((PMDATH & 0x3f) << 8) + (PMDATL & 0xff);
       
        return buff;
}

/******************************************************************************
*        写数据
******************************************************************************/
void WriteStr(uint addr , const uint *dat)
{
        uchar i;
        GIE = 0;
        PMADRH = (addr>>8) & 0x07;   //地址高位寄存器
        PMADRL = addr & 0xff;                //地址低位寄存器
        for(i=0;i<4;i++)
        {
                PMDATH = (dat >> 8) & 0x3f;        //数据高位寄存器
                PMDATL = dat & 0xff;                        //数据低位寄存器
                WREN = 1;                //使能
                PMCON2 = 0x55;        //闪存编程序列
                PMCON2 = 0xAA;        //闪存编程序列
                WR = 1;                        //写使能
                NOP();                        //空操作
                NOP();
                WREN = 0;                //禁能
        }
        GIE = 1;
}

新手求助,问题解决立马结贴,万分感谢!!
沙发
yewuyi| | 2013-4-18 10:27 | 只看该作者
for(i=0;i<4;i++)
        {
                PMDATH = (dat >> 8) & 0x3f;        //数据高位寄存器
                PMDATL = dat & 0xff;                        //数据低位寄存器
                WREN = 1;                //使能
                PMCON2 = 0x55;        //闪存编程序列
                PMCON2 = 0xAA;        //闪存编程序列
                WR = 1;                        //写使能
                NOP();                        //空操作
                NOP();
                WREN = 0;                //禁能
        }

----------------
向FLASH写入数据后是需要延时几个毫秒的,在这个过程中不能再次发送写FLASH命令,你这个for循环或者出现连续写了把?

使用特权

评论回复
板凳
feng00x|  楼主 | 2013-4-18 12:29 | 只看该作者
yewuyi 发表于 2013-4-18 10:27
for(i=0;i> 8) & 0x3f;        //数据高位寄存器
                PMDATL = dat & 0xff;                   ...

感谢叶工的回复
关键是read的时候也没有变化,PMADRH、PMADRL地址寄存器一直是初始状态,我看了下手册上的例程,会不会跟bank的选择有关系
-------------------例程---------------------------
例3-1: 读闪存程序存储器
BANKSEL PM_ADR              ; Change STATUS bits RP1:0 to select bank with PMADRL
MOVLW MS_PROG_PM_ADDR       ;
MOVWF PMADRH                ; MS Byte of Program Address to read
MOVLW LS_PROG_PM_ADDR       ;
MOVWF PMADRL                ; LS Byte of Program Address to read
BANKSEL PMCON1              ; Bank to containing PMCON1
BSF PMCON1, RD              ; PM Read
NOP                         ; First instruction after BSF PMCON1,RD executes normally
NOP                         ; Any instructions here are ignored as program
                            ; memory is read in second cycle after BSF PMCON1,RD
                            ;
BANKSEL PMDATL              ; Bank to containing PMADRL
MOVF PMDATL, W              ; W = LS Byte of Program PMDATL
MOVF PMDATH, W              ; W = MS Byte of Program PMDATL

使用特权

评论回复
地板
yewuyi| | 2013-4-18 13:50 | 只看该作者
使用C语言编程时,BANK和PAGE是由编译器自动识别并插入相关代码的,这不需要你编写代码来切换它,所以这应当不是BANK的问题。

使用特权

评论回复
5
yklstudent| | 2013-4-18 18:50 | 只看该作者
资料的问题 坑爹的资料 不知道是本身的问题 还是翻译的问题

使用特权

评论回复
6
feng00x|  楼主 | 2013-4-19 08:58 | 只看该作者
虽然没解决,但还是谢谢各位热心解答,自从用PIC开发,项目进度各种卡壳,郁闷呐。。。

使用特权

评论回复
7
yklstudent| | 2013-4-19 12:31 | 只看该作者
看在没有正面回答问题 楼主也给分的份上
就提示下解决方法(软件仿真OK)
把数据和地址的高、低位顺序换换  问题就会解决的

使用特权

评论回复
8
chcHOPE| | 2017-3-10 10:28 | 只看该作者
我也在写一个flash驱动

使用特权

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

本版积分规则

1

主题

7

帖子

0

粉丝