专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
PIC单片机
各位高人,本人是新手,使用dsPIC30F2010片子,主任让我写一个从EEPROM读写一个字的程
2020-02-08 12:19
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
6182
43
43
各位高人,本人是新手,使用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 ); //读出刚刚写入的数据
}
}
加载中...
查看其它43个回答
一周热门
更多
>
相关问题
PIC单片机不同的IO口驱动74HC573驱动共阴极的数码管,有的段不亮
1 个回答
一种简单精确的pic延时方法
21 个回答
谁熟悉PIC的产品发布时间的,帮看看PIC18F47K40啥版本IDE能开发
12 个回答
求AN1078对应的源代码下载地址
5 个回答
PIC单片机应用技巧
4 个回答
相关文章
一种用PIC单片机主时钟驱动的老式挂钟
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
PIC单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
#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 ); //读出刚刚写入的数据
}
}
一周热门 更多>