|
买了个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());
} |
|