关 闭

新闻中心

EEPW首页 > 工控自动化 > 设计应用 > 基于AX88796B的网络接口模块的设计与实现

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

作者:重庆邮电大学 崔巍 时间:2008-07-22 来源:今日电子/21IC 收藏

网络接口硬件设计

本文引用地址:https://www.eepw.com.cn/article/86068.htm

   1 的引脚配置

  与CPU的连接方式有MCS51模式、ISA模式、186模式,此方案使用了ISA 8bit模式。片选引脚CSn,读写信号RDn、WRn、RSTn都是低电平有效,分别和AT91r40008相应引脚相连即可。的数据线SD0~SD15和AT91r40008的DATA[0:15]相连,可通过软件配置为16位或8位DMA数据传输方式。AX88796B的IRQ是可编程的,请求信号可以通过配置BTCR或EEPROM来选择其触发方式和I/O缓冲类型,AT91r40008触发方式应该和BTCR的配置相一致。其他重要引脚如IOIS16、PME、EECE、EECK在本设计中悬空处理。引脚配置应根据网卡芯片手册说明和设计方案而定。

  对AX88796B控制状态寄存器(CSR)的操作,需要确定其基地址,基地址的选择应根据AT91r40008的可编程外部总线EBI的地址和片选信号来确定。AT91r40008的EBI处理位于地址空间0x00400000~0xFFC00000的访问操作,在访问过程中,它将产生外部器件的控制访问信号。当把网卡寄存器地址空间映射进EBI后,直接对EBI地址空间操作即可控制网卡的寄存器读写。对每个映射进EBI接口的外围器件,可以编程等待周期数、数据浮空时间、数据总线宽度(8位或16位)等。

  2 AT91r40008与AX88796B接口电路

 


图4 硬件连接原理图

  电路如图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);

  3 中断处理

  中断的处理和CPU关联密切,在软件中必须先配置好网卡的片选线和中断信号线。数据包到来时,网卡将其保存在SARM中,同时触发一个中断。处理器接收到中断信号后,进入中断处理程序。在中断处理程序中读AX88796B的中断状态寄存器ISR来判断是什么样类型的中断,如果读出的值的最低位为1,则代表是数据包接收中断,这时需触发一个消息,进入到读网卡函数。读网卡函数的功能是将网络数据包从网卡的内存接收到主机中,接着向上层传递,进行相应的处理。

  一个报文的发送过程就是通过调用写网卡函数,将报文发送到网卡的内存中去。然后将AX88796的控制寄存器(CR)的发送位TXP(Transmit packet)位置1,即将报文发送。
中断处理子程序的关键代码:

/*IRQ0_handler*/
uint8 InterruptStatus;
InterruptStatus=read(ISR);//读中断状态寄存器
write(IMR,0x00);//禁止中断
write(ISR,InterruptStatus);//清除中断状态寄存器
if(InterruptStatus&0x01)//是否为数据包接收中断
OSQPost(TcpIpMsgQ,&idx);//通知上位机接收到数据包
write(IMR,0x11);//使能接收中断和覆写中断


上一页 1 2 下一页

评论


相关推荐

技术专区

关闭