|
最近开始学ARM,板子是OK6410,256MB DDR,2GB Nand Flash,型号为K9GAG08U0D。
看过韦东山老师的S3C6410视频,看了S3C6410的芯片手册,然后按照讲解来设置Nand Flash控制器,结果设置完成了之后,Nand Flash一直不能继续读写,读出来的数据都是0x30,ASCII码值对应为0。而且写数据也不正确,Read ID操作得到的结果也不正确。调了一天了还是出不来,请大家帮忙看看什么原因。
程序如下:
void Nand_Init(void) //Nand Flash控制器初始化
{
rMEM_SYS_CFG &= ~((1<<1)|(1<<3));
rNFCONF &= ~((1<<30) | (7<<12) | (7<<8) | (7<<4));
rNFCONF |= (0<<12)|(2<<8)|(1<<4); //TACLS=0,TWRPH0=2,TWRPH1=1
rNFCONT |= 1;
Nand_Reset();
}
void Nand_Select(u8 n) //使能片选
{
rNFCONT &= ~(n<<1);
}
void Nand_Deselect(u8 n)
{
rNFCONT |= n<<1;
}
void Nand_Cmd(u8 cmd) //命令寄存器
{
rNFCMMD = cmd;
}
void Nand_Addr(u8 addr) //地址寄存器
{
rNFADDR = addr;
}
void Nand_Data(u32 data) //数据寄存器
{
rNFDATA = data;
}
u8 Nand_Stat(void) //Nand Flash状态检测
{
if(rNFSTAT&1==0)
return 0;
else
return 1;
}
void Nand_Write(u16 block,u8 page,u16 column,u8 data)
{
Nand_Select(1);
Nand_Cmd(0x80); //这里将地址都设置为0是试验能否向0地址写入数据
Nand_Addr(0x00);
Nand_Addr(0x00);
Nand_Addr(0x00);
Nand_Addr(0x00);
Nand_Addr(0x00);
rNFDATA = data;
Nand_Cmd(0x10);
Nand_Wait();
}
u8 Nand_Read(u16 block,u8 page,u16 column)//Nand_Read未能正确访问Nand Flash,读出数据均为48(0x30)
{
u8 data;
Nand_Select(1);
Nand_Cmd(0x00); //这里将地址都设置为0是试验能不能从0地址读出数据
Nand_Addr(0x00);
Nand_Addr(0x00);
Nand_Addr(0x00);
Nand_Addr(0x00);
Nand_Addr(0x00);
Nand_Cmd(0x30);
Nand_Wait();
data = rNFDATA&0xFF;
return data;
}
main()
{
Nand_Init();
Nand_Select(1);
Nand_Write(0,0,0,0xCC);
Uart_Trans(Nand_Read(0,0,0)); //通过串口发送读到的数据,显示为0,ASCII码值为0x30
}
读出结果一直不正确,写入结果也不正确,另外想问下,Nand Flash接了两个片选Xm0CSn2和Xm0CSn3到底哪个起作用?Nand Flash的Plane是怎么回事? |
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|