打印
[STM32F1]

STM32F107+LWIP DM9161 MII

[复制链接]
6813|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tgwfcc|  楼主 | 2014-7-18 10:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
板子是自己做的,现在想简单的ping通。我是参考的神舟的代码,在STM32F107_ETH_LwIP_V1.0.0这个例程的基础上改的,目前知道需要修改的代码( System_Setup();启动函数):PHY Address,(PHY ID代码中没看到),模式改为MII,GPIO管脚的配置。另外void LwIP_Init(void) 这个函数要修改吗?
把程序下载到板子上,网口的绿灯和黄灯都是闪的,正常情况应是绿灯常亮,黄灯闪。请高手帮忙指点一下,要怎么做?我是新手。最好能加QQ853678594,在线等。
System_Setup和 LwIP_Init.rar (6.9 KB)


沙发
tgwfcc|  楼主 | 2014-7-18 10:11 | 只看该作者
void LwIP_Init(void)
{
  struct ip_addr ipaddr;
  struct ip_addr netmask;
  struct ip_addr gw;
  //uint8_t macaddress[6]={0,0,0,0,0,1};
        uint8_t macaddress[6]={0xcc,0xbb,0xaa,0x99,0x88,0x1};

  /* Initializes the dynamic memory heap defined by MEM_SIZE.*/
  mem_init();

  /* Initializes the memory pools defined by MEMP_NUM_x.*/
  memp_init();


#if LWIP_DHCP
  ipaddr.addr = 0;
  netmask.addr = 0;
  gw.addr = 0;

  /* Configure the board opeartin mode: Client/Server */  
  LCD_DisplayStringLine(Line5, "  Keep Key button   ");
  LCD_DisplayStringLine(Line6, "pressed to activate ");
  LCD_DisplayStringLine(Line7, "     the server     ");

  Delay(KEY_DELAY);
  
  if(!STM_EVAL_PBGetState(Button_KEY))
  {       
        Server = SELECTED;
       
        LCD_DisplayStringLine(Line5, "                    ");
        LCD_DisplayStringLine(Line6, "  Server selected   ");       
        LCD_DisplayStringLine(Line7, "                    ");
        Delay(LCD_DELAY);
  }
  else
  {
    macaddress[5]=CLIENTMAC6;
       
        Server = NOT_SELECTED;
       
        LCD_DisplayStringLine(Line5, "                    ");
        LCD_DisplayStringLine(Line6, "  Client selected   ");       
        LCD_DisplayStringLine(Line7, "                    ");
        Delay(LCD_DELAY);
  }

#else
  IP4_ADDR(&ipaddr, 192, 168, 1, 8);
  IP4_ADDR(&netmask, 255, 255, 255, 0);
  IP4_ADDR(&gw, 192, 168, 1, 1);
#endif

  Set_MAC_Address(macaddress);

  /* - netif_add(struct netif *netif, struct ip_addr *ipaddr,
            struct ip_addr *netmask, struct ip_addr *gw,
            void *state, err_t (* init)(struct netif *netif),
            err_t (* input)(struct pbuf *p, struct netif *netif))
   
   Adds your network interface to the netif_list. Allocate a struct
  netif and pass a pointer to this structure as the first argument.
  Give pointers to cleared ip_addr structures when using DHCP,
  or fill them with sane numbers otherwise. The state pointer may be NULL.

  The init function pointer must point to a initialization function for
  your ethernet netif interface. The following code illustrates it's use.*/
  netif_add(&netif, &ipaddr, &netmask, &gw, NULL, &ethernetif_init, &ethernet_input);

  /*  Registers the default network interface.*/
  netif_set_default(&netif);


#if LWIP_DHCP
  /*  Creates a new DHCP client for this interface on the first call.
  Note: you must call dhcp_fine_tmr() and dhcp_coarse_tmr() at
  the predefined regular intervals after starting the client.
  You can peek in the netif->dhcp struct for the actual DHCP status.*/
  dhcp_start(&netif);
#endif

  /*  When the netif is fully configured this function must be called.*/
  netif_set_up(&netif);

}

/**
  * @brief  Called when a frame is received
  * @param  None
  * @retval None
  */
void LwIP_Pkt_Handle(void)
{
  /* Read a received packet from the Ethernet buffers and send it to the lwIP for handling */
  ethernetif_input(&netif);
}

/**
  * @brief  LwIP periodic tasks
  * @param  localtime the current LocalTime value
  * @retval None
  */
void LwIP_Periodic_Handle(__IO uint32_t localtime)
{

  /* TCP periodic process every 250 ms */
  if (localtime - TCPTimer >= TCP_TMR_INTERVAL)
  {
    TCPTimer =  localtime;
    tcp_tmr();
  }
  /* ARP periodic process every 5s */
  if (localtime - ARPTimer >= ARP_TMR_INTERVAL)
  {
    ARPTimer =  localtime;
    etharp_tmr();
  }

#if LWIP_DHCP
  /* Fine DHCP periodic process every 500ms */
  if (localtime - DHCPfineTimer >= DHCP_FINE_TIMER_MSECS)
  {
    DHCPfineTimer =  localtime;
    dhcp_fine_tmr();
  }
  /* DHCP Coarse periodic process every 60s */
  if (localtime - DHCPcoarseTimer >= DHCP_COARSE_TIMER_MSECS)
  {
    DHCPcoarseTimer =  localtime;
    dhcp_coarse_tmr();
  }
#endif

}

/**
  * @brief  LCD & LEDs periodic handling
  * @param  localtime: the current LocalTime value
  * @retval None
  */
void Display_Periodic_Handle(__IO uint32_t localtime)
{
  /* 250 ms */
  if (localtime - DisplayTimer >= LCD_TIMER_MSECS)
  {
    DisplayTimer = localtime;

    /* We have got a new IP address so update the display */
    if (IPaddress != netif.ip_addr.addr)
    {
      __IO uint8_t iptab[4];
      uint8_t iptxt[20];

      /* Read the new IP address */
      IPaddress = netif.ip_addr.addr;

      iptab[0] = (uint8_t)(IPaddress >> 24);
      iptab[1] = (uint8_t)(IPaddress >> 16);
      iptab[2] = (uint8_t)(IPaddress >> 8);
      iptab[3] = (uint8_t)(IPaddress);

      sprintf((char*)iptxt, "   %d.%d.%d.%d    ", iptab[3], iptab[2], iptab[1], iptab[0]);

      /* Display the new IP address */
#if LWIP_DHCP
      if (netif.flags & NETIF_FLAG_DHCP)
      {        
                /* Display the IP address */
                LCD_DisplayStringLine(Line7, "IP address assigned ");
        LCD_DisplayStringLine(Line8, "  by a DHCP server  ");
        LCD_DisplayStringLine(Line9, iptxt);
                Delay(LCD_DELAY);
               
                /** Start the client/server application: only when a dynamic IP address has been obtained  **/
            /* Clear the LCD */
        LCD_Clear(Black);
            LCD_SetBackColor(Black);
        LCD_SetTextColor(White);                          
      
            iptab[0] = (uint8_t)(IPaddress >> 24);
        iptab[1] = (uint8_t)(IPaddress >> 16);
        iptab[2] = (uint8_t)(IPaddress >> 8);
        iptab[3] = (uint8_t)(IPaddress);
                  
            sprintf((char*)iptxt, "is: %d.%d.%d.%d ", iptab[3], iptab[2], iptab[1], iptab[0]);               
      
            LCD_DisplayStringLine(Line0, " You are configured ");
            LCD_DisplayStringLine(Line2, iptxt);

            if(Server)
            {
              LCD_DisplayStringLine(Line1, "as a server, your IP");
                 
                  /* Initialize the server application */
              server_init();
            }
            else
            {
              LCD_DisplayStringLine(Line1, "as a client, your IP");
                 
                  /* Configure the IO Expander */
          IOE_Config();
      
          /* Enable the Touch Screen and Joystick interrupts */
          IOE_ITConfig(IOE_ITSRC_TSC);
                  
                  /* Initialize the client application */
              client_init();
            }                
      }
      else
#endif
      {
        /* Display the IP address */
                LCD_DisplayStringLine(Line8, "  Static IP address   ");
        LCD_DisplayStringLine(Line9, iptxt);            
                Delay(LCD_DELAY);
      }           
    }

#if LWIP_DHCP
   
    else if (IPaddress == 0)
    {
      /* We still waiting for the DHCP server */
          LCD_DisplayStringLine(Line4, "     Looking for    ");
      LCD_DisplayStringLine(Line5, "     DHCP server    ");
      LCD_DisplayStringLine(Line6, "     please wait... ");

      LedToggle &= 3;

      STM_EVAL_LEDToggle((Led_TypeDef)(LedToggle++));

      /* If no response from a DHCP server for MAX_DHCP_TRIES times */
          /* stop the dhcp client and set a static IP address */
          if (netif.dhcp->tries > MAX_DHCP_TRIES)
      {
        struct ip_addr ipaddr;
        struct ip_addr netmask;
        struct ip_addr gw;

        LCD_DisplayStringLine(Line7, "    DHCP timeout    ");        

        dhcp_stop(&netif);

        IP4_ADDR(&ipaddr, 192, 168, 1, 8);
        IP4_ADDR(&netmask, 255, 255, 255, 0);
        IP4_ADDR(&gw, 192, 168, 1, 1);

        netif_set_addr(&netif, &ipaddr , &netmask, &gw);

      }
    }
#endif
  }
}

/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/

使用特权

评论回复
板凳
tgwfcc|  楼主 | 2014-7-18 10:12 | 只看该作者
#include "stm32_eth.h"
#include "stm32f107.h"

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
#define DP83848_PHY        /* Ethernet pins mapped on STM3210C-EVAL Board */
#define PHY_ADDRESS       0x00 /* Relative to STM3210C-EVAL Board */

#define MII_MODE          /* MII mode for STM3210C-EVAL Board (MB784) (check jumpers setting) */
//#define RMII_MODE       /* RMII mode for STM3210C-EVAL Board (MB784) (check jumpers setting) */

使用特权

评论回复
地板
sun1238898| | 2014-7-18 10:35 | 只看该作者
你的PHY地址不对,应该是0x01吧。
#define DP83848_PHY        /* Ethernet pins mapped on STM3210C-EVAL Board */
#define PHY_ADDRESS       0x00 /* Relative to STM3210C-EVAL Board */
将PHY_ADDRESS改为0x01试一下、

使用特权

评论回复
5
tgwfcc|  楼主 | 2014-7-18 10:39 | 只看该作者
sun1238898 发表于 2014-7-18 10:35
你的PHY地址不对,应该是0x01吧。
#define DP83848_PHY        /* Ethernet pins mapped on STM3210C-EVAL  ...

如果PHY是DP83848的话,地址是0X01,我看的神舟的代码,写的是0X00,神舟用的也是DM9161的

使用特权

评论回复
6
tgwfcc|  楼主 | 2014-7-19 09:39 | 只看该作者
为什么都没有高手帮忙呢?

使用特权

评论回复
7
tgwfcc|  楼主 | 2014-7-25 18:02 | 只看该作者
MARK,和开发板所用的GPIO也不一样,修改了GPIO_Configuration();和#include "stm32_eth.h"文件中PHY的寄存器。不知道在怎么修改了。
《PHY》
/**--------------------------------------------------------------------------**/
/**
  * @brief                     Desciption of common PHY registers
  */
/**--------------------------------------------------------------------------**/

/**
  * @}
  */

/** @defgroup PHY_Read_write_Timeouts
  * @{
  */
#define PHY_READ_TO                     ((uint32_t)0x0004FFFF)
#define PHY_WRITE_TO                    ((uint32_t)0x0004FFFF)

/**
  * @}
  */

/** @defgroup PHY_Reset_Delay
  * @{
  */
#define PHY_ResetDelay                  ((uint32_t)0x000FFFFF)

/**
  * @}
  */

/** @defgroup PHY_Config_Delay
  * @{
  */
#define PHY_ConfigDelay                 ((uint32_t)0x00FFFFFF)

/**
  * @}
  */

/** @defgroup PHY_Register_address
  * @{
  */
#define PHY_BCR                          0          /*!< Tranceiver Basic Control Register */
#define PHY_BSR                          1          /*!< Tranceiver Basic Status Register */

/**
  * @}
  */

/** @defgroup PHY_basic_Control_register
  * @{
  */
#define PHY_Reset                       ((u16)0x8000)      /*!< PHY Reset */
#define PHY_Loopback                    ((u16)0x4000)      /*!< Select loop-back mode */
#define PHY_FULLDUPLEX_100M             ((u16)0x2100)      /*!< Set the full-duplex mode at 100 Mb/s */
#define PHY_HALFDUPLEX_100M             ((u16)0x2000)      /*!< Set the half-duplex mode at 100 Mb/s */
#define PHY_FULLDUPLEX_10M              ((u16)0x0100)      /*!< Set the full-duplex mode at 10 Mb/s */
#define PHY_HALFDUPLEX_10M              ((u16)0x0000)      /*!< Set the half-duplex mode at 10 Mb/s */
#define PHY_AutoNegotiation             ((u16)0x1000)      /*!< Enable auto-negotiation function  ÉñÖÛµÄÊÇ 0x3000 */
#define PHY_Restart_AutoNegotiation     ((u16)0x0200)      /*!< Restart auto-negotiation function */
#define PHY_Powerdown                   ((u16)0x0800)      /*!< Select the power down mode */
#define PHY_Isolate                     ((u16)0x0400)      /*!< Isolate PHY from MII */

/**
  * @}
  */

/** @defgroup PHY_basic_status_register
  * @{
  */
#define PHY_AutoNego_Complete           ((u16)0x0020)      /*!< Auto-Negotioation process completed */
#define PHY_Linked_Status               ((u16)0x0004)      /*!< Valid link established */
#define PHY_Jabber_detection            ((u16)0x0002)      /*!< Jabber condition detected */

/**
  * @}
  */

/** @defgroup PHY_status_register
  * @{
  */
/* The PHY status register value change from a PHY to another so the user have
   to update this value depending on the used external PHY */
/**
  * @brief  For LAN8700  
  */
//#define PHY_SR                           31         /*!< Tranceiver Status Register 31¼Ä´æÆ÷ */
/**
  * @brief  For DM9161CEP  
  */
#define PHY_SR                           17     /*!< Tranceiver Status Register  17¼Ä´æÆ÷ */

/* The Speed and Duplex mask values change from a PHY to another so the user have to update
   this value depending on the used external PHY */
/**
  * @brief  For LAN8700  
  */
//#define PHY_Speed_Status            ((u16)0x0004)       /*!< Configured information of Speed: 10Mbps */
//#define PHY_Duplex_Status           ((u16)0x0010)       /*!< Configured information of Duplex: Full-duplex */

/**
  * @brief  For DM9161CEP  
  */
#define PHY_Speed_Status            ((u16)0x3000)    /*!< Configured information of Speed: 10Mbps  17¼Ä´æÆ÷ 0011*/
#define PHY_Duplex_Status           ((u16)0xA000)    /*!< Configured information of Duplex: Full-duplex  17¼Ä´æÆ÷ 1010*/
#define IS_ETH_PHY_ADDRESS(ADDRESS) ((ADDRESS) <= 0x20)
#define IS_ETH_PHY_REG(REG) (((REG) == PHY_BCR) || \
                             ((REG) == PHY_BSR) || \
                             ((REG) == PHY_SR))







使用特权

评论回复
8
tgwfcc|  楼主 | 2014-7-25 18:04 | 只看该作者
《GPIO》
/**
  * @brief  Configures the different GPIO ports.
  * @param  None
  * @retval None
  */
void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  /* ETHERNET pins configuration */
  /* AF Output Push Pull:
  - ETH_MII_MDIO / ETH_RMII_MDIO: PA2
  - ETH_MII_MDC / ETH_RMII_MDC: PC1
  - ETH_MII_TXD2: PC2
  - ETH_MII_TX_EN / ETH_RMII_TX_EN: PB11
  - ETH_MII_TXD0 / ETH_RMII_TXD0: PB12
  - ETH_MII_TXD1 / ETH_RMII_TXD1: PB13
  - ETH_MII_PPS_OUT / ETH_RMII_PPS_OUT: PB5                                                                                                //PB5ΪSPI1_MOSI
  - ETH_MII_TXD3: PB8 */

  /* Configure PA2 as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* Configure PC1, PC2 and PC3 as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

  /* Configure PB5, PB8, PB11, PB12 and PB13 as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_11 |                                //PB5ÅäÖÃΪSPI1_MOSI
                                GPIO_Pin_12 | GPIO_Pin_13;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  /**************************************************************/
  /*               For Remapped Ethernet pins                   */
  /*************************************************************/
  /* Input (Reset Value):
  - ETH_MII_CRS CRS: PA0
  - ETH_MII_RX_CLK / ETH_RMII_REF_CLK: PA1
  - ETH_MII_COL: PA3
  - ETH_MII_RX_DV / ETH_RMII_CRS_DV: PD8                                                                                                //RX_DV :PA7ÐÞ¸Ä ²»ÊÇÖØÓ³Éä
  - ETH_MII_TX_CLK: PC3
  - ETH_MII_RXD0 / ETH_RMII_RXD0: PD9                                                                                                                //RXD0:PC4
  - ETH_MII_RXD1 / ETH_RMII_RXD1: PD10                                                                                                        //RXD1:PC5
  - ETH_MII_RXD2: PD11                                                                                                                                                                        //RXD2:PB0
  - ETH_MII_RXD3: PD12                                                                                                                                                                        //RXD3:PB1
  - ETH_MII_RX_ER: PB10 */

  /* ETHERNET pins remapp in STM3210C-EVAL board: RX_DV and RxD[3:0] */
  GPIO_PinRemapConfig(GPIO_Remap_ETH, ENABLE);

  /* Configure PA0, PA1 £¬PA3 and PA7 as input */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_3 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* Configure PB0, PB1 and PB10 as input */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  /* Configure PC3, PC4 and PC5 as input */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

  /* ADC Channel14 config --------------------------------------------------------*/
  /* Relative to STM3210D-EVAL Board   */
  /* Configure PC.04 (ADC Channel14) as analog input -------------------------*/
  /*GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_Init(GPIOC, &GPIO_InitStructure);*/

  /* MCO pin configuration------------------------------------------------- */
  /* Configure MCO (PA8) as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

}

使用特权

评论回复
9
tgwfcc|  楼主 | 2016-3-16 15:50 | 只看该作者
本帖最后由 tgwfcc 于 2016-3-16 17:54 编辑

这么长时间后,终于又拾起来了。帖子参考:https://bbs.21ic.com/forum.php?mo ... 8324&fromuid=715358
如果是自己设计的原理、板,建议先确认一下原理是不是对的。因为我第一次设计的时候,TX、RX都画的不对。
现在来看之前画的板子,好水啊。
说明一下:如果需要移植LWIP的朋友,注意几点:
1、模式是RMII还是MII;
2、PHY地址:PHY的地址配置管脚,上拉为1,不接为0。对应原理设计,修改PHY地址即可;
3、模式不一致或是GPIO不一致时,按照自己的设计修改对应的GPIO;
4、配置完GPIO后,设置PHY参数,对照着相应的寄存器看一遍Ethernet的结构体,就明白各个参数的意思了;
5、修改PHY扩展寄存器中的状态寄存器,PHY的标准寄存器中有个Status寄存器,但是操作的时候一般读扩展中的Status寄存器。
    每个PHY扩展的Status寄存器地址可能都不一样,所以看下手册找找。
6、在上边那个扩展Status寄存器中,需要用到的是PHY的速度、双工模式,对应Status寄存器把这两个值改对就可以了。
7、例程中的LWIP协议,除了IP地址和端口外,其他没什么要改的,玩一下TCP Client、TCP Server 、UDP Client 、UDP Server的例程,前边没有问题的话,应该都是可以的。
8、最后,想要深入研究的话,在去看LWIP的API函数吧。

使用特权

评论回复
10
zhuomuniao110| | 2016-3-16 22:53 | 只看该作者
楼主经过两年的锤炼,这个做网络功能,应该非常厉害了吧。LWIP协议好用不?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

34

主题

260

帖子

4

粉丝