#include <stdio.h>
#define DM9000_IO 0x20000000
#define DM9000_DATA 0x20100004
#define DM9000_outb(d,r) ( *(volatile
unsigned char *)r = d )
#define DM9000_inb(r) (*(volatile unsigned
char *)r)
#define DM9000_VIDL
0x28 //从此寄存器读出的值应该为0x46
#define DM9000_VIDH
0x29 //从此寄存器读出的值应该为0x0A
static unsigned char DM9000_ior(int reg)
{
DM9000_outb(reg,
DM9000_IO);
return
DM9000_inb(DM9000_DATA);
}
static void DM9000_iow(int reg, unsigned
char value)
{
DM9000_outb(reg,
DM9000_IO);
DM9000_outb(value,
DM9000_DATA);
}
void main(void)
{
unsigned
short int id=0;
asm("#define
EBIU_AMGCTL 0xFFC00A00");
//
setup EBIU_AMGCTL reg (enable all banks)
asm("p0.l
= EBIU_AMGCTL & 0xFFFF;");
asm("p0.h
= (EBIU_AMGCTL >> 16) & 0xFFFF;");
asm("r0
= 0x0f;");
asm("w[p0]
= r0;");
id
= DM9000_ior(DM9000_VIDL);
id
|= DM9000_ior(DM9000_VIDH) << 8;
printf("id
is %x\n",id); //打印出的应该是0x0A46,但是实际上刚好相//反为0x460A
}
上面的程序实现对DM9000AE的0x28和0x29两个寄存器的读操作。
你好,我对DM9000AE的不同寄存器进行连续读就会得出不正确的结果,如上所示。如果只对一个寄存器进行循环读好像出了第一次读出的数据有问题后面好像是正确的,第一次读出的数据还是上一次读/写操作是的数据。
DM9000A的片选引脚(CS#)接的是BF533的ASM2引脚,CMD接的是BF533的A2引脚,SD0—SD15接的是BF533的D0— D15,IOR#和IOW#分别接的是BF533的~AOE和~AWE。 |