导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→各位高手帮忙看看8019发送数据问题[ukbat]

 *第32374篇: 各位高手帮忙看看8019发送数据问题

  
楼 主:ukbat 2005年6月17日09:40
 各位高手帮忙看看8019发送数据问题
我用老古那个一体化电路做的,用的 winbond的单片机,用 单片机初始化8019都正常,写8019的ram也正常,但是单片机发发送命令0x1E给8019时,8019没有数据发送出去,并且去读CR的值是0x21,这是怎么一回事啊,各位高手帮帮忙看看。下面是用C51写的部分程序。

#define reg00  XBYTE[0xc000] //对应于地址240H 为命令寄存器CR地址  
#define reg01  XBYTE[0xc100]    //241H.
#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]    //25FH.
#define  uint  unsigned int
#define  uchar unsigned char
#define recount   256 
#define wrcount   256
#define INBUF_LEN 1    //数据长度
void netcardreset(void); //网卡芯片复位函数
void delaymsecond(void); //延迟函数
void page(uchar pagenumber); //
void ne2000init(void);  //网卡芯片初始化函数
//void readmynodeid(void); //读取网卡物理地址函数
void writemynodeid(void); //设置网卡物理地址函数
void write_dma(unsigned int count);  //写网卡芯片Ram函数
void read_dma(unsigned int readdress,unsigned int count);  //读网卡芯片Ram函数
//void init_serialcomm(void);
//void serial (); 
uint flag=1;

void main()
{   unsigned int i;

 readdress=0x4c00;
    wraddress=0x4000;

 //P2=0x00;
    //delaymsecond();
    netcardreset();   
    ne2000init();     
    writemynodeid();
  /* for(;;)
    {

    reg00=0x1e;
 P1=0xff^reg00;
    }*/
   // init_serialcomm();  //初始化串口 
    /*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)   //如果上位机发送数据给单片机
   {
    flag=0;
 
 write_dma(wrcount); //写网卡的ram:开始地址wraddress,一 次写wrcount字节
   }
   // read_dma(readdress,recount);   //读网卡ram:开始地址readdress,一次读recount字节
   } 
}  

void netcardreset(void)
{
 uint data i;
 uchar data temp;
reset=1;
P1=0x00;  //使网卡的RSTDRV引脚变成高电平,网卡是高电平复位的。
//for(i=0;i  <250;i++);  //延时程序
reset=0;  //使网卡的RSTDRV引脚变成低电平,网卡上电复位完毕
P1=0xff;
//for(i=0;i  <250;i++);
temp=reg1f;  //读网卡的复位端口
reg1f=temp;  //写网卡的复位端口
//for(i=0;i  <250;i++);
// reset=1;reset=0相当于冷复位,temp=reg1f;reg1f=temp相当于热复位

}

void page(uchar pagenumber)
{
 uchar data temp;
 temp=reg00;  //读入命令寄存器CR的值。  
 temp=temp&0x3B;   //将高2位,即PS1,PS0清0
 pagenumber=pagenumber  <  <6;  //将低2位移至高端
 temp=temp|pagenumber; //写入高2位
 reg00=temp; //设置第几页
}

void ne2000init(void)
{  P1=0xff^reg00;
   reg00=0x21; //选择页0的寄存器,网卡停止运行,因为还没有初始化。   
   //==================================================//
   P1=0xff^reg00;
//   P1=0xff^reg01;
   reg01=0x4c; //寄存器PSTART。  接收缓冲区的起始页的地址   
//   P1=0xff^reg01;
//   P1=0xff^reg02;
   reg02=0x80; //寄存器PSTOP。  接收缓冲区的结束页地址。(该页不用于接收)
//   P1=0xff^reg02;
   P1=0xff^reg03;
   reg03=0x4c; //寄存器BNRY。   指向最后一个已经读取的页(读指针)   
   P1=0xff^reg03;    

   //=================================================//
//   P1=0xff^reg04;
   reg04=0x40; //TPSR 为发送页的起始页地址,初始化为指向第一个发送缓冲区的页.   
//   P1=0xff^reg04;
//   P1=0xff^reg0c;
   reg0c=0xcc; //RCR 接收配置寄存器,设置为使用接收缓冲区,仅接收自己的地址的数据包(以及广播地址数据包)和多点播送地址包,小于64字节的包丢弃(这是协议的规定,设置成接收是用于网络分析),校验错的数据包不接收。   
//   P1=0xff^reg0c;
//  P1=0xff^reg0d;
   reg0d=0xe0; //TCR 发送配置寄存器,启用crc自动生成和自动校验,工作在正常模式。   
//   P1=0xff^reg0d;
//   P1=0xff^reg0e;
   reg0e=0xc8; //DCR 数据配置寄存器,设置为使用FIFO缓存,普通模式,8位数据传输模式,字节顺序为高位字节在前,低位字节在后.  
//   P1=0xff^reg0e;
   reg0f=0x00; //IMR 中断屏蔽寄存器,设置成0x00,屏蔽所有的中断,设置成0xff将允许中断.   
   P1=0xff^reg00;
   reg00=0x12;   
   P1=0xff^reg00;
   page(1); //选择页1的寄存器     
   P1=0xff^reg00;
   P1=0xff^reg07;
   reg07=0x4d; //CURR 网卡写内存的指针,它指向当前正在写的页的下一页。   
   P1=0xff^reg07;
   //=================================================//
   //设置多点播送的参数
   reg08=0x00;  //MAR0 
   P1=0xff^reg08;
   reg09=0x41; //MAR1
   P1=0xff^reg09;
   reg0a=0x00; //MAR2
   P1=0xff^reg0a;
   reg0b=0x80; //MAR3
   P1=0xff^reg0b;
   reg0c=0x00; //MAR4
   P1=0xff^reg0c;
   reg0d=0x00; //MAR5
   P1=0xff^reg0d;
   reg0e=0x00; //MAR6 
   P1=0xff^reg0e;
   reg0f=0x00; //MAR7
   P1=0xff^reg0f;
   P1=0xff^reg00;
   reg00=0x52;
   P1=0xff^reg00;   
   reg00=0x22; //选择页0寄存器,网卡执行命令.
   P1=0xff^reg00;


//使用0x40-0x4B为网卡的发送缓冲区,共12页,向网卡dma中以wraddress开始的地址区写入count个字节的数据,并让网卡将其发送出去
void write_dma(unsigned int count)
{

    unsigned int i;
   count=1;
     if(wraddress>  =0x4c00) 
      {
        wraddress=wraddress-0x0c00;
      } 
     page(0);
     reg09=wraddress>  >  8;
     reg08=wraddress&0xff;
     reg0b=count>  >  8; 
     reg0a=count&0xff;
     reg00=0x12 ;
  P1=0xff^reg00;
     for(i=0;i  <count;i++)
  {
          reg10=0x55;
  }
      reg00=0x1e;
   P1=0xff^reg00;
  
       wraddress=wraddress+count;
       flag=1;
       reg0b=0; 
       reg0a=0;
       reg00=0x22;
    //P1=0xff^reg00;   

程序是一个死循环,我让8019不停的发数据,各位看看有什么问题,谢谢。

  
2楼:remeo 2005年7月15日21:10
 shim a
  
3楼:remeo 2005年7月15日21:12
 你的wraddress好象没有定义啊?现在还在做这个东西吗?

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

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


[上一篇主题]:欢迎大家加入Crystal Reports讨论区,共同研讨Crystal Rep

[下一篇主题]:求救! MAX7219数码管显示