返回该小组首页 回复主题
gerald03

gerald03

小组等级:     E币:667  (E币换礼)

#1楼主:有人用过TCP/IP芯片W3100A吗?关于其datasheet求教!

文章发表于:2008-04-09 02:59

我有两个版本的datasheet,它两个不同之处在UDP的传送流程图(P33)上,我觉得UDP这块第二个版本的对。但是它们TCP流程图(P30)那块都一样,也是我一直没搞明白的地方:
pdf
pdf
一个问题是:TCP发送流程图中,FBS=Cx_TW_PR-Cx_TR_PR,我觉得不对,我认为这个表达式是正在发送数据的长度。

另一个问题是:TCP接收流程图中,recv LEN是怎么得到的?MCU还没有从W3100A接收到数据呢,它是怎么知道的recv LEN?

同志们帮帮忙啊!


      【回复】

gerald03

   小组等级:    E币:667  (E币换礼)

#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大小还不太明白。


gerald03

   小组等级:    E币:667  (E币换礼)

#3

文章发表于:2008-04-27 17:24

怪不得他们公司网站上都不再更新W3100A的信息,也不再宣传W3100A了。

gerald03

   小组等级:    E币:667  (E币换礼)

#4

文章发表于:2008-04-30 09:20

终于明白了它的BUF计算方法,在W3150A芯片的datasheet中看到了。
看来W3100A的datasheet的确很多bug。

哈哈,长经验,不能一棵树吊死!它不宣传W3100A定是有原因的,W3150A就解决了!


点击看大图
点击看大图
点击看大图
通过这几张图就看明白了,它是用什么方法用BUF的,也明白了为什么它的BUF_PR寄存器要16位的。

gerald03

   小组等级:    E币:667  (E币换礼)

#5

文章发表于:2008-04-30 09:48

最后写错了,BUF_PR寄存器要32位的.

总共 , 当前 /

快速回复主题--如果想加入编辑器功能,建议使用 [高级回复]

您目前还不是小组成员,请先加入

回复贴子区

用户名:    您没有注册?

密码:    忘记了密码?

内容:

浏览该小组的用户还看过...

设计资源与分销

";