LAN91C111工作流程比较简单,驱动程序将要发送的数据包按指定格式写入芯片并启动发送命令,LAN91C111会自动把数据包转换成物理帧格式在物理信道上传输;反之芯片收到物理信号后自动将其还原成数据,并按指定格式存放在芯片RAM中以便主机程序取用。简言之就是LAN91C111完成数据包和电信号之间的相互转换: 数据包电信号。LAN91C111的编程主要包括:初始化、发送数据包、接收数据包三部分。

初始化

上电后,LAN91C111内部的寄存器的值设置为缺省值,CPU根据需要设置它里面的Configuration, Base和Individual Address寄存器,以保证它正确工作。发送数据包流程

(1) DSP向控制器发送ALLOCATE MEMORY命令(设置MMUCOM寄存器,通常设置0x0020)。MMU为待发送包在控制器内部的packet buffer中分配存储空间。

(2) DSP查询中断状态寄存器中的ALLOC INT位,直到该位被置成1,也可以设置Interrupt Mask中的ALLOC INT位,然后等待硬件中断,这时MMU已经分配好存储空间。而且TX packet number放在Allocation Result寄存器中。

(3)将Allocation Result寄存器中的packet number拷贝到Packet Number:寄存器中,设置Pointer寄存器(设置为TX,WR,AUTOINC,即0x4000)。然后将包的数据从upper layer发送队列传送到控制器的数据寄存器中。要求依次写人Status Word, Byte Count, destination address,source address,packet size,packet data,control word。
(4) DSP向控制器发送"ENQUEUE PACKET NUMBER TO TX FIFO“命令(设置MMUCOM寄存器,通常设置Ox00C0),这个命令将Packet Number寄存器中的packetnumber拷贝到TX FIFO,说明发送的包已经放入队列中。同时设置Transmit control寄存器中的TXENA位,启动transmitter。到目前为止,DSP的设置工作完成,它可以IDLE,直到接收到一个控制器产生的发送中断。

(5)当控制器传送完包以后,memory中的第一个字(16bit)被CSMA/CD写入相应的Status Word,然后将TX FIFO中的packet number移到TX completion FIFO,当TX completion FIFO不为空时产生中断。

(6) DSP接收到中断后,开始执行中断处理程序,它读入中断状态寄存器,如果产生发送中断,则从FIFO ports寄存器读入发送的包的Packet Number,并将它写到Packet Number寄存器。然后从内存中读人状态字(包括设置Pointer寄存器为TX,RD,AUTOINC,即0x6000,然后从数据寄存器中读入包的状态字),它是EPH寄存器的镜像,根据状态字判断包发送是否成功。如果成功则DSP向控制器发布RELEASE命令(设置MMUCOM寄存器,设置为Ox00A0),控制器将释放发送包所使用的存储空间,同时设置TX INT Acknowledge寄存器,它将TX completion FIFO中的packet number清除。

(7)使用“每发送一个序列的包产生一个中断”方案:允许TX EMPTY INT和TX INT, AUTORELEASE=1,当发送完FIFO中的最后一个包后,产生TX EMPTY INT中断。当发生严重的发送错误时,产生TX INT中断,同时将发送失败的包的packet number保存到FIFO Ports寄存器,这样DSP就可以知道发送过程停止了。这种方案可以减少DSP的负担,而且存储空间的释放也更迅速。接收数据包流程

(1) DSP设置receive control寄存器中的RXEN位,允许接收包。

(2)含有正确地址的包被接收到,从MMU请求存储空间,并分派一个packet number,内部的DMA逻辑产生连续的地址,并将接收到的字写到memory中,如果超界,包被丢弃,存储空间被释放。当检测到包的结束,状态字被写到接收包的最前面,byte count写到第二个字。如果CRC校验正确,packet number被写到RX FIFO,由于RX FIFO非空,产生RCV INT中断;如果CRC校验不正确,存储空间被释放,而且不产生中断。

(3) DSP接收到中断后开始执行中断处理程序,它读入中断状态寄存器,如果产生接收中断(RCV INT位为1),则可以从FIFO ports寄存器得到接收的包的packet number,而且可以从数据寄存器将接收包传送到DSP的内存或外存中。当处理结束,DSP向处理器发布REMOVE AND RELEASE FROM TOP OF RX命令(即设置寄存器MMUCOM,即0x0060),释放使用的存储空间和packet number.