EDN博客精华文章 作者:
gerald03
例程中的一个函数,由此我明白了它的shadow register是怎么用的。说实在的,它这款芯片真的不怎么地,datasheet中的bug多不说,想shadow register这中用法还是头一次见到,这种用法感觉很不可理喻。
怪不得他们公司都不宣传W3100A了,也不更新它的datasheet了。可能没人用这款老芯片了。新款芯片取代了老的。
u_int select(SOCKET s, u_char func)
{
u_int val;
un_l2cval rd_ptr, wr_ptr, ack_ptr;
u_char k;
EX0 = 0;
switch (func) {
case SEL_CONTROL : &
nbsp;
// socket status information val = IndirectReadByte(SOCK_STATUS(s));
break;
case SEL_SEND :
// Calculate send free buffer size k = IndirectReadByte(SHADOW_TXWR_PTR(s));
// Shadow Register needs to be read before reading buffer register wait_1us(2);
IndirectReadBuf(TX_WR_PTR(s),(u_char*)&wr_ptr,4);
if( (IndirectReadByte(OPT_PROTOCOL(s)) & 0x07) != SOCK_STREAM)
{
k = IndirectReadByte(SHADOW_TXRD_PTR(s));
// Shadow Register needs to be read before reading buffer register wait_1us(2);
IndirectReadBuf(TX_RD_PTR(s),(u_char*)&ack_ptr,4);
}
else
{
k = IndirectReadByte(SHADOW_TXACK_PTR(s));
// Shadow Register needs to be read before reading buffer register wai