学海荡舟手机网

主页 > 实用文摘 > 教育文摘_07 > > 详细内容

用Ax88796实现SA1110的以太网接口_嵌入式系统论文

摘要:讨论嵌入式微处理器sa1110与以太网控制器ax88796在实际应用中的硬件连接问题;给出软件设计方面的一些注意事项,为sa1110的网络应用提供一种参考。

    关键词:嵌入式 sa1110 ax88796 以太网 cpu mii

 intel公司的strongarm sa1110是一款主要面向嵌入式应用的高性能32位微处理器,目前已经被广泛应用在pda等手持设备上。sa1110最高主频可达206 mhz,具有内存管理单元(mmu)和大容量的指令/数据高速缓存(16 kb/8 kb),兼容sdram、smrom等多种存储设备,并带有lcd和pcmcia控制器。

1 ax88796简介

 ax88796是台湾asix公司推出的ne2000兼容快速以太网控制器。其内部集成有10/100 mb/s自适应的层收发器和8k×16位的sram,支持mcs-51系列、80186系列以及mc68k系列等多种cpu总线类型。

 ax88796执行基于ieee802.3/ieee802.3u 局域网标准的10mb/s和100mb/s以太网控制功能,并提供ieee802.3u兼容的媒质无关接口mii(media independent interface),用以支持在其它媒质上的应用。此外,ax88796还提供可选用的标准打印接口,可用于连接打印设备或用作通用i/o端口。其结构框图如图1所示。

 ax88796的地址总线sa[9:0]与数据总线sd[15:0]分别与cpu的地址/数据总线相连。cpu通过i/o读写ne2000寄存器来控制ax88796的工作状态,通过远程dma fifos与ax88796的内部缓存sram进行数据交换。sram与mac核之间进行local dma将数据发送至mac层,再经由内部的phy层发送至rj45接口,或者经过mii接口送至外部的层芯片。

 seeprom接口可以用来连接串行eeprom。eeprom可用于存储mac地址,供ax88796每次初始化时读取。

2 硬件接口电路

 ax88796的cpu[1:0]两个输入引脚用来设置与不同cpu总线连接时ax88796的工作模式。在asix公司官方提供的资料中,ax88796在与sa1110连接时,是将这两个引脚都拉低,也即设为isa总线模式。但实际应用中发现这样设置,在对ax88796奇地址寄存器进行8位数据宽度的访问时存在问题:无论写入何值,读出值总为00h(由于ax88796是ne2000系列的以太网控制器,其mac层的控制寄存器都采用8位数据宽度,因此存放地址有奇偶之分;而cpu在对ax88796的控制中,需要对其寄存器进行8位数据宽度的读写)。

 最初的怀疑是,对ax88796的奇地址寄存器无法正确写入数据。但用示波器抓取数据总线上的信号,发现sa1110已经正确送出数据;并且当对ax88796的奇地址寄存器进行读操作时,ax88796在数据总线d[7:0]上送出的数据正是此前sa1110向其奇地址寄存器写入的数据。也就是说,数据已经被正确写入了ax88796的奇地址寄存器中,但sa1110从中读取数据时出现了问题。

 根据ax88796资料中的相关说明,在isa总线模式下,对其ne2000寄存器进行8位数据宽度操作时,高8位数据线d[15:8]是被内部拉低的。因此,数据都是在数据总线d[7:0]上进行传送的,而ax88796由地址线a0上信号电平的高低来判断所访问地址的奇偶,如表1所列。

表1 ax88796在isa总线模式下的读写操作

   
(a)isa总线模式下的读操作

操作模式csbhea0iordiowrsd[15:8]sd[7:0]
空闲模式hxxxx高阻高阻
字节访问l
l
h
h
l
h
l
l
h
h
无效
无效
偶字节数据
奇字节数据
双字节访问llllh奇字节数据偶字节数据

 (b)isa总线模式下的写操作

操作模式csbhea0iordiowrsd[15:8]sd[7:0]
空闲模式hxxxxxx
字节访问l
l
h
h
l
h
h
h
l
l
x
x
偶字节数据
奇字节数据
双字节访问lllhl奇字节数据偶字节数据

    h-高电平,l-低电平,x-不确定


    sa1110最大支持32位数据总线,它在进行不同宽度的数据读写时,有其自身的一套机制:

 在对奇地址进行8位数据宽度的写操作时(如写19h),地址线a0送出1,而数据总线d[31:24]、d[23:16]、d[15:8]、d[7:0]上同时送出该8位数据(即送出19191919h);在对奇地址进行8位数据宽度的读操作时,地址线a0送出1,数据总线d[15:8]上的数据作为有效数据被读入sa1110的内部寄存器,而其余数据线上的数据被丢弃。

 由此可见,当sa1110对ax88796的奇地址寄存器进行8位数据宽度的读操作时,ax88796在数据总线d[7:0]上送出的有效数据,被sa1110丢弃了;而数据总线d[15:8]上的值00h被误认作有效数据读入了sa1110。这就解释了为什么对ax88796奇地址寄存器可以正确写入却无法正确读取的问题了。

 综合上面的分析,在实际中采用的接口电路如图 2所示。

 ax88796的cpu[0]上拉,cpu下拉,设置它工作在186总线模式下。sa1110的地址线a0经反向器后接至ax88796的引脚,用来确保sa1110对ax88796的控制寄存器的访问都为8位数据宽度。实验证明,这并不影响ax88796作remote dma时与sa1110之间的16位数据宽度传输。

 sa1110的gpiox引脚可以复用作中断输入,因此用来连接ax88796的中断输出ireq。

3 软件方面

 由于ax88796是ne2000兼容芯片,所以linux kernel中的驱动ne.c、8390.c只需作较少的改动就可以用来驱动sa1110平台上的ax88796:

 将ne.c中的侦测端口地址列表netcard_portlist[]的初始赋值改为kernel中为ncsx所映射的虚拟地址。

 将ne.c里的中断侦测程序段去掉,分配dev->irq=irq_gpiox;而在8390.c中的每次enable_irq函数前,将gpiox设置为上升沿触发。

 由于ax88796具有独立的端口被用来支持对eeprom的访问,因此ne.c中访问eeprom所采取的remote dma方式应改写为对端口的访问方式。

 另外值得一提的是,sa1110的片选输出ncsx与读写信号输出noe、nwe之间的时序关系可以由对应的sa1110寄存器mscx中的控制位来调节。一个合适的取值可以大大提高sa1110与ax88796之间的数据传输速度。