求一个用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的网络相关寄存器太多了,看的头晕,不想细研究了,哪位弄过,分享一下,谢谢 见此贴 http://www.amobbs.com/thread-5601945-1-1.html 的3楼 看着代码即可!该后缀为.7Z
magicoe 发表于 2014-11-6 10:23
见此贴 http://www.amobbs.com/thread-5601945-1-1.html 的3楼
好的,我先看看 activeleo 发表于 2014-11-6 10:26
看着代码即可!该后缀为.7Z
谢谢,我看一下代码先 activeleo 发表于 2014-11-6 10:26
看着代码即可!该后缀为.7Z
你的代码中没有ethernetif.c文件???我没有找到 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;
}
activeleo 发表于 2014-11-6 10:26
看着代码即可!该后缀为.7Z
这个dp83848的ID是怎么来的呢??
#define EMAC_DP83848C_ID 0x20005C90/**< PHY Identifier */ xtaens 发表于 2014-11-6 13:40
这个dp83848的ID是怎么来的呢??
#define EMAC_DP83848C_ID 0x20005C90/**< PHY Identifier ...
这个请看PHY的Datasheet magicoe 发表于 2014-11-6 13:44
这个请看PHY的Datasheet
好的,我再看看手册
那个缓存发送数据的问题,希望大侠看看怎么解释 我的low_level_output文件写法来自:http://www.amobbs.com/thread-5584125-1-1.html xtaens 发表于 2014-11-6 13:50
我的low_level_output文件写法来自:http://www.amobbs.com/thread-5584125-1-1.html
这个是参考官方EasyWeb那个的 xtaens 发表于 2014-11-6 13:34
先请教你一个问题:
low_level_output函数调用ethernet_send向网卡发送数据,但是ethernet_send调用的确 ...
这个缓冲区应该是设定到EMAC的DMA上的,由DMA自动完成发送和接受 magicoe 发表于 2014-11-6 10:23
见此贴 http://www.amobbs.com/thread-5601945-1-1.html 的3楼
这两个包中的emac及low_level_output写的好乱啊
{:sad:}
xtaens 发表于 2014-11-6 14:09
这两个包中的emac及low_level_output写的好乱啊
不乱,是你静不下来一条条语句好好学习。 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;
magicoe 发表于 2014-11-6 14:11
不乱,是你静不下来一条条语句好好学习。
我现在lwip能进中断了,但是提示数据错误。RxErrorInt和RxFinishedInt置位,清零后中断再也进不来了。
RxErrorInt表示:
接收出现错误时中断触发。接收错误包括: AlignmentError、
RangeError 、 LengthError 、 SymbolError 、 CRCError 或
NoDescriptor 或 Overrun
RxFinishedInt表示:
当 所 有 的 接 收 描 述 符 均 已 处 理 完 时 , 即 当 传 输 满 足
ProduceIndex= = consumeIndex 时中断触发
我用网口监视软件,初始化时没有发现我发出的arp确认包。 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]