楼主看下这篇**,看是否有帮助

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

楼主看下这篇**,看是否有帮助

  <br /> 相关链接:<a href='http://www.21ic.com/new_info/news/files/jidong/2004928185900.html'>http://www.21ic.com/new_info/news/files/jidong/2004928185900.html</a>
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

11

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部