导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→ADUC831接RTL8019AS收不到数据,帮忙!!谢谢![pegion1001]

 *第29477篇: ADUC831接RTL8019AS收不到数据,帮忙!!谢谢!!

  
楼 主:pegion1001 2008年7月18日03:40
 ADUC831接RTL8019AS收不到数据,帮忙!!谢谢!!
想用AD,不想外扩存储器,所以选用了ADUC 
晶振是12M的,MCU用的是ADuC831,p0接了RTL8019的SD7~0,p2的4~0接了RTL的SA4~0,p2的7接了SA8,p3的5接了RTL8019的reset。跑如下代码的时候:
#include   <ADuC831.h>  
#include   <string.h>  
#include   <stdlib.h>  
#include   <stdio.h>  
#include   <absacc.h>  


#define reg00 XBYTE[0x8000] //reg00- 10为网卡芯片接口的寄存器地址300-310; 
#define reg01 XBYTE[0x8100] 
#define reg02 XBYTE[0x8200] 
#define reg03 XBYTE[0x8300] 
#define reg04 XBYTE[0x8400] 
#define reg05 XBYTE[0x8500] 
#define reg06 XBYTE[0x8600] 
#define reg07 XBYTE[0x8700] 
#define reg08 XBYTE[0x8800] 
#define reg09 XBYTE[0x8900] 
#define reg0a XBYTE[0x8a00] 
#define reg0b XBYTE[0x8b00] 
#define reg0c XBYTE[0x8c00] 
#define reg0d XBYTE[0x8d00] 
#define reg0e XBYTE[0x8e00] 
#define reg0f XBYTE[0x8f00] 
#define reg10 XBYTE[0x9000]
#define reg1f XBYTE[0x9f00] //网卡的复位端口的地址,对应于网卡的地址31FH。
#define uint unsigned int   //uint 代表unsigned int
#define uchar unsigned char //uchar 代表unsignedchar
sbit reset=P3^5;            //单片机的p3.5脚连接到网卡的RSTDRV复位引脚

void NetCardReset();
void NetCardInit();
void page(uchar pagenumber);
void query_8019(void);
union u {uint word; struct{uchar high; uchar low;}bytes;}; 

union u  mynodeid[3];//存储网卡的物理地址

//////////////////////////////////////////
void main(void)
{
 unsigned int i = 0;

 SCON = 0x50; //串口方式1,允许接收
 TMOD = 0x20; //定时器1 定时方式2
 TCON = 0x41; //设定时器1 开始计数
 TH1 = 0xE6; //12MHz 1200 波特率
 TL1 = 0xE6; 
 TI = 1;
 TR1 = 1; //启动定时器

 printf ("Hello World!\n"); //显示Hello World
 for(i = 0; i   < 30000; i++)
  ;

 mynodeid[0].bytes.high = 0x00;
 mynodeid[0].bytes.low = 0xC0;
 mynodeid[1].bytes.high = 0x26;
 mynodeid[1].bytes.low = 0x78;
 mynodeid[2].bytes.high = 0xA1;
 mynodeid[2].bytes.low = 0x80;
 NetCardReset();
 NetCardInit();
 while(1)
 {  
  query_8019();
 }
}

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

void NetCardInit()
{
 reg00 = 0x21;//
 reg01 = 0x4c;//
 reg02 = 0x80;//
 reg03 = 0x4c;//
 reg04 = 0x40;//
 reg07 = 0xff;
 reg0c = 0xcc;//
 reg0d = 0xe0;//
 reg0f = 0x03;//

 page(1);
 reg07 = 0x4d;//
 reg08 = 0xff;//
 reg09 = 0xff;//
 reg0a = 0xff;//
 reg0b = 0xff;//
 reg0c = 0xff;//
 reg0d = 0xff;//
 reg0e = 0xff;//
 reg0f = 0xff;//
 reg01=mynodeid[0].bytes.high; //PAR0
 reg02=mynodeid[0].bytes.low; //PAR1
 reg03=mynodeid[1].bytes.high; //PAR2
 reg04=mynodeid[1].bytes.low; //PAR3
 reg05=mynodeid[2].bytes.high; //PAR4
 reg06=mynodeid[2].bytes.low; //PAR5
 reg00 = 0x22;//
}

void page(uchar pagenumber)
{
    uchar temp;
    temp=reg00;        
    temp=temp&0x3B ;//高两位清零
    pagenumber=pagenumber   <  <6;
    temp=temp | pagenumber;
    reg00=temp;
}

void query_8019(void)
{   
    uint 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 + 1; 
    if (bnry>  0x7f) 
     bnry=0x4c;
    if (bnry!=curr)    //此时表示有新的数据包在缓冲区里
    {
 printf("recvData!,bnry = %x,curr = %x\n",bnry, curr);

    }
    else
 printf("recvNOData!\n");
    page(0);
    reg0b=0x00;
    reg0a=0x00;  
    reg00=0x22;//complete dma page 0
}

在串口打印出来的总是: recvData!,bnry = 4C,curr = 4D呀,通过网线接到一hub上,在pc上随便ping一IP串口上打印的也是: recvData!,bnry = 4C,curr = 4D呀?为什么收不到数据呢?!!!


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

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


[上一篇主题]:HOLTEK(合泰)IC系列一级代理商

[下一篇主题]:跪求:如何在用户代码区中实现IAP,而不是通常的在BOOT阶段实现?