对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的控制寄存器是怎么读写的,希望高手指点一下。
有DM9000芯片的Datasheet吗?研究一下它的读写时序不就很清楚了
我对该芯片不了解,但这种读寄存器的方法也是存在的,也就是先向一个地址写寄存器的Index,然后就自动可以在某个地址读到相应寄存器的值
Datasheet中应该说得非常清楚,没有上网下一份就OK了
引用: 引用楼主 kaios1 的帖子:
对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 USHOR…
这种东西都是很古老的操作方法,记得我刚参加工作的时候,某个芯片也是这样的操作方法的:先在IO寄存器里面写地址,然后到内存里面读寄存器的值。。。。
您好,不知道前面各位的问题解了没,你们说的问题小弟并不太懂,但我们目前是divacom在中国区域的总代理,从03年来一直专注于做DM9000及DIVACOM全线产品,对于研发来说,首先是产品质量有保证(为当年全新原装最新版本),然后通过我们可以找到原厂的工程师做技术支持,当然,是免费提供的,说不定我能帮得上大家的忙,以下是我的联系方式 QQ:1259987438 电话:027-8765163610 (0)13554272382 王洪武