导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→帮忙看看程序:关于以太网通讯的(8019)[long22885528]

 *第11375篇: 帮忙看看程序:关于以太网通讯的(8019)

  
楼 主:long22885528 2003年5月4日09:41
 帮忙看看程序:关于以太网通讯的(8019)
小弟在看下面的程序时有一些疑惑,希望大家给予指导,谢谢!~~
Q1)就是"if(len  <60)len=60;"中的LEN的值是那来的??是从TCP/IP包那得到的么??

Q2)就是"if    (txd_buffer_select)
        reg09=0x40 ;    //txdwrite highaddress
       else
                  reg09=0x46 ;      //txdwrite highaddress
             reg08=0x00 ;     //read page address low"

中的IF.....ELSE的关系;为什么会用到他呢??                if  (txd_buffer_select)又是什么意思呢??

Q3)就是"for      (ii=4;ii  <len+4;ii++)  "
中的LEN又为什么要加4,并且发送起始页也要加4呢??

有空的话能将这段程序的每一条的功能解释一下么??谢谢!~~~~~

void send_frame(UCHAR xdata * outbuf, UINT len)/*发送一个数据包的命令,长度最小为60字节,最大1514字节*/
{
UCHAR i;
UINT ii;
    page(0);
    if(len  <60)len=60;
    txd_buffer_select=!txd_buffer_select;
      if    (txd_buffer_select)
        reg09=0x40 ;    //txdwrite highaddress    else
        reg09=0x46 ;    //txdwrite highaddress
    reg08=0x00;         //read page address low
    reg0b=len>  >  8;        //read count high
    reg0a=len&0xff;        //read count low;
    reg00=0x12;            //write dma, page0
       for      (ii=4;ii  <len+4;ii++)  
    {
       reg10=*(outbuf+ii);  
    }


    /* 以下3句为中止dma的操作,可以不要            */
    reg0b=0x00;        //read count high   中止DMA操作
    reg0a=0x00;        //read count low;
    reg00=0x22;        //complete dma page 0

    for(i=0;i  <16;i++)    //最多重发16次,从for(i=0;……到free(outbuf);为发送数据
    {
        for(ii=0;ii  <1000;ii++)    //检查txp为是否为低
        {
            if ((reg00&0x04)==0) break;
        }
        if ((reg04&0x01)!=0) break;    //tsr位是否为1表示发送成功
        reg00=0x3e;
    }
    reg07=0xff;
    if(txd_buffer_select)
        reg04=0x40;    //txd packet start; 
    else
        reg04=0x46;    //txd packet start; 
    reg06=len>  >  8;    //high byte counter
    reg05=len&0xff;    //low byte counter
    reg07=0xff;
    reg00=0x3e;        //to sendpacket;  
    free(outbuf);}
 

  
2楼:ahwangyadong 2003年5月4日21:32
 回答
1、以太网帧长最少60字节(不包括CRC校验),要发送的数据如没有60字节,就要填充至60字节,你要发送多少字节的数据,自己肯定是知道的。
2、在该程序里,网卡芯片发送缓冲设为12页,两个区,每区6个,发送数据时,轮流使用这两个区。txd_buffer_select相当于标志,为1时起始页为0x40,为0时为0x46。
3、LEN加4是因为待发送的数据保存在outbuf+4到outbuf+LEN+3处。至于前面的4个字节是什么,那是该代码作者的道理,这里没看出来。
4、你需要好好看看NE2000网卡原理的文章,这样就清楚了。
  
3楼:long22885528 2003年5月10日16:45
 谢谢!~~~能看看接收的程序么??
麻烦您了!~~我想问问它在程序中起什么用!~~为什么用CURR==0,来判断硬件是否读错??RETURN又是什么功能呢???谢谢!~~~~~
//------------------------------------------------------------------------
// This functions checks the 8019 receive event status
// word to see if an ethernet frame has arrived.  If so,
// set EVENT_ETH_ARRIVED bit in global event_word
//------------------------------------------------------------------------
void query_8019(void)
{   
char bnry,curr;
 page(0);
    bnry=reg03;  //bnry page have read 读页指针
 page(1);
 curr=reg07;  //curr writepoint 8019写页指针
 page(0);
 if ((curr==0)) return ;//
 bnry=bnry++;
 if (bnry>  0x7f) bnry=0x4c;
 if (bnry!=curr) //此时表示有新的数据包在缓冲区里
 {
  EA = 0;
     event_word |= EVENT_ETH_ARRIVED;
     EA = 1;
 }
  reg0b=0x00; reg0a=0x00;  reg00=0x22;//complete dma page 0
}
  
4楼:langren0468 2003年5月10日16:49
 return 是返回, CURR接收数据标志用
  
5楼:long22885528 2003年5月10日16:54
 return 返回什么呢??CURR 不是写入指针么!~~~~
  
6楼:langren0468 2003年5月10日16:57
 具体老古网站里面资料都有呀,返回就是不执行后面的直接跳出!
  
7楼:long22885528 2003年5月10日16:59
 老古网站没有关于发送和接收的资料!~~~把地址发给我吧(具体的)
  
8楼:langren0468 2003年5月10日17:01
 就以前看那些呀,还有那个UDP程序已经很清楚了!
  
9楼:long22885528 2003年5月10日17:03
 没有啊!~~难道就是http://www.laogu.com/首页上的么??
  
10楼:langren0468 2003年5月10日17:05
 是,你可以去看看,我很早看过了,现在不清楚具体位置了!
  
11楼:long22885528 2003年5月10日21:25
 没有找到!~~~是不是你记错了啊???
  
12楼:langren0468 2003年5月10日22:12
 就是一般接收程序呀,那个UDP的就有
  
13楼:long22885528 2003年5月11日08:29
 是上次你给我的哪个里边的吗??
  
14楼:langren0468 2003年5月11日14:10
 那里面有!

>>>>>>对该主题发表你的看法

本主题贴数14,分页: [第1页]


[上一篇主题]:[求助]本公司急需一批特殊的USB转RS232的连接线

[下一篇主题]:[求助]华邦W78系列单片机在进行ISP时,进入了F04KBOOT模式,此时怎么复位呀?