请选择 进入手机版 | 继续访问电脑版
查看: 2197|回复: 6

[原创] 【IRD-LPC1768-DEV】以太网TCP Server测试

[复制链接]
  • TA的每日心情
    开心
    2024-4-5 11:15
  • 签到天数: 1061 天

    [LV.10]以坛为家III

    29

    主题

    1517

    帖子

    31

    金牌会员

    Rank: 6Rank: 6

    积分
    4970
    最后登录
    2024-4-5
    发表于 2019-3-19 13:10:58 | 显示全部楼层 |阅读模式
    报告3
    ——以太网TCP Server
    1.   总结
    利用官方的uIP+EMAC的例程研究了一段时间,无论如何也不能正确的建立连接,经过研究发现了几点不同需要特别注意:
    1、 LPC1768主板采用的Phy为KSZ8001L;
    2、 设计上增加了以太网芯片的电源控制;
    注意到这两点,问题基本扫清了。
    2.   硬件连接关系和引脚初始化 line.jpg
    硬件上的连接除了RMII要求的引脚必须初始化外,特别需要提醒的是上图中红色圈出的部分,P1.29 ETH_PHY_PD的引脚,这个引脚是KSZ8001L的Power Down控制引脚,通常的驱动中不会特殊提到这个引脚的使用,根据手册中的描述,这个引脚应该初始化为GPIO的输出模式,并且因该拉高,使能物理层的正常工作。
    pd-line.jpg
    我之前一直没有注意到,导致调试了好几天都没有进展。
    1. /*
    2.          * Enable P1 Ethernet Pins:
    3.          * P1.0 - ENET_TXD0
    4.          * P1.1 - ENET_TXD1
    5.          * P1.4 - ENET_TX_EN
    6.          * P1.8 - ENET_CRS
    7.          * P1.9 - ENET_RXD0
    8.          * P1.10 - ENET_RXD1
    9.          * P1.14 - ENET_RX_ER
    10.          * P1.15 - ENET_REF_CLK
    11.          * P1.16 - ENET_MDC
    12.          * P1.17 - ENET_MDIO
    13.          */
    14.         PinCfg.Funcnum = 1;
    15.         PinCfg.OpenDrain = 0;
    16.         PinCfg.Pinmode = 0;
    17.         PinCfg.Portnum = 1;

    18.         PinCfg.Pinnum = 0;
    19.         PINSEL_ConfigPin(&PinCfg);
    20.         PinCfg.Pinnum = 1;
    21.         PINSEL_ConfigPin(&PinCfg);
    22.         PinCfg.Pinnum = 4;
    23.         PINSEL_ConfigPin(&PinCfg);
    24.         PinCfg.Pinnum = 8;
    25.         PINSEL_ConfigPin(&PinCfg);
    26.         PinCfg.Pinnum = 9;
    27.         PINSEL_ConfigPin(&PinCfg);
    28.         PinCfg.Pinnum = 10;
    29.         PINSEL_ConfigPin(&PinCfg);
    30.         PinCfg.Pinnum = 14;
    31.         PINSEL_ConfigPin(&PinCfg);
    32.         PinCfg.Pinnum = 15;
    33.         PINSEL_ConfigPin(&PinCfg);
    34.         PinCfg.Pinnum = 16;
    35.         PINSEL_ConfigPin(&PinCfg);
    36.         PinCfg.Pinnum = 17;
    37.         PINSEL_ConfigPin(&PinCfg);
    38.         PinCfg.Pinnum = 29;
    39.         PinCfg.Funcnum = 0;
    40.         PINSEL_ConfigPin(&PinCfg);

    41.         GPIO_SetDir(1, (1<<29), 1);
    42.         GPIO_SetValue(1, (1<<29));
    复制代码
    3.   物理层初始化
    在驱动移植过程中,特别要注意的一个地方是:
    #defineEMAC_DEF_ADR    (0x00<<8)           /**< Default PHY deviceaddress        */
    这个是用于EMAC读写物理层寄存器时使用。
    1. Status EMAC_Init(EMAC_CFG_Type *EMAC_ConfigStruct)
    2. {
    3.         /* Initialize the EMAC Ethernet controller. */
    4.         int32_t regv,tout, tmp;

    5.         /* Set up clock and power for Ethernet module */
    6.         CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCENET, ENABLE);
    7.         delay_ms(100);
    8.         /* Reset all EMAC internal modules */
    9.         LPC_EMAC->MAC1    = EMAC_MAC1_RES_TX | EMAC_MAC1_RES_MCS_TX | EMAC_MAC1_RES_RX | EMAC_MAC1_RES_MCS_RX |
    10.                                             EMAC_MAC1_SIM_RES | EMAC_MAC1_SOFT_RES |EMAC_MAC1_RX_FLOWC | EMAC_MAC1_TX_FLOWC;       

    11.         LPC_EMAC->Command = EMAC_CR_REG_RES | EMAC_CR_TX_RES | EMAC_CR_RX_RES;       

    12.         /* A short delay after reset. */
    13.         delay_ms(1);

    14.         /* Initialize MAC control registers. */
    15.         LPC_EMAC->MAC1 = EMAC_MAC1_PASS_ALL;
    16.         LPC_EMAC->MAC2 = EMAC_MAC2_CRC_EN | EMAC_MAC2_PAD_EN;
    17.         LPC_EMAC->MAXF = EMAC_ETH_MAX_FLEN;
    18.         LPC_EMAC->CLRT = EMAC_CLRT_DEF;
    19.         LPC_EMAC->IPGR = EMAC_IPGR_P2_DEF;
    20.         /*
    21.          * Find the clock that close to desired target clock
    22.          */

    23. // host clock divided by 28, no suppress preamble, no scan increment
    24.     // TBD: Should this be calculated at run time?
    25.     LPC_EMAC->MCFG = 0x801C;       
    26.     delay_ms(10);

    27.         // release reset
    28.         LPC_EMAC->MCFG = 0x0018;
    29.         LPC_EMAC->MCMD = 0;

    30.         /* Enable Reduced MII interface. */
    31.         LPC_EMAC->Command = EMAC_CR_RMII;// | EMAC_CR_PASS_RUNT_FRM;

    32.         LPC_EMAC->SUPP = EMAC_SUPP_SPEED;
    33.     delay_ms(100);
    34.         /* Put the DP83848C in reset mode */
    35.         write_PHY (EMAC_PHY_REG_BMCR, EMAC_PHY_BMCR_RESET);
    36.     delay_ms(1000);

    37.         /* Wait for hardware reset to end. */
    38.         for (tout = EMAC_PHY_RESP_TOUT; tout; tout--) {
    39.                 regv = read_PHY (EMAC_PHY_REG_BMCR);
    40.                 if (!(regv & (EMAC_PHY_BMCR_RESET))) {  // | EMAC_PHY_BMCR_POWERDOWN
    41.                         /* Reset complete, device not Power Down. */
    42.                         break;
    43.                 }
    44.                 if (tout == 0){
    45.                         // Time out, return ERROR
    46.                         return (ERROR);
    47.                 }
    48.         }

    49.     // Setup PAUSE control (PAUSE and ASM_DIR in ANAR register)
    50.     regv = read_PHY(EMAC_PHY_REG_ANAR);

    51.     write_PHY(EMAC_PHY_REG_ANAR, regv|(1<<10)|(1<<11));
    52.        
    53.         // Set PHY mode
    54.         if (EMAC_SetPHYMode(EMAC_ConfigStruct->Mode) < 0){
    55.                 return (ERROR);
    56.         }

    57.         // Set EMAC address
    58.         setEmacAddr(EMAC_ConfigStruct->pbEMAC_Addr);

    59.         /* Initialize Tx and Rx DMA Descriptors */
    60.         rx_descr_init ();
    61.         tx_descr_init ();

    62.         // Set Receive Filter register: enable broadcast and multicast
    63.         LPC_EMAC->RxFilterCtrl = EMAC_RFC_BCAST_EN | EMAC_RFC_PERFECT_EN;
    64.         /* Enable Rx Done and Tx Done interrupt for EMAC */
    65.         LPC_EMAC->IntEnable = EMAC_INT_RX_DONE | EMAC_INT_TX_DONE;

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

    68.         /* Enable receive and transmit mode of MAC Ethernet core */
    69.         LPC_EMAC->Command  |= (EMAC_CR_RX_EN | EMAC_CR_TX_EN);
    70.         LPC_EMAC->MAC1     |= EMAC_MAC1_REC_EN;

    71.         return SUCCESS;
    72. }
    73. 原有驱动时基于83848的,改成KSZ8001L还是有调整的。
    复制代码
    4.   基于uIP的TCPServer
    物理层初始化完成,接就是TCP/IP协议栈的移植,这里采用uIP。
    协议栈的初始化过程,包括uip的初始化,本机IP地址,子网掩码,网关的初始化。结束后基本具备了通讯条件。
    4.1.  TCPServer初始化
    void mytcp_init(void)
    {
      /*We start to listen for connections on TCP port 1000. */
    uip_listen(HTONS(1000));
    }
    这个时初始化TCPServer监听端口号为1000的端口。
    4.2.  数据获取处理和发送
    uIP有一个关键函数uip_appcall(),所有的用户数据处理都在这里完成。
    void mytcp_appcall(void)
    {
      /*
       *The uip_conn structure has a field called "appstate" that holds
       *the application state of the connection. We make a pointer to
       *this to access it easier.
       */
           structmytcp_state *s = &(uip_conn->appstate);
           intlen,i;
           char*nptr;
      /*
       *If a new connection was just established, we should initialize
       *the protosocket in our applications' state structure.
       */
    if(uip_connected()) {
       PSOCK_INIT(&s->p, s->inputbuffer, sizeof(s->inputbuffer));
      }
    if(uip_conn->lport == HTONS(6000))
      {
             if(uip_newdata())
             {
                  len=uip_datalen();
                  nptr=(char*)uip_appdata;
                  if(len< UIP_SEND_BUF_MAX_LEN)
                  {
                         nptr[len]= 0;
                         uip_send(nptr,len);
                  }
             }
      }
      
    }
    通过uip_conn->lport == HTONS(6000)判定连接上发来的数据来自我们监听的端口,这个方法可以保证当监听多个端口时,仍然可以区分数据的来源。
    uip_newdata()函数判断uIP协议栈已经获取了有效的数据输入。
    len=uip_datalen();获取输入有效数据的长度。
    nptr=(char*)uip_appdata;取得接收到的数据。
    5.   效果展示
    初始化
    cmd.jpg
    收到数据后原样回传测试
    test1.jpg
    以太网通道建立完成,下一步时通过以太网通道完成DEV板载接口的控制。


    回复

    使用道具 举报

  • TA的每日心情
    开心
    2018-4-20 15:04
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    49

    主题

    188

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    2945
    最后登录
    2023-7-24
    发表于 2019-3-29 13:40:10 | 显示全部楼层
    楼主可以把TCP通信的工程发一下出来吗?
    今天心情不错
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-5 11:15
  • 签到天数: 1061 天

    [LV.10]以坛为家III

    29

    主题

    1517

    帖子

    31

    金牌会员

    Rank: 6Rank: 6

    积分
    4970
    最后登录
    2024-4-5
     楼主| 发表于 2019-3-29 15:13:20 | 显示全部楼层
    donatello1996 发表于 2019-3-29 13:40
    楼主可以把TCP通信的工程发一下出来吗?

    https://www.nxpic.org.cn/module/forum/thread-616349-1-1.html
    这个帖子中的代码时全的,包含tcp
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-4-20 15:04
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    49

    主题

    188

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    2945
    最后登录
    2023-7-24
    发表于 2019-3-30 20:22:43 | 显示全部楼层
    story_xjj 发表于 2019-3-29 15:13
    https://www.nxpic.org.cn/module/forum/thread-616349-1-1.html
    这个帖子中的代码时全的,包含tcp ...

    你的 mytcp_appcall函数我试过调不通啊,你有没有不带操作系统的一份TCP通信工程呢?
    今天心情不错
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-10 22:38
  • 签到天数: 1335 天

    [LV.10]以坛为家III

    88

    主题

    4292

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    9049
    最后登录
    2024-4-13
    发表于 2019-3-31 11:37:07 | 显示全部楼层
    这个开发板的原理图与硬件不匹配的坑还是挺多的
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-5 11:15
  • 签到天数: 1061 天

    [LV.10]以坛为家III

    29

    主题

    1517

    帖子

    31

    金牌会员

    Rank: 6Rank: 6

    积分
    4970
    最后登录
    2024-4-5
     楼主| 发表于 2019-4-1 15:09:42 | 显示全部楼层
    donatello1996 发表于 2019-3-30 20:22
    你的 mytcp_appcall函数我试过调不通啊,你有没有不带操作系统的一份TCP通信工程呢? ...

    这个是我的不带操作系统的程序版本,你参考一下吧
    myprog - 2.rar (6.99 MB, 下载次数: 8)
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-4-20 15:04
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    49

    主题

    188

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    2945
    最后登录
    2023-7-24
    发表于 2019-4-1 15:12:54 | 显示全部楼层
    story_xjj 发表于 2019-4-1 15:09
    这个是我的不带操作系统的程序版本,你参考一下吧

    不用啦哈哈,昨晚我已经自己调通了,谢谢了大佬
    今天心情不错
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-18 10:34 , Processed in 0.139047 second(s), 25 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

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