打印

送ili9320 ucGUI程序,并咨询NAND问题!

[复制链接]
3275|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 re张风 于 2013-8-20 16:02 编辑

先说问题:
最近测试NANDFLASH,在FSMC上挂的是K9F1G08,现能正确读到ID、块擦除、页读、页写等。
现在遇到的问题是它的每页后的剩余(64字节)空间的读写,想用它来存贮ECC值及坏块情况。参考固件中的FSMC_NAND_ReadSpareArea和FSMC_NAND_WriteSpareArea函数,好像不正确。不知有没有那位用过这两个函数来操作剩余空间或用其它简单点的算法实现?也不知是不是我改过的代码有错?

代码太占篇幅,移位到4楼

ucGUI分享:
很久没有来论坛了,给大家分享一个基于ili9320的ucGUI的代码,如使用时有啥问题,直接问我就行了!

没事路过的,请帮顶一下!谢谢各位!
沙发
re张风|  楼主 | 2013-8-19 23:32 | 只看该作者
本帖最后由 re张风 于 2013-8-19 23:38 编辑

用Keil编译的,下载后,按这图片中的重命名一下,然后解压:


HOM3103_GUI-9325-5.zip (478.5 KB)

HOM3103_GUI-9325-4.zip (1.39 MB)

HOM3103_GUI-9325-3.zip (1.39 MB)

HOM3103_GUI-9325-2.zip (1.39 MB)

HOM3103_GUI-9325-1.zip (1.39 MB)













使用特权

评论回复
板凳
re张风|  楼主 | 2013-8-20 09:09 | 只看该作者
问题还在,人工置顶!!!

使用特权

评论回复
地板
re张风|  楼主 | 2013-8-20 10:28 | 只看该作者
uint32_t FSMC_NAND_WriteSpareArea(uint8_t *pBuffer, NAND_ADDRESS Address, uint32_t NumSpareAreaTowrite)
{
  uint32_t index = 0x00, numsparesreawritten = 0x00, addressstatus = NAND_VALID_ADDRESS;
  uint32_t status = NAND_READY, size = 0x00;

  while((NumSpareAreaTowrite != 0x00) && (addressstatus == NAND_VALID_ADDRESS) && (status == NAND_READY))
  {
    /* Page write Spare area command and address */
    *(__IO uint8_t *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_AREA_C;
    *(__IO uint8_t *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_WRITE0;

    *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = 0;  
    *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = 0;  
    *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_1st_CYCLE(ROW_ADDRESS);  
    *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_2nd_CYCLE(ROW_ADDRESS);  

    /* Calculate the size */
    size = NAND_SPARE_AREA_SIZE + (NAND_SPARE_AREA_SIZE * numsparesreawritten);

    /* Write the data */
    for(; index < size; index++)
    {
      *(__IO uint8_t *)(Bank_NAND_ADDR | DATA_AREA) = pBuffer[index];
    }

    *(__IO uint8_t *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_WRITE_TRUE1;

    /* Check status for successful operation */
    status = FSMC_NAND_GetStatus();

    if(status == NAND_READY)
    {
      numsparesreawritten++;      

      NumSpareAreaTowrite--;  

      /* Calculate Next page Address */
      addressstatus = FSMC_NAND_AddressIncrement(&Address);
    }      
  }

  //return (status | addressstatus);
  if( addressstatus == NAND_VALID_ADDRESS )
          return status;
  else
          return NAND_ERROR;
}

uint32_t FSMC_NAND_ReadSpareArea(uint8_t *pBuffer, NAND_ADDRESS Address, uint32_t NumSpareAreaToRead)
{
  uint32_t numsparearearead = 0x00, index = 0x00, addressstatus = NAND_VALID_ADDRESS;
  uint32_t status = NAND_READY, size = 0x00;

  while((NumSpareAreaToRead != 0x0) && (addressstatus == NAND_VALID_ADDRESS))
  {     
    /* Page Read command and page address */     
   *(__IO uint8_t *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_AREA_C;

    *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = 0;  
    *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = 0;  
    *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_1st_CYCLE(ROW_ADDRESS);  
    *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_2nd_CYCLE(ROW_ADDRESS);  

    /* Data Read */
    size = NAND_SPARE_AREA_SIZE +  (NAND_SPARE_AREA_SIZE * numsparearearead);
        
    /* Get Data into Buffer */
    for ( ;index < size; index++)
    {
      pBuffer[index] = *(__IO uint8_t *)(Bank_NAND_ADDR | DATA_AREA);
    }

    numsparearearead++;

    NumSpareAreaToRead--;

    /* Calculate page address */                                    
    addressstatus = FSMC_NAND_AddressIncrement(&Address);
  }

  status = FSMC_NAND_GetStatus();

  //return (status | addressstatus);
  if( addressstatus == NAND_VALID_ADDRESS )
          return status;
  else
          return NAND_ERROR;
}

使用特权

评论回复
5
re张风|  楼主 | 2013-8-20 16:03 | 只看该作者
:'(人工再置顶!找人解答一下!

使用特权

评论回复
6
zeluo| | 2013-8-20 21:02 | 只看该作者
帮楼主顶一个   看看别人的意见吧    看看有没有高手能解决这个问题  

使用特权

评论回复
7
re张风|  楼主 | 2013-8-20 22:47 | 只看该作者
zeluo 发表于 2013-8-20 21:02
帮楼主顶一个   看看别人的意见吧    看看有没有高手能解决这个问题

谢谢你的“顶”!继续等待!

使用特权

评论回复
8
outstanding| | 2013-8-21 10:06 | 只看该作者
  顶。。。

使用特权

评论回复
9
re张风|  楼主 | 2013-8-21 16:26 | 只看该作者
谢谢!我还得继续等待并同时做些实验啊!

使用特权

评论回复
10
playlinus| | 2013-8-23 01:34 | 只看该作者
http://boy-display.taobao.com选型最新驱动的TFT屏

使用特权

评论回复
11
610095871| | 2013-8-23 08:26 | 只看该作者
楼主对ucgui感兴趣的话 可以上bbs.anbn.cn上发表一些关于ucgui的心得体会,之后将更换域名为ucgui.net

使用特权

评论回复
12
re张风|  楼主 | 2013-8-23 09:22 | 只看该作者
本帖最后由 re张风 于 2013-8-23 13:27 编辑
610095871 发表于 2013-8-23 08:26
楼主对ucgui感兴趣的话 可以上bbs.anbn.cn上发表一些关于ucgui的心得体会,之后将更换域名为ucgui.net
...
现在对ucGUI,我只是会用,算不上有心得体会。等有全新的认识时,一定要分享。
现在是弄FLASH时遇到问题了!卡壳了!

使用特权

评论回复
13
re张风|  楼主 | 2013-8-23 09:46 | 只看该作者
playlinus 发表于 2013-8-23 01:34
http://boy-display.taobao.com选型最新驱动的TFT屏

同时2.8"的价比我的买价整整高出10多远钱!:curse:

使用特权

评论回复
14
bbstr| | 2013-8-23 11:02 | 只看该作者
    *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = 0;  
    *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = 0;  
    *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_1st_CYCLE(ROW_ADDRESS);  
    *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_2nd_CYCLE(ROW_ADDRESS);  

这部分貌似填错了,前面两个应该是一个sector的长度比如512或者2048,后面两个或者三个(具体看你接的是大页还是小页的nand)应该是你的sector的地址,比如第一个,第100个之类
    *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = 512&0xff;  
    *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = (512>>8)&0xff;  
    *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = sector_addr&0xff;  
    *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = (sector_addr>>8)&0xff;  

    *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = 2048&0xff;  
    *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = (2048>>8)&0xff;  
    *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = sector_addr&0xff;  
    *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = (sector_addr>>8)&0xff;
    *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = (sector_addr>>16)&0xff;

使用特权

评论回复
15
re张风|  楼主 | 2013-8-23 13:12 | 只看该作者
bbstr 发表于 2013-8-23 11:02
*(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = 0;  
    *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR ...

谢谢!
我现在用的是K9F1G08:它的组织结构及地址输入如下所示


读、写操作中,均按整页在进行访问,因此,送出去的前两个地址(即一个sector的地址范围)数据均为0。
在我测试的代码中,NAND_CMD_AREA_C定义的是0x50,是将访问指针设置在这一页的备份区(参考的网上其它地方的说法)
如按照你所说的,意思是将数据访问指针设置到页末(sector的末尾)?我试试你说的这法子!

使用特权

评论回复
16
bbstr| | 2013-8-23 15:22 | 只看该作者
你看看你的NAND_CMD_AREA_C定义是多少如果是0x00,那就按照我上面说的,是0x50的话,那就是指定了去读spare的,那么后面就变成这样
*(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = 2048&0xff;  
    *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = (2048>>8)&0xff;  
*(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = sector_addr&0xff;  
    *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = (sector_addr>>8)&0xff;
    *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = (sector_addr>>16)&0xff;
变为
*(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = 0;  
*(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = sector_addr&0xff;  
    *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = (sector_addr>>8)&0xff;
    *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = (sector_addr>>16)&0xff;

使用特权

评论回复
17
re张风|  楼主 | 2013-8-26 22:30 | 只看该作者
唉,什么定位指令都是白搭,直接给地址中填入一页地址的最最后一个地址进去即可。
如我用的2K页面的,一页数据的有效地址为0~2047,那么我给页地址写入2048(0x0800)即可!按正常页读写方式即可,只是控制好数据量.
非常感谢bbstr的帮助与提醒!

使用特权

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

本版积分规则

个人签名:走,向前走,再走,继续走! http://www.uectr.com

51

主题

525

帖子

1

粉丝