微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 模拟电路设计 > 基于AX88796B的网络接口模块的设计与实现

基于AX88796B的网络接口模块的设计与实现

时间:06-24 来源:今日电子 点击:

电路如图4所示

  AX88796B的驱动程序设计

  AX88796B的网卡驱动程序是处理器CPU和网卡硬件的接口,网卡驱动程序主要包括以下几部分:网卡的初始化;数据包的接收和发送;中断处理子程序。

  1 网卡初始化

  在网卡的初始化过程中除了完成对相关寄存器的定义与赋值外,还要完成对接收缓冲环的构造。AX88796B的所有寄存器除了数据端口寄存器外都是8位数据宽度。数据端口寄存器可以通过配置DCR寄存器中的WTS设置成8位或16位宽。AX88796B将偏移量为01h~0fh的寄存器分为4页(Page0~Page3)进行操作。与NE2000兼容的寄存器只有3页(Page0~Page2)。初始化需要设置页0与页1的相关寄存器,页2的寄存器是只读的,不可以设置,页3的寄存器不是NE2000兼容的,不用设置。初始化函数主要要完成以下诸项工作。

  /*AX88796B_init*/
  /*调用复位子程序对AX88796B进行复位。有两种复位方式:一是硬件复位,通过拉高拉低RESET引脚达到复位AX88796B的目的;二是软件复位,从0x1f端口读数据使AX88796B复位。*/

  ReadByte(RESET);
  WriteByte(RESET,0xff);
  delay(3000);
  WriteByte(IMR,0);/*初始化中断屏蔽寄存器IMR,写入0x00,禁止所有中断请求。*/
  WriteByte(CR,0x61);/*选中页1,停止AX88796B。*/
  delay(1000);
  WriteByte(CPR,0x4C);/*初始化接收缓冲环写页指针CPR=PSTART*/
  WriteByte(PAR0~PAR5,MAC);/*设置网卡芯片MAC地址,清除多播地址寄存器。*/
  WriteByte(MAR0~MAR7,0);
  WriteByte(CR,0x21);/*停止网卡,切换到页0。*/
  delay(1000);
  WriteByte(BNRY,0x79);/*写边界指针寄存器(BNRY)为0x79;*/
  WriteByte(PSTART,0x4c);/*设置接收缓冲区的起始页地址0x4c;*/
  WriteByte(PSTOP,0x80);/*PSTOP接收缓冲区的结束页地址0x80;*/
  WriteByte(TPSR,0x40);/*TPSR发送页的起始地址0x40;*/
  WriteByte(DCR,0x80);/*设置数据配置寄存器为8位数据传输模式。*/
  /*设置接收配置寄存器为0x4C,使接收缓冲区仅接收广播地址数据包和多点播送地址包。*/
  WriteByte(RCR,0x4C);
  /*设置TCR发送配置寄存器为0x80,采用全双工模式,当数据包长度小于60字节时自动填充,发送时附加CRC校验。*/
  WriteByte(TCR,0x80);
  WriteByte(ISR,0xFF);/*清除中断状态寄存器。*/
  WriteByte(IMR,0x11);/*允许覆写中断和数据包接收中断。*/
  WriteByte(BTCR,0x30);/*中断触发方式为高电平有效,IRQ输出为推挽驱动方式*/
  WriteByte(CR,0x22);/*启动芯片,AX88796B初始化完成。*/
  delay(1000);
  wrcurpge=read(CPR);
  rdnxtpge=wrcurpge;

  2 数据包的发送和接收

  判断AX88796B是否接收到新的数据包有两种方式:轮循和中断。单片机用轮循方式较多。为了提高CPU性能和实时性要求,这里采用中断方式。当网卡接收到新数据包时进入中断,首先判断CPR是否等于BNRY,若相等,则表示接收缓冲区已被存满,则停止接收数据包,而不会覆盖旧的数据;若不等,则将接收缓冲区中待读取的数据包的起始地址写入RSAR[0,1]寄存器,数据包的开始4字节写入RBCR[0,1]寄存器,并启动远端DMA读命令,通过读取4个信息字节得到待读取数据包的长度、接收状态和下一个将被读的页的指针信息。然后通过远端DMA读命令,将数据包从网卡SRAM中读入CPU内存中,并更新读页指针寄存器BNRY,CPU每从网卡内存中读走一页数据,BNRY便加一,这需要通过程序实现。网卡通过CPR将接收到的数据包写入接收缓冲区,每写完一页,CPR将自动加一,当加到最后的空页(这里是PSTOP=0x80)时,CPR将自动恢复为接收缓冲区的首页(PSTART=0x4c)。网卡接收关键性代码如下:

  /*AX88796B_receive*/
  uint8 rcvinfo[4],i;
uint16 pktlength,index;
/*得到待读取数据包的信息,并将其保存在rcvinfo数组中*/

WriteByte(RSAR0,0x00);
WriteByte(idx,RSAR1,rdnxtpge);
WriteByte(RBCR0,0x04);
WriteByte(RBCR1,0x00);
WriteByte(CR,0x0A);
for(i=0;i<4;i++)
rcvinfo[i]=*((uint8*)(DP_PORT+Base_addr));
pktlength=rcvinfo[2]+(rcvinfo[3]*256)-4;
/*根据得到的待读取数据包的长度pktlength,将数据包读入CPU内存Buf*/

WriteByte(RSAR0,0x4);
WriteByte(RSAR1,rdnxtpge);
WriteByte(RBCR0,(uint8)(pktlength&0x00ff));
WriteByte(RBCR1,(uint8)(pktlength>>8));
WriteByte(CR,0x0A);
ReadData(uint16*Buf,uint16 length);
/*更新BNRY指针,并返回pktlength值*/
rdnxtpge=rcvinfo[1];
if(rdnxtpge==PSTART)
WriteByte(idx,BNRY,PSTOP-1);
else
WriteByte(idx,BNRY,rdnxtpge-1);
return pktlength;

  CPU通过远端DMA通道将网卡发送缓冲区的起始地址和要发送的字节数分别写入RSAR[0,1]和RBCR[0,1],然后启动远端DMA写命令即可将数据包写入网卡内存,此后将字节数写入TBCR[0,1]寄存器,启动发送命令就可将数据包发送到网络上。网卡发送的关键代码如下:

/*AX88796B_transmit*/
/*将数据写入网卡的发送缓冲区*/
WriteByte (RSAR0,0x00);
WriteByte (RSAR1,TX_BUF_Start);
WriteByte (RBCR0,(uint8)(len&0xFF));
WriteByte (RBCR1,(uint8)(len>>8));
WriteByte (CR,0x12);
WriteData((uint16*)addr,len);
WriteByte (idx,TPSR,TX_BUF_Start);
/*发送缓冲区的数据发送到网络*/
WriteByte (TBCR0,(uint8)(len&0xFF));
WriteByte (TBCR1,(uint8)(len>>8));
WriteByte (CR,0x26);

 

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top