基于LPC2210的RTL8019AS以太网驱动系统设计(四)

    技术2022-05-20  34

    基于LPC2210RTL8019AS以太网驱动系统设计终结篇

    ---------------------------------------------------------

    Author             :tiger-johnWebSite            :blog.csdn.net/tigerjb

    Email               jibo.tiger@gmail.com

    开发环境         硬件环境:LPC2200

                                操作系统:UC/OS-II操作系统

                                编译环境:ADS1.2

    Tiger声明:本人鄙视直接复制本人文章而不加出处的个人或团体,但不排斥别人转载tiger-john的文章,只是请您注明出处并和本人联系或留言给我3Q

    ---------------------------------------------------------

    .页面切换子模块

    7.1页面切换子模块功能

    根据上一层模块传入的页号来切换页。RTL8019AS中的NE2000寄存器中用户可用于切换的页面有012三页,第四页为芯片保留。

    7.2页面切换子模块组成

    1>  读取命令寄存器(CR)中的值

    temp=ReadFromNet(0);

    2>    把命令寄存器中的PS1,PS0位清零,在清零过程中不能修改其他位,并且不能置TXP位。

    // 命令寄存器中的PS1,PS0位清零注意txp位不能要

    temp=temp&0x3B ;

    3>  把页号写入CR命令寄存器中的PS1,PS0

    pagenumber=pagenumber <<6;

    temp=temp | pagenumber;

    WriteToNet(0,temp);

    7.3页面切换子模块接口

    页面切换子模块调用了写数据模块

     

     

    Ø  写数据子模块:将数据写入RTL2019AS芯片中

    7.4页面切换子模块程序

    /****************************Copyright(c)********************

    **                                   西安邮电学院

    **                                   graduate school

    **                                                                 XNMS实验室

    **                                  Author:冀博

    **                                                                 Time:2011221

    **                                 http://blog.csdn.net/tigerjb

    **

    **--------------FileInfo---------------------------------------------------------------------

    ****************************Copyright(c)******************** /

    /**********************************************************

    **函数原型:    void  page(uchar pagenumber)

    **入口参数           uchar   pagenumber: 要切换的页

    ** 值:            

    **    明:       选择页,可选择0,1,2三页,第四页ne000兼容芯片保留

    **********************************************************/

    void page(uint8 pagenumber) 

    {

           uint8 temp;

           temp=ReadFromNet(0);

           temp=temp&0x3B ;//注意txp位不能要

           pagenumber=pagenumber <<6;

           temp=temp | pagenumber;

           WriteToNet(0,temp);

    }

    .设置芯片物理地址子模块

    8.1设置芯片物理地址子模块功能将物理地址写入实际地址寄存器(PAR0~PAR5)中并且用这些物理地址来对目标地址数据包进行比较,来确定接收或者拒绝接收数据包。

    8.2设置芯片物理地址子模块接口

    设置芯片物理地址子模块调用了写数据子模块

     

     

    Ø  写数据子模块:将数据写入RTL2019AS芯片中

    8.3设置芯片物理地址子模块程序

    /****************************Copyright(c)********************

    **                                   西安邮电学院

    **                                   graduate school

    **                                                                 XNMS实验室

    **                                  Author:冀博

    **                                                                 Time:2011221

    **                                 http://blog.csdn.net/tigerjb

    **

    **--------------FileInfo---------------------------------------------------------------------

    ****************************Copyright(c)******************** /

    /**********************************************************

    **函数原型:    void SetMacID()

    **入口参数:          *mac_ptr

    ** 值:                         

    **    明:       设置芯片物理地址,物理地址已经存储在程序空间内

    **********************************************************/

    void SetMacID(uint8 * mac_ptr)  

    {

           //MAC地址写入MY——MAC——ID

           page(1);

           WriteToNet(1 , *mac_ptr);

           mac_ptr++;

           WriteToNet(2 , *mac_ptr);

           mac_ptr++;

           WriteToNet(3 , *mac_ptr);

           mac_ptr++;

           WriteToNet(4 , *mac_ptr);

           mac_ptr++;

           WriteToNet(5 , *mac_ptr);

           mac_ptr++;

           WriteToNet(6 , *mac_ptr);

           //设置完后将页面转换到页面0

           page(0);

    }

     

    .写数据子模块

    Ø  LPC2210开发板中RTL8019ASCPU的存储空间上映射的基地址为0X83400000,因此以太网的基地址为0X83400000

    Ø  LPC2210 通过16 DMA 方式实现对RTL8019AS 双口RAM的访问,每次传输2字节(16比特数据)

    9.1写数据子模块功能

    根据传入的16bit DataAdd,将16bit Data写入以太网基地址0X83400000+Add处。

    9.2写数据子模块程序

    /****************************Copyright(c)********************

    **                                   西安邮电学院

    **                                   graduate school

    **                                                                 XNMS实验室

    **                                  Author:冀博

    **                                                                 Time:2011221

    **                                 http://blog.csdn.net/tigerjb

    **

    **--------------FileInfo---------------------------------------------------------------------

    ****************************Copyright(c)******************** /

    /**********************************************************

    * 名称:         WriteToNet()

    * 功能:         把数据写入RTL8019AS

    * 入口参数:       ADDR          写入地址

                                WRITEDATA   写入数据

    * 出口参数:无

    **********************************************************/

    void  WriteToNet(uint8 ADDR_16,uint16 WRITEDATA)

    {

    (*((volatile unsigned short *) NET_BASE_ADDR+ADDR_16))=WRITEDATA;

    }

    .读数据子模块

    10.1读数据子模块功能:

    根据传入的ADDR从以太网RTL8019AS基地址0X83400000+ADDR处读出2字节(16bit)数据

    10.2读数据子模块程序

    /****************************Copyright(c)********************

    **                                   西安邮电学院

    **                                   graduate school

    **                                                                 XNMS实验室

    **                                  Author:冀博

    **                                                                 Time:2011221

    **                                 http://blog.csdn.net/tigerjb

    **

    **--------------FileInfo---------------------------------------------------------------------

    ****************************Copyright(c)********************

    /**********************************************************

    *名称  :      ReadFromNet()

    *功能  :      RTL8019AS把数据读出

    *入口参数:  ADDR          读出地址

    *出口参数:  READDATA   读出数据

    **********************************************************/

    uint16  ReadFromNet(uint8 ADDR_16)

    {

           uint16 temp;

    temp=(*((volatile unsigned short *) NET_BASE_ADDR+ADDR_16));//0x83400000

           return (temp);

    }

     


    最新回复(0)