首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

EEPROM为什么一次只能烧写一个

EEPROM为什么一次只能烧写一个

这个程序写一个是正确的,调用IFsh1_SetByteFlash 6次依次写进去也正确。就是不能一次写6个。


volatile unsigned char PassWordDef[6]={0x01,0x02,0x03,0x04,0x05,0x06};
volatile unsigned char PassWord[6] @0xC000;

IFsh1_Init();
delay(10);
IFsh1_SetByteFlash(0xC000,PassWordDef[0]);


byte NonDestructiveUnsecureWrite(word src, word dst, word size)
{
word x; /* Tmp. var. */

FnBurstProgCmdInRamStruct FnBurstProgCmdInRam=*(FnBurstProgCmdInRamStruct *)(FnBurstProgCmdInRam_); /* Copy function into the stack */
__RESET_WATCHDOG();
if((dst < 0xBFFF) || (dst > 0xFFAF)) /* 检查要改写的FLASH地址 */
return ERR_RANGE; /* 地址不在规定的范围内 */

if(!FSTAT_FCCF) /* Is previous command completed ? */
return ERR_BUSY; /* If no then error */
SaveStatusReg(); /* Save status information and disable interrupts(if enabled) */
FSTAT=0x00; /* Init. flash engin */
if(FSTAT & BM_FLASH_ERR_MASK) /* Potection violation or access error? */
FSTAT = BM_FLASH_ERR_MASK; /* Clear FPVIOL & FACERR flag */
__RESET_WATCHDOG();
((pFnBurstProgCmdInRam)&FnBurstProgCmdInRam)(src,dst,size); /* Call code in ram */
__RESET_WATCHDOG();
if(FSTAT & BM_FLASH_ERR_MASK) { /* Error detected? */
RestoreStatusReg(); /* Yes, restore status information and interrupt state */
if(FSTAT_FPVIOL) /* Protect violation? */
return ERR_PROTECT; /* Return error code ERR_PROTECT */
else
return ERR_NOTAVAIL; /* Return error code ERR_NOTAVAIL */
}
RestoreStatusReg(); /* Restore status information and interrupt state */
for(x=0x00;x if(((byte*)src)[x] != ((byte*)dst)[x]) /* Compare source byte and written byte */
return ERR_VALUE; /* Source value is different from dest. value, return error */
return ERR_OK;
}


byte IFsh1_SetByteFlash(word Addr,byte Data)
{

return NonDestructiveUnsecureWrite((word )&Data,Addr,0x01);
我把这里的Ox01改为0x06,应该可以写6个啊,可结果是只有第一个是对的,后面5个也写了,但不是我定义的数据。
}
可是函数IFsh1_SetByteFlash本身只有两个参数呀。
海纳百川  有容乃大
可是NonDestructiveUnsecureWrite(word src, word dst, word size)里有3个参数啊,

它调用的下面的函数也有word size这个参数啊
static void FnBurstProgCmdInRam_(word src, word dst, word size )
{
while(size--) { /* For all written bytes do: */

/* Is the src. byte equal to the dest. byte? */
*(byte *)dst = *(byte *)src; /* No, write byte to the flash memory */
FCMD = FCMD_BURST_PROGRAM; /* Initiate burst write commamd */
FSTAT = 0x80; /* Launch the command */
if(FSTAT & BM_FLASH_ERR_MASK) /* Error detected? */
return; /* Yes, return */
dst++; /* Increnent dest. pointer */
src++; /* Increnent src. pointer */
while(!FSTAT_FCCF); /* Wait for command buffer empty */

} /* while */
}
如果不能用这段程序实现一次写多个BYTE,请问可以参考哪能个例子啊

[此贴子已经被作者于2008-3-17 11:23:57编辑过]

把整个project打包贴出来看看吧。
海纳百川  有容乃大
http://bbs.chinaecnet.com/uploadImages/TestFlash6byte.rar
这是我写6次成功的程序,改成一次写入就不对了,请版主帮看看
你上传的PROJECT中没有连写6次的程序?那是我想看的。
或者,你可以关闭COP试试。
海纳百川  有容乃大
http://bbs.chinaecnet.com/uploadImages/TestFlash6byte1.rar

就是在上面我提到的地方改了一下,
另外,看门狗我关过,也是一样的结果
你是怎么关闭COP的?要注意SOPT寄存器上电后只能写一次,再次写入是无效的。
海纳百川  有容乃大
是的,我知道看门狗只能写一次.在main()里的第一句就设为关闭看门狗,SOPT = 0b01000000;然后就再没设置过,我试过的,不是看门狗的问题.
程序的问题出在参数传递上。当调用函数IFsh1_SetByteFlash时,你用的格式是:
IFsh1_SetByteFlash(0xC000,PassWordDef[0]);
同时,你可以看到函数IFsh1_SetByteFlash的格式为:
byte IFsh1_SetByteFlash(word Addr,byte Data)
{
return NonDestructiveUnsecureWrite((word )&Data,Addr,0x06); /* Write data to the flash */
}
所以,实际上在你调用函数IFsh1_SetByteFlash时,只是将一个数组元素的值传过来,它的真正地址值并没有传过来。用(word )&Data解析出的地址值是错误的。因此,你一次写6的数只有第一个是正确的。
如果要正确地一次写入6个字节,就必须将真正的地址值传过来。试试看吧,相信你能做到。
海纳百川  有容乃大
谢谢,我试下
成功啦!谢谢版主,再次感谢!!!
恭喜恭喜
海纳百川  有容乃大
返回列表