44B0 读取flash am29lv160db的问题

[复制链接]
5382|9
 楼主| hero415 发表于 2007-8-10 10:22 | 显示全部楼层 |阅读模式
各位大虾,小弟在学习44b0,目前在调试在线编程flash&nbsp;am29lv160db的试验时,遇到一些问题,三四天了都没有办法解决,实在郁闷,望各位大虾指点,作为报酬,可以提供我刚刚调试好的以太网驱动程序,该程序在我的板子上已经运行良好,保证可以使用。<br />我的问题如下:<br />用c写的程序,每次读此flash的厂商id和设备id时都不正确,逼于无奈,嵌入了一段汇编代码,可以正确读出第一参数,但是第二个参数,即厂商id争取,设备id错误,把程序的次序调换一下,设备id又正确,厂商id&nbsp;又错误,实在没辙。<br />具体代码如下:<br /><br />int&nbsp;CMDam29lv160(int&nbsp;argc,&nbsp;char&nbsp;*argv[])<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;U32&nbsp;id;<br />&nbsp;&nbsp;&nbsp;&nbsp;id=0xffffffff;<br />&nbsp;&nbsp;&nbsp;&nbsp;rNCACHBE0=((0x2000000&gt&gt12)&lt&lt16&nbsp;)|(0x0&gt12);&nbsp;//flash&nbsp;area&nbsp;must&nbsp;be&nbsp;non-cachable&nbsp;area.<br />&nbsp;&nbsp;&nbsp;&nbsp;rNCACHBE1=(((U32)0xc000000&gt&gt12)&lt&lt16&nbsp;)|(U32)(0x6000000&gt&gt12);&nbsp;//flash&nbsp;area&nbsp;must&nbsp;be&nbsp;non-cachable&nbsp;area.<br />&nbsp;&nbsp;&nbsp;&nbsp;rSYSCFG=rSYSCFG&(~0x8);&nbsp;//write&nbsp;buffer&nbsp;has&nbsp;to&nbsp;be&nbsp;off&nbsp;for&nbsp;proper&nbsp;timing.&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;id=GetFlashId();<br />&nbsp;&nbsp;&nbsp;&nbsp;Uart_Printf(&quot;
Flash&nbsp;id=0x%x&quot;,id);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />}<br /><br />unsigned&nbsp;int&nbsp;GetFlashId&nbsp;(void)&nbsp;<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;short&nbsp;i,j;<br />&nbsp;&nbsp;&nbsp;&nbsp;i=0;j=0;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__asm&nbsp;{<br />mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,#0xf0<br />mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r4,#0x00<br />mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r8,#0xaa<br />mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r5,#0xa00<br />mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r9,#0x55<br />mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r10,#0x500<br />mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r11,#0x90<br /><br />strh&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,[r4,#0]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />strh&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r8,[r5,#0xaa]&nbsp;&nbsp;&nbsp;&nbsp;<br />strh&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r9,[r10,#0x54]<br />strh&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r11,[r5,#0xaa]<br />ldrh&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,[r4,#0]<br />ldrh&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r3,[r4,#2]<br /><br />mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i,r2<br />mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j,r3<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />&nbsp;&nbsp;return&nbsp;((unsigned&nbsp;int)((i&lt&lt16)&nbsp;|j));&nbsp;&nbsp;<br />}<br />至于c语言的代码,参考了三星的代码都不行。<br /><br />请各位指点,先谢谢各位大虾了。<br />
 楼主| hero415 发表于 2007-8-10 10:25 | 显示全部楼层

c 代码,读出都不正确

#define&nbsp;_WR(addr,data)&nbsp;&nbsp;&nbsp;&nbsp;*((&nbsp;unsigned&nbsp;short&nbsp;*)((addr)&lt&lt1))=(unsigned&nbsp;short)(data)<br />#define&nbsp;_RD(addr)&nbsp;&nbsp;&nbsp;&nbsp;*((unsigned&nbsp;short&nbsp;*)((addr)&lt&lt1))<br />#define&nbsp;_RESET()&nbsp;&nbsp;&nbsp;&nbsp;_WR(0x0,0xf0f0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /><br /><br />&nbsp;&nbsp;&nbsp;_RESET();<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;_WR(0x555,0xaa);<br />&nbsp;&nbsp;&nbsp;&nbsp;_WR(0x2aa,0x55);<br />&nbsp;&nbsp;&nbsp;&nbsp;_WR(0x555,0x90);<br />&nbsp;&nbsp;&nbsp;&nbsp;i=_RD(0x0);<br />&nbsp;&nbsp;&nbsp;&nbsp;_RESET();<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;_WR(0x555,0xaa);<br />&nbsp;&nbsp;&nbsp;&nbsp;_WR(0x2aa,0x55);<br />&nbsp;&nbsp;&nbsp;&nbsp;_WR(0x555,0x90);<br />&nbsp;&nbsp;&nbsp;&nbsp;j=_RD(0x1);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;_RESET();
 楼主| hero415 发表于 2007-8-10 13:29 | 显示全部楼层

关闭cache和中断,还是不对。

rINTMSK=&nbsp;BIT_GLOBAL;<br />rNCACHBE0=((0x2000000&gt&gt12)&lt&lt16&nbsp;)|(0x0&gt12);&nbsp;//flash&nbsp;area&nbsp;must&nbsp;be&nbsp;non-cachable&nbsp;area.<br />rNCACHBE1=(((U32)0xc000000&gt&gt12)&lt&lt16&nbsp;)|(U32)(0x6000000&gt&gt12);&nbsp;//flash&nbsp;area&nbsp;must&nbsp;be&nbsp;non-cachable&nbsp;area.&nbsp;&nbsp;<br />rSYSCFG=0x00;<br /><br />c代码,<br />unsigned&nbsp;int&nbsp;GetFlashId&nbsp;(void)&nbsp;<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;short&nbsp;i,j;<br />&nbsp;&nbsp;&nbsp;&nbsp;i=0;j=0;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;_RESET();<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;_WR(0x555,0xaa);<br />&nbsp;&nbsp;&nbsp;&nbsp;_WR(0x2aa,0x55);<br />&nbsp;&nbsp;&nbsp;&nbsp;_WR(0x555,0x90);<br />&nbsp;&nbsp;&nbsp;&nbsp;i=_RD(0x0);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;_WR(0x555,0xaa);<br />&nbsp;&nbsp;&nbsp;&nbsp;_WR(0x2aa,0x55);<br />&nbsp;&nbsp;&nbsp;&nbsp;_WR(0x555,0x90);<br />&nbsp;&nbsp;&nbsp;&nbsp;j=_RD(0x1);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;_RESET();<br />&nbsp;<br />&nbsp;&nbsp;return&nbsp;((unsigned&nbsp;int)((i&lt&lt16)&nbsp;|j));&nbsp;&nbsp;//&nbsp;Wait&nbsp;until&nbsp;Erase&nbsp;completed<br />}<br /><br />执行的结果是<br />Flash&nbsp;id=0xf0f0ea00<br /><br />显然都不对。
lishuanghua 发表于 2007-8-10 20:06 | 显示全部楼层

是否是在RAM里面运行?

不能在flash里面运行&nbsp;编程flash本身&nbsp;的代码
lishuanghua 发表于 2007-8-10 20:10 | 显示全部楼层

一个自己写的例子

///////////////////////////////////////////////////////////////<br />//&nbsp;&nbsp;&nbsp;&nbsp;读取flash(MBM29LV160)厂商、器件代码和扇区保护信息:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />//&nbsp;&nbsp;&nbsp;&nbsp;输入:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;无。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />//&nbsp;&nbsp;&nbsp;&nbsp;输出:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;将厂商代码保存到manufacture_code;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;将器件代码保存到device_code;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;将扇区保护信息保存到Sector_Protection_status数组;&nbsp;&nbsp;//<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2003.05.28Li.SH//<br />///////////////////////////////////////////////////////////////<br />void&nbsp;&nbsp;&nbsp;&nbsp;flash_get_device_inf(void)<br />{<br />unsigned&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*addr_aaa,*addr_555,*addr_sa,i;<br />unsigned&nbsp;long&nbsp;&nbsp;&nbsp;&nbsp;rINTMSK_TEMP;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;rINTMSK_TEMP&nbsp;=&nbsp;rINTMSK;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Save&nbsp;interrupt&nbsp;controller<br />&nbsp;&nbsp;&nbsp;&nbsp;rINTMSK&nbsp;=&nbsp;0x07ffffff;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Masked&nbsp;all&nbsp;interrupt<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;addr_aaa&nbsp;=&nbsp;0xaaa;<br />&nbsp;&nbsp;&nbsp;&nbsp;addr_555&nbsp;=&nbsp;0x555;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//command&nbsp;address<br />//&nbsp;&nbsp;&nbsp;&nbsp;read&nbsp;manufacture&nbsp;code&nbsp;and&nbsp;device_code:<br />&nbsp;&nbsp;&nbsp;&nbsp;*addr_aaa&nbsp;=&nbsp;0xaa;<br />&nbsp;&nbsp;&nbsp;&nbsp;*addr_555&nbsp;=&nbsp;0x55;<br />&nbsp;&nbsp;&nbsp;&nbsp;*addr_aaa&nbsp;=&nbsp;0x90;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Autoselect&nbsp;command.<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;addr_sa&nbsp;=&nbsp;0x001fff00;<br />&nbsp;&nbsp;&nbsp;&nbsp;manufacture_code&nbsp;=&nbsp;*addr_sa;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;addr_sa&nbsp;=&nbsp;0x001fff02;<br />&nbsp;&nbsp;&nbsp;&nbsp;device_code&nbsp;=&nbsp;*addr_sa;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(manufacture_code&nbsp;==&nbsp;4)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(device_code&nbsp;==&nbsp;0x49)&nbsp;&nbsp;&nbsp;&nbsp;//MBM29LV160BE<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i&nbsp;=&nbsp;0;i&nbsp;&lt&nbsp;35;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addr_sa&nbsp;=&nbsp;MBM29LV160BE_Sector_tab.SectorAddress;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addr_sa&nbsp;+=&nbsp;4;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sector_Protection_status&nbsp;=&nbsp;*addr_sa;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if(device_code&nbsp;==&nbsp;0xc4)&nbsp;&nbsp;&nbsp;&nbsp;//MBM29LV160TE<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i&nbsp;=&nbsp;0;i&nbsp;&lt&nbsp;35;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addr_sa&nbsp;=&nbsp;MBM29LV160TE_Sector_tab.SectorAddress;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addr_sa&nbsp;+=&nbsp;4;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sector_Protection_status&nbsp;=&nbsp;*addr_sa;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;*addr_aaa&nbsp;=&nbsp;0xaa;<br />&nbsp;&nbsp;&nbsp;&nbsp;*addr_555&nbsp;=&nbsp;0x55;<br />&nbsp;&nbsp;&nbsp;&nbsp;*addr_aaa&nbsp;=&nbsp;0xf0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Read/Reset&nbsp;command.<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;*(unsigned&nbsp;long*)0x1e0000c&nbsp;=&nbsp;rINTMSK_TEMP;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//recover&nbsp;interrupt&nbsp;controller<br />}<br />
 楼主| hero415 发表于 2007-8-11 10:35 | 显示全部楼层

问题终于 解决,真是谁也想不到的问题。

经过反复的试验发现,am29lv160db-90,居然需要在复位指令后延时一段时间,然后再复位一次才可以。怪不得我们买的开发板带的例程也对,想必他们也没有调试出来,谁知居然问题出在这里。<br />全部代码如下:<br />int&nbsp;CMDam29lv160(int&nbsp;argc,&nbsp;char&nbsp;*argv[])<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;U32&nbsp;n,s,m;<br />&nbsp;&nbsp;&nbsp;&nbsp;U16&nbsp;flag;<br />&nbsp;&nbsp;&nbsp;&nbsp;n=rNCACHBE0;<br />&nbsp;&nbsp;&nbsp;&nbsp;s=rSYSCFG;<br />&nbsp;&nbsp;&nbsp;&nbsp;m=rINTMSK;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;rNCACHBE0=((0xc000000&gt&gt12)&lt&lt16&nbsp;)|(0x0&gt12);<br />&nbsp;&nbsp;&nbsp;&nbsp;rSYSCFG=rSYSCFG&(~0x8);&nbsp;//write&nbsp;buffer&nbsp;has&nbsp;to&nbsp;be&nbsp;off&nbsp;for&nbsp;proper&nbsp;timing.&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rINTMSK=&nbsp;BIT_GLOBAL;<br />&nbsp;&nbsp;&nbsp;&nbsp;ProgramAM29F800();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;rNCACHBE0=n;<br />&nbsp;&nbsp;&nbsp;&nbsp;rSYSCFG=s;&nbsp;//write&nbsp;buffer&nbsp;has&nbsp;to&nbsp;be&nbsp;off&nbsp;for&nbsp;proper&nbsp;timing.&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rINTMSK=&nbsp;m;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />}<br /><br />.....<br />#define&nbsp;&nbsp;&nbsp;&nbsp;moutportw(data,port)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*(volatile&nbsp;unsigned&nbsp;short&nbsp;*)(port&lt&lt1)&nbsp;=&nbsp;(volatile&nbsp;unsigned&nbsp;int)(data))<br /><br />#define&nbsp;&nbsp;&nbsp;&nbsp;minportw(port)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*(volatile&nbsp;unsigned&nbsp;short&nbsp;*)(port&lt&lt1)<br /><br /><br /><br /><br /><br />int&nbsp;AM29F800_CheckId(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;U16&nbsp;manId,devId;<br />moutportw(0xf0f0,0x0);<br />Delay(100);<br />moutportw(0xf0f0,0x0);<br /><br />moutportw(0xaaaa,0x555);<br />moutportw(0x5555,0x2aa);<br />moutportw(0x9090,0x555);<br />manId=minportw(0x0);<br /><br />moutportw(0xf0f0,0x0);<br />Delay(100);<br />moutportw(0xf0f0,0x0);<br />moutportw(0xaaaa,0x555);<br />moutportw(0x5555,0x2aa);<br />moutportw(0x9090,0x555);<br />devId=minportw(0x1);<br />moutportw(0xf0f0,0x0);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if(manId==0x0001&nbsp;&&&nbsp;devId==0x22bf)&nbsp;return&nbsp;1;&nbsp;//&nbsp;AM29LV200B<br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if(manId==0x0001&nbsp;&&&nbsp;devId==0x22ba)&nbsp;return&nbsp;2;&nbsp;//&nbsp;AM29LV400B<br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if(manId==0x0001&nbsp;&&&nbsp;devId==0x225b)&nbsp;return&nbsp;3;&nbsp;//&nbsp;AM29LV800B<br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if(manId==0x0001&nbsp;&&&nbsp;devId==0x2249)&nbsp;return&nbsp;4;&nbsp;//&nbsp;AM29LV160B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if(manId==0x0004&nbsp;&&&nbsp;devId==0x2249)&nbsp;return&nbsp;4;&nbsp;//&nbsp;29LV160B&nbsp;fairchild&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;return&nbsp;0;<br />}<br /><br /><br /><br />希望对其他兄弟们有点作用。。<br />谢谢各位大虾的指导。
jsheng 发表于 2007-8-11 11:15 | 显示全部楼层

厉害

楼上都是高手啊.
 楼主| hero415 发表于 2007-8-11 19:18 | 显示全部楼层

艾,感觉自己太菜了

费尽心机可以读出flash的id,但是随后却发现,无论如何都不能成功擦除,更别提写了。实在没辙,把44binit.s和三星的对比了一下,发现有点差异,改为和三星一样,还是不行,bank0的时序参数设定改为最大,也不行。郁闷!<br /><br />于是,我想到了5楼的话,我是不是还在“flash”中运行阿?<br />由于编译设置ro=0,rw=0x0c000000,我用axd进行了方针跑一下,居然跑到主程序里时,pc=0000xxxx,郁闷,这不还在bank0吗。<br /><br />然后我们把板子的程序烧成44bmon,还有将我的应用程序重新编译,ro=0xc000000,再下载到ram中运行,情况一下就好了,可以擦除和比较了。<br /><br />请问大虾们,44binit.s中不是有一段代码是将ro&nbsp;copy&nbsp;到rw的吗,怎么最后还是在flash中运行呢?<br />
lishuanghua 发表于 2007-8-11 22:41 | 显示全部楼层

你编译设置ro=0当然是从0开始了

ro就是只读。仿真的时候不需要将代码&quot;copy&quot;到RAM里面,因为axd会直接奖代码下载到你设置的ro开始的地方。
raoxianbin 发表于 2014-3-19 20:31 | 显示全部楼层
借鉴了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

14

帖子

0

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