K9F2808,程序采用模拟时序的方法,外挂在arm上,参考了坛子的程序<br /><br />目前读ID遇到这样的情况,掉电后读ID,第一次读到FFFF,第二次才能读到,每次都这样。<br /><br />读写页面就一点都不正常,读出来全部是FF,在线求助。。。。。。<br /><br />//写命令<br />void NFWrCmd(uint8 cmd)<br />{<br /> OS_ENTER_CRITICAL();<br /> NF_DPORT_OUT;<br /> NF_ALE_CLR;<br /> NF_nCS_CLR;<br /> NF_CLE_SET;<br /> NF_nWE_CLR;<br /> FIO3SET |= (uint32)cmd;<br /> NF_nWE_SET;<br /> NF_CLE_CLR;<br /> NF_ALE_SET;<br /> OS_EXIT_CRITICAL();<br />}<br /><br />//写地址<br />void NFWrAddr(uint8 addr)<br />{<br /> OS_ENTER_CRITICAL();<br /> NF_DPORT_OUT;<br /> NF_nWE_SET;<br /> NF_nCS_CLR;<br /> NF_CLE_CLR;<br /> NF_ALE_SET;<br /> NF_nWE_CLR;<br /> FIO3SET |= (uint32)addr;<br /> NF_nWE_SET;<br /> NF_BUSY_END; // wait busy end<br /><br /> NF_ALE_CLR;<br /> OS_EXIT_CRITICAL();<br />}<br /><br />//写数据<br />void NFWrDat(uint8 dat)<br />{<br /> OS_ENTER_CRITICAL();<br /> NF_DPORT_OUT;<br /> NF_nWE_SET;<br /> NF_CLE_CLR;<br /> NF_nCS_CLR;<br /> NF_ALE_CLR;<br /> NF_nWE_CLR;<br /> NF_BUSY_END; // wait busy end<br /> FIO3SET |= (uint32)dat;<br /> NF_BUSY_END; // wait busy end<br /> NF_nWE_SET;<br /> OS_EXIT_CRITICAL();<br />}<br /><br />//读数据<br />uint8 NFRdDat(void)<br />{<br /><br /> uint8 Rdata;<br /> OS_ENTER_CRITICAL();<br /> NF_DPORT_IN;<br /> NF_nWE_SET;<br /> NF_CLE_CLR;<br /> NF_ALE_CLR;<br /> NF_nCS_CLR;<br /> NF_nOE_CLR;<br /> NF_BUSY_END; // wait busy end<br /><br /> Rdata = (UINT8)( FIO3PIN );<br /> NF_BUSY_END;<br /> NF_nOE_SET;<br /> OS_EXIT_CRITICAL();<br /> return Rdata;<br /><br />}<br /><br /><br />/*********************************************************************************************************<br />** 函数名: NF_ReadPage()<br />** 说 明: 读页面<br />*********************************************************************************************************/<br />void NF_ReadPage(uint32 Block, uint8 Page,uint8 *Buff)<br />{<br /><br /> uint16 i, j;<br /> uint32 BlockPage;<br /> uint8 HAdd;<br /> uint8 MAdd;<br /> uint8 LAdd;<br /> uint8 *bufPt = Buff;<br /> <br /> //每块32页,每页512字节<br /> Page &= 0x1F; //[Page = A9,A10,A11,A12,A13]<br /> //计算实际地址<br /> BlockPage = (Block<<5) + Page; //[Block = A14 ...]<br /> LAdd = (unsigned char)(BlockPage & 0xFF);<br /> MAdd = (unsigned char)(BlockPage>>8 & 0xFF);<br /> HAdd = (unsigned char)(BlockPage>>16 & 0xFF);<br /> <br /> //读写NAND的时候,总线不可以变化,中断读写特殊寄存器可能引起总线跳变<br /> OS_ENTER_CRITICAL();<br /><br /> NFWrCmd(0x00);<br /> NFWrAddr(0x00);<br /> //NFWriteAdd(HAdd, MAdd, LAdd);<br /> NFWrAddr(LAdd);<br /> NFWrAddr(MAdd);<br /> NFWrAddr(HAdd);<br /><br /> //The 528 bytes of data within the selected page are<br /> //transferred to the data registers in less than 12us(tR).<br /> for (j=0; j<10; j++); //wait tWB(100ns)/////??????<br /><br /> NF_BUSY_END; // Wait tR(max 12us)<br /><br /> for (i=0;i<512;i++)<br /> {<br /> *bufPt++ = NFRdDat(); // Read one page<br /> }<br /><br /> OS_EXIT_CRITICAL();//开中断<br />}<br /><br /><br />/*********************************************************************************************************<br />** 函数名: NF_WritePage()<br />** 说 明: 写页面<br />*********************************************************************************************************/<br />uint8 NF_WritePage(uint32 Block, uint8 Page, uint8 *Buff)<br />{<br /><br /> uint8 Status;<br /> uint8 HAdd;<br /> uint8 MAdd;<br /> uint8 LAdd;<br /> uint16 i;<br /> uint32 BlockPage;<br /> uint8 *bufPt = Buff;<br /> <br /> <br /><br /> //每块32页,每页512字节<br /> Page &= 0x1F; //[Page = A9,A10,A11,A12,A13]<br /> //计算实际地址<br /> BlockPage = (Block<<5) + Page; //[Block = A14 ...]<br /> LAdd = (unsigned char)(BlockPage & 0xFF);<br /> MAdd = (unsigned char)(BlockPage>>8 & 0xFF);<br /> HAdd = (unsigned char)(BlockPage>>16 & 0xFF);<br /><br /><br /><br /> //读写NAND的时候,总线不可以变化,中断读写特殊寄存器可能引起总线跳变<br /> OS_ENTER_CRITICAL();//关中断<br /><br /> NFWrCmd(0x80);<br /> NFWrAddr(0x00);<br /> //NFWriteAdd(HAdd, MAdd, LAdd);<br /> NFWrAddr(LAdd);<br /> NFWrAddr(MAdd);<br /> NFWrAddr(HAdd);<br /> <br /> for (i=0;i<512;i++)<br /> {<br /> NFWrDat(*bufPt++); // Write one page to NFM from buffer<br /> }<br /><br /> NFWrCmd(0x10);<br /> //Read Staus Register<br /> while (1)<br /> {//Device Operation --- BIT6<br /> NFWrCmd(0x70);<br /> Status = NFRdDat();<br /> if (Status & (1<<6))<br /> {//Busy : "0" Ready : "1"<br /> break;<br /> }<br /> }<br /> //Read Staus Register<br /> //Total Pass/Fail -- BIT0<br /> NFWrCmd(0x70);;<br /> Status = NFRdDat();<br /> if (Status & (1<<0))<br /> {//Fail : "1"<br /> OS_EXIT_CRITICAL();//开中断<br /> return 0;<br /> }<br /> else<br /> {//Pass : "0"<br /> OS_EXIT_CRITICAL();;//开中断<br /> return 1;<br /> }<br />} |
|