11742|14

161

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

网络开发笔记14_RL-TCPnet移植.pdf [复制链接]

前言

       忙了一个月的考试终于结束了,也可以抽点时间来写写了,虽然工作还没确定,不过还不着急,好像也有点眉目了。

       闲话不吹了,说说活动,本说完成TelnetTFTP的,结果TFTP我没找到那小的SD卡,没法做,Telnet呢,不知道为什么,不让人满意,别的东西我想对于控制系统来说,没什么太大的价值,不过对想做网络开发的人还是可以自学下

       所以我想说下,RL-TCPnet的移植,因为只有能移植,才能更广泛的应用,由于条件有限,也只能分析一下。

 

以太网驱动

       以太网驱动以轮询方式工作, 系统频繁地调用函数       poll_ethernet() 该模式简单易行,性能不高。但是以太网控制器如果集成有一个大的存储缓冲,那么轮询方式也是一个不错的选择。   

实现驱动所必须的函数:

init_ethernet() 初始化以太网控制器。

poll_ethernet() 从以太网控制缓冲器读取包。

send_frame() 写包到以太网控制器。   

   也可在中断模式下使用以太网接口。

RL-TCPnet 包括几个以太网驱动。它们在 \Keil\ARM\RL\TCPnet\SRC\ 目录下:

如果想在工程中应用以太网接口,需要拷贝以太网驱动到工程目录下并将其加到工程中。

 

中断模式

       中断设备驱动程序可以减少当系统反应较慢时丢失包的可能性,提高了性能。如果以太网通信大,用户事件函数占用很长的进程,丢包是可能发生。 

当以太网控制器集成了一个小的存储缓冲器时 (如几个千字节 ),需要以中断模式来处理包的接收。

实现驱动的必要函数:

init_ethernet() – 初始化以太网控制器

interrupt_ethernet()– 中断服务程序,从以太网控制器缓冲读取包并存入RAM缓冲器。

send_frame() – 发送数据到以太网控制器 

int_disable_eth() –禁止以太网控制器中断。 

int_enable_eth() – 允许以太网控制器中断。 

 

分析LM3S驱动

       TILM3S系列的驱动是LM3S_EMAC.hLM3S_EMAC.C,官方都做好了的,这是不用移植的,移植只有用在MCU不带网络控制器的环境下,一般带了的,官方都做好了

网络开发笔记14_RL-TCPnet移植.pdf

121.5 KB, 下载次数: 1025

最新回复

抽空学习研究一下  详情 回复 发表于 2017-12-7 21:43
 
点赞 关注

回复
举报

161

帖子

0

TA的资源

一粒金砂(高级)

沙发
 

1 LM3S_EMAC.h的源代码

/* Management Clock Divider */

#define MCDIV_MASK          0x000000FF  /* MII Data Clock Divider Mask       */

 

/* Management Transmit/Receive Data */

#define MTXD_MASK           0x0000FFFF  /* Management Transmit Data mask     */

#define MRXD_MASK           0x0000FFFF  /* Management Receive Data mask      */

 

/* Number of RX Packets */

#define RXFC_MASK           0x0000003F  /* Number of RX Packets in FIFO      */

 

/* Tramsmit Request */

#define TXRQ_NEW_TX         0x00000001  /* Start New Transmission            */

 

/* Timer Support */

#define TSEN_EN             0x00000001  /* Enable Timer Support              */

 

/* Embedded PHY Registers */

#define PHY_REG_CTRL        0x00        /* Basic Mode Control Register       */

#define PHY_REG_STAT        0x01        /* Basic Mode Status Register        */

#define PHY_REG_IDR1        0x02        /* PHY Identifier 1                  */

#define PHY_REG_IDR2        0x03        /* PHY Identifier 2                  */

#define PHY_REG_ANA         0x04        /* Auto-Negotiation Advertisement    */

#define PHY_REG_ANLPA       0x05        /* Auto-Neg. Link Partner Abitily    */

#define PHY_REG_ANE         0x06        /* Auto-Neg. Expansion Register      */

#define PHY_REG_VSP         0x10        /* Vendor Specific Register          */

#define PHY_REG_INT         0x11        /* Interrupt Control/Status Register */

#define PHY_REG_DIAG        0x12        /* Diagnostic Register               */

#define PHY_REG_TRANC       0x13        /* Transceiver Control               */

#define PHY_REG_LEDC        0x17        /* LED Configuration                 */

#define PHY_REG_MDIX        0x18        /* MDI/MDIX Control                  */

 

#define PHY_FULLD_100M      0x2100      /* Full Duplex 100Mbit               */

#define PHY_HALFD_100M      0x2000      /* Half Duplex 100Mbit               */

#define PHY_FULLD_10M       0x0100      /* Full Duplex 10Mbit                */

#define PHY_HALFD_10M       0x0000      /* Half Duplex 10MBit                */

#define PHY_AUTO_NEG        0x3000      /* Select Auto Negotiation           */

 

/* Misc */

#define PHY_DEF_ADR         0x0000      /* Default PHY device address        */

 

#endif

 

/*----------------------------------------------------------------------------

 * end of file

 *---------------------------------------------------------------------------*/

  

       可以从上看出,这里都是一些寄存器等。其实也可以用LM3S固件库里的

这里就不多说了

 
 

回复

161

帖子

0

TA的资源

一粒金砂(高级)

板凳
 

*----------------------------------------------------------------------------

 *      Name:    LM3S_EMAC.C

 *      Purpose: Driver for Luminary Micro LM3Sxxxx EMAC Ethernet Controller

 *      Rev.:    V4.05

 *----------------------------------------------------------------------------

 *      This code is part of the RealView Run-Time Library.

 *      Copyright (c) 2004-2009 KEIL - An ARM Company. All rights reserved.

 *---------------------------------------------------------------------------*/

 

#include <Net_Config.h>

#include <LM3Sxxxx.H>

#include "LM3S_EMAC.h"

 

/* The following macro definitions may be used to select the speed

   of the physical link:

 

  _10MBIT_   - connect at 10 MBit only

  _100MBIT_  - connect at 100 MBit only

 

  By default an autonegotiation of the link speed is used. This may take

  longer to connect, but it works for 10MBit and 100MBit physical links.     */

 

 

/* Net_Config.c */

extern U8 own_hw_adr[];

 

/*----------------------------------------------------------------------------

 *      EMAC Ethernet Driver Functions

 *----------------------------------------------------------------------------

 *  Required functions for Ethernet driver module:

 *   这里是轮询的方法

 *  a. Polling mode: - void init_ethernet ()

 *                   - void send_frame (OS_FRAME *frame)

 *                   - void poll_ethernet (void)

 *   这里是中断的方法

 *  b. Interrupt mode: - void init_ethernet ()

 *                     - void send_frame (OS_FRAME *frame)

 *                     - void int_enable_eth ()

 *                     - void int_disable_eth ()

 *                     - interrupt function

 *---------------------------------------------------------------------------*/

 

/* Local Function Prototypes */

static void write_PHY (U32 PhyReg, U16 Value);//写寄存器

static U16  read_PHY (U32 PhyReg);//读寄存器

 

 

 
 
 

回复

161

帖子

0

TA的资源

一粒金砂(高级)

4
 

/*--------------------------- init_ethernet ---------------------------------*/

 

void init_ethernet (void) {//初始化网络控制器

  /* Initialize the EMAC ethernet controller. */

  U32 tout,regv;

 

  /* Enable and Reset the Ethernet Controller */

//使能网络控制器时钟

  SysCtlPeripheralEnable (SYSCTL_PERIPH_ETH);

  SysCtlPeripheralReset (SYSCTL_PERIPH_ETH);

 

  /* Enable Port F for Ethernet LEDs */

  SysCtlPeripheralEnable (SYSCTL_PERIPH_GPIOF);

  GPIODirModeSet  (GPIO_PORTF_BASE, (GPIO_PIN_2 | GPIO_PIN_3),

                   GPIO_DIR_MODE_HW);

  GPIOPadConfigSet(GPIO_PORTF_BASE, (GPIO_PIN_2 | GPIO_PIN_3),

                   GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD);

 

  /* Disable all Ethernet Interrupts */

//禁止中断

  pEMAC->IEN = 0;

  pEMAC->ISR = INT_ALL;

 

  /* Set MII interface clock (max. 2.5MHz) */

  pEMAC->MCDIV = 10;

 

  /* Put the PHY in reset mode */

  write_PHY (PHY_REG_CTRL, 0x8000);

 

  /* Wait for hardware reset to end. */

  for (tout = 0; tout < 0x20000; tout++) {

    regv = read_PHY (PHY_REG_CTRL);

    if (!(regv & 0x8000)) {

      /* Reset complete. */

      break;

    }

  }

 

 
 
 

回复

161

帖子

0

TA的资源

一粒金砂(高级)

5
 

#if defined (_10MBIT_)//10M模式

  /* Connect at 10MBit */

  write_PHY (PHY_REG_CTRL, PHY_FULLD_10M);

#elif defined (_100MBIT_)//100M模式

  /* Connect at 100MBit */

  write_PHY (PHY_REG_CTRL, PHY_FULLD_100M);

#else

  /* Use autonegotiation about the link speed. */

  write_PHY (PHY_REG_CTRL, PHY_AUTO_NEG);

  /* Wait to complete Auto_Negotiation. */

  for (tout = 0; tout < 0x20000; tout++) {

    regv = read_PHY (PHY_REG_STAT);

    if (regv & 0x0020) {

      /* Autonegotiation Complete. */

      break;

    }

  }

#endif

 

  /* Check the link status. */

  for (tout = 0; tout < 0x10000; tout++) {

    regv = read_PHY (PHY_REG_STAT);

    if (regv & 0x0004) {

      /* Link is on. */

      break;

    }

  }

 

  /* Configure TX/RX Control Registers, enable Multicast. */

  pEMAC->RXCTL = RXCTL_BAD_CRC | RXCTL_RST_FIFO | RXCTL_MCAST_EN;

  pEMAC->TXCTL = TXCTL_PAD_EN  | TXCTL_CRC_EN;

 

  /* Configure Full/Half Duplex mode. */

  if (regv & 0x0800) {

    /* Full duplex is enabled. */

    pEMAC->TXCTL |= TXCTL_DUP_EN;

  }

 

  /* Set the Ethernet MAC Address registers */

  pEMAC->IAR0 = ((U32)own_hw_adr[3] << 24) | ((U32)own_hw_adr[2] << 16) |

                ((U32)own_hw_adr[1] << 8)  |  (U32)own_hw_adr[0];

 

  pEMAC->IAR1 = ((U32)own_hw_adr[5] << 8)  |  (U32)own_hw_adr[4];

 

  /* Enable the Ethernet Controller */

  pEMAC->RXCTL |= RXCTL_RX_EN;

  pEMAC->TXCTL |= TXCTL_TX_EN;

 

  /* Enable Interrupts */

  pEMAC->IEN = INT_RX;

  IntEnable(INT_ETH);//使能网络控制器

}

 
 
 

回复

161

帖子

0

TA的资源

一粒金砂(高级)

6
 

/*--------------------------- int_enable_eth --------------------------------*/

 

void int_enable_eth (void) {//使能中断

  /* Ethernet Interrupt Enable function. */

  IntEnable(INT_ETH);

}

 

 

/*--------------------------- int_disable_eth -------------------------------*/

 

void int_disable_eth (void) {//禁止中断

  /* Ethernet Interrupt Disable function. */

  IntDisable(INT_ETH);

}

 

 

/*--------------------------- send_frame ------------------------------------*/

 

void send_frame (OS_FRAME *frame) {//发送数据

  /* Send frame to EMAC ethernet controller */

  U32 len,val;

  U16 *sp;

 

  /* Wait for current packet to complete. */

  while (pEMAC->TXRQ & TXRQ_NEW_TX);

 

  sp = (U16 *)&frame->data[0];

  val = frame->length - 14;

  val |= (*sp++) << 16;

  pEMAC->DATA = val;

  /* Copy frame data to EMAC packet buffers. */

  for (len = (frame->length + 1) >> 2; len; sp += 2, len--) {

    pEMAC->DATA = sp[0] | ((U32)sp[1] << 16);

  }

 
 
 

回复

161

帖子

0

TA的资源

一粒金砂(高级)

7
 

 /* Start Transmitting */

  pEMAC->TXRQ = TXRQ_NEW_TX;

}

 

 

/*--------------------------- interrupt_ethernet ----------------------------*/

 

void interrupt_ethernet (void) __irq {//中断处理函数

  /* EMAC Ethernet Controller Interrupt function. */

  OS_FRAME *frame;

  U32 val,int_stat,RxLen,len;

  U16 *dp;

 

  while ((int_stat = pEMAC->ISR & INT_ALL) != 0) {

    pEMAC->ISR = int_stat;

    if (int_stat & INT_RX) {

      /* Packet received, get the packet size. */

              //接收包

      val = pEMAC->DATA;

      RxLen = (val & 0xFFFF) - 6;

      /* DMA adds also 4-byte CRC and 2-byte 'size' to packet size. */

 

      if (RxLen > ETH_MTU || (int_stat & INT_RX_ERR)) {

        /* Invalid frame, ignore it and free buffer. */

        goto rel;

      }

      /* Flag 0x80000000 to skip sys_error() call when out of memory. */

      frame = alloc_mem (RxLen | 0x80000000);

      if (frame != NULL) {

        dp  = (U16 *)&frame->data[0];

        for (len = (RxLen + 3) >> 2; len; dp += 2, len--) {

          dp[0] = val >> 16;

          val = pEMAC->DATA;

          dp[1] = val & 0xFFFF;

        }

        if ((RxLen - 1) & 0x02) {

          /* Drain the remaining 1 or 2 byte(s) of the CRC. */

          val = pEMAC->DATA;

        }

        put_in_queue (frame);

      }

      else {

        /* In case of error discard the entire RX FIFO. */

rel:      pEMAC->RXCTL &= ~RXCTL_RX_EN;

        pEMAC->RXCTL |= RXCTL_RST_FIFO;

        pEMAC->RXCTL |= RXCTL_RX_EN;

      }

    }

  }

}

 

 

 
 
 

回复

161

帖子

0

TA的资源

一粒金砂(高级)

8
 

/*--------------------------- write_PHY -------------------------------------*/

 

static void write_PHY (U32 PhyReg, U16 Value) {

  /* Write a data 'Value' to PHY register 'PhyReg'. */

  U32 tout;

 

  pEMAC->MADR = PHY_DEF_ADR;

  pEMAC->MTXD = Value;

  pEMAC->MCTL = (PhyReg << 3) | MCTL_WR | MCTL_START;

 

  /* Wait util operation completed */

  for (tout = 0; tout < MII_WR_TOUT; tout++) {

    if ((pEMAC->MCTL & MCTL_START) == 0) {

      break;

    }

  }

}

 

 

/*--------------------------- read_PHY --------------------------------------*/

 

static U16 read_PHY (U32 PhyReg) {

  /* Read a PHY register 'PhyReg'. */

  U32 tout;

 

  pEMAC->MADR = PHY_DEF_ADR;

  pEMAC->MCTL = (PhyReg << 3) | MCTL_START;

 

  /* Wait until operation completed */

  for (tout = 0; tout < MII_RD_TOUT; tout++) {

    if ((pEMAC->MCTL & MCTL_START) == 0) {

      break;

    }

  }

  return (pEMAC->MRXD & MRXD_MASK);

}

 

/*----------------------------------------------------------------------------

 * end of file

 *---------------------------------------------------------------------------*/

 

我觉得这里讲得太细的话,我可能会花几天,写几篇文章,但是还是讲不清楚

所以我只注识了一下,我认为比较重要的地方,希望帮助理解

 

移植也就是重写这里的几个函数。别的应用程序都一样

 
 
 

回复

144

帖子

0

TA的资源

一粒金砂(中级)

9
 

写得好,有没有DEMO?

 
 
 

回复

27

帖子

0

TA的资源

一粒金砂(初级)

10
 
写的好 学习 学习
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(中级)

11
 
学习一下,看TI的说明这个组件功能还是挺强的,哪天来用一下看看。
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(中级)

12
 
最近正着手尝试LM3S9B96的网络通讯,学习一下
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(初级)

13
 
写的很好
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(初级)

14
 

回复 8楼 yuhua8688 的帖子

请问 做过web没?
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

15
 
抽空学习研究一下
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表