44b0+D12读取芯片ID出现问题,只能正确读取第一位字节 求救

[复制链接]
3216|8
 楼主| IC1008 发表于 2007-5-10 09:13 | 显示全部楼层 |阅读模式
正确的读取答案应该是&nbsp;0x1210<br />但是读取到的数值是&nbsp;&nbsp;&nbsp;0x1212<br /><br />#define&nbsp;&nbsp;&nbsp;&nbsp;D12Cmd&nbsp;&nbsp;&nbsp;&nbsp;*(volatile&nbsp;U8&nbsp;*)(0x2000001)<br />#define&nbsp;&nbsp;&nbsp;&nbsp;D12Dat&nbsp;&nbsp;&nbsp;&nbsp;*(volatile&nbsp;U8&nbsp;*)(0x2000000)<br />#define&nbsp;&nbsp;&nbsp;&nbsp;D12Dat1&nbsp;&nbsp;&nbsp;&nbsp;*(volatile&nbsp;U8&nbsp;*)(0x2000002)<br /><br />U32&nbsp;D12RdChipId()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;U32&nbsp;tmp;<br />&nbsp;&nbsp;&nbsp;&nbsp;D12Cmd&nbsp;=&nbsp;0xfd;<br />&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;=&nbsp;D12Dat;<br />&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;=&nbsp;tmp&lt&lt8;<br />&nbsp;&nbsp;&nbsp;&nbsp;tmp+=D12Dat;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//D12Dat&nbsp;读取失败<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;tmp;&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0000009c:&nbsp;&nbsp;&nbsp;&nbsp;e3a010fd&nbsp;&nbsp;&nbsp;&nbsp;....&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,#0xfd<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x000000a0:&nbsp;&nbsp;&nbsp;&nbsp;e3a00780&nbsp;&nbsp;&nbsp;&nbsp;....&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,#0x2000000<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x000000a4:&nbsp;&nbsp;&nbsp;&nbsp;e5c01001&nbsp;&nbsp;&nbsp;&nbsp;....&nbsp;&nbsp;&nbsp;&nbsp;STRB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,[r0,#1]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x000000a8:&nbsp;&nbsp;&nbsp;&nbsp;e5d01000&nbsp;&nbsp;&nbsp;&nbsp;....&nbsp;&nbsp;&nbsp;&nbsp;LDRB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,[r0,#0]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x000000ac:&nbsp;&nbsp;&nbsp;&nbsp;e1a01401&nbsp;&nbsp;&nbsp;&nbsp;....&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,r1,LSL&nbsp;#8<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x000000b0:&nbsp;&nbsp;&nbsp;&nbsp;e5d00000&nbsp;&nbsp;&nbsp;&nbsp;....&nbsp;&nbsp;&nbsp;&nbsp;LDRB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,[r0,#0]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x000000b4:&nbsp;&nbsp;&nbsp;&nbsp;e0800001&nbsp;&nbsp;&nbsp;&nbsp;....&nbsp;&nbsp;&nbsp;&nbsp;ADD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,r0,r1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x000000b8:&nbsp;&nbsp;&nbsp;&nbsp;e1a0f00e&nbsp;&nbsp;&nbsp;&nbsp;....&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pc,r14<br /><br />但是我程序给为这样&nbsp;第二起读取地址是*(volatile&nbsp;U8&nbsp;*)(0x2000002)<br />可以读到0x1210<br />U32&nbsp;D12RdChipId()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;U32&nbsp;tmp;<br />&nbsp;&nbsp;&nbsp;&nbsp;D12Cmd&nbsp;=&nbsp;0xfd;<br />&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;=&nbsp;D12Dat;<br />&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;=&nbsp;tmp&lt&lt8;<br />&nbsp;&nbsp;&nbsp;&nbsp;tmp+=D12Dat1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//D12Dat1&nbsp;读取成功<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;tmp;&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0000009c:&nbsp;&nbsp;&nbsp;&nbsp;e3a010fd&nbsp;&nbsp;&nbsp;&nbsp;....&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,#0xfd<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x000000a0:&nbsp;&nbsp;&nbsp;&nbsp;e3a00780&nbsp;&nbsp;&nbsp;&nbsp;....&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,#0x2000000<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x000000a4:&nbsp;&nbsp;&nbsp;&nbsp;e5c01001&nbsp;&nbsp;&nbsp;&nbsp;....&nbsp;&nbsp;&nbsp;&nbsp;STRB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,[r0,#1]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x000000a8:&nbsp;&nbsp;&nbsp;&nbsp;e5d01000&nbsp;&nbsp;&nbsp;&nbsp;....&nbsp;&nbsp;&nbsp;&nbsp;LDRB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,[r0,#0]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x000000ac:&nbsp;&nbsp;&nbsp;&nbsp;e1a01401&nbsp;&nbsp;&nbsp;&nbsp;....&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,r1,LSL&nbsp;#8<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x000000b0:&nbsp;&nbsp;&nbsp;&nbsp;e5d00002&nbsp;&nbsp;&nbsp;&nbsp;....&nbsp;&nbsp;&nbsp;&nbsp;LDRB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,[r0,#2]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x000000b4:&nbsp;&nbsp;&nbsp;&nbsp;e0800001&nbsp;&nbsp;&nbsp;&nbsp;....&nbsp;&nbsp;&nbsp;&nbsp;ADD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,r0,r1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x000000b8:&nbsp;&nbsp;&nbsp;&nbsp;e1a0f00e&nbsp;&nbsp;&nbsp;&nbsp;....&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pc,r14<br />
publicrtos 发表于 2007-5-10 09:28 | 显示全部楼层

减速试试

可能减速一下会好一些吧
 楼主| IC1008 发表于 2007-5-10 09:28 | 显示全部楼层

忘记给图了

 楼主| IC1008 发表于 2007-5-10 10:53 | 显示全部楼层

设置总线速度已经是最慢的了

也试过在第二次读取之前加上了for循环<br />晶振加上倍频是20M&nbsp;已经是很低的了
PandaFeng 发表于 2007-5-10 11:30 | 显示全部楼层

是不是总线速度太快了?

tmp+=D12Dat1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//D12Dat1&nbsp;读取成功<br />在这里设个断点,再单步执行一下看看。
computer00 发表于 2007-5-10 12:02 | 显示全部楼层

也许这个ID本来就是那样的?它的datasheet上好象都没提到这个

你可以试试修改D12的CLK输出,看能不能起作用。
 楼主| IC1008 发表于 2007-5-10 13:25 | 显示全部楼层

我试过单步了 跟全速执行是同一个效果

  
pandafeng 发表于 2007-5-10 21:29 | 显示全部楼层

不好意思,我没看清题目。

这年头灌水也不容易~~<br />以前我用这芯片时没有读过它的id。<br />怀疑d12有问题,改成&nbsp;0x2000004,0x2000008&nbsp;行吗?<br /><br />或者调一下位置,又是何结果?<br />U32&nbsp;D12RdChipId()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;U32&nbsp;tmp;<br />&nbsp;&nbsp;&nbsp;&nbsp;D12Cmd&nbsp;=&nbsp;0xfd;<br />&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;=&nbsp;D12Dat1;<br />&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;=&nbsp;tmp&lt&lt8;<br />&nbsp;&nbsp;&nbsp;&nbsp;tmp+=D12Dat;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;tmp;&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br />
 楼主| IC1008 发表于 2007-5-11 08:57 | 显示全部楼层

谢谢各位 问题已经找到了

这个区域应该禁止缓存,才能读取正确&nbsp;不然CPU会自动的一次读了好多数据的,所以<br />0x2000002相当于程序自动读的第二次有效数据
您需要登录后才可以回帖 登录 | 注册

本版积分规则

41

主题

229

帖子

0

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