搜索
bottom↓
回复: 17

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

[复制链接]

出0入0汤圆

发表于 2014-11-6 08:43:38 | 显示全部楼层 |阅读模式
想用lwip,lpc1788单片机,裸机跑lwip,部分驱动用的库lpc177x_8x_08132012.zip中的文件

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

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

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

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

出0入0汤圆

发表于 2014-11-6 10:23:26 | 显示全部楼层
见此贴 http://www.amobbs.com/thread-5601945-1-1.html 的3楼

出0入0汤圆

发表于 2014-11-6 08:43:39 | 显示全部楼层
看着代码即可!该后缀为.7Z


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2014-11-6 12:33:36 | 显示全部楼层
magicoe 发表于 2014-11-6 10:23
见此贴 http://www.amobbs.com/thread-5601945-1-1.html 的3楼

好的,我先看看

出0入0汤圆

 楼主| 发表于 2014-11-6 12:34:10 | 显示全部楼层
activeleo 发表于 2014-11-6 10:26
看着代码即可!该后缀为.7Z

谢谢,我看一下代码先

出0入0汤圆

 楼主| 发表于 2014-11-6 13:26:16 | 显示全部楼层
activeleo 发表于 2014-11-6 10:26
看着代码即可!该后缀为.7Z

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

出0入0汤圆

 楼主| 发表于 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数据读取的那个帖子。


  1. void EMAC_WritePacketBuffer(EMAC_PACKETBUF_Type *pDataStruct)
  2. {
  3.   uint32_t idx,len;
  4.   uint32_t *sp,*dp;

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



  15. int8_t ethernet_send(void *pPacket, uint16_t size)
  16. {
  17.         EMAC_PACKETBUF_Type TxPack;

  18.         /* Check size */
  19.         if(size == 0)
  20.         {
  21.                 return 1;
  22.         }

  23.         /* check Tx Slot is available */
  24.         if (EMAC_CheckTransmitIndex() == FALSE)
  25.         {
  26.                 return -1;
  27.         }

  28.         size = MIN(size,EMAC_MAX_PACKET_SIZE);

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

  34.         return 0;
  35. }

  36. static err_t
  37. low_level_output(struct netif *netif, struct pbuf *p)
  38. {
  39.   //struct ethernetif *ethernetif = netif->state;
  40.   struct pbuf *q;
  41.   u32_t len = 0;

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

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

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

  56.     memcpy((u8_t*)&gTxBuf[len], q->payload, q->len);
  57.     len = len + q->len;
  58.   }

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

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

  64.   LINK_STATS_INC(link.xmit);

  65.   SYS_ARCH_UNPROTECT(sr);
  66.   return ERR_OK;
  67. }
复制代码

出0入0汤圆

 楼主| 发表于 2014-11-6 13:40:23 | 显示全部楼层
activeleo 发表于 2014-11-6 10:26
看着代码即可!该后缀为.7Z

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

出0入0汤圆

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

这个请看PHY的Datasheet

出0入0汤圆

 楼主| 发表于 2014-11-6 13:48:08 | 显示全部楼层
magicoe 发表于 2014-11-6 13:44
这个请看PHY的Datasheet

好的,我再看看手册

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

出0入0汤圆

 楼主| 发表于 2014-11-6 13:50:10 | 显示全部楼层
我的low_level_output文件写法来自:http://www.amobbs.com/thread-5584125-1-1.html

出0入0汤圆

发表于 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那个的

出0入0汤圆

发表于 2014-11-6 14:03:48 | 显示全部楼层
xtaens 发表于 2014-11-6 13:34
先请教你一个问题:

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

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

出0入0汤圆

 楼主| 发表于 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写的好乱啊

出0入0汤圆

发表于 2014-11-6 14:11:30 | 显示全部楼层
xtaens 发表于 2014-11-6 14:09
这两个包中的emac及low_level_output写的好乱啊

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

出0入0汤圆

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

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

但是下面的注释中有DMA

  1. /* EMAC local DMA Descriptors */

  2. /** Rx Descriptor data array */
  3. static RX_Desc Rx_Desc[EMAC_NUM_RX_FRAG];

  4. /** Rx Status data array - Must be 8-Byte aligned */
  5. #if defined ( __CC_ARM   )
  6. static __align(8) RX_Stat Rx_Stat[EMAC_NUM_RX_FRAG];
  7. #elif defined ( __ICCARM__ )
  8. #pragma data_alignment=8
  9. static RX_Stat Rx_Stat[EMAC_NUM_RX_FRAG];
  10. #elif defined   (  __GNUC__  )
  11. static __attribute__ ((aligned (8))) RX_Stat Rx_Stat[EMAC_NUM_RX_FRAG];
  12. #endif

  13. /** Tx Descriptor data array */
  14. static TX_Desc Tx_Desc[EMAC_NUM_TX_FRAG];
  15. /** Tx Status data array */
  16. static TX_Stat Tx_Stat[EMAC_NUM_TX_FRAG];

  17. /* EMAC local DMA buffers */
  18. /** Rx buffer data */
  19. static uint32_t rx_buf[EMAC_NUM_RX_FRAG][EMAC_ETH_MAX_FLEN>>2];
  20. /** Tx buffer data */
  21. static uint32_t tx_buf[EMAC_NUM_TX_FRAG][EMAC_ETH_MAX_FLEN>>2];
复制代码

出0入0汤圆

 楼主| 发表于 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确认包。

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-4-26 17:20

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

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