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

发布者:GoldenSunrise最新更新时间:2017-11-28 来源: eefocus关键字:LPC2210  RTL8019AS  以太网  驱动系统 手机看文章 扫描二维码
随时随地手机看文章

五.发送数据包模块

5.1发送数据包模块功能

发送数据包时,先将待发送数据包通过远程DMA写入芯片RAM,给出发送缓冲区首地址和数据包长度,即可实现RTL8019AS的数据发送。RTL8019AS会自动按以太网协议完成发送并将结果写入状态寄存器。

5.2发送数据包模快的数据结构

 

1>_pkst

struct _pkst{

struct _pkst *STPTR;//前一个结构数组

unsigned int        length;//以太网帧报头长度长度14字节

unsigned char      *DAPTR;//报头的指针

                            };

2>ipethernet

typedef struct  { 

uint8        DestMacId[6];          /*目的网卡地址*/

uint8        SourceMacId[6];      /*源网卡地址*/

int16        NextProtocal;       /*下一层协议*/

                                   } ipethernet;

3>定义数据结构:

struct _pkst  * TxdData;

struct _pkst *ExPtr;

5.3发送数据包模块组成


第一部分:ARM LPC2210把数据写到RTL8019AS RAM中

该过程涉及以下几个寄存器:

Ø  RBCR0,RBCR1:远程DMA数据字节技术器

Ø  RSAR0,RSAR1:远程DMA起始地址

Ø  CR:发出远程DMA开始命令

 

1>计算发送包帧的长度

2>设置远程DMA起始地址寄存器(RSAR0,RSAR1),使远程DMA起始地址寄存器为发送缓冲区首地址

3>设置远程DMA字节计数器寄存器为发送数据帧的长度

4>启动远程DMA写

设置CR命令寄存器使DMA开始远程写。

5>将数据写到远程DMA 0x10号寄存器处

6>清零远程DMA字节计数器为0,并终止远程DMA写

7>清除所有中断标志

第二部分:RTL8019AS将数据发送到以太网

在ARM LPC2210把数据通过远程DMA写到RTL8019AS RAM之后,RTL8019AS芯片通过本地DMA将数据发送到以太网。

该过程涉及以下寄存器:

Ø  TPSR:设置传输数据包开始页面地址

Ø  TBCR0,TBCR1:设置传输数据包的字节计数。

Ø  CR:发出发送数据包的指令。

设置寄存器结束后,RTL8019AS会自动用本地DMA发数据。

1>  设置要发送包的起始页

配置TPSR(发送开始页寄存器):把发送缓冲区首地址赋值给TPSR.

2>  判断数据包长度,若小于60字节,补足60字节

3>  设置传输数据包的字节计数

设置TBCR0,TBCR1为数据包长度

4>发送数据前先清除所有中断源

5>启动本地DMA发送数据包

配置CR命令寄存器为3E发送数据包

6>包发送完后,判断是否出错,若发送错误则进行重发,但只重发六次

Ø  读取命令寄存器(CR)中的TXP位:判断数据包是否发送完毕。没有发送完,则循环等待包发送完。

 

Ø  读TSR(传输状态寄存器):判断PTX位是否为1,若为1说明传输正确,退出程序。否则启动DMA重新传输数据。

5.4发送数据包模块的接口

发送包模块调用了写数据子模块,读数据子模块和页面切换子模块

Ø  读数据子模块: 从RTL8019AS芯片中把数据读出。

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

Ø  页面切换子模块:可选择Page0,Page1,Page3三个页面。



5.5发送数据包模块程序

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

**                                   西安邮电学院

**                                   graduate school

**                                                                 XNMS实验室

**                                  Author:冀博

**                                                                 Time:2011年2月21日

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

**

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

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

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

**函数原型:void    Send_Packet(struct _pkst *TxdData)

**入口参数:struct _pkst *TxdData   :指向要发送数据的结构指针            

**出口参数:          无          

**说    明:       发送数据包,以太网底层驱动程序,所有的数据发送都要通过该程序

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

void Send_Packet(struct _pkst *TxdData)// 

{

       static uint8 Tx_Buff_Sel=0;

       struct _pkst *ExPtr;

       uint8 *TEPTR;

       union send_temp{

                                                 uint16 words;

                                                 uint8    bytes[2];

                                           }send_buff;

       uint16 ii,length=0;

       //切换至第0页

       page(0);

       length=length+TxdData->length;

       ExPtr=TxdData->STPTR;

       //计算出要发送的数据的总长度

       while(ExPtr!=NULL)

       {     

              length=length+ExPtr->length;

              ExPtr=ExPtr->STPTR;

       }

       ii=length;

       //发送缓冲区的切换

       Tx_Buff_Sel=Tx_Buff_Sel^1;

  //设置远程DMA起始地址寄存器(RSAR0,RSAR1)

       if(Tx_Buff_Sel)

       {

              WriteToNet(0x09,0x40);                       

       }                   

       else

       {     

              WriteToNet(0x09,0x46);                

       }

       WriteToNet(0x08,0x00);

       //设置远程DMA字节计数器寄存器为发送数据帧的长度

       WriteToNet(0x0b,ii>>8);         

       WriteToNet(0x0a,ii&0x00ff); 

       //启动远程DMA开始写

       WriteToNet(0,0x12);  

       /*******将数据写到远程DMA 0x10号寄存器处*****/       

       //TEPTR指向IPthernet

       TEPTR=TxdData->DAPTR;

       //发送数据结构IPthernet数据,每次发送两个字节

       for(ii=0;ii<(((TxdData->length)+1)/2);ii++)

       {

              send_buff.bytes[0]=*TEPTR;

              TEPTR++;

              send_buff.bytes[1]=*TEPTR;

              TEPTR++;

              WriteToNet(0x10,send_buff.words);

       }

       ExPtr=TxdData->STPTR;//把下一个结构体指针给Exptr

       while(ExPtr!=NULL)

       {

              TEPTR=ExPtr->DAPTR;

              for(ii=0;ii<((ExPtr->length+1)/2);ii++)

              {

                     send_buff.bytes[0]=*TEPTR;

                     TEPTR++;

                     send_buff.bytes[1]=*TEPTR;

                     TEPTR++;

                     WriteToNet(0x10,send_buff.words);

              }

       ExPtr=ExPtr->STPTR;

       }

       //清零远程DMA字节计数器为0

       WriteToNet(0x0b,0x00);

       WriteToNet(0x0a,0x00);

       //终止DMA写操作

       WriteToNet(0x00,0x22);  

       //清除所有中断标志

       WriteToNet(0x07,0xff);

       //设置要发送包的起始页

       if(Tx_Buff_Sel)

              {

                     WriteToNet(0x04,0x40);  

              }

       else

              {

                     WriteToNet(0x04,0x46); 

          }

       //判断数据包长度,若小于60字节,补足60字节

   ii=length;

       if(length<60)

              {

                     //如果数据长度<60字节,设置长度为60字节

                     ii=60;

              }

       //设置TBCR0,TBCR1为数据包长度

       WriteToNet(0x06,ii>>8);  

       WriteToNet(0x05,ii&0x00ff);

       //发送数据前先清除所有中断标志

       WriteToNet(0x07,0xff);

       //启动本地DMA发送数据包

       WriteToNet(0x00,0x3e);  

       //检测是否发错,若发错重发,但只重发六次

       for(length=0;length<6;length++) //最多重发6次

       {

              for(ii=0;ii<1000;ii++)

              {

                            if((ReadFromNet(0X00)&0x04)==0) 

                            {

                                   break;

                            }

      }

                            if((ReadFromNet(0X04)&0x01)!=0)

                            {

                                   break;

                            }

              WriteToNet(0x00,0x3e);       //to sendpacket;

      }

}


关键字:LPC2210  RTL8019AS  以太网  驱动系统 引用地址:基于LPC2210的RTL8019AS以太网驱动系统设计(二)

上一篇:基于LPC2210的RTL8019AS以太网驱动系统设计(三)
下一篇:基于ARM LPC2210的以太网RTL8019AS驱动系统设计(一)

推荐阅读最新更新时间:2024-03-16 15:47

Optiphase推出五相电机驱动系统 可提高车辆安全性/降低成本
据外媒报道,美国得克萨斯州电机与控制器专家Optiphase Drive Systems发布了一款独特的五相电机驱动系统,以取代传统的三相电机系统,从而简化实现脱碳。
[汽车电子]
Optiphase推出五相电机<font color='red'>驱动</font><font color='red'>系统</font> 可提高车辆安全性/降低成本
适用于高亮度LED照明系统的LED驱动器LM3450
  适用于高亮度LED照明系统的LM3450 LED 驱动器内置主动式功率因素修正器(PFC)和相位调光译码器,确保可在极宽的可编程调光范围内灯光的明暗变化稳定,不会出现闪烁情况。   采用相位调光器的住宅和商用照明系统必须配备可将相位斩波波形正确解码的电路,以便调光器能稳定调控LED的亮度。目前市场上的可调光LED驱动器很多时候都不符合正相调光器或TRIAC调光器有关最低电流的规定,导致调光器调控亮度时突然关闭或“错误启动(misfire)”,使得灯光因为无法准确解译相位角而出现闪烁,而且在调光率极低时闪烁尤其明显。为了解决这一问题,目前的驱动器都会缩小LED的调光范围或不断耗散电能,以确保调光器不会错误启动。   这款设计
[电源管理]
适用于高亮度LED照明<font color='red'>系统</font>的LED<font color='red'>驱动</font>器LM3450
工业以太网安全性初探
1简介工业以太网及存在的安全问题     企业信息化网络可分为三个层次。从下到上依次为现场设备层、过程监控层和信息管理层。最上层的是企业信息管理网络,它主要用于企业的生产调度,财务、人事以及企业的经营管理等方面信息的传输;中间的过程网络主要用于将的现场信息置入实时数据库,实现现场数据的存储、管理、查询的等基本的功能;底层的现场设备层网络则主要用于控制系统中大量现场设备之间测量一与控制信息的传输。其中底层现场设备对通信响应的实时性和确定性要求较高,因此目前现场设备网络主要由现场总线低速网段组成。     传统工业控制网络由于其技术陈旧及其三协议不统一,导致不便于通讯的特点,在许多场合已经不能满足现实的需要。同时由于以太网技术
[嵌入式]
利用恒流LED驱动器设计高效率LED照明系统
随着高功率LED的问世,照明产业也面临新的挑战。LED的使用寿命及电源转换效率成为设计LED照明系统时的主要考虑因素。而为了提供恒流以维持LED色彩与亮度的一致性,恒流LED驱动器可作为一个提供恒流输出的开关式转换器。此外,省电或高效率的电源转换需求更是在LED照明应用上不可缺少的要素,而磁滞型脉冲频率调变技术(Hysteretic PFM)可以大幅提升轻载或重载时的电源转换效率。本文将探讨如何利用恒流LED驱动器设计出高效率、高稳定性的LED照明系统。 传统LED驱动器:定电压模式 流经LED的电流决定了LED的亮度,电流越大,LED的亮度也会越亮。一般而言,使用定电压或恒流驱动器都可达到点亮LED的目的。图1为最简单的定电压L
[嵌入式]
40G以太网产品加快商用步伐
     如今10G以太网产品已经开始普及,其市场份额约占总额为180亿美元以太网交换机市场的25%,以后还将会继续增长。许多人关注的是,10G以太网的后续产品是什么?      虽然10G以太网产品还没有成熟,但是下一波以太网交换机浪潮即将开始。下一代以太网可能是40G/100G以太网,也可能是兆兆位以太网,甚至有可能是两者之间的某一种标准。实际上,40/100G以太网标准已经在近日获得批准,该标准的产品也将上市销售。美国极进网络公司、 Force10网络公司和BLADE网络技术公司均已经宣布其交换机支持40G以太网端口的数据中心和应用。思科、Juniper、博科和阿朗也都宣布或开始在他们的服务提供商路由器中出货100G以太
[网络通信]
基于NioslI的SOPC系统中lED显示驱动IP核设计
  NioslI 嵌入式 处理器是A1tera公司提出的S OPC 解决方案,是一种用户可随意配置和构建的32位嵌入式处理器,结合丰富的 外设 可快速、灵活地构建功能强大的SOPC系统。A lte ra公司提供了一些通用的IP核,使得用户可轻松集成属于自己的专用功能;但对于一些特定的外设,没有现成可用的IP核,如 液晶 模块CBGl28064等。   用户可通过自定义逻辑的方法在SOPC设计中添加自定义IP核。在实际应用中, LCD 液晶 显示 器凭借功耗低、体积小、轻薄及控制 驱动 简单等特点,在智能仪器、仪表和低功耗电子产品中得到了广泛应用。本文以深圳秋田视佳实业有限公司的液晶显示模块CBGl28064为例,在基于Ni
[电源管理]
基于NioslI的SOPC<font color='red'>系统</font>中lED显示<font color='red'>驱动</font>IP核设计
驱动系统发展及关键技术
扁线电机2021年渗透率约为27%,预计今年渗透率可达40%,随着扁线技术的成熟,未来用量增长迅猛。
[嵌入式]
电<font color='red'>驱动</font><font color='red'>系统</font>发展及关键技术
纳芯微推出NSI22C1x系列隔离式比较器,助力打造更可靠的工业电机驱动系统
纳芯微今日宣布推出基于电容隔离技术的隔离式比较器NSI22C1x系列, 该系列包括用于过压和过温保护的隔离式单端比较器NSI22C11和用于过流保护的隔离式窗口比较器NSI22C12。 NSI22C1x系列可用于工业电机驱动、光伏逆变器、不间断电源、车载充电机的过压、过温和过流保护,在提升系统可靠性的前提下,支持更高功率密度的系统设计,同时简化外围电路,相比传统分立方案,可将系统保护电路尺寸缩小60%。 以工业电机驱动系统为例,其正朝着更高效率、更高功率密度和更高可靠性的方向发展,同时伴随着以 SiC和GaN 为代表的宽禁带半导体在功率器件上的应用,对系统的可靠性,尤其是过流及短路保护的响应时间提出了更高的要求。纳芯
[工业控制]
纳芯微推出NSI22C1x系列隔离式比较器,助力打造更可靠的工业电机<font color='red'>驱动</font><font color='red'>系统</font>
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved