导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→[讨论]89c52与8019传输数据?[yibuerli]

 *第12195篇: [讨论]89c52与8019传输数据?

  
楼 主:yibuerli 2003年5月18日17:38
 [讨论]89c52与8019传输数据?
我做的是单片机采集数据系统,通过嵌入式以太网芯片8019将采集到的数据快速传输到上位机,数据采集后经过AD转换器放入单片机外部RAM里,设计的是采集到30K的数据以后就开始通过8019传输,传输完了以后再采集。
     这里涉及到流程的问题,我一直想不清楚,有经验的能否给我点指点?
     1.在采集到30K数据后是否通过中断中止数据传输,然后当30K数据全部通过8019传输完了以后再进行采集?查询方式呢?
     2.每1.5K数据组成一个以太网帧,30K就有20个帧,应该怎么设计传输控制呢?芯片往上位机传送数据又是怎样的呢?收到一帧就传送一帧吗?
     3.8052向8019送数据是8019本身的DMA方式吗?通过一个程序来控制(老古上的)?
  
2楼:langren0468 2003年5月18日17:46
 是DMA
  
3楼:langren0468 2003年5月19日10:24
 就用一体化的那个可以做
  
4楼:xiang 2003年6月2日10:35
 求助
langren0468:
  
            你好啊!我今天在论坛上看了你的帖子,知道你对8052控制RTL8019AS的一体化的那个方案比较熟,所以想向你求助!我做的毕业设计是用8052单片机控制RTL8019AS来连上以太网。跟(网站上提供的一体化的方案基本类似),由于前段时间找工作花了很多时间,搞的现在时间很紧,6月10号左右就要答辩了,而程序部分还不知道如何下手,用单片机实现TCP/IP又是第一次搞,本来对单片机编程就不熟。不知你有没有那个一体化的程序?如果有,请给我寄一份好吗?我想参照一下。我的邮箱是:xiangguojin@163.com,拜托了,谢谢你了!另外老古说那个网站提供还提供那个一体化的方案的程序,说是用汇编写的,我怎么找也没找到,你能帮我找一下吗?


  
5楼:langren0468 2003年6月2日13:26
 老古主页有自己找!
  
6楼:xiang 2003年6月2日17:38
 请教
你好,这位朋友。我是要找那个一体化板子的程序,我在老古上找了,没有,只有老古自己开发的那个方案的相关程序,我到这个网站上也找了好几次,也没找到用汇编写的程序,你能帮我吗?谢谢!
  
7楼:langren0468 2003年6月3日08:42
 知道思路,自己编写!
  
8楼:guest 2003年6月3日09:44
 请问一下,有哪位师父知道SMARTMED
请问一下,有哪位师父知道SMARTMEDIA卡的插座的封装形式,我的信箱LIUHESHU@163.NET
  
9楼:yibuerli 2003年5月19日16:03
 是哪个一体化的程序啊?我好像打不开?
  
10楼:langren0468 2003年5月19日16:29
 网上有自己下!
  
11楼:yibuerli 2003年5月19日16:36
 ISA总线的解决方案中就提了一下。上面有个网址我打不开
  
12楼:tari 2003年5月22日22:29
 我也在做这方面的东西,我看过老古的文章,
我也在做这方面的东西,我看过老古的文章,怎么没有看到有关的程序啊?
那位大哥指点一下。

  
13楼:langren0468 2003年5月23日08:59
 知道思路就可以了三,你还想要现成的程序,请你不要太懒!
  
14楼:tari 2003年5月23日10:51
 呵呵,不是我懒。我看过上面的文章,根据内
呵呵,不是我懒。我看过上面的文章,根据内容整理出了程序,但是不知道对不对。手里又没有相应硬件,想看看他的程序是怎么写的。我把程序贴在这里,哪位大哥知道的话指点一二。
     另外我还有个问题:
     1.文中说以太网传输的物理帧中我们只用注意DA,SA,TYPE,DATA四个的内容,我的程序中写入网卡的数据放在bufferwrite[1536]中,我在写数据的时候要不要把前面8个字节空出来留给网卡自动生成的PR,SD位?即我要把目的地址DA写入bufferwrite[0]还是bufferwrite[8]?
    2.我要完成的任务是保证单片机和网卡之间要能顺利的传输数据,那么我得物理帧中的TYPE是否无论写入什么数据都没关系?
下面是程序:
#include   <reg51.h>  
#include   <stdio.h>  
#include   <absacc.h>  
#define reg00  XBYTE[0xc000]   
#define reg01  XBYTE[0xc100]   
#define reg02  XBYTE[0xc200]   
#define reg03  XBYTE[0xc300]   
#define reg04  XBYTE[0xc400]   
#define reg05  XBYTE[0xc500]   
#define reg06  XBYTE[0xc600]  
#define reg07  XBYTE[0xc700]   
#define reg08  XBYTE[0xc800]   
#define reg09  XBYTE[0xc900]   
#define reg0a  XBYTE[0xca00]   
#define reg0b  XBYTE[0xcb00]   
#define reg0c  XBYTE[0xcc00]   
#define reg0d  XBYTE[0xcd00]  
#define reg0e  XBYTE[0xce00]  
#define reg0f  XBYTE[0xcf00]  
#define reg10  XBYTE[0xd000]
#define reg11  XBYTE[0xd100]   
#define reg12  XBYTE[0xd200]   
#define reg13  XBYTE[0xd300]  
#define reg14  XBYTE[0xd400]   
#define reg15  XBYTE[0xd500]   
#define reg16  XBYTE[0xd600]   
#define reg17  XBYTE[0xd700]  
#define reg18  XBYTE[0xd800]   
#define reg19  XBYTE[0xd900]  
#define reg1a  XBYTE[0xda00]  
#define reg1b  XBYTE[0xdb00]   
#define reg1c  XBYTE[0xdc00]  
#define reg1d  XBYTE[0xdd00]   
#define reg1e  XBYTE[0xde00]   
#define reg1f  XBYTE[0xdf00]   
#define  uint  unsigned int
#define  uchar unsigned char
#define recount   256 
#define wrcount   256
void netcardreset(void);
void delaymsecond(void);
void page(uchar pagenumber);
void ne2000init(void);
void readmynodeid(void);
void writemynodeid(void);
void write_dma(unsigned int wraddress,unsigned int count);
void read_dma(unsigned int readdress,unsigned int count);
uint flag;
          
union u{
 uint word;
 struct{
       uchar high;
       uchar low;
    }bytes;
 };
union u mynodeid[3];    //存储网卡的物理地址
xdata unsigned char bufferread[1536];  //读网卡得到的数据,放在外部ram.
xdata unsigned char bufferwrite[1536];   //写入网卡缓冲区的数据,放在外部ram.
unsigned int readdress;
unsigned int wraddress;
sbit reset=P3^4;  
                                   
void main()
{   unsigned int i;
    readdress=0x4c00;
    wraddress=0x4000;
    delaymsecond();
    netcardreset();   
    ne2000init();     
    readmynodeid();
    for(i=0;i  <6;i++)
    { if(i%2==0)
      {
        bufferwrite[14+i]=mynodeid[i/2].bytes.high;
      }
      else
        bufferwrite[14+i]=mynodeid[i/2].bytes.low;
    } 
    bufferwrite[20]=0x08;//
    bufferwrite[21]=0x00;// 
    writemynodeid();   
 while(1)
 { if(flag==1)  //如果上位机发送数据给单片机
   {
    write_dma(wraddress,wrcount);//写网卡的ram:开始地址wraddress,一 次写wrcount字节
   }
       read_dma(readdress,recount);  //读网卡ram:开始地址readdress,一次读recount字节
   }
}


void netcardreset(void)
{
 uint data i;
 uchar data temp;
 reset=1;  
 for(i=0;i  <250;i++);
 temp=reg1f;   
 reg1f=temp;  
 for(i=0;i  <250;i++);
}

  void delaymsecond(void)
   {  unsigned int i;
    for(i=0;i  <10000;i++);
   }


void page(uchar pagenumber)
{
 uchar data temp;
 temp=reg00;   
 temp=temp&0x3B;
 pagenumber=pagenumber  <  <6;
 temp=temp|pagenumber;
 reg00=temp;
}


void ne2000init(void)
{
   reg00=0x21;   
   reg01=0x4c;   
   reg02=0x80;   
   reg03=0x4c;   
   reg04=0x40;   
   reg0c=0xcc;   
    reg0d=0xe0;   
    reg0e=0xc8;  
    reg0f=0x00;   
    reg00=0x12;   
    page(1);     
    reg07=0x4d;   
    reg08=0x00;   
    reg09=0x41;
    reg0a=0x00;
    reg0b=0x80;
    reg0c=0x00;
    reg0d=0x00;
    reg0e=0x00;
    reg0f=0x00;
    reg00=0x52;   
    reg00=0x22;
}


void readmynodeid(void)
 {
     union u protocal;
     uchar data i,temp;
     page(0);
     reg09=0;     
     reg08=0;    
     reg0b=0;  
     reg0a=12;  
     reg00=0x0a;   
     for(i=0;i  <6;i++)
  {
     temp=reg10;     
     if(i%2==0)
     {
         protocal.bytes.high=temp;
     }
     else 
     { 
   protocal.bytes.low=temp;
   mynodeid[i/2].word=protocal.word;
     }
      temp=reg10;   
  }
  }


void writemynodeid(void)
{
 page(1);
 reg01=mynodeid[0].bytes.high;
    reg02=mynodeid[0].bytes.low;
    reg03=mynodeid[1].bytes.high;
    reg04=mynodeid[1].bytes.low;
    reg05=mynodeid[2].bytes.high;
    reg06=mynodeid[2].bytes.low;
}

//使用0x40-0x4B为网卡的发送缓冲区,共12页,向网卡dma中以wraddress开始的地址区写入count个字节的数据,并让网卡将其发送出去
void write_dma(unsigned int wraddress,unsigned int count)
{
      unsigned int i;
     if(wraddress>  =0x4c00) 
      {
        wraddress=wraddress-0x4c00;
      } 
     
     reg09=wraddress>  >  8;
     reg08=wraddress&0xff;
     reg0b=count>  >  8; 
     reg0a=count&0xff;
     reg00=0x12 ;
     for(i=0;i  <count;i++)
  {
          reg10=bufferwrite[i];
  }
      reg00=0x1e;
       wraddress=wraddress+count;
       flag=0;
       reg0b=0; 
       reg0a=0;
       reg00=0x22;
}
//从网卡dma以readdress开头的地址区读出count个字节,放到单片机片外存储空间 bufferread[]中。
void read_dma(unsigned int readdress,unsigned int count)
{
 unsigned int i,n;
 uchar data curr,bnry,pstop;
  reg00=0x0a;
  bnry=reg03+1;
  reg00=0x4a;
  curr=reg07;
  if(curr!=bnry)          
  
  {
          if(readdress>  =0x8000)
          {
            readdress=readdress-0x8000;
          }
          reg09=readdress>  >  8;
          reg08=readdress&0xff;
          reg0b=count>  >  8;
          reg0a=count&0xff;
          reg00=0x0a ;
          for(i=0;i  <count;i++)
   {
            bufferread[i]=reg10;
   }
          pstop=reg02;
          n=count/256;   //计算读出的数据有多少个页
          bnry=reg03+n; //将bnry的值加n,保证下一次的读出
          reg03=bnry;
          reg00=0x12;
   if(bnry>  =pstop)
   {
      reg03=0x4c;
            reg00=0x12; 
   }
          readdress=readdress+count;
          reg0b=0; 
          reg0a=0;
          reg00=0x22;
  }
}

      

  
15楼:langren0468 2003年5月23日10:55
 那你电路板根据一体化那个图做的吗?
  
16楼:tari 2003年5月23日10:58
 不是,我是根据他的文中(四)89C52单
不是,我是根据他的文中(四)89C52单片机与网卡接口电路图做的。


  
17楼:langren0468 2003年5月23日10:59
 那你接8019中断了吗?
  
18楼:tari 2003年5月23日11:05
 我是完全按照他的文中所说做的。应该没有
我是完全按照他的文中所说做的。应该没有
  
19楼:langren0468 2003年5月23日11:07
 那你是定时中断查询看是否有数据接收和发送吗?
  
20楼:tari 2003年5月23日11:13
 我在程序中设置了一个全局变量flag,当
我在程序中设置了一个全局变量flag,当上位机发送数据给单片机后,就将flag设置为1,
单片机发现flag为1,就发送数据,然后置flag为0。对于从网卡中读出数据采用的是查询方式,因为我的单片机只用做数据传输,不用完成别的任务。

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

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


[上一篇主题]:protel99se菜鸟求救,怎样画一条环形的导线

[下一篇主题]:怎么现在毕业生这么懒!要答辩了都跑到这来要程序!!!