#1楼主:有人用过TCP/IP芯片W3100A吗?关于其datasheet求教!
文章发表于:2008-04-09 02:59
我有两个版本的datasheet,它两个不同之处在UDP的传送流程图(P33)上,我觉得UDP这块第二个版本的对。但是它们TCP流程图(P30)那块都一样,也是我一直没搞明白的地方:


一个问题是:TCP发送流程图中,FBS=Cx_TW_PR-Cx_TR_PR,我觉得不对,我认为这个表达式是正在发送数据的长度。
另一个问题是:TCP接收流程图中,recv LEN是怎么得到的?MCU还没有从W3100A接收到数据呢,它是怎么知道的recv LEN?
同志们帮帮忙啊!
#2
文章发表于:2008-04-27 17:11
例程中的一个函数,由此我明白了它的shadow register是怎么用的。说实在的,它这款芯片真的不怎么地,datasheet中的bug多不说,想shadow register这中用法还是头一次见到,这种用法感觉很不可理喻。
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 : // 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
wait_1us(2);
IndirectReadBuf(TX_ACK_PTR(s),(u_char*)&ack_ptr,4);
}
if (wr_ptr.lVal >= ack_ptr.lVal) val = SSIZE[s] - (wr_ptr.lVal - ack_ptr.lVal);
else val = SSIZE[s] - (0 - ack_ptr.lVal + wr_ptr.lVal);
break;
case SEL_RECV : // Calculate received data size
k = IndirectReadByte(SHADOW_RXWR_PTR(s)); // Shadow Register needs to be read before reading buffer register
wait_1us(2);
IndirectReadBuf(RX_WR_PTR(s),(u_char*)&wr_ptr,4);
k = IndirectReadByte(SHADOW_RXRD_PTR(s)); // Shadow Register needs to be read before reading buffer register
wait_1us(2);
IndirectReadBuf(RX_RD_PTR(s),(u_char*)&rd_ptr,4);
if (wr_ptr.lVal == rd_ptr.lVal){ val = 0;}
else if (wr_ptr.lVal > rd_ptr.lVal) val = wr_ptr.lVal - rd_ptr.lVal;
else val = 0 - rd_ptr.lVal + wr_ptr.lVal;
#ifdef DEBUG
PutString("wr_ptr.lVal = ");PutLTOA(wr_ptr.lVal);PutString(" : rd_ptr.lVal = ");PutLTOA(rd_ptr.lVal);PutString(" : size = ");PutITOA(val);PutStringLn("");
#endif
break;
default :
val = -1;
break;
}
EX0 = 1;
return ( val );
}
这里的计算buffer大小还不太明白。
#3
文章发表于:2008-04-27 17:24
怪不得他们公司网站上都不再更新W3100A的信息,也不再宣传W3100A了。