1

关于投票
总结点经验,有的datasheet有bug,有些细节还不阐明。

最近在用W3100A做毕业设计,发现它的例程中有些地方(关于一个缓冲区寄存器指针的用法)总是看不通,参考它的datasheet也没有仔细说 明这里。到他们公司网站上提问,也没人回答,看了一下它们关于这款芯片的问答,都是在2003年以前的。而且他们公司也不宣传这款芯片了。便想,是不是这 款芯片有缺陷,有了取代品了?就看看他们正在宣传的W3150A和W5100,最后,终于在W3150A的datasheet中看到了这个缓冲区寄存器指 针的用法。经验便是,不能在一棵树上吊死。

我可是对于这个bug研究了好多天啊。浪费了不少时间。

系统分类: 通信网络
用户分类: 生活
标签: datasheet w3100a
来源: 原创
发表评论 阅读全文(237) | 回复(1)

1

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

哈哈,长经验,不能一棵树上吊死!它不更新W3100A的datasheet定是有原因的,W3150A取代它了!


点击看大图
点击看大图
点击看大图
通过这几张图就看明白了,它是用什么方法用BUF的,也明白了为什么它的BUF_PR寄存器要4个八位组的。
系统分类: 通信网络
用户分类: TCP/IP 以太网芯片
标签: W3100A TCP芯片
来源: 原创
发表评论 阅读全文(111) | 回复(0)

1

关于投票
这时才知道W3100A的SHADOW_REG是怎么用的。

例程中的一个函数,由此我明白了它的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 :                   // 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大小还不太明白。


系统分类: 通信网络
用户分类: TCP/IP 以太网芯片
标签: W3100A TCP芯片
来源: 原创
发表评论 阅读全文(103) | 回复(0)
总共 , 当前 /