各位高人,本人是新手,使用dsPIC30F2010片子,主任让我写一个从EEPROM读写一个字的程

2020-02-08 12:19发布

各位高人,本人是新手,使用dsPIC30F2010片子,主任让我写一个从EEPROM读写一个字的程序,我一个星期未搞定,哭求各位帮忙,我的email:wish_free@163.com,
如果谁能帮我,我愿意与他以友相待,长期交往.
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
43条回答
wnrwnr
2020-02-11 01:08
各位,下面是小妹用C语言写的完整的向EEPROM写一个字然后读出的完整程序,编译也通过了,但就是结果不对,仿真的时候总是擦除函数和写函数的参数dm_addr_low, sourceArray和command 处于"out of scope"的状态,不知哪位大哥帮我看一下,问题在哪里.芯片是dsPIC30F2010.

#include "p30f2010.h"

_FOSC(CSW_FSCM_OFF&XT_PLL4);                                //4倍频锁相环
_FWDT(WDT_OFF);
_FBORPOR(PBOR_OFF&MCLR_EN);
_FGS(CODE_PROT_OFF);

unsigned int EEdata;                                //储存从EEPROM的字单元读出的数据

#define NVMCON_WriteOneWordEEPROM   0x4004              //写一个字的命令字
#define NVMCON_WriteOneRowEEPROM    0x4005
#define NVMCON_ReadOneWordEEPROM    0x4004
#define NVMCON_EraseOneWordEEPROM   0x4044
#define NVMCON_EraseOneRowEEPROM    0x4045

unsigned int pp;                                                        //读写的地址
unsigned int qq;                                                        //写入的值
unsigned int Send_data[6]={0x41,0x42,0x43,0x44,0x45,0x46};

//擦除EEPROM中一个字
void eraseOneWordEEProm( unsigned int dm_addr_low )
{
           NVMADRU = 0x7F;                                                 //EEPROM表头TBLPAG位置。
        NVMADR = dm_addr_low;                                         //要擦除的地址。
        startWriting( NVMCON_EraseOneWordEEPROM );                            //擦除EEPROM中一个字
          NVMCONbits.WREN = 0;                                         //禁止编程操作
}

//编程一个字
void writeOneWordEEProm( unsigned int dm_addr_low, unsigned int sourceArray)
{
    TBLPAG = 0x7F;                                                 //给表头寄存器赋值,准备写缓冲。
    WREG4 = sourceArray;                                        //数据          
    WREG5 = dm_addr_low;                                           //目标数据地址
    asm volatile ("TBLWTL.W w4,[w5]");                                       //把数据写到目标地址,
    startWriting( NVMCON_WriteOneWordEEPROM);
    NVMCONbits.WREN = 0;                                         //禁止编程操作
}

//从EEPROM中读取一个字
unsigned int  getEEPromData( unsigned int eePromAdd )
{
        TBLPAG = 0x7F;                                                         //给表头寄存器赋值
        WREG0 = eePromAdd;         //数据地址
        asm volatile ("TBLRDL  [W0], W4");                //读EEPROM中的一个字
        EEdata= WREG4;
        return EEdata;                                                        //返回读到的数据       
}

//写入命令子程序
void startWriting( unsigned int command )
{
    NVMCON = command;                                                 
    asm volatile ( "push SR" );                       
    asm volatile ( "mov         #0x00e0, w0" );        //使CPU的中断优先级为7级,屏蔽一切中断
    asm volatile ( "ior        SR" );   
        asm volatile( "mov  #0x55, w0" );                //往寄存器NVMKEY里写0x55和0xAA
    asm volatile( "mov  w0, NVMKEY" );
    asm volatile( "mov  #0xAA, w0" );
        asm volatile( "mov  w0, NVMKEY" );
        NVMCONbits.WR = 1;                           
        while (NVMCONbits.WR == 1);                         
        asm volatile ( "pop         SR" );                                //操作EEPROM结束之后,弹出状态寄存器
}
int main(void)                                                               
{
        pp=0xFC00;
        qq=Send_data[0];
        eraseOneWordEEProm( pp );
        writeOneWordEEProm( pp, qq);
        while(1)
        {
                EEdata=getEEPromData( pp );    //读出刚刚写入的数据
        }

}

一周热门 更多>