打印

STM32F103ZET6+K9F1G08 NAND ECC问题

[复制链接]
5289|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
a_bb|  楼主 | 2010-1-13 20:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请香帮主和damiaa 帮助看看
STM32F103ZET6+K9F1G08 NAND Flash
已经将FSMC_NAND_WriteSmallPage,FSMC_NAND_ReadSmallPage 改写,并证实读写正确
初始化时使能了ECC,并设为2048Bytes.

int main(void)
{

   u32 eccxor;
   volatile u32 ecc1 = 0xf0;
   volatile u32 ecc2= 0x0f;
#ifdef DEBUG
  debug();
#endif
  u32 i;
   
  /* System Clocks Configuration */
  RCC_Configuration();   
  /* NVIC Configuration */
  NVIC_Configuration();
  /* PB.12,13,14 config to drive LD2 and LD3,LD4 ******************************/
  /* Enable GPIOB clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  
  /* Configure PB.12,13,14 as Output push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13| GPIO_Pin_14;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
LED2OFF();  
LED3OFF();  
LED4OFF();  

  /* Enable the FSMC Clock */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);
  
  /* FSMC Initialization */
  FSMC_NAND_Init();
  /* NAND read ID command */
  FSMC_NAND_ReadID(&NAND_ID);
  /* Verify the NAND ID */
  if((NAND_ID.Maker_ID == NAND_ST_MakerID) && (NAND_ID.Device_ID == NAND_ST_DeviceID))
  {
    /* NAND memory address to write to */
    WriteReadAddr.Zone = 0x00;
    WriteReadAddr.Block = 0x00;
    WriteReadAddr.Page = 0x00;
    /* Erase the NAND first Block */
    status = FSMC_NAND_EraseBlock(WriteReadAddr);
    /* Write data to FSMC NAND memory */
    /* Fill the buffer to send */
    Fill_Buffer(TxBuffer, BUFFER_SIZE , 0x66);
    status = FSMC_NAND_WriteSmallPage(TxBuffer, WriteReadAddr, PageNumber);
/* 通过地址 0xa0000074查看生成ECC值为0x0f0f*/
ecc1 = FSMC_GetECC(FSMC_Bank2_NAND);
/* ecc1 值等于0x0f0f*/
FSMC_NANDECCCmd(FSMC_Bank2_NAND,DISABLE);
/* 通过地址 0xa0000074查看生成ECC值被清零*/
FSMC_NANDECCCmd(FSMC_Bank2_NAND,ENABLE);
    /* Read back the written data */
    status = FSMC_NAND_ReadSmallPage (RxBuffer, WriteReadAddr, PageNumber);
/*RxBuffer已经得到正确的值*/
* 通过地址 0xa0000074查看生成ECC值还是零*/
ecc2 = FSMC_GetECC(FSMC_Bank2_NAND);
FSMC_NANDECCCmd(FSMC_Bank2_NAND,DISABLE);
eccxor = ecc1 ^ ecc2;
if(eccxor==0)LED4ON();
   
  }
  else
  {
    /* Turn on LD3 */
LED3ON();  
  }
  while(1)
  {
  }
}
问题就在于,ECC使用一次后,无论如何就一直为零了。
查阅了damiaa 的帖子https://bbs.21ic.com/viewthread.php?tid=132297&highlight=ecc
说是 前面加了volatile 才开始变, 我在程序开始就定义了  volatile u32 ecc1 = 0xf0;
   volatile u32 ecc2= 0x0f; 没有作用呀!并且通过地址直接观察,ECC就是一直是0呀。
似乎ECC被DISABLE后再ENABLE也没有作用了。请解决了此问题的大侠指点一二,谢了先
沙发
zwll| | 2010-1-13 23:32 | 只看该作者
不是很懂,等待高手

使用特权

评论回复
板凳
吸铁石上| | 2010-9-19 09:38 | 只看该作者
遇到同样的问题,解决了没啊,说下哦

使用特权

评论回复
地板
pkat| | 2010-9-19 10:35 | 只看该作者
好古老的帖子,楼主不可能8个月还没解决吧:lol

使用特权

评论回复
5
香水城| | 2010-9-19 10:45 | 只看该作者
请问FSMC_NAND_WriteSmallPage()写入了多少字节?FSMC_NAND_ReadSmallPage()读出了多少字节?

使用特权

评论回复
6
jinjing999| | 2010-9-19 10:47 | 只看该作者
官方提供这个是小容量的NAND。你用的芯片是大容量的,驱动程序有点差别,当初我也是因为这个问题折腾了一天。还好好看手册,命令是有点差别。能看不懂了了,我给提供点源程序

使用特权

评论回复
7
ffeige1984| | 2010-9-19 10:49 | 只看该作者
这个是个大容量的 2K一页

使用特权

评论回复
8
吸铁石上| | 2010-9-19 13:12 | 只看该作者
我是使用K9F1208的属于小页类型,读写都是512个字节来操作,现象还是ECC读了一次后,不管如何都是0

使用特权

评论回复
9
香水城| | 2010-9-21 15:04 | 只看该作者
没有人回答我在5楼的问题呀。

使用特权

评论回复
10
爱不孤单| | 2014-7-1 15:47 | 只看该作者
香水城 发表于 2010-9-19 10:45
请问FSMC_NAND_WriteSmallPage()写入了多少字节?FSMC_NAND_ReadSmallPage()读出了多少字节? ...

他是按照页来读取与存储的,FSMC_NAND_ReadSmallPage()、FSMC_NAND_WriteSmallPage()都是操作的页,flash芯片不一样,对应的大小也就不一样;
比如,K9F2808芯片一页就是528Byte(512Byte+16Byte),K9F1G08一页就是2112Byte(2048Byte+64Byte),但是实际上操作的有效数据都是Data Area,Spare Area只是记录坏块数据的一般用不到

使用特权

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

本版积分规则

35

主题

98

帖子

0

粉丝