导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→老古,看看我的程序

* 4328: 老古,看看我的程序

   tuoniao35 
tuoniao35发表的帖子 

 老古,看看我的程序
老古,看看我的程序,哪个地方不对指点一下,好么?

#define uint  unsigned int
#define uchar unsigned char
typedef union{
              struct
              {
                uchar b0:1;
                uchar b1:1;
                uchar b2:1;
                uchar b3:1;
                uchar b4:1;
                uchar b5:1;
                uchar b6:1;
                uchar b7:1;
        }bit;
        uchar all;
        }reg_8019;
#define reg   *(char *)(0x30000H)        //因为片选是cs0,与本人所用单片机有关
   /************************************************************
             remote dma write
             &transmit packet
             数据包传送方向:单片机M16c-网卡8019-以太网
 ************************************************************/            
void driver send() 
{    
      uchar cr;
      page(0);                             
      cr=*reg                       //commmand register
      
      if(cr==0x26h)                //判断网上是否有数据包发送
                                                       
      queueit();                  //若有,则先排队等待
      else                       //若没有,则远程写
      write_dma(0x4000,COUNT);              //remote dma write
      
      *(reg+5)=count&0xff;               
      *(reg+6)=count>>8;               //local dma-transmit byte count
      *(reg+4)=0x40;                  //tpsr,每次发送数据包都需重新设置此寄存器
      
      *reg=0x26;                       //program NIC to transmit packet
}


void queueit()
{      
        reg_8019 cr;
        page(0);
        cr.all=*reg;                       //command register
        while(cr.bit.b2==1);              //wait until the txp bit equal 0
}


void write_dma(uint address,uint count)   //address为要写入到网卡里的ram的起始地

                                          //count为要连续写入的字节数
{       
    uint i;
    reg_8019 isr;
    isr.all=*(reg+7)              //interrupt status register
    uint buffer[768];            //最大数据包1514字节+4字节的校验码
          page(0);
         *(reg+9)=address>>8;          //remote address high
         *(reg+8)=address&0xff;        //remote address low 
         *(reg+11)=count>>8;          //remote  write count high 
        *(reg+10)=count&0xff;        //remote  write count low 
        *reg=0x12 ;                  //remote  dma write and start
        
        i=0;
        while(isr.bit.b6==1)   //wait for the completion of the remote dma write

      {
        *(reg+16)=buffer[i];       //(reg+16)是DMA端口地址(data transfer i/o 
port)

      }
        isr.bit.b6=1;
        *(reg+11)=0;            // count high   中止DMA操作 
        *(reg+10)=0;            // count low
        *reg=0x22;             //abort/complete dma   page 0 

}

发表时间:2002年1月4日9:36:00

  
回复该帖

本主题共有 7 帖,分页:>>>>>该主题的所有内容[7]条

 *树形目录 只列出部分跟帖的标题以及简单的摘要信息 该主题的部分跟帖如下:

  4337.[详细]等待到数据包发完,才处理下一包,这种做法效率不高。51大概能处理200包/秒,而发送一个1500字..
摘要:不要等到发完,就去处理下一包。......(15字)
- [老古][1068次] 2002年1月4日

  4341.[详细]这么说,8090流程图中谈到单片机的等待是多余的?
摘要:......(无内容)
- [tuoniao35][1117次] 2002年1月4日

  4382.[详细]一般是否每次把包放到发送缓冲区的时候,就开始指定tpsr的值,然后开始令网卡发包?..
摘要:......(无内容)
- [tuoniao35][2208次] 2002年1月5日

[上一篇帖子]:请问老古网络组建技术老古您好,我正在组建一个基于以太网的485网络,我不知道具体的技术方法和硬件,
[下一篇帖子]:硬件:若单片机给网卡8019发数据包的时候,都需查看本网卡是否正在给网上发包,请问,等到什么时候,单