打印

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

[复制链接]
2364|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
IC1008|  楼主 | 2007-5-10 09:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
正确的读取答案应该是 0x1210
但是读取到的数值是   0x1212

#define    D12Cmd    *(volatile U8 *)(0x2000001)
#define    D12Dat    *(volatile U8 *)(0x2000000)
#define    D12Dat1    *(volatile U8 *)(0x2000002)

U32 D12RdChipId()
{
    U32 tmp;
    D12Cmd = 0xfd;
    tmp = D12Dat;
    tmp = tmp<<8;
    tmp+=D12Dat;       //D12Dat 读取失败
    return tmp;    
}
        0x0000009c:    e3a010fd    ....    MOV      r1,#0xfd
        0x000000a0:    e3a00780    ....    MOV      r0,#0x2000000
        0x000000a4:    e5c01001    ....    STRB     r1,[r0,#1]
        0x000000a8:    e5d01000    ....    LDRB     r1,[r0,#0]
        0x000000ac:    e1a01401    ....    MOV      r1,r1,LSL #8
        0x000000b0:    e5d00000    ....    LDRB     r0,[r0,#0]
        0x000000b4:    e0800001    ....    ADD      r0,r0,r1
        0x000000b8:    e1a0f00e    ....    MOV      pc,r14

但是我程序给为这样 第二起读取地址是*(volatile U8 *)(0x2000002)
可以读到0x1210
U32 D12RdChipId()
{
    U32 tmp;
    D12Cmd = 0xfd;
    tmp = D12Dat;
    tmp = tmp<<8;
    tmp+=D12Dat1;         //D12Dat1 读取成功
    return tmp;    
}
        0x0000009c:    e3a010fd    ....    MOV      r1,#0xfd
        0x000000a0:    e3a00780    ....    MOV      r0,#0x2000000
        0x000000a4:    e5c01001    ....    STRB     r1,[r0,#1]
        0x000000a8:    e5d01000    ....    LDRB     r1,[r0,#0]
        0x000000ac:    e1a01401    ....    MOV      r1,r1,LSL #8
        0x000000b0:    e5d00002    ....    LDRB     r0,[r0,#2]
        0x000000b4:    e0800001    ....    ADD      r0,r0,r1
        0x000000b8:    e1a0f00e    ....    MOV      pc,r14

相关帖子

沙发
publicrtos| | 2007-5-10 09:28 | 只看该作者

减速试试

可能减速一下会好一些吧

使用特权

评论回复
板凳
IC1008|  楼主 | 2007-5-10 09:28 | 只看该作者

忘记给图了

使用特权

评论回复
地板
IC1008|  楼主 | 2007-5-10 10:53 | 只看该作者

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

也试过在第二次读取之前加上了for循环
晶振加上倍频是20M 已经是很低的了

使用特权

评论回复
5
PandaFeng| | 2007-5-10 11:30 | 只看该作者

是不是总线速度太快了?

tmp+=D12Dat1;         //D12Dat1 读取成功
在这里设个断点,再单步执行一下看看。

使用特权

评论回复
6
computer00| | 2007-5-10 12:02 | 只看该作者

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

你可以试试修改D12的CLK输出,看能不能起作用。

使用特权

评论回复
7
IC1008|  楼主 | 2007-5-10 13:25 | 只看该作者

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

使用特权

评论回复
8
pandafeng| | 2007-5-10 21:29 | 只看该作者

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

这年头灌水也不容易~~
以前我用这芯片时没有读过它的id。
怀疑d12有问题,改成 0x2000004,0x2000008 行吗?

或者调一下位置,又是何结果?
U32 D12RdChipId()
{
    U32 tmp;
    D12Cmd = 0xfd;
    tmp = D12Dat1;
    tmp = tmp<<8;
    tmp+=D12Dat;
    return tmp;    
}

使用特权

评论回复
9
IC1008|  楼主 | 2007-5-11 08:57 | 只看该作者

谢谢各位 问题已经找到了

这个区域应该禁止缓存,才能读取正确 不然CPU会自动的一次读了好多数据的,所以
0x2000002相当于程序自动读的第二次有效数据

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

41

主题

229

帖子

0

粉丝