|
对dm9000中的寄存器的读写不是很明白,比如在dm9000.c中有
DWORD id_val;
id_val = READ_REG1(0x28);
其中
#define READ_REG1 ReadReg
static UCHAR
ReadReg(USHORT offset)
{
IOWRITE(dwEthernetIOBase, offset); //这里dwEthernetIOBase=0x20000300
return IOREAD(dwEthernetDataPort); //这里dwEthernetDataPort=dwEthernetIOBase+4
}
#define IOREAD(o) (UCHAR)*((volatile USHORT *)(o)))
#define IOWRITE(o, d) *((volatile USHORT *)(o)) = (UCHAR)(d)
这里
IOWRITE(o, d) *((volatile USHORT *)(o)) = (UCHAR)(d)
先是将o(在这里是dwEthernetIOBase=0x20000300)强制转换成一个指向USHORT的指针,然后将这个指针指向的内存区域赋值为
d(在这里是0x28)。是这样吧?
但是我的理解是dwEthernetIOBase=0x20000300只是一个基址,0x28只是一个偏移量,真正寄存器的地址应该是0x20000328
dm9000的控制寄存器共32个,就是从dwEthernetIOBase到dwEthernetDataPort之间的4个双字,但是读的时候为什么每次都返回
dwEthernetDataPort所指向的地址的内容?每次返回寄存器内容的地址都一样?
我的理解在哪里出问题了?实在是不明白dm9000的控制寄存器是怎么读写的,希望高手指点一下。
|
|