xtaens 发表于 2014-11-6 08:43:38

求一个用LPC1788的库文件emac写的lwip网卡驱动ethernetif.c文件...

想用lwip,lpc1788单片机,裸机跑lwip,部分驱动用的库lpc177x_8x_08132012.zip中的文件

lwip网卡驱动ethernetif.c文件不想自己写了,哪位有用lpc177x_8x_08132012.zip的库文件lpc177x_8x_emac.c写的ethernetif.c文件

lwip、lpc1788的网络相关寄存器太多了,看的头晕,不想细研究了,哪位弄过,分享一下,谢谢

magicoe 发表于 2014-11-6 10:23:26

见此贴 http://www.amobbs.com/thread-5601945-1-1.html 的3楼

activeleo 发表于 2014-11-6 08:43:39

看着代码即可!该后缀为.7Z


xtaens 发表于 2014-11-6 12:33:36

magicoe 发表于 2014-11-6 10:23
见此贴 http://www.amobbs.com/thread-5601945-1-1.html 的3楼

好的,我先看看

xtaens 发表于 2014-11-6 12:34:10

activeleo 发表于 2014-11-6 10:26
看着代码即可!该后缀为.7Z

谢谢,我看一下代码先

xtaens 发表于 2014-11-6 13:26:16

activeleo 发表于 2014-11-6 10:26
看着代码即可!该后缀为.7Z

你的代码中没有ethernetif.c文件???我没有找到

xtaens 发表于 2014-11-6 13:34:04

magicoe 发表于 2014-11-6 10:23
见此贴 http://www.amobbs.com/thread-5601945-1-1.html 的3楼

先请教你一个问题:

low_level_output函数调用ethernet_send向网卡发送数据,但是ethernet_send调用的确实EMAC_WritePacketBuffer函数

该函数只是把发发送的数据放到了Tx_Desc缓存中,这个缓存中的数据是谁,在哪里,怎么调用把数据发送到phy上的呢?
谢谢

下面的函数有2个是1788的库函数中的,一个是lwip文件中的。low_level_output的写法参考论坛里一个人的,是用lwip实现AD数据读取的那个帖子。


void EMAC_WritePacketBuffer(EMAC_PACKETBUF_Type *pDataStruct)
{
uint32_t idx,len;
uint32_t *sp,*dp;

idx = LPC_EMAC->TxProduceIndex;
sp= (uint32_t *)pDataStruct->pbDataBuf;
dp= (uint32_t *)Tx_Desc.Packet;
/* Copy frame data to EMAC packet buffers. */
for (len = (pDataStruct->ulDataLen + 3) >> 2; len; len--)
{
    *dp++ = *sp++;
}
Tx_Desc.Ctrl = (pDataStruct->ulDataLen - 1) | (EMAC_TCTRL_INT | EMAC_TCTRL_LAST);//===============这个数据在哪里被发送到phy上了呢?????????
}



int8_t ethernet_send(void *pPacket, uint16_t size)
{
        EMAC_PACKETBUF_Type TxPack;

        /* Check size */
        if(size == 0)
        {
                return 1;
        }

        /* check Tx Slot is available */
        if (EMAC_CheckTransmitIndex() == FALSE)
        {
                return -1;
        }

        size = MIN(size,EMAC_MAX_PACKET_SIZE);

        /* Setup Tx Packet buffer */
        TxPack.ulDataLen = size;
        TxPack.pbDataBuf = (uint32_t *)pPacket;
        EMAC_WritePacketBuffer(&TxPack);
        EMAC_UpdateTxProduceIndex();

        return 0;
}

static err_t
low_level_output(struct netif *netif, struct pbuf *p)
{
//struct ethernetif *ethernetif = netif->state;
struct pbuf *q;
u32_t len = 0;

//initiate transfer();
SYS_ARCH_DECL_PROTECT(sr);
/* Interrupts are disabled through this whole thing to support multi-threading
   transmit calls. Also this function might be called from an ISR. */
SYS_ARCH_PROTECT(sr);

#if ETH_PAD_SIZE
pbuf_header(p, -ETH_PAD_SIZE); /* drop the padding word */
#endif

for(q = p; q != NULL; q = q->next)
{
    /* Send the data from the pbuf to the interface, one pbuf at a
       time. The size of the data in each pbuf is kept in the ->len
       variable. */
    //send data from(q->payload, q->len);

    memcpy((u8_t*)&gTxBuf, q->payload, q->len);
    len = len + q->len;
}

//signal that packet should be sent();
ethernet_send(gTxBuf, len);

#if ETH_PAD_SIZE
pbuf_header(p, ETH_PAD_SIZE); /* reclaim the padding word */
#endif

LINK_STATS_INC(link.xmit);

SYS_ARCH_UNPROTECT(sr);
return ERR_OK;
}

xtaens 发表于 2014-11-6 13:40:23

activeleo 发表于 2014-11-6 10:26
看着代码即可!该后缀为.7Z

这个dp83848的ID是怎么来的呢??
#define EMAC_DP83848C_ID         0x20005C90/**< PHY Identifier                  */

magicoe 发表于 2014-11-6 13:44:44

xtaens 发表于 2014-11-6 13:40
这个dp83848的ID是怎么来的呢??
#define EMAC_DP83848C_ID         0x20005C90/**< PHY Identifier   ...

这个请看PHY的Datasheet

xtaens 发表于 2014-11-6 13:48:08

magicoe 发表于 2014-11-6 13:44
这个请看PHY的Datasheet

好的,我再看看手册

那个缓存发送数据的问题,希望大侠看看怎么解释

xtaens 发表于 2014-11-6 13:50:10

我的low_level_output文件写法来自:http://www.amobbs.com/thread-5584125-1-1.html

magicoe 发表于 2014-11-6 14:02:56

xtaens 发表于 2014-11-6 13:50
我的low_level_output文件写法来自:http://www.amobbs.com/thread-5584125-1-1.html

这个是参考官方EasyWeb那个的

magicoe 发表于 2014-11-6 14:03:48

xtaens 发表于 2014-11-6 13:34
先请教你一个问题:

low_level_output函数调用ethernet_send向网卡发送数据,但是ethernet_send调用的确 ...

这个缓冲区应该是设定到EMAC的DMA上的,由DMA自动完成发送和接受

xtaens 发表于 2014-11-6 14:09:40

magicoe 发表于 2014-11-6 10:23
见此贴 http://www.amobbs.com/thread-5601945-1-1.html 的3楼

这两个包中的emac及low_level_output写的好乱啊
{:sad:}

magicoe 发表于 2014-11-6 14:11:30

xtaens 发表于 2014-11-6 14:09
这两个包中的emac及low_level_output写的好乱啊

不乱,是你静不下来一条条语句好好学习。

xtaens 发表于 2014-11-6 14:14:44

magicoe 发表于 2014-11-6 14:03
这个缓冲区应该是设定到EMAC的DMA上的,由DMA自动完成发送和接受

我没有对DMA进行任何操作,也没找到他在哪个函数调用了。下面是lpc177x_8x_emac.c的驱动,开头定义了Rx_Stat等缓存,且是局部变量。

但是下面的注释中有DMA

/* EMAC local DMA Descriptors */

/** Rx Descriptor data array */
static RX_Desc Rx_Desc;

/** Rx Status data array - Must be 8-Byte aligned */
#if defined ( __CC_ARM   )
static __align(8) RX_Stat Rx_Stat;
#elif defined ( __ICCARM__ )
#pragma data_alignment=8
static RX_Stat Rx_Stat;
#elif defined   (__GNUC__)
static __attribute__ ((aligned (8))) RX_Stat Rx_Stat;
#endif

/** Tx Descriptor data array */
static TX_Desc Tx_Desc;
/** Tx Status data array */
static TX_Stat Tx_Stat;

/* EMAC local DMA buffers */
/** Rx buffer data */
static uint32_t rx_buf;
/** Tx buffer data */
static uint32_t tx_buf;

xtaens 发表于 2014-11-6 14:24:53

magicoe 发表于 2014-11-6 14:11
不乱,是你静不下来一条条语句好好学习。

我现在lwip能进中断了,但是提示数据错误。RxErrorInt和RxFinishedInt置位,清零后中断再也进不来了。

RxErrorInt表示:
接收出现错误时中断触发。接收错误包括: AlignmentError、
RangeError 、 LengthError 、 SymbolError 、 CRCError 或
NoDescriptor 或 Overrun


RxFinishedInt表示:
当 所 有 的 接 收 描 述 符 均 已 处 理 完 时 , 即 当 传 输 满 足
ProduceIndex= = consumeIndex 时中断触发

我用网口监视软件,初始化时没有发现我发出的arp确认包。

xtaens 发表于 2014-11-6 16:42:08

magicoe 发表于 2014-11-6 13:44
这个请看PHY的Datasheet

知道这个怎么回事了,我被那个:OUI Most Significant Bits: Bits 3 to 18 of the OUI (080017h) are
stored in bits 15 to 0 of this register. The most significant two bits
of the OUI are ignored (the IEEE standard refers to these as bits 1and 2).



OUI Least Significant Bits:
Bits 19 to 24 of the OUI (080017h) are mapped from bits 15 to 10
of this register respectively.

map了好久没弄出那个值

其实这个值就是默认值,不用map了,谢谢了
页: [1]
查看完整版本: 求一个用LPC1788的库文件emac写的lwip网卡驱动ethernetif.c文件...