精华内容
下载资源
问答
  • W5500以太网芯片及模块使用
    万次阅读
    2016-04-29 14:19:16

    一、模块介绍

    是以太网转spi接口的,模块上有3个led和一个复位按钮,灯的含义是:

    LINKLED 
    网络连接指示灯(Link LED) 
    显示当前连接状态: 
    低电平:连接建立; 
    高电平:未连接; 

    DUPLED 
    全/半双工指示灯(Duplex LED) 
    显示当前连接的双工状态: 
    低电平:全双工状态; 
    高电平:半双工状态; 

    ACTLED 
    活动状态指示灯(Active LED) 
    显示数据收/发活动时,物理介质子层的载波侦听活动情
    况: 
    低电平:有物理介质子层的载波侦听信号; 
    高电平:无物理介质子层的载波侦听信号;


    但貌似配置成全双工100M的速度也没什么增加,哪里出问题了呢?我现在使用18M的spi,使用wiz官方loopback软件测试速度为5Mb/s左右,好慢啊(/ □ \)

    二、模块驱动

    注意:在官网上有人共享了github的库函数驱动,不过是C99标准的,这一段Keil的c编译器支持好像有问题,而且对于是库函数很致命,使用寄存器则无所谓

    比如:ctlsocket和ctlwizchip函数的参数会因C99和C89的强转void类型定义不同,使其失效。eg:0x0000不会错,0x0010可能会篡改成0x4e3c

    更多相关内容
  • 文档包含以太网模块W5500中文和英文文档介绍资料,非常方便,分享给大家!
  • W5500以太网模块是一款基于WIZnet W5500芯片的以太网模块,性能出色、性价比高。 模块集成硬件化TCP/IP协议;内部具有32K字节存储器作为TX/RX缓存;支持10/100Mbps网络传输速率;支持8个独立端口同时运行;同时支持...
  • STM32的W5500以太网通信模块快速实现方法.pdf
  • STM32+W5500以太网模块

    千次阅读 2021-12-24 15:33:18
    一:w5500以太网模块介绍: W5500 是一款全硬件 TCP/IP 嵌入式以太网控制器,为嵌入式系统提供了更加简易的互联网连接方 案。W5500 集成了 TCP/IP 协议栈,10/100M 以太网数据链路层(MAC) 及物理层(PHY),使得 ...

    一:w5500以太网模块介绍:

    W5500 是一款全硬件 TCP/IP 嵌入式以太网控制器,为嵌入式系统提供了更加简易的互联网连接方 案。W5500 集成了 TCP/IP 协议栈,10/100M 以太网数据链路层(MAC) 及物理层(PHY),使得 用户使用单芯片就能够在他们的应用中拓展网络连接。

    久经市场考验的 WIZnet 全硬件 TCP/IP 协议栈支持 TCP,UDP,IPv4,ICMP,ARP,IGMP 以及 PPPoE 协议。W5500 内嵌 32K 字节片上缓存以供以太网包处理。如果你使用 W5500, 你只需要一些简单 的 Socket 编程就能实现以太网应用。这将会比其他嵌入式以太网方案 更加快捷、简便。用户可以同 时使用 8 个硬件 Socket 独立通讯。

    W5500 提供了 SPI(外设串行接口)从而能够更加容易与外设 MCU 整合。而且, W5500 的使用了新的高效SPI协议支持 80MHz 速率,从而能够更好的实现高速网络通讯。 为了减少系统能耗, W5500 提供了网络唤醒模式(WOL)及掉电模式供客户选择使用。


    模块排针功能表:

     STM32与W5500连接方法:

    PA15->W5500_RST(源程序使用的是PC5,这里没有该引脚修改为PA15)

    PC4->W5500_INT(使用寄存器查询方式的例程时,此引脚可以不接,其他例程可能涉及修改引脚)

    PA4->W5500_SCS

    PA5->W5500_SCK

    PA6->W5500_MISO

    PA7->W5500_MOSI

    调试寄存器的UDP模式:

     

     

    基于stm32与w5500以太网应用:

     

     如上图所示,最底下的一层叫做“物理层”,也叫“PHY 层”,最上面的一层叫做“应用层”,中间的三层(自下而上)分别是“链路层”,也叫“MAC 层”、 “网络层”和“传输层”。越下面的层,越靠近硬件;越上面的层,越靠近用户。
    我们一层一层讲解
    一、物理层
    物理层就是最基础的类似于modbus中的硬件连接是rs485的两根线。物理层由计算机和网络介质之间的实际界面组成,可定义电气信号、符号、线的状态和时钟要求、数据编码和数据传输用的连接器。上面的4层都是基于物理层的。
    二、数据链路层
    实际上由两个独立的部分组成,介质存取控制(Media AccessControl,MAC)和逻辑链路控制层(Logical Link Control,LLC)。

    其中spi2的四根线要接上w5500的 SCSn, SCLK, MOSI, MISO 4 路信号。还有中断信号和复位信号。
    W5500 有两种工作模式,分别是可变数据长度模式和固定数据长度模式。在可变数据长度模式中,W5500 可以与其他 SPI 设备共用 SPI 接口。但是一旦将 SPI接口指定给 W5500 之后,也就是 1 脚 CS 片选信号如果选中了这个 W5500,则不能再与其他 SPI 设备共用。在固定数据长度模式,SPI 将指定给 W5500,不能与其他 SPI 设备共享。因为 1 脚 CS 片选信号将直接接地为低电平。
    8.1w5500初始化
    W5500_conf.c 主要配置 W5500 的 MAC、IP 地址,W5500 基本的数据读写过程,复位设置函数等。
    Socket.c 函数主要介绍了 W5500 的 SOCKET 相关配置函数,比如 SOCKET 的打开、关闭,以及接收数据、发送数据等等。
    Utility.c 函数主要介绍了基本的延时函数,还有数据格式转化函数。

    main()函数代码:

    int main(void)
    {
    	unsigned char i;
    
    	/* Initialize STM32F103 */
    	System_Initialization();//系统配置
    	SysTick_Init();//启动系统滴答定时器 SysTick
    
    	/* Config W5500 */
    	W5500_Configuration();//W5500配置
    	Delay_ms(200);//延时等待
    
    	/* Modbus-TCP Init */
        eMBTCPInit(MB_TCP_PORT_USE_DEFAULT); //端口依赖事件模块初始化
    	Delay_ms(200); //延时等待
    	
    	/* Enable Modbus-TCP Stack */    
        eMBEnable();//激活协议栈	
        
    
        printf("\r\nModbus-TCP Start!\r\n");
        printf("IP:192.168.1.128\r\n");
    
    
    	while(1)
    	{
    		
    		i=Read_SOCK_1_Byte(0,Sn_SR);  //读W5500状态
    		if(i==0)	  
    		{
    			do
    			{
    				Delay_ms(100);//延时等待
    			
    			}while(Socket_Listen(0)==FALSE);//设置“Socket n”为“TCP服务器模式”
    		}
    		else if(i==SOCK_ESTABLISHED)		 //建立TCP连接
    		{
    		eMBPoll();//启动modbus侦听
    		BSP_LED();//线圈控制LED灯
    		}
    				
    	}
    }
    

    W5500配置函数:

    /* W5500 configuration */
    void W5500_Configuration()
    {
    	unsigned char array[6];
    
    	GPIO_SetBits(GPIO_W5500_RST_PORT, GPIO_W5500_RST_Pin);//上拉
    	Delay_ms(100);    /*delay 100ms 使用systick 1ms时基的延时*/
        //等待以太网链路
    	while((Read_1_Byte(PHYCFGR)&LINK)==0); 		/* Waiting for Ethernet Link */
    
    	Write_1_Byte(MR, RST);//写入W5500普通寄存器一个字节
    	Delay_ms(20);		/*delay 20ms */
    
    	/* Set Gateway IP as: 192.168.1.1 */
    	array[0]=192;
    	array[1]=168;
    	array[2]=1;
    	array[3]=1;
    	Write_Bytes(GAR, array, 4);//设置网关IP
    
    	/* Set Subnet Mask as: 255.255.255.0 */
    	array[0]=255;
    	array[1]=255;
    	array[2]=255;
    	array[3]=0;
    	Write_Bytes(SUBR, array, 4);//设置子网掩码
    
    	/* Set MAC Address as: 0x48,0x53,0x00,0x57,0x55,0x00 */
    	array[0]=0x48;
    	array[1]=0x53;
    	array[2]=0x00;
    	array[3]=0x57;
    	array[4]=0x55;
    	array[5]=0x00;
    	Write_Bytes(SHAR, array, 6);//设置MAC地址
    
    	/* Set W5500 IP as: 192.168.1.128 */
    	array[0]=192;
    	array[1]=168;
    	array[2]=1;
    	array[3]=128;
    	Write_Bytes(SIPR, array, 4);//设置W5500的IP地址
    }
    

    STM32+W5500的web服务

    main()函数:

    int main(void)
    {
    	Systick_Init(72);//系统时钟初始化
    	GPIO_Configuration(); //GPIO configuration
    	USART1_Init(); //串口初始化:115200@8-n-1
    	printf("W5500 EVB initialization over.\r\n");
    	Reset_W5500();
    	WIZ_SPI_Init();//W5500相关引脚配置
    	printf("W5500 initialized!\r\n");
    	if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7))
    	{
    		DefaultSet();//出厂值
    	}
    	else
    	{
     		get_config();//read config data from flash
    	}
    	printf("Firmware ver%d.%d\r\n",ConfigMsg.sw_ver[0],ConfigMsg.sw_ver[1]);
    	if(ConfigMsg.debug==0) ConfigMsg.debug=1;
    
    	set_network();//配置网络信息
    	printf("Network is ready.\r\n");
    	while(1)
    	{
    		if(ConfigMsg.JTXD_Control == 0)
    		  	do_http();//开启http服务
    		else
    		  	JTXD_do_http();
    		if(reboot_flag)
    			NVIC_SystemReset();//发起系统复位请求复位单片机
    //        reboot();
            
    	}
    }
    

    GPIO初始化函数:

    void GPIO_Configuration(void)
    {
      GPIO_InitTypeDef GPIO_InitStructure;
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO , ENABLE);
      // Port A output
      GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0|GPIO_Pin_1| GPIO_Pin_2 |GPIO_Pin_3; 
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
      GPIO_Init(GPIOA, &GPIO_InitStructure);
      
    //  GPIO_ResetBits(GPIOA, GPIO_Pin_0);
    //  GPIO_ResetBits(GPIOA, GPIO_Pin_1);
    //  GPIO_SetBits(GPIOA, GPIO_Pin_2); // led off
    //  GPIO_SetBits(GPIOA, GPIO_Pin_3); // led off
      // Port B output;
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; 
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
      GPIO_Init(GPIOB, &GPIO_InitStructure);
      GPIO_SetBits(GPIOB, GPIO_Pin_9);
      // Port C input
    //  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    //  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    //  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    //  GPIO_Init(GPIOC, &GPIO_InitStructure);
    
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;//控制flash
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
      GPIO_Init(GPIOB, &GPIO_InitStructure);
      GPIO_SetBits(GPIOB, GPIO_Pin_7);	
    }
    

    W5500相关配置

    void WIZ_SPI_Init(void)
    {
    	SPI_InitTypeDef   SPI_InitStructure;
      GPIO_InitTypeDef GPIO_InitStructure;
      RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
      RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB |RCC_APB2Periph_AFIO , ENABLE);	
      // Port B output
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; 
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
      GPIO_Init(GPIOB, &GPIO_InitStructure);
      GPIO_SetBits(GPIOB, GPIO_Pin_12);
      /* Configure SPIy pins: SCK, MISO and MOSI */
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
      GPIO_Init(GPIOB, &GPIO_InitStructure);
    	  /* SPI Config -------------------------------------------------------------*/
    	  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    	  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
    	  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
    	  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
    	  SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
    	  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
    	  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
    	  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
    	  SPI_InitStructure.SPI_CRCPolynomial = 7;
    
    	  SPI_Init(SPI2, &SPI_InitStructure);
    	  SPI_Cmd(SPI2, ENABLE);
    }
    

    http请求:

    void do_http(void)
    {
      uint8 ch=SOCK_HTTP;
      uint16 len;
    
      st_http_request *http_request;
      memset(rx_buf,0x00,MAX_URI_SIZE);
      http_request = (st_http_request*)rx_buf;		// struct of http request  
      /* http service start */
      switch(getSn_SR(ch))
      {
        case SOCK_INIT:
          listen(ch);
          break;
        case SOCK_LISTEN:
          break;
        case SOCK_ESTABLISHED:
        //case SOCK_CLOSE_WAIT:
          if(getSn_IR(ch) & Sn_IR_CON)
          {
            setSn_IR(ch, Sn_IR_CON);
          }
          if ((len = getSn_RX_RSR(ch)) > 0)		
          {
            len = recv(ch, (uint8*)http_request, len); 
            *(((uint8*)http_request)+len) = 0;
            proc_http(ch, (uint8*)http_request); // request is processed
            disconnect(ch);
          }
          break;
        case SOCK_CLOSE_WAIT:   
          if ((len = getSn_RX_RSR(ch)) > 0)
          {
            //printf("close wait: %d\r\n",len);
            len = recv(ch, (uint8*)http_request, len);       
            *(((uint8*)http_request)+len) = 0;
            proc_http(ch, (uint8*)http_request); // request is processed
          }
          disconnect(ch);
          break;
        case SOCK_CLOSED:
          socket(ch, Sn_MR_TCP, 80, 0x00);    /* reinitialize the socket */
          break;
        default:
        break;
      }// end of switch
    }
    
    
    void JTXD_do_http(void)
    {
      uint8 ch=SOCK_HTTP;
      uint16 len;
    
      st_http_request *http_request;
      memset(rx_buf,0x00,MAX_URI_SIZE);
      http_request = (st_http_request*)rx_buf;		// struct of http request
      
      /* http service start */
      switch(getSn_SR(ch))
      {
        case SOCK_INIT:
          listen(ch);
          break;
        case SOCK_LISTEN:
    
          break;
        case SOCK_ESTABLISHED:
        //case SOCK_CLOSE_WAIT:
          if(getSn_IR(ch) & Sn_IR_CON)
          {
            setSn_IR(ch, Sn_IR_CON);
          }
          if ((len = getSn_RX_RSR(ch)) > 0)		
          {
            len = recv(ch, (uint8*)http_request, len); 
            *(((uint8*)http_request)+len) = 0;
            JTXD_proc_http(ch, (uint8*)http_request); // request is processed
            disconnect(ch);
          }
          break;
        case SOCK_CLOSE_WAIT:   
          if ((len = getSn_RX_RSR(ch)) > 0)
          {
            //printf("close wait: %d\r\n",len);
            len = recv(ch, (uint8*)http_request, len);       
            *(((uint8*)http_request)+len) = 0;
            JTXD_proc_http(ch, (uint8*)http_request); // request is processed
          }
          disconnect(ch);
          break;
        case SOCK_CLOSED:                   
          socket(ch, Sn_MR_TCP, 80, 0x00);    /* reinitialize the socket */
          break;
        default:
        break;
      }// end of switch
    }
    

    展开全文
  • * 实验平台:NiRen_TwoHeart系统板(或用户STM32开发板) + NiRen_W5500以太网(TCP/IP)模块 * 硬件连接: PC5 -> W5500_RST * PC4 -> W5500_INT * PA4 -> W5500_SCS * PA5 -> W5500_SCK * PA6 -> W5500_MISO * PA7 ->...

    写完标题发现好像也没什么可写的.
    主要是硬件的东西从来没这么顺利过,总结一下
    1.买了之后送的文档,挺详细的,即便如此接线没有说 3.3v 和gnd要接.他们可能认为这是常识猪都知道, 但确实有人不知道比如搞软件的我,但我的直觉让我接上
    2.有问题的时候硬件相关会很不容易找,比如我的板子开关接触不良了,但我没贴个标签在上面,所以烧录好程序后一直没电,是通过吧仿真器插在usb 这样才提供了稳定的电压
    3.keil v5 是我的ide ,但示例程序是v4的,并不兼容 表现为cpu没有在我的列表里,编译好之后烧录报错,只好在v5的工程,把代码弄过去,工程是对应我的板子的.这样才烧录成功了.
    4.netAssist.exe 网络调试助手 很好用, http://www.cmsoft.cn

    贴下代码吧

    /***************************************************************************************
     * 工程名  :泥人W5500模块-客户端模式例程
     * 描述    :W5500的端口0工作在客户端模式,主动与泥人提供的《TCP&UDP测试工具》上创建的服务端连接,
     *			 并且以500ms的时间间隔定时给服务端发送字符串"\r\nWelcome To NiRenElec!\r\n",同时将接
     *			 收到服务端发来的数据回发给服务端。
     * 实验平台:NiRen_TwoHeart系统板(或用户STM32开发板) + NiRen_W5500以太网(TCP/IP)模块
     * 硬件连接:  PC5 -> W5500_RST   
     *             PC4 -> W5500_INT     
     *             PA4 -> W5500_SCS      
     *             PA5 -> W5500_SCK    
     *             PA6 -> W5500_MISO    
     *             PA7 -> W5500_MOSI    
     * 库版本  :ST_v3.5
     * 作者    :泥人通信模块开发团队
     * 博客    :http://nirenelec.blog.163.com
     * 淘宝    :http://nirenelec.taobao.com
    ***************************************************************************************/
    
    /*例程网络参数*/
    //网关:192.168.0.1
    //掩码:	255.255.255.0
    //物理地址:0C 29 AB 7C 00 01
    //本机IP地址:192.168.0.199
    //端口0的端口号:5000
    //端口0的目的IP地址:192.168.0.101
    //端口0的目的端口号:6000
    
    //配合 NetAssist.exe 作为调试工具|
    
    #include "stm32f10x.h"		
    #include "W5500.h"			
    #include <string.h>
    
    void RCC_Configuration(void);		//设置系统时钟为72MHZ(这个可以根据需要改)
    void NVIC_Configuration(void);		//STM32中断向量表配配置
    void Timer2_Init_Config(void);		//Timer2初始化配置
    void System_Initialization(void);	//STM32系统初始化函数(初始化STM32时钟及外设)
    void Delay(unsigned int d);			//延时函数(ms)
    
    unsigned int Timer2_Counter=0; //Timer2定时器计数变量(ms)
    unsigned int W5500_Send_Delay_Counter=0; //W5500发送延时计数变量(ms)
    
    /*******************************************************************************
    * 函数名  : W5500_Initialization
    * 描述    : W5500初始货配置
    * 输入    : 无
    * 输出    : 无
    * 返回值  : 无
    * 说明    : 无
    *******************************************************************************/
    void W5500_Initialization(void)
    {
    	W5500_Init();		//初始化W5500寄存器函数
    	Detect_Gateway();	//检查网关服务器 
    	Socket_Init(0);		//指定Socket(0~7)初始化,初始化端口0
    }
    
    /*******************************************************************************
    * 函数名  : Load_Net_Parameters
    * 描述    : 装载网络参数
    * 输入    : 无
    * 输出    : 无
    * 返回值  : 无
    * 说明    : 网关、掩码、物理地址、本机IP地址、端口号、目的IP地址、目的端口号、端口工作模式
    *******************************************************************************/
    void Load_Net_Parameters(void)
    {
    	Gateway_IP[0] = 192;//加载网关参数
    	Gateway_IP[1] = 168;
    	Gateway_IP[2] = 0;
    	Gateway_IP[3] = 1;
    
    	Sub_Mask[0]=255;//加载子网掩码
    	Sub_Mask[1]=255;
    	Sub_Mask[2]=255;
    	Sub_Mask[3]=0;
    
    	Phy_Addr[0]=0x0c;//加载物理地址
    	Phy_Addr[1]=0x29;
    	Phy_Addr[2]=0xab;
    	Phy_Addr[3]=0x7c;
    	Phy_Addr[4]=0x00;
    	Phy_Addr[5]=0x01;
    
    	IP_Addr[0]=192;//加载本机IP地址
    	IP_Addr[1]=168;
    	IP_Addr[2]=0;
    	IP_Addr[3]=199;
    
    	S0_Port[0] = 0x13;//加载端口0的端口号5000 
    	S0_Port[1] = 0x88;
    
    	S0_DIP[0]=192;//加载端口0的目的IP地址
    	S0_DIP[1]=168;
    	S0_DIP[2]=0;
    	S0_DIP[3]=101;
    	
    	S0_DPort[0] = 0x17;//加载端口0的目的端口号6000
    	S0_DPort[1] = 0x70;
    
    	S0_Mode=TCP_CLIENT;//加载端口0的工作模式,TCP客户端模式
    }
    
    /*******************************************************************************
    * 函数名  : W5500_Socket_Set
    * 描述    : W5500端口初始化配置
    * 输入    : 无
    * 输出    : 无
    * 返回值  : 无
    * 说明    : 分别设置4个端口,根据端口工作模式,将端口置于TCP服务器、TCP客户端或UDP模式.
    *			从端口状态字节Socket_State可以判断端口的工作情况
    *******************************************************************************/
    void W5500_Socket_Set(void)
    {
    	if(S0_State==0)//端口0初始化配置
    	{
    		if(S0_Mode==TCP_SERVER)//TCP服务器模式 
    		{
    			if(Socket_Listen(0)==TRUE)
    				S0_State=S_INIT;
    			else
    				S0_State=0;
    		}
    		else if(S0_Mode==TCP_CLIENT)//TCP客户端模式 
    		{
    			if(Socket_Connect(0)==TRUE)
    				S0_State=S_INIT;
    			else
    				S0_State=0;
    		}
    		else//UDP模式 
    		{
    			if(Socket_UDP(0)==TRUE)
    				S0_State=S_INIT|S_CONN;
    			else
    				S0_State=0;
    		}
    	}
    }
    
    /*******************************************************************************
    * 函数名  : Process_Socket_Data
    * 描述    : W5500接收并发送接收到的数据
    * 输入    : s:端口号
    * 输出    : 无
    * 返回值  : 无
    * 说明    : 本过程先调用S_rx_process()从W5500的端口接收数据缓冲区读取数据,
    *			然后将读取的数据从Rx_Buffer拷贝到Temp_Buffer缓冲区进行处理。
    *			处理完毕,将数据从Temp_Buffer拷贝到Tx_Buffer缓冲区。调用S_tx_process()
    *			发送数据。
    *******************************************************************************/
    void Process_Socket_Data(SOCKET s)
    {
    	unsigned short size;
    	size=Read_SOCK_Data_Buffer(s, Rx_Buffer);
    	memcpy(Tx_Buffer, Rx_Buffer, size);			
    	Write_SOCK_Data_Buffer(s, Tx_Buffer, size);
    }
    
    /*******************************************************************************
    * 函数名  : main
    * 描述    : 主函数,用户程序从main函数开始运行
    * 输入    : 无
    * 输出    : 无
    * 返回值  : int:返回值为一个16位整形数
    * 说明    : 无
    *******************************************************************************/
    int main(void)
    {
    	System_Initialization();	//STM32系统初始化函数(初始化STM32时钟及外设)
    	Load_Net_Parameters();		//装载网络参数	
    	W5500_Hardware_Reset();		//硬件复位W5500
    	W5500_Initialization();		//W5500初始货配置
    	while (1)
    	{
    		W5500_Socket_Set();//W5500端口初始化配置
    
    		if(W5500_Interrupt)//处理W5500中断		
    		{
    			W5500_Interrupt_Process();//W5500中断处理程序框架
    		}
    		if((S0_Data & S_RECEIVE) == S_RECEIVE)//如果Socket0接收到数据
    		{
    			S0_Data&=~S_RECEIVE;
    			Process_Socket_Data(0);//W5500接收并发送接收到的数据
    		}
    		else if(W5500_Send_Delay_Counter >= 8)//定时发送字符串
    		{
    			if(S0_State == (S_INIT|S_CONN))
    			{
    				S0_Data&=~S_TRANSMITOK;
    				memcpy(Tx_Buffer, "\r\nWelcome To NiRenElec!\r\n", 23);	
    				Write_SOCK_Data_Buffer(0, Tx_Buffer, 23);//指定Socket(0~7)发送数据处理,端口0发送23字节数据
    			}
    			W5500_Send_Delay_Counter=0;
    		}
    	}
    }
    
    /*******************************************************************************
    * 函数名  : RCC_Configuration
    * 描述    : 设置系统时钟为72MHZ(这个可以根据需要改)
    * 输入    : 无
    * 输出    : 无
    * 返回值  : 无
    * 说明    : STM32F107x和STM32F105x系列MCU与STM32F103x系列MCU时钟配置有所不同
    *******************************************************************************/
    void RCC_Configuration(void)
    {
      ErrorStatus HSEStartUpStatus;               //外部高速时钟(HSE)的工作状态变量
      
      RCC_DeInit();                               //将所有与时钟相关的寄存器设置为默认值
      RCC_HSEConfig(RCC_HSE_ON);                  //启动外部高速时钟HSE 
      HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待外部高速时钟(HSE)稳定
    
      if(SUCCESS == HSEStartUpStatus)             //如果外部高速时钟已经稳定
      {
        /* Enable Prefetch Buffer */
        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //Flash设置
        /* Flash 2 wait state */
        FLASH_SetLatency(FLASH_Latency_2);
        
      
        RCC_HCLKConfig(RCC_SYSCLK_Div1); //设置AHB时钟等于系统时钟(1分频)/72MHZ
        RCC_PCLK2Config(RCC_HCLK_Div1);  //设置APB2时钟和HCLK时钟相等/72MHz(最大为72MHz)
        RCC_PCLK1Config(RCC_HCLK_Div2);  //设置APB1时钟是HCLK时钟的2分频/36MHz(最大为36MHz)
      
    #ifndef STM32F10X_CL                 //如果使用的不是STM32F107x或STM32F105x系列MCU,PLL以下配置  
        RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //PLLCLK = 8MHz * 9 = 72 MHz 
    #else                                //如果使用的是STM32F107x或STM32F105x系列MCU,PLL以下配置
        /***** 配置PLLx *****/
        /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
        RCC_PREDIV2Config(RCC_PREDIV2_Div5);
        RCC_PLL2Config(RCC_PLL2Mul_8);
    
        RCC_PLL2Cmd(ENABLE); //使能PLL2 
        while (RCC_GetFlagStatus(RCC_FLAG_PLL2RDY) == RESET);//等待PLL2稳定
    
        /* PLL configuration: PLLCLK = (PLL2 / 5) * 9 = 72 MHz */ 
        RCC_PREDIV1Config(RCC_PREDIV1_Source_PLL2, RCC_PREDIV1_Div5);
        RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_9);
    #endif
    
        RCC_PLLCmd(ENABLE); //使能PLL
        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //等待PLL稳定
    
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);          //设置系统时钟的时钟源为PLL
    
        while(RCC_GetSYSCLKSource() != 0x08);               //检查系统的时钟源是否是PLL
        RCC_ClockSecuritySystemCmd(ENABLE);                 //使能系统安全时钟 
    
    	/* Enable peripheral clocks --------------------------------------------------*/
      	/* Enable I2C1 and I2C1 clock */
     	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    
      	/* Enable GPIOA GPIOB SPI1 and USART1 clocks */
      	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB
    					| RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD
    					| RCC_APB2Periph_AFIO, ENABLE);    
      }
    }
    
    /*******************************************************************************
    * 函数名  : NVIC_Configuration
    * 描述    : STM32中断向量表配配置
    * 输入    : 无
    * 输出    : 无
    * 返回值  : 无
    * 说明    : 设置KEY1(PC11)的中断优先组
    *******************************************************************************/
    void NVIC_Configuration(void)
    {
    	NVIC_InitTypeDef NVIC_InitStructure;						//定义NVIC初始化结构体
    
      	/* Set the Vector Table base location at 0x08000000 */
      	NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
    	
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);				//设置中断优先级组为1,优先组(可设0~4位)
    	
    	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;				//设置中断向量号
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;	//设置抢先优先级
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;			//设置响应优先级
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				//使能NVIC
    	NVIC_Init(&NVIC_InitStructure);
    
    	W5500_NVIC_Configuration();	//W5500 接收引脚中断优先级设置
    }
    
    /*******************************************************************************
    * 函数名  : Timer2_Init_Config
    * 描述    : Timer2初始化配置
    * 输入    : 无
    * 输出    : 无
    * 返回    : 无 
    * 说明    : 无
    *******************************************************************************/
    void Timer2_Init_Config(void)
    {
    	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    	
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);		//使能Timer2时钟
    	
    	TIM_TimeBaseStructure.TIM_Period = 9;						//设置在下一个更新事件装入活动的自动重装载寄存器周期的值(计数到10为1ms)
    	TIM_TimeBaseStructure.TIM_Prescaler = 7199;					//设置用来作为TIMx时钟频率除数的预分频值(10KHz的计数频率)
    	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;		//设置时钟分割:TDTS = TIM_CKD_DIV1
    	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;	//TIM向上计数模式
    	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);				//根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
    	 
    	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE ); 				//使能TIM2指定的中断
    	
    	TIM_Cmd(TIM2, ENABLE);  									//使能TIMx外设
    }
    
    /*******************************************************************************
    * 函数名  : TIM2_IRQHandler
    * 描述    : 定时器2中断断服务函数
    * 输入    : 无
    * 输出    : 无
    * 返回    : 无 
    * 说明    : 无
    *******************************************************************************/
    void TIM2_IRQHandler(void)
    {
    	if(TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
    	{
    		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
    		Timer2_Counter++;
    		W5500_Send_Delay_Counter++;
    	}
    }
    
    /*******************************************************************************
    * 函数名  : System_Initialization
    * 描述    : STM32系统初始化函数(初始化STM32时钟及外设)
    * 输入    : 无
    * 输出    : 无
    * 返回    : 无 
    * 说明    : 无
    *******************************************************************************/
    void System_Initialization(void)
    {
    	RCC_Configuration();		//设置系统时钟为72MHZ(这个可以根据需要改)
      	NVIC_Configuration();		//STM32中断向量表配配置
    	SPI_Configuration();		//W5500 SPI初始化配置(STM32 SPI1)
    	Timer2_Init_Config();		//Timer2初始化配置
    	W5500_GPIO_Configuration();	//W5500 GPIO初始化配置	
    }
    
    /*******************************************************************************
    * 函数名  : Delay
    * 描述    : 延时函数(ms)
    * 输入    : d:延时系数,单位为毫秒
    * 输出    : 无
    * 返回    : 无 
    * 说明    : 延时是利用Timer2定时器产生的1毫秒的计数来实现的
    *******************************************************************************/
    void Delay(unsigned int d)
    {
    	Timer2_Counter=0; 
    	while(Timer2_Counter < d);
    }
    
    

    需注意的是
    1.设备要在一个子网内,同个网关
    2.设好服务端的ip和端口. 这个代码是客户端, 不需要在意客户端的IP端口

    对了,顺便看下效果, 同是8ms发送一次到服务端
    这是windows发送,且无线wifi发送:
    在这里插入图片描述
    这是上面的代码,stm32发送,且有线发送:
    在这里插入图片描述
    摊手撇嘴.jpg
    对实时性有要求那就必须使用stm32, 当然还有其他方案,比如linux系统安装RT(realtime)模块

    展开全文
  • W5500以太网原理图.pdf

    2020-03-11 16:51:56
    使用的主控芯片是STM32F103,W5500模块以太网参考电路原理图(全),给硬件设计师们一个参考,可以照我这个直接画的。
  • 用VB.NET写的代码,与W5500以太网模块与Arduino Uno搭建的通信单元,实现电脑端与单片机通信单元之间的UPD双向通信。通过此例可以发挥的你想像力,让电脑端成为你的控制端。
  • 两块W5500以太网模块,一块TCP服务端,一块TCP客户端,单独与PC通信都可以,两种用交叉网线连接通信失败,已经改了MAC地址不一样,两者的IP和端口也符合要求,Debug时发现接收方不能接收
  • W5500以太网主控器以W5500为核心,集成ATmega32u4和W5500以太网芯片的主控板,能够满足一般IOT项目的应用要求。其大小与Leonardo尺寸相等,板载POE供电电源、外接电源稳压电路、SD卡电路以及Leonardo主控单元电路,...
  • 1、STM32单片机当做TCP服务端,单片机通过SPI口跟W5500进行通讯。W5500通过网线接电脑或者交换机。 2、接线如下: PA4 SPI 片选 SCS 引脚 PA5 SPI 时钟 SCLK 引脚 PA7 SPI MOSI 主出从入 MOSI 引脚 PA6 SPI MISO 主...
  • 1、STM32单片机当做TCP客户端,单片机通过SPI口跟W5500进行通讯。W5500通过网线接电脑或者交换机。 2、接线如下: PA4 SPI 片选 SCS 引脚 PA5 SPI 时钟 SCLK 引脚 PA7 SPI MOSI 主出从入 MOSI 引脚 PA6 SPI MISO 主...
  • 1、STM32单片机当做TCP服务端,单片机通过SPI口跟W5500进行通讯。W5500通过网线接电脑或者交换机。 2、接线如下: PA4 SPI 片选 SCS 引脚 PA5 SPI 时钟 SCLK 引脚 PA7 SPI MOSI 主出从入 MOSI 引脚 PA6 SPI MISO 主...
  • 1、STM32单片机当做TCP客户端,单片机通过SPI口跟W5500进行通讯。W5500通过网线接电脑或者交换机。 2、接线如下: PA4 SPI 片选 SCS 引脚 PA5 SPI 时钟 SCLK 引脚 PA7 SPI MOSI 主出从入 MOSI 引脚 PA6 SPI MISO 主...
  • 1、STM32单片机通过SPI口跟W5500进行通讯。W5500通过网线接电脑或者交换机,进行UDP通讯。 2、接线如下: PA4 SPI 片选 SCS 引脚 PA5 SPI 时钟 SCLK 引脚 PA7 SPI MOSI 主出从入 MOSI 引脚 PA6 SPI MISO 主入从出 ...
  • 1、STM32单片机通过SPI口跟W5500进行通讯。W5500通过网线接电脑或者交换机进行UDP通讯。 2、接线如下: PA4 SPI 片选 SCS 引脚 PA5 SPI 时钟 SCLK 引脚 PA7 SPI MOSI 主出从入 MOSI 引脚 PA6 SPI MISO 主入从出 MISO...
  • w5500模块原理图pcb,ALTIUM 09版本。布局可参考,已经应用在项目中,可直接打板,值得拥有
  • 这个方案采用的是FPGA+W5500。串口部分利用串口数据收发硬件加速器,充分利用Buff及FiFO资源,从而极大程度上的提高了16串口的数据调度能力。与此同时,网络部分采用ToE技术的W5500,从而极大程度上的降低了系统中断...
  • W5500网络扩展板集成了一个硬件TCP/IP协议协芯片W5500以及一个含有网络变压器...其中,W5500是一款全硬件TCP/IP嵌入式以太网控制器,以嵌入式系统提供了更加简易的互联网连接方案。 附件包含以下资料 总的资料截图 代码
  • W5500以太网芯片数据手册、参考原理图、W5500硬件设计布线规范等
  • ESP8266使用W5100以太网模块概述程序连线结果 概述 实验项目,希望用一个以太网模块来实现以太网通讯,没有使用WiFi网络,而是用连线的以太网。 采用一个ESP8266模块做主处理器,采用Arduino IDE做开发环境。首先...

    ESP8266使用W5100及W5500以太网模块

    概述

    实验项目,希望用一个以太网模块来实现以太网通讯,没有使用WiFi网络,而是用连线的以太网。
    采用一个ESP8266模块做主处理器,采用Arduino IDE做开发环境。首先选择了一个W5500模块连接以太网。结果通过SPI连接W5500,不成功。程序跑不起来。也没有添加其他的库,感觉现在的Arduino不是很友好,下载程序非常慢。就上某宝又购买了一个W5100模块。(因为看Ethernet.h和Ethernet.cpp发现库与W5100模块兼容。这次实验,一切正常,在这里分享一下使用情况。

    程序

    /*
      A simple server that answer the ping message. 
      Using an ESP8266 .
    */
    
    /* Circuit:
     *  Ethernet shield attached to pins : 
     *  D6: GPIO12 - MISO
     *  D7: GPIO13 - MOSI
     *  D8: GPIO15 - CS
     *  D5: GPIO14 - SCLK
     */
    
    #include <SPI.h>
    #include <Ethernet.h>
    
    #define MACADDRESS 0xDE, 0xAD, 0xBE, 0xEF, 0xDE, 0xED
    IPAddress ip(192,168,6,29);
    IPAddress gateway(192, 168, 6, 1);
    IPAddress subnet(255, 255, 255, 0);
    
    // telnet defaults to port 23
    EthernetServer server(23);
    
    #define RST     4    //W5100 RST
    void setup() 
    {
      pinMode(BUILTIN_LED, OUTPUT);
      pinMode(RST, OUTPUT);  
      digitalWrite(RST,HIGH);  //Reset this module
      delay(200); 
      digitalWrite(RST,LOW); 
      delay(200);
      digitalWrite(RST,HIGH);  
      delay(200);     
    
      Serial.begin(115200);
      Serial.println();
    
      byte mac[] = { MACADDRESS };
    
      Ethernet.begin(mac, ip, gateway, subnet);  
    
      // print your local IP address:
      Serial.print("My IP address: ");
      Serial.println(Ethernet.localIP());
      
      server.begin();
    }
    
    void loop()
    {
    }
    

    连线

    在这里插入图片描述
    模块和ESP8266连线不要发生错误一次成功

    W5100ESP8266
    +5V
    NSSSS
    MOMOSI
    GNDGND
    RSTGPIO4
    SCKSCLK
    MIMISO

    结果

    在这里插入图片描述
    实验成功,可以使用以太网和ESP8266通讯了。

    经验

    使用W5500不知道为啥总是死机。没有任何反应。看门狗都不起作用。用ESP32和W5500作了试验,ESP32无法作主机,原因是采用的库是C:\安装Arduino IDE\libraries\Ethernet目录下的头文件问题,不能使用EthernetServer myServer(23); 定义变量。编译不能通过。还有一个经验是当不清楚SPI的接线时可以用打印的方法获取SPI的端口。
    这几天又试验了ESP32使用W5500的情况,ESP32可以作client,和server进行通讯,但不知道为啥还是不能作server。

    后记

    最近有网友讨论ESP8266和W5500的板子通讯的事,实验了一下。可以用ESP8266连接W5500实现以太网有线通讯,只要在初始化程序中增加Ethernet.init(5);这个命令选择GPIO5作为片选信号。还要注意:

    • 不能使用默认的GPIO15作为片选CS信号,如果用GPIO15的话会出现死机现象。可能和我们的板子GPIO15连接的一个10KΩ的接地电阻有关。
    • 片选信号选择其他的可以通讯并实现TCP等的传输。
    • 在初始化中添加Ethernet.Inti(5); 就可以,这个CS可以任意选

    在这里插入图片描述

    ESP32+W5500

    关于ESP32+W5500的server不能运行解决了,可以使用ESP32和W5500实现有线以太网通讯。关键是库函数有问题,在编译时需要使用Server.h库。我的库的地址是在机器上的如下位置:
    在这里插入图片描述
    把这个头文件中改成如下形式就可以编译并使用W5500通讯了。

    class Server: public Print
    {
    public:
        //virtual void begin(uint16_t port=0) =0;   modified by CAI at 2021-12-13
        virtual void begin() = 0;
    };
    
    展开全文
  • 在本篇中我们将讨论如何设计并实现W5500以太网控制器的驱动。 1、功能概述 W5500是WIZnet开发的单芯片全硬件TCP/IP协议栈,能够方便的实现网络连接应用。 1.1、硬件描述 W5500作为一款全硬件TCP/IP嵌入式以太网...
  • STM32上移植MQTT协议使用W5500以太网芯片连接阿里云前言正题核心代码结论 前言 有机会做这次项目很开心,学到了很多东西,但刚开始的时候是真的从零开始,网上找的资料都大相径庭,很多代码都有问题,而且把别人做的...
  • 基于FPGA与W5500以太网接口设计.pdf

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 420
精华内容 168
关键字:

w5500以太网模块