CC2540 flash 写与读
请问如何写和读flash,
HalFlashErase(0x40);
HalFlashWrite(0x8000, buff, 30);
HalFlashRead(0x00, 0x0000, buff, 30);
为什么读出来的与写入的不一样?
Hi mo mo,
首先, 你写的地址0x8000跟你擦除的地址是对应的, 正确. (0x40 * 0x0800) / 4 = 0x8000
但你的HalFlashRead(0x00, 0x0000, buff, 30)第一个参数, page页数跟你写的HalFlashWrite(0x8000, buff, 30) 不一样, 应该是0x40, 跟HalFlashErase(0x40)里一样.
另外, 很重要的一点, 在用 HalFlashErase() 擦除的时候, 这个函数会立即返回, 而实际上flash的擦除工作仍在进行. 所以请用下面代码加个延迟:
while( FCTL & 0x80 ); // wait for erase to complete
所以请试一下如下代码:
{
HalFlashErase(0x40);
while( FCTL & 0x80 ); // wait for erase to complete
HalFlashWrite(0x8000, buff, 30);
HalFlashRead(0x40, 0x0000, buff, 30);
}
为了更好地促进我们论坛的发展,
如果提供的方法有效, 希望请把问题设为已解决, 并推荐最佳答案 :)
非常感谢!
能具体介绍下这几个函数及FCTL各参数么,这个是读写内部flash吧?cc2540的蓝牙序列号是存在哪里的?
你要的这些信息pdf资料里面都有
HalFlashErase(0x10);
delays(10);
while( FCTL & 0x80 ); // wait for erase to complete
HalFlashWrite(0x8000,arr,6);
delays(10);
HalFlashRead(0x10,0x0000,arrr,6);
你好,我想请问下为什么我这样读写flash没不行呢,读的跟写的不一样?
Yan
请问一下read的page和write的addr应该怎样换算,好像搞不清这个关系。还有和nv那个id表的value怎么换算。谢谢!
假如读的是第10页,那么写的时候的地址就是10*2048/4
我这样直接测试 开发板的LCD和串口都没有任何显示,提示IDATA overflow,请问如何解决
void testflash(void)
{
uint8 newValueBuf[20]={1,2,3,4,5,6,7,8,9};
uint8 newBuf[20]={0};
uint8 wrt[8] = {'1','2','3','4','5','6','7','8'};
uint8 page = 0x40;
uint16 addr = (uint16)page << 9;
HalFlashErase(page);
SerialPrintString("erase.....\r\n");
while( FCTL & 0x80 ); // wait for erase to complete
HalFlashWrite(addr, newValueBuf, 20);
HalFlashRead(page, 0x0000, newBuf, 20);
sbpSerialAppWrite (newBuf, 20);
SerialPrintString("\r\n");
}