搜索
bottom↓
回复: 50

LPC1768裸跑LWIP成功,发帖庆祝下!

[复制链接]

出0入0汤圆

发表于 2011-10-29 13:13:10 | 显示全部楼层 |阅读模式
硬件: LPC1768+DP83848C
软件: LWIP(1.4.0) 裸奔

原先使用 RTT 系统跑网络, 两个TCP链接,100ms发送8K字节数据,长时间测试(>5h) 发送链接挂掉,上论坛求救大拿,自己查资料. 无奈自己没有接触过OS和LWIP,问题没有解决. 无奈,狠心裸奔. 经过2周的修改,现在网络已经ping通. 特发帖纪念下. 随后附上移植例程.

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2011-10-29 15:00:38 | 显示全部楼层
mark!

出10入0汤圆

发表于 2011-10-29 20:36:33 | 显示全部楼层
mark!!期待源码!!一直想玩LAN....

出0入0汤圆

发表于 2011-10-29 21:22:48 | 显示全部楼层
等待代码中……

出0入0汤圆

 楼主| 发表于 2011-10-30 09:05:32 | 显示全部楼层
周末加班调试网络, 发现一问题,主机接收有点问题,忙于查找.暂时发下部分代码.

MAC驱动部分
/******************************************************************
*****                                                        *****
*****  Name: EMAC.c                                          *****
*****  Ver.: V4.05                                           *****
*****  Date: 07/05/2010                                      *****
*****  Auth: Andreas Dannenberg                              *****
*****  Func: ethernet packet-driver for use with LAN-        *****
*****        controller DP83848C                               *****
*****                                                        *****
*****  Keil: Module modified for use with Philips            *****
*****        LPC17xx EMAC Ethernet controller                *****
*****                                                        *****
******************************************************************/
#include "LPC17xx.h"
#include "type.h"
#include "EMAC.h"
#include "net_cfg.h"
#include "netconf.h"

          
#define EMAC_PHY_AUTO                0
#define EMAC_PHY_10MBIT                1
#define EMAC_PHY_100MBIT        2

#define MAX_ADDR_LEN                 6


static unsigned short *rptr;
static unsigned short *tptr;

/*********************************************************************************************************
** Function name:       ENET_IRQHandler                         
** Descriptions:        Interrupt handler for Ethernet Controller
** input parameters:    无
** output parameters:   无
** Returned value:      无          
*********************************************************************************************************/
void ENET_IRQHandler(void)
{
        u32_t status;

        /* get the current interrupt status */
        status = LPC_EMAC->IntStatus & LPC_EMAC->IntEnable;

        /* Clear the interrupt. */

        LPC_EMAC->IntClear = status;

        if (status & (INT_RX_DONE | INT_RX_ERR))
        {
                /* Disable EMAC RxDone interrupts. */
//                LPC_EMAC->IntEnable = (INT_RX_DONE | INT_RX_ERR);

                lwip_netif_interrupt();
                /* a frame has been received */
        }
        else if (status & INT_TX_DONE)
        {
                /* release one slot */
                lwip_netif_interrupt();
                LPC_EMAC->IntClear = status;
        }

}
/*********************************************************************************************************
** Function name:       write_PHY                         
** Descriptions:        Write a value to a PHY register
** input parameters:    PhyReg : PHY register number ;         Value: PHY register value
** output parameters:   无
** Returned value:      无          
*********************************************************************************************************/
static void write_PHY (u32_t PhyReg, u32_t Value)
{
        unsigned int tout;

        LPC_EMAC->MADR = DP83848C_DEF_ADR | PhyReg;
        LPC_EMAC->MWTD = Value;

        /* Wait utill operation completed */
        tout = 0;
        for (tout = 0; tout < MII_WR_TOUT; tout++)
        {
                if ((LPC_EMAC->MIND & MIND_BUSY) == 0)
                {
                        break;
                }
        }
}

/*********************************************************************************************************
** Function name:       read_PHY                         
** Descriptions:        Read a PHY register
** input parameters:    PhyReg : PHY register number ;         
** output parameters:   无
** Returned value:      PHY register value          
*********************************************************************************************************/
static u16_t read_PHY (u8_t PhyReg)
{
        u32_t tout;

        LPC_EMAC->MADR = DP83848C_DEF_ADR | PhyReg;
        LPC_EMAC->MCMD = MCMD_READ;

        /* Wait until operation completed */
        tout = 0;
        for (tout = 0; tout < MII_RD_TOUT; tout++)
        {
                if ((LPC_EMAC->MIND & MIND_BUSY) == 0)
                {
                        break;
                }
        }
        LPC_EMAC->MCMD = 0;
        return (LPC_EMAC->MRDD);
}

/*********************************************************************************************************
** Function name:       rx_descr_init                         
** Descriptions:        init rx descriptor
** input parameters:    无         
** output parameters:   无
** Returned value:      无          
*********************************************************************************************************/
void rx_descr_init (void)
{
        u32_t i;

        for (i = 0; i < NUM_RX_FRAG; i++)
        {
                RX_DESC_PACKET(i)  = RX_BUF(i);
                RX_DESC_CTRL(i)    = RCTRL_INT | (ETH_FRAG_SIZE-1);
                RX_STAT_INFO(i)    = 0;
                RX_STAT_HASHCRC(i) = 0;
        }

        /* Set EMAC Receive Descriptor Registers. */
        LPC_EMAC->RxDescriptor    = RX_DESC_BASE;
        LPC_EMAC->RxStatus        = RX_STAT_BASE;
        LPC_EMAC->RxDescriptorNumber = NUM_RX_FRAG-1;

        /* Rx Descriptors Point to 0 */
        LPC_EMAC->RxConsumeIndex  = 0;
}

/*********************************************************************************************************
** Function name:       tx_descr_init                         
** Descriptions:        init tx descriptor
** input parameters:    无         
** output parameters:   无
** Returned value:      无          
*********************************************************************************************************/
void tx_descr_init (void)
{
        u32_t i;

        for (i = 0; i < NUM_TX_FRAG; i++)
        {
                TX_DESC_PACKET(i) = TX_BUF(i);
                TX_DESC_CTRL(i)   = (1ul<<31) | (1ul<<30) | (1ul<<29) | (1ul<<28) | (1ul<<26) | (ETH_FRAG_SIZE-1);
                TX_STAT_INFO(i)   = 0;
        }

        /* Set EMAC Transmit Descriptor Registers. */
        LPC_EMAC->TxDescriptor    = TX_DESC_BASE;
        LPC_EMAC->TxStatus        = TX_STAT_BASE;
        LPC_EMAC->TxDescriptorNumber = NUM_TX_FRAG-1;

        /* Tx Descriptors Point to 0 */
        LPC_EMAC->TxProduceIndex  = 0;
}

/*********************************************************************************************************
** Function name:       Init_EMAC                         
** Descriptions:        configure port-pins for use with LAN-controller,reset it and send the configuration-sequence
** input parameters:    无         
** output parameters:   无
** Returned value:      无          
*********************************************************************************************************/
void Init_EMAC(void)
{
// Keil: function modified to access the EMAC
        /* Initialize the EMAC ethernet controller. */
        u32_t regv, tout, id1, id2;

        /* Power Up the EMAC controller. */
        LPC_SC->PCONP |= 0x40000000;
  
        /* Enable P1 Ethernet Pins. */
        LPC_PINCON->PINSEL2 = 0x50150105;
        LPC_PINCON->PINSEL3 = (LPC_PINCON->PINSEL3 & ~0x0000000F) | 0x00000005;
       
        /* Reset all EMAC internal modules. */
        LPC_EMAC->MAC1 = MAC1_RES_TX | MAC1_RES_MCS_TX | MAC1_RES_RX | MAC1_RES_MCS_RX |
                 MAC1_SIM_RES | MAC1_SOFT_RES;
        LPC_EMAC->Command = CR_REG_RES | CR_TX_RES | CR_RX_RES;

        /* A short delay after reset. */
        for (tout = 100; tout; tout--);

        /* Initialize MAC control registers. */
        LPC_EMAC->MAC1 = MAC1_PASS_ALL;
        LPC_EMAC->MAC2 = MAC2_CRC_EN | MAC2_PAD_EN;
        LPC_EMAC->MAXF = ETH_MAX_FLEN;
        LPC_EMAC->CLRT = CLRT_DEF;
        LPC_EMAC->IPGR = IPGR_DEF;

        /* PCLK=18MHz, clock select=6, MDC=18/6=3MHz */
        /* Enable Reduced MII interface. */
        LPC_EMAC->MCFG = MCFG_CLK_DIV20 | MCFG_RES_MII;
        for (tout = 100; tout; tout--);
        LPC_EMAC->MCFG = MCFG_CLK_DIV20;

        /* Enable Reduced MII interface. */
        LPC_EMAC->Command = CR_RMII | CR_PASS_RUNT_FRM | CR_PASS_RX_FILT;

        /* Reset Reduced MII Logic. */
        LPC_EMAC->SUPP = SUPP_RES_RMII | SUPP_SPEED;
        for (tout = 100; tout; tout--);
        LPC_EMAC->SUPP = SUPP_SPEED;

        /* Put the DP83848C in reset mode */
        write_PHY (PHY_REG_BMCR, 0x8000);
        for (tout = 1000; tout; tout--);

        /* Wait for hardware reset to end. */
        for (tout = 0; tout < 0x100000; tout++)
        {
                regv = read_PHY (PHY_REG_BMCR);
                if (!(regv & 0x8000))
                {
                        /* Reset complete */
                        break;
                }
        }

        /* Check if this is a DP83848C PHY. */
        id1 = read_PHY (PHY_REG_IDR1);
        id2 = read_PHY (PHY_REG_IDR2);

        if (((id1 << 16) | (id2 & 0xFFF0)) == DP83848C_ID)
        {
                /* Configure the PHY device */
               
                /* Use autonegotiation about the link speed. */
                write_PHY (PHY_REG_BMCR, PHY_AUTO_NEG);
                /* Wait to complete Auto_Negotiation. */
                for (tout = 0; tout < 0x100000; tout++)
                {
                        regv = read_PHY (PHY_REG_BMSR);
                        if (regv & 0x0020)
                        {
                                /* Autonegotiation Complete. */
                                break;
                        }
                }
        }
        /* Check the link status. */
        for (tout = 0; tout < 0x10000; tout++)
        {
                regv = read_PHY (PHY_REG_STS);
                if (regv & 0x0001)
                {
                        /* Link is on. */
                        break;
                }
        }

        /* Configure Full/Half Duplex mode. */
        if (regv & 0x0004)
        {
                /* Full duplex is enabled. */
                LPC_EMAC->MAC2    |= MAC2_FULL_DUP;
                LPC_EMAC->Command |= CR_FULL_DUP;
                LPC_EMAC->IPGT     = IPGT_FULL_DUP;
        }
        else
        {
                /* Half duplex mode. */
                LPC_EMAC->IPGT = IPGT_HALF_DUP;
        }

        /* Configure 100MBit/10MBit mode. */
        if (regv & 0x0002)
        {
                /* 10MBit mode. */
                LPC_EMAC->SUPP = 0;
        }
        else
        {
                /* 100MBit mode. */
                LPC_EMAC->SUPP = SUPP_SPEED;
        }

        /* Set the Ethernet MAC Address registers */
        LPC_EMAC->SA0 = (LWIP_MAC1 << 8) | LWIP_MAC0 ;
        LPC_EMAC->SA1 = (LWIP_MAC3 << 8) | LWIP_MAC2 ;
        LPC_EMAC->SA2 = (LWIP_MAC5 << 8) | LWIP_MAC4 ;

        /* Initialize Tx and Rx DMA Descriptors */
        rx_descr_init ();
        tx_descr_init ();

        /* Receive Broadcast and Perfect Match Packets */
        LPC_EMAC->RxFilterCtrl = RFC_BCAST_EN | RFC_PERFECT_EN;

        /* Reset all interrupts */
        LPC_EMAC->IntClear  = 0xFFFF;

        /* Enable EMAC interrupts. */
        LPC_EMAC->IntEnable = INT_RX_DONE | INT_TX_DONE;

        /* Enable receive and transmit mode of MAC Ethernet core */
        LPC_EMAC->Command  |= (CR_RX_EN | CR_TX_EN);
        LPC_EMAC->MAC1     |= MAC1_REC_EN;

        /* Enable the ENET Interrupt */
        NVIC_EnableIRQ(ENET_IRQn);
}


/*********************************************************************************************************
  End Of File
*********************************************************************************************************/

出0入0汤圆

 楼主| 发表于 2011-10-30 09:17:26 | 显示全部楼层
还有,关键的 ethernetif.c

static void
low_level_init(struct netif *netif)
{
//  struct ethernetif *ethernetif = netif->state;
  
  /* set MAC hardware address length */
  netif->hwaddr_len = ETHARP_HWADDR_LEN;

  /* set MAC hardware address */
  netif->hwaddr[0] = LWIP_MAC0;
  netif->hwaddr[1] = LWIP_MAC1;
  netif->hwaddr[2] = LWIP_MAC2;
  netif->hwaddr[3] = LWIP_MAC3;
  netif->hwaddr[4] = LWIP_MAC4;
  netif->hwaddr[5] = LWIP_MAC5;
  /* maximum transfer unit */
  netif->mtu = 1500;
  
  /* device capabilities */
  /* don't set NETIF_FLAG_ETHARP if this device is not an ethernet one */
  netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP;        //  

  /* Do whatever else is needed to initialize interface. */  

  Init_EMAC();                        //Chexing
}

static err_t
low_level_output(struct netif *netif, struct pbuf *p)
{
//  struct ethernetif *ethernetif = netif->state;
  struct pbuf *q;
        u32_t Index, IndexNext;
        u8_t *ptr;


        /* get produce index */
        Index = LPC_EMAC->TxProduceIndex;

        /* calculate next index */
        IndexNext = LPC_EMAC->TxProduceIndex + 1;
        if(IndexNext > LPC_EMAC->TxDescriptorNumber)
                IndexNext = 0;

        /* copy data to tx buffer */
        q = p;
        ptr = (u8_t *)TX_BUF(Index);

        while (q)
        {
                memcpy(ptr, q->payload, q->len);
                ptr += q->len;
                q = q->next;
        }

        TX_DESC_CTRL(Index) &= ~0x7ff;
        TX_DESC_CTRL(Index) |= (1ul<<31) | (1ul<<30) | (1ul<<29) | (1ul<<28) | (1ul<<26) |(p->tot_len - 1) & 0x7ff;
        /* change index to the next */
        LPC_EMAC->TxProduceIndex = IndexNext;

//        pbuf_free(q);                chexing                         10-28

  return ERR_OK;
}

static struct pbuf *
low_level_input(struct netif *netif)
{
//  struct ethernetif *ethernetif = netif->state;
  struct pbuf *p;       
        u32_t size;
        u32_t Index;

        /* init p pointer */
        p = NULL;

        Index = LPC_EMAC->RxConsumeIndex;


        if(Index != LPC_EMAC->RxProduceIndex)
        {
                size = (RX_STAT_INFO(Index) & 0x7ff)+1;
                if (size > ETH_FRAG_SIZE) size = ETH_FRAG_SIZE;

                /* allocate buffer */
                p = pbuf_alloc(PBUF_RAW, size, PBUF_POOL);
                if (p != NULL)
                {
                        struct pbuf* q;
                        u8_t *ptr;

                        ptr = (u8_t *)RX_BUF(Index);
                        for (q = p; q != NULL; q= q->next)
                        {
                                memcpy(q->payload, ptr, q->len);
                                ptr += q->len;
                        }
                }

               
                /* move Index to the next */
                if(++Index > LPC_EMAC->RxDescriptorNumber)
                        Index = 0;

                /* set consume index */
                LPC_EMAC->RxConsumeIndex = Index;
       
            LINK_STATS_INC(link.recv);

        }
        else
        {
                /* Enable RxDone interrupt */
                LPC_EMAC->IntEnable = INT_RX_DONE | INT_TX_DONE;
        }

  return p;  
}

ethernetif_init()  和  ethernetif_input() 都不修改.

出0入22汤圆

发表于 2011-10-30 09:25:21 | 显示全部楼层
楼上,lpc1768用在什么行业呀?

出0入0汤圆

 楼主| 发表于 2011-10-30 11:57:20 | 显示全部楼层
回复【6楼】zxq6 小马哈
楼上,lpc1768用在什么行业呀?
-----------------------------------------------------------------------

用在石油仪器上 做数据采集终端.

出0入0汤圆

发表于 2011-10-30 18:26:09 | 显示全部楼层
不错。。。。
正在做网络方面。

出0入0汤圆

发表于 2011-11-4 14:02:11 | 显示全部楼层
Mark  正在用LPC1768

出0入0汤圆

发表于 2011-11-4 14:11:51 | 显示全部楼层
LPC1768FBD100的说实现的和STM32相比来说性能要高得多。不过现在价格也降下来好多了

出0入0汤圆

发表于 2011-11-6 21:39:28 | 显示全部楼层
开增票35元。1K的量。

出0入0汤圆

发表于 2011-11-8 22:04:31 | 显示全部楼层
不错

出0入0汤圆

发表于 2011-11-21 22:43:59 | 显示全部楼层
用现有的rl_tcpnet也挺好的。只是接收有点问题,解决就好了。

出0入0汤圆

发表于 2011-11-29 15:11:24 | 显示全部楼层
lpc1768 + rtt + lwip 测了几个月了,没有挂掉的情况啊

出0入0汤圆

发表于 2011-12-19 10:56:40 | 显示全部楼层
研究研究

出0入0汤圆

发表于 2011-12-19 11:27:15 | 显示全部楼层
回复【15楼】zjianb
lpc1768 + rtt + lwip 测了几个月了,没有挂掉的情况啊
-----------------------------------------------------------------------

使用了socket么?

出0入0汤圆

发表于 2011-12-19 17:48:02 | 显示全部楼层
关注

出0入0汤圆

发表于 2011-12-20 09:44:57 | 显示全部楼层
学习学习,支持中!MARK!

出0入0汤圆

发表于 2011-12-23 16:55:11 | 显示全部楼层
回复【楼主位】chexing
-----------------------------------------------------------------------

楼主工程是否能分享一下??

出0入0汤圆

发表于 2011-12-23 16:57:35 | 显示全部楼层
我用了你的方式做了 但是PING不通 不知道哪里出现问题 可以ARP连接 也可以发UDP 就是PING有问题 能否借用下你的工程 我也是裸跑 不带系统

出0入0汤圆

发表于 2011-12-26 15:03:41 | 显示全部楼层
膜拜楼主,学习了!

出0入0汤圆

发表于 2012-4-5 10:42:12 | 显示全部楼层
嘿嘿,感谢楼主。。。。。。。

出0入8汤圆

发表于 2012-5-3 16:37:08 | 显示全部楼层
LWIP成功,放代码出来看看啊,大家参考下了

出0入0汤圆

发表于 2012-10-19 17:32:32 | 显示全部楼层
楼主有没有测试一下传送数据的带宽有多少,或者楼主是否知道如何测试?

出0入0汤圆

发表于 2013-1-8 11:45:16 | 显示全部楼层
xuchess 发表于 2011-11-21 22:43
用现有的rl_tcpnet也挺好的。只是接收有点问题,解决就好了。

rl_tcpnet可以商用么,需要授权交版权费么?

出0入0汤圆

发表于 2013-1-8 15:07:50 | 显示全部楼层
谢谢分享!!

出0入0汤圆

发表于 2013-1-9 18:57:43 | 显示全部楼层
rtx_tcpnet 是rtx kernel中自带的,有部分源码的。

出0入0汤圆

发表于 2013-1-17 11:22:54 | 显示全部楼层
谢谢分享。

出0入0汤圆

发表于 2013-1-19 12:31:35 | 显示全部楼层
byin 发表于 2013-1-8 11:45
rl_tcpnet可以商用么,需要授权交版权费么?

我用的就是RL库,测试下来还可以,跨网段也没问题,你可以试试看的……

出0入0汤圆

发表于 2013-1-19 14:44:31 | 显示全部楼层
楼上的各位这个LPC的单片机片上资源是多少?ROM/RAM各多少?
可不可以挂接WiFi模块实现WiFi客户端的功能?

出0入0汤圆

发表于 2013-1-26 12:50:49 | 显示全部楼层
mark一下

出0入0汤圆

发表于 2013-2-19 11:33:22 | 显示全部楼层
楼主能不能说下lwip_netif_interrupt();这个函数中的实现是什么呢?

出0入0汤圆

发表于 2013-6-15 11:18:20 | 显示全部楼层
您好,能发送一份1700和lwip的裸跑例程吗,谢谢啊,wygyyx@163.com

出0入0汤圆

发表于 2013-6-16 00:54:34 | 显示全部楼层
求更多1768资料

出0入34汤圆

发表于 2013-6-16 14:16:55 | 显示全部楼层
各位想要用 LPC1768 来裸跑 LWIP 的看看是否可以参考这个路虎的 LWIP 程序  ->  uC/OS-V2.9_LWIP-V1.3.2

再自己改改将其 uC/OS 给移除掉试试吧!

出0入0汤圆

发表于 2013-7-2 18:24:48 | 显示全部楼层
mark



出0入0汤圆

发表于 2013-8-12 14:58:21 来自手机 | 显示全部楼层
mark……
顶一个…

出0入0汤圆

发表于 2014-4-9 19:46:51 | 显示全部楼层
这几天也在调试LPC1768裸奔lwip,期待能得到楼主的更多指点。

出0入0汤圆

发表于 2014-5-29 11:22:22 | 显示全部楼层
这几天也在调试LPC1768裸奔lwip,期待能得到楼主的更多指点,共享源码呵呵。

出0入0汤圆

发表于 2014-7-2 17:10:57 | 显示全部楼层
楼主有没有用1768+交换机芯片的应用啊?

出0入0汤圆

发表于 2014-7-2 17:11:13 | 显示全部楼层
楼主有没有用1768+交换机芯片的应用啊?

出0入0汤圆

发表于 2014-7-2 17:11:39 | 显示全部楼层
楼主有没有用1768+交换机芯片的应用啊?

出0入0汤圆

发表于 2014-7-3 10:24:21 | 显示全部楼层
没法附件上来啊楼主

出0入0汤圆

发表于 2014-7-8 15:46:25 | 显示全部楼层
STM32F107+RTT+LwIP,测试了两周,很稳定。

出0入0汤圆

发表于 2014-7-17 21:32:30 | 显示全部楼层
MARK,学习一下

出0入0汤圆

发表于 2014-9-4 19:17:55 | 显示全部楼层
参考一下

出0入0汤圆

发表于 2015-3-23 17:06:29 | 显示全部楼层
期待楼主开源呀。

出0入0汤圆

发表于 2015-4-2 17:24:58 | 显示全部楼层
楼主,怎么没回应呢?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 07:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表