|
被k9f1208搞了快一个星期,是的,我都觉得自己水爆了。
实际上第二天,我就能读写了。但是,发现系统掉电后,再读居然读不到数据!这是不可能的,我后来猜测是自己读函数没写好。
但是,我这个二货居然重写了所有底层的读写函数,结果现在连个渣渣都读不出来。一个星期,搞不定,就此自认水货,虚心讨教。
我使用的芯片是str710,用emi接口加管脚模拟控制信号,接bank3
// 头文件里的
enum flash_control_pin_num{
CE_PIN = 3, /*gpio2,o*/
WP_PIN = 4, /*gpio2,o*/
CLE_PIN = 5, /*gpio2,o*/
ALE_PIN = 6, /*gpio2,o*/
RB_PIN = 7 /*gpio2,i*/
};
#define CE (0x0001 << CE_PIN)
#define WP (0x0001 << WP_PIN)
#define CLE (0x0001 << CLE_PIN)
#define ALE (0x0001 << ALE_PIN)
#define RB (0x0001 << RB_PIN)
//系统时钟设置。外接16M晶振。
void SystemClockInit(void){
RCCU_PCLK1Config (RCCU_RCLK_2);
RCCU_PCLK2Config (RCCU_RCLK_2);
RCCU_MCLKConfig (RCCU_DEFAULT);
RCCU_PLL1Config (RCCU_PLL1_Mul_12, RCCU_Div_6) ;
while(RCCU_FlagStatus(RCCU_PLL1_LOCK) == RESET)
{
/* Wait PLL to lock */
}
RCCU_RCLKSourceConfig (RCCU_PLL1_Output);
}
// bank3 的地址 NAND_ADDR_BASE = 0x66000000
volatile u8* _BASEADDR = (volatile u8*)NAND_ADDR_BASE;
// 一些控制管脚函数
void Nand_ALE_Active (void)
{
GPIO_BitWrite(GPIO2, ALE_PIN, 1);
}
void Nand_ALE_noActive (void)
{
GPIO_BitWrite(GPIO2, ALE_PIN, 0);
}
// io
void Nand_CE_Active (void)
{
GPIO_BitWrite(GPIO2, CE_PIN, 0);
}
void Nand_CE_noActive (void)
{
GPIO_BitWrite(GPIO2, CE_PIN, 1);
}
void Nand_WriteProtect (void)
{
GPIO_BitWrite(GPIO2, WP_PIN, 0);
}
void Nand_WriteUnprotect (void)
{
GPIO_BitWrite(GPIO2, WP_PIN, 1);
}
//nand初始化函数。
void Nand_Flash_Init(void){
volatile u16 i = 50;
EMI_Enable(EMI_BANK3, ENABLE);
EMI_Config(EMI_BANK3, EMI_SIZE_8, EMI_15_WaitStates);
GPIO_Config (GPIO2, RB, GPIO_IN_TRI_CMOS); // RnB
GPIO_Config (GPIO2, CE, GPIO_AF_PP); // Chip Selecet
GPIO_Config (GPIO2, CLE, GPIO_OUT_PP); // CLE
GPIO_Config (GPIO2, ALE, GPIO_OUT_PP); // ALE
GPIO_Config (GPIO2, WP, GPIO_OUT_PP); // WP
Nand_ALE_noActive(); // Set ALE to 0
Nand_CE_noActive(); // Set CS3 to 0, Enable
Nand_WriteUnprotect();
// Clear the status register
Nand_WriteCommand(NAND_Reset);
for(;i < 3;i--)
;
while(!IsFlashBusy());
while(!(NandReadStausRegister()&(ERROR_READY |!ERROR_PROGRAM_OR_ERASE)));
}
// 写命令函数
void Nand_WriteCommand(u8 cmd){
*((volatile u8 *)(NAND_ADDR_BASE | NAND_CLE)) = cmd;
}
// 读RB管脚忙标志
u8 IsFlashBusy(void){
return GPIO_BitRead(GPIO2, RB_PIN);
}
读状态
// 读状态
u8 NandReadStausRegister(void){
volatile u8 status;
Nand_CE_Active();
GPIO_Config(GPIO2, RB_PIN, GPIO_IN_TRI_CMOS);
Nand_WriteCommand(NAND_ReadStatusReg);
status= *(u8 *)NAND_ADDR_BASE;
Nand_CE_noActive();
return status;
}
读id
// 读芯片id
u16 Nand_ReadInfo(void){
u8 MakerCode;
u8 DeviceCode;
Nand_CE_Active();
GPIO_Config(GPIO2, RB, GPIO_IN_TRI_CMOS);
Nand_WriteCommand(NAND_ReadElectSign); //send read ID Command (90h)
GPIO_Config (GPIO2, ALE, GPIO_OUT_PP);
Nand_ALE_Active();
*(u8*)(NAND_ADDR_BASE) = (u8)(0x00); // send Address. 1cycle (00h)
Nand_ALE_noActive();
MakerCode = *_BASEADDR;
DeviceCode = *_BASEADDR;
Nand_CE_noActive();
return ((MakerCode << 8)| DeviceCode);
}
应该差不多了,现在问题是怎么也读不到芯片id。在nand的初始化函数里,连读状态都读不出来,总是0x00。我试过短接它的数据线到电源,结果还是读回来0x00!
如果有高手指出我问题所在,小弟万谢~~~
官方代码奉上。
我自己的代码,求解。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|