硬汉嵌入式论坛

 找回密码
 立即注册
查看: 6812|回复: 3
收起左侧

[有问必答] 求大神,V5开发板,想修改NAND FLASH,改成个2G的,然后作为U盘用。但是不知道怎修

[复制链接]

10

主题

12

回帖

42

积分

新手上路

积分
42
发表于 2014-4-23 17:32:41 | 显示全部楼层 |阅读模式
买了个v5的开发板,想把nand flash 修改大一些,然后作为U盘用,NAND用的是H27UAG8T2B。
底层页的读写写完了,格式化也写完了,但是不知道怎么和USB对接了,也没找到对接函数。
要是只改底层读写 和 格式化,然后启动USB,USB无法识别。
想知道 还需要改哪些地方。
求大神指点。
下面附 读写和格式化函数

/*
*********************************************************************************************************
* 函 数 名: FSMC_NAND_WritePage
* 功能说明: 写一组数据至NandFlash指定页面的指定位置,写入的数据长度不大于一页的大小。
* 形    参:  - _pBuffer: 指向包含待写数据的缓冲区
*             - _ulPageNo: 页号,所有的页统一编码,范围为:0 - 65535
*     - _usAddrInPage : 页内地址,范围为:0-2111
*             - _usByteCount: 写入的字节个数
* 返 回 值: 执行结果:
*    - NAND_FAIL 表示失败
*    - NAND_OK 表示成功
*********************************************************************************************************
*/
static uint8_t FSMC_NAND_WritePage(uint8_t *_pBuffer, uint32_t _ulPageNo, uint16_t _usAddrInPage, uint16_t _usByteCount)
{
uint16_t i;
  uint64_t _ulPageNo_Pag;
/* 发送页写命令 */
NAND_CMD_AREA = NAND_CMD_WRITE0;
/* 发送页内地址 , 对于 HY27UF081G2A
         Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
  第1字节: A7   A6   A5   A4   A3   A2   A1   A0  (_usPageAddr 的bit7 - bit0)
  第2字节: 0    0    A13  A12  A11  A10  A9   A8  (_usPageAddr 的bit11 - bit8, 高4bit必须是0)
  第3字节: A21  A20  A19  A18  A17  A16  A15  A14
  第4字节: A29  A28  A27  A26  A25  A24  A23  A22
   第5字节: 0    0    0    0    0    0    A31  A30
*/
_ulPageNo_Pag=_ulPageNo*(8192+448);
  NAND_ADDR_AREA = _usAddrInPage;
  NAND_ADDR_AREA = _usAddrInPage >> 8;
NAND_ADDR_AREA = _ulPageNo_Pag;
NAND_ADDR_AREA = (_ulPageNo_Pag & 0x00FF00) >> 8;
  NAND_ADDR_AREA = (_ulPageNo_Pag & 0xFF0000) >> 16;

/* 写数据 */
for(i = 0; i < _usByteCount; i++)
{
  NAND_DATA_AREA = _pBuffer;
}
NAND_CMD_AREA = NAND_CMD_WRITE_TRUE1;
/* 检查操作状态 */
if (FSMC_NAND_GetStatus() == NAND_READY)
{
  return NAND_OK;
}
return NAND_FAIL;
}
/*
*********************************************************************************************************
* 函 数 名: FSMC_NAND_ReadPage
* 功能说明: 从NandFlash指定页面的指定位置读一组数据,读出的数据长度不大于一页的大小。
* 形    参:  - _pBuffer: 指向包含待写数据的缓冲区
*             - _ulPageNo: 页号,所有的页统一编码,范围为:0 - 65535
*     - _usAddrInPage : 页内地址,范围为:0-2111
*             - _usByteCount: 字节个数
* 返 回 值: 执行结果:
*    - NAND_FAIL 表示失败
*    - NAND_OK 表示成功
*********************************************************************************************************
*/
static uint8_t FSMC_NAND_ReadPage(uint8_t *_pBuffer, uint32_t _ulPageNo, uint16_t _usAddrInPage, uint16_t _usByteCount)
{
uint16_t i;
  uint64_t _ulPageNo_Pag;
    /* 发送页面读命令 */
    NAND_CMD_AREA = NAND_CMD_AREA_A;
/* 发送页内地址 , 对于 HY27UF081G2A
         Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
  第1字节: A7   A6   A5   A4   A3   A2   A1   A0  (_usPageAddr 的bit7 - bit0)
  第2字节: 0    0    A13  A12  A11  A10  A9   A8  (_usPageAddr 的bit11 - bit8, 高4bit必须是0)
  第3字节: A21  A20  A19  A18  A17  A16  A15  A14
  第4字节: A29  A28  A27  A26  A25  A24  A23  A22
   第5字节: 0    0    0    0    0    0    A31  A30
*/
_ulPageNo_Pag=_ulPageNo*(8192+448);
  NAND_ADDR_AREA = _usAddrInPage;
  NAND_ADDR_AREA = _usAddrInPage >> 8;
NAND_ADDR_AREA = _ulPageNo_Pag;
NAND_ADDR_AREA = (_ulPageNo_Pag & 0x00FF00) >> 8;
  NAND_ADDR_AREA = (_ulPageNo_Pag & 0xFF0000) >> 16;

NAND_CMD_AREA = NAND_CMD_AREA_TRUE1;
  /* 必须等待,否则读出数据异常, 此处应该判断超时 */
for (i = 0; i < 20; i++);
while( GPIO_ReadInputDataBit(GPIOG, GPIO_Pin_6) == 0);
/* 读数据到缓冲区pBuffer */
for(i = 0; i < _usByteCount; i++)
{
  _pBuffer = NAND_DATA_AREA;
}
return NAND_OK;
}


/*
*********************************************************************************************************
* 函 数 名: FSMC_NAND_EraseBlock
* 功能说明: 擦除NAND Flash一个块(block)
* 形    参:  - _ulBlockNo: 块号,范围为:0 - 1023
* 返 回 值: NAND操作状态,有如下几种值:
*             - NAND_TIMEOUT_ERROR  : 超时错误
*             - NAND_READY          : 操作成功
*********************************************************************************************************
*/
static uint8_t FSMC_NAND_EraseBlock(uint32_t _ulBlockNo)
{
uint64_t _ulBlockNo_Pag;

_ulBlockNo_Pag=_ulBlockNo*(8192+448);
/* 发送擦除命令 */
NAND_CMD_AREA = NAND_CMD_ERASE0;
  NAND_ADDR_AREA = _ulBlockNo_Pag;
NAND_ADDR_AREA = (_ulBlockNo_Pag & 0x00FF00) >> 8;
  NAND_ADDR_AREA = (_ulBlockNo_Pag & 0xFF0000) >> 16;

NAND_CMD_AREA = NAND_CMD_ERASE1;
return (FSMC_NAND_GetStatus());
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2014-4-23 17:45:56 | 显示全部楼层
这个得需要站长出马解答了。
回复

使用道具 举报

10

主题

12

回帖

42

积分

新手上路

积分
42
 楼主| 发表于 2014-9-16 10:29:41 | 显示全部楼层
联系我吧 ,我做出来了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2014-9-16 18:56:08 | 显示全部楼层

回 ljc710871968 的帖子

ljc710871968:联系我吧 ,我做出来了 (2014-09-16 10:29) 
不错[s:151]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-16 02:09 , Processed in 0.165607 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表