[STM32U5] 【NUCLEO-U575ZI-Q测评】网口TCP服务器

[复制链接]
1861|23
 楼主| 比神乐 发表于 2023-3-13 11:41 | 显示全部楼层 |阅读模式
本帖最后由 比神乐 于 2023-3-15 10:07 编辑

今天搞了一下网口TCP服务器。
CS:PC10;SCLK:PA1;MOSI:PA7;MISO:PA6;RST:PF7.
用硬件SPI没搞成功,只好模拟时序。
原理图:
5.jpg


6.jpg

7.jpg

主程序代码:
  1. #include "main.h"
  2. #include "W5500.h"                        
  3. #include <string.h>
  4. /* Private includes ----------------------------------------------------------*/
  5. /* USER CODE BEGIN Includes */

  6. /* USER CODE END Includes */

  7. /* Private typedef -----------------------------------------------------------*/
  8. /* USER CODE BEGIN PTD */

  9. /* USER CODE END PTD */

  10. /* Private define ------------------------------------------------------------*/
  11. /* USER CODE BEGIN PD */

  12. /* USER CODE END PD */

  13. /* Private macro -------------------------------------------------------------*/
  14. /* USER CODE BEGIN PM */

  15. /* USER CODE END PM */

  16. /* Private variables ---------------------------------------------------------*/

  17. SPI_HandleTypeDef hspi1;


  18. /* Private function prototypes -----------------------------------------------*/
  19. void SystemClock_Config(void);
  20. static void SystemPower_Config(void);
  21. static void MX_GPIO_Init(void);
  22. static void MX_ICACHE_Init(void);


  23. /* USER CODE END PFP */

  24. /* Private user code ---------------------------------------------------------*/
  25. /* USER CODE BEGIN 0 */
  26. /* USER CODE END 0 */

  27. unsigned int W5500_Send_Delay_Counter=0; //W5500·¢ËÍÑÓʱ¼ÆÊý±äÁ¿(ms)
  28. unsigned char temp=0;
  29. /*******************************************************************************
  30. * º¯ÊýÃû  : W5500_Initialization
  31. * ÃèÊö    : W5500³õʼ»õÅäÖÃ
  32. * ÊäÈë    : ÎÞ
  33. * Êä³ö    : ÎÞ
  34. * ·µ»ØÖµ  : ÎÞ
  35. * ˵Ã÷    : ÎÞ
  36. *******************************************************************************/
  37. void W5500_Initialization(void)
  38. {
  39.         W5500_Init();                //³õʼ»¯W5500¼Ä´æÆ÷º¯Êý
  40.         Detect_Gateway();        //¼ì²éÍø¹Ø·þÎñÆ÷
  41.         Socket_Init(0);                //Ö¸¶¨Socket(0~7)³õʼ»¯,³õʼ»¯¶Ë¿Ú0
  42. }

  43. /*******************************************************************************
  44. * º¯ÊýÃû  : Load_Net_Parameters
  45. * ÃèÊö    : ×°ÔØÍøÂç²ÎÊý
  46. * ÊäÈë    : ÎÞ
  47. * Êä³ö    : ÎÞ
  48. * ·µ»ØÖµ  : ÎÞ
  49. * ˵Ã÷    : Íø¹Ø¡¢ÑÚÂë¡¢ÎïÀíµØÖ·¡¢±¾»úIPµØÖ·¡¢¶Ë¿ÚºÅ¡¢Ä¿µÄIPµØÖ·¡¢Ä¿µÄ¶Ë¿ÚºÅ¡¢¶Ë¿Ú¹¤×÷ģʽ
  50. *******************************************************************************/
  51. void Load_Net_Parameters(void)
  52. {
  53.         Gateway_IP[0] = 169;//¼ÓÔØÍø¹Ø²ÎÊý
  54.         Gateway_IP[1] = 254;
  55.         Gateway_IP[2] = 159;
  56.         Gateway_IP[3] = 1;

  57.         Sub_Mask[0]=255;//¼ÓÔØ×ÓÍøÑÚÂë
  58.         Sub_Mask[1]=255;
  59.         Sub_Mask[2]=0;
  60.         Sub_Mask[3]=0;

  61.         Phy_Addr[0]=0x6D;//¼ÓÔØÎïÀíµØÖ·
  62.         Phy_Addr[1]=0x58;
  63.         Phy_Addr[2]=0x49;
  64.         Phy_Addr[3]=0xFC;
  65.         Phy_Addr[4]=0xA9;
  66.         Phy_Addr[5]=0xB4;

  67.         IP_Addr[0]=169;//¼ÓÔØ±¾»úIPµØÖ·
  68.         IP_Addr[1]=254;
  69.         IP_Addr[2]=159;
  70.         IP_Addr[3]=40;

  71.         S0_Port[0] = 0x13;//¼ÓÔØ¶Ë¿Ú0µÄ¶Ë¿ÚºÅ5000
  72.         S0_Port[1] = 0x88;

  73.         S0_DIP[0]=169;//¼ÓÔØ¶Ë¿Ú0µÄÄ¿µÄIPµØÖ·
  74.         S0_DIP[1]=254;
  75.         S0_DIP[2]=159;
  76.         S0_DIP[3]=18;
  77.         
  78.         S0_DPort[0] = 0x17;//¼ÓÔØ¶Ë¿Ú0µÄÄ¿µÄ¶Ë¿ÚºÅ6000
  79.         S0_DPort[1] = 0x70;

  80.         S0_Mode=TCP_SERVER;//¼ÓÔØ¶Ë¿Ú0µÄ¹¤×÷ģʽ,TCP¿Í»§¶Ëģʽ
  81. }

  82. /*******************************************************************************
  83. * º¯ÊýÃû  : W5500_Socket_Set
  84. * ÃèÊö    : W5500¶Ë¿Ú³õʼ»¯ÅäÖÃ
  85. * ÊäÈë    : ÎÞ
  86. * Êä³ö    : ÎÞ
  87. * ·µ»ØÖµ  : ÎÞ
  88. * ˵Ã÷    : ·Ö±ðÉèÖÃ4¸ö¶Ë¿Ú,¸ù¾Ý¶Ë¿Ú¹¤×÷ģʽ,½«¶Ë¿ÚÖÃÓÚTCP·þÎñÆ÷¡¢TCP¿Í»§¶Ë»òUDPģʽ.
  89. *                        ´Ó¶Ë¿Ú״̬×Ö½ÚSocket_State¿ÉÒÔÅж϶˿ڵŤ×÷Çé¿ö
  90. *******************************************************************************/
  91. void W5500_Socket_Set(void)
  92. {
  93.         if(S0_State==0)//¶Ë¿Ú0³õʼ»¯ÅäÖÃ
  94.         {
  95.                 if(S0_Mode==TCP_SERVER)//TCP·þÎñÆ÷ģʽ
  96.                 {
  97.                         if(Socket_Listen(0)==TRUE)
  98.                                 S0_State=S_INIT;
  99.                         else
  100.                                 S0_State=0;
  101.                 }
  102.                 else if(S0_Mode==TCP_CLIENT)//TCP¿Í»§¶Ëģʽ
  103.                 {
  104.                         if(Socket_Connect(0)==TRUE)
  105.                                 S0_State=S_INIT;
  106.                         else
  107.                                 S0_State=0;
  108.                 }
  109.                 else//UDPģʽ
  110.                 {
  111.                         if(Socket_UDP(0)==TRUE)
  112.                                 S0_State=S_INIT|S_CONN;
  113.                         else
  114.                                 S0_State=0;
  115.                 }
  116.         }
  117. }

  118. /*******************************************************************************
  119. * º¯ÊýÃû  : Process_Socket_Data
  120. * ÃèÊö    : W5500½ÓÊÕ²¢·¢ËͽÓÊÕµ½µÄÊý¾Ý
  121. * ÊäÈë    : s:¶Ë¿ÚºÅ
  122. * Êä³ö    : ÎÞ
  123. * ·µ»ØÖµ  : ÎÞ
  124. * ˵Ã÷    : ±¾¹ý³ÌÏȵ÷ÓÃS_rx_process()´ÓW5500µÄ¶Ë¿Ú½ÓÊÕÊý¾Ý»º³åÇø¶ÁÈ¡Êý¾Ý,
  125. *                        È»ºó½«¶ÁÈ¡µÄÊý¾Ý´ÓRx_Buffer¿½±´µ½Temp_Buffer»º³åÇø½øÐд¦Àí¡£
  126. *                        ´¦ÀíÍê±Ï£¬½«Êý¾Ý´ÓTemp_Buffer¿½±´µ½Tx_Buffer»º³åÇø¡£µ÷ÓÃS_tx_process()
  127. *                        ·¢ËÍÊý¾Ý¡£
  128. *******************************************************************************/
  129. void Process_Socket_Data(SOCKET s)
  130. {
  131.         unsigned short size;
  132.         size=Read_SOCK_Data_Buffer(s, Rx_Buffer);
  133.         if(Rx_Buffer[0]=='1')
  134.                 BSP_LED_On(LED1);
  135.         if(Rx_Buffer[0]=='0')
  136.                 BSP_LED_Off(LED1);
  137.         memcpy(Tx_Buffer, Rx_Buffer, size);                        
  138.         Write_SOCK_Data_Buffer(s, Tx_Buffer, size);
  139. }
  140. /**
  141.   * [url=home.php?mod=space&uid=247401]@brief[/url]  The application entry point.
  142.   * @retval int
  143.   */
  144. int main(void)
  145. {
  146.   /* USER CODE BEGIN 1 */

  147.   /* STM32U5xx HAL library initialization:
  148.        - Configure the Flash prefetch
  149.        - Configure the Systick to generate an interrupt each 1 msec
  150.        - Set NVIC Group Priority to 3
  151.        - Low Level Initialization
  152.      */
  153.   /* USER CODE END 1 */

  154.   /* MCU Configuration--------------------------------------------------------*/

  155.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  156.   HAL_Init();

  157.   /* USER CODE BEGIN Init */

  158.   /* USER CODE END Init */

  159.   /* Configure the system clock */
  160.   SystemClock_Config();

  161.   /* Configure the System Power */
  162.   SystemPower_Config();

  163.   /* USER CODE BEGIN SysInit */

  164.   /* USER CODE END SysInit */

  165.   /* Initialize all configured peripherals */
  166.   MX_GPIO_Init();
  167.   MX_ICACHE_Init();
  168.   
  169.   /* USER CODE BEGIN 2 */

  170.   /* Configure LED1, LED2 and LED3 */
  171.   BSP_LED_Init(LED1);
  172.   BSP_LED_Init(LED2);
  173.   BSP_LED_Init(LED3);
  174.         
  175.   /* Configure User push-button button */


  176.   /*##-1- Start the Full Duplex Communication process ########################*/
  177.   /* While the SPI in TransmitReceive process, user can transmit data through
  178.      "aTxBuffer" buffer & receive data through "aRxBuffer" */
  179.   /* Timeout is set to 5S */


  180.         //BSP_LED_On(LED1);
  181.   /* USER CODE END 2 */
  182.         Load_Net_Parameters();                //×°ÔØÍøÂç²ÎÊý        
  183.         W5500_Hardware_Reset();                //Ó²¼þ¸´Î»W5500
  184.         //BSP_LED_On(LED2);
  185.         W5500_Initialization();                //W5500³õʼ»õÅäÖÃ
  186.         //BSP_LED_On(LED3);
  187.   /* Infinite loop */

  188.   /* USER CODE BEGIN WHILE */
  189.   while (1)
  190.   {
  191.     /* USER CODE END WHILE */
  192.                 W5500_Socket_Set();//W5500¶Ë¿Ú³õʼ»¯ÅäÖÃ

  193.                 W5500_Interrupt_Process();//W5500Öжϴ¦Àí³ÌÐò¿ò¼Ü

  194.                 if((S0_Data & S_RECEIVE) == S_RECEIVE)//Èç¹ûSocket0½ÓÊÕµ½Êý¾Ý
  195.                 {
  196.                         S0_Data&=~S_RECEIVE;
  197.                         Process_Socket_Data(0);//W5500½ÓÊÕ²¢·¢ËͽÓÊÕµ½µÄÊý¾Ý
  198.                 }
  199.                 else if(W5500_Send_Delay_Counter >= 50000)//¶¨Ê±·¢ËÍ×Ö·û´®
  200.                 {
  201.                         if(S0_State == (S_INIT|S_CONN))
  202.                         {
  203.                                 S0_Data&=~S_TRANSMITOK;
  204.                                 memcpy(Tx_Buffer, "\r\nWelcome To ChuangWeiElec!\r\n", 27);
  205.                                 Write_SOCK_Data_Buffer(0, Tx_Buffer, 27);//Ö¸¶¨Socket(0~7)·¢ËÍÊý¾Ý´¦Àí,¶Ë¿Ú0·¢ËÍ27×Ö½ÚÊý¾Ý
  206.                         }
  207.                         W5500_Send_Delay_Counter=0;
  208.                 }
  209.                 W5500_Send_Delay_Counter++;
  210.     /* USER CODE BEGIN 3 */

  211.   }
  212.   /* USER CODE END 3 */
  213. }

  214. /**
  215.   * [url=home.php?mod=space&uid=247401]@brief[/url] System Clock Configuration
  216.   * @retval None
  217.   */
  218. void SystemClock_Config(void)
  219. {
  220.   RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  221.   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  222.   /** Configure the main internal regulator output voltage
  223.   */
  224.   if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK)
  225.   {
  226.     Error_Handler();
  227.   }

  228.   /** Initializes the CPU, AHB and APB busses clocks
  229.   */
  230.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;
  231.   RCC_OscInitStruct.MSIState = RCC_MSI_ON;
  232.   RCC_OscInitStruct.MSICalibrationValue = RCC_MSICALIBRATION_DEFAULT;
  233.   RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_4;
  234.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  235.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI;
  236.   RCC_OscInitStruct.PLL.PLLMBOOST = RCC_PLLMBOOST_DIV1;
  237.   RCC_OscInitStruct.PLL.PLLM = 1;
  238.   RCC_OscInitStruct.PLL.PLLN = 80;
  239.   RCC_OscInitStruct.PLL.PLLP = 2;
  240.   RCC_OscInitStruct.PLL.PLLQ = 2;
  241.   RCC_OscInitStruct.PLL.PLLR = 2;
  242.   RCC_OscInitStruct.PLL.PLLRGE = RCC_PLLVCIRANGE_0;
  243.   RCC_OscInitStruct.PLL.PLLFRACN = 0;
  244.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  245.   {
  246.     Error_Handler();
  247.   }

  248.   /** Initializes the CPU, AHB and APB busses clocks
  249.   */
  250.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  251.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
  252.                               |RCC_CLOCKTYPE_PCLK3;
  253.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  254.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  255.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  256.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  257.   RCC_ClkInitStruct.APB3CLKDivider = RCC_HCLK_DIV1;

  258.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
  259.   {
  260.     Error_Handler();
  261.   }
  262. }

  263. /**
  264.   * [url=home.php?mod=space&uid=247401]@brief[/url] Power Configuration
  265.   * @retval None
  266.   */
  267. static void SystemPower_Config(void)
  268. {

  269.   /*
  270.    * Disable the internal Pull-Up in Dead Battery pins of UCPD peripheral
  271.    */
  272.   HAL_PWREx_DisableUCPDDeadBattery();

  273.   /*
  274.    * Switch to SMPS regulator instead of LDO
  275.    */
  276.   if (HAL_PWREx_ConfigSupply(PWR_SMPS_SUPPLY) != HAL_OK)
  277.   {
  278.     Error_Handler();
  279.   }
  280. }

  281. /**
  282.   * [url=home.php?mod=space&uid=247401]@brief[/url] ICACHE Initialization Function
  283.   * @param None
  284.   * @retval None
  285.   */
  286. static void MX_ICACHE_Init(void)
  287. {

  288.   /* USER CODE BEGIN ICACHE_Init 0 */

  289.   /* USER CODE END ICACHE_Init 0 */

  290.   /* USER CODE BEGIN ICACHE_Init 1 */

  291.   /* USER CODE END ICACHE_Init 1 */

  292.   /** Enable instruction cache in 1-way (direct mapped cache)
  293.   */
  294.   if (HAL_ICACHE_ConfigAssociativityMode(ICACHE_1WAY) != HAL_OK)
  295.   {
  296.     Error_Handler();
  297.   }
  298.   if (HAL_ICACHE_Enable() != HAL_OK)
  299.   {
  300.     Error_Handler();
  301.   }
  302.   /* USER CODE BEGIN ICACHE_Init 2 */

  303.   /* USER CODE END ICACHE_Init 2 */

  304. }


  305. /**
  306.   * [url=home.php?mod=space&uid=247401]@brief[/url] GPIO Initialization Function
  307.   * @param None
  308.   * @retval None
  309.   */
  310. static void MX_GPIO_Init(void)
  311. {
  312.         GPIO_InitTypeDef  gpio_init_structure;
  313.   /* GPIO Ports Clock Enable */
  314.   __HAL_RCC_GPIOA_CLK_ENABLE();
  315.         __HAL_RCC_GPIOC_CLK_ENABLE();
  316.         __HAL_RCC_GPIOF_CLK_ENABLE();
  317.         
  318.         
  319.   
  320.     /* Configure the GPIO_LED pin */
  321.     gpio_init_structure.Pin   = GPIO_PIN_1 | GPIO_PIN_7;
  322.     gpio_init_structure.Mode  = GPIO_MODE_OUTPUT_PP;
  323.     gpio_init_structure.Pull  = GPIO_NOPULL;
  324.     gpio_init_structure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;

  325.     HAL_GPIO_Init(GPIOA, &gpio_init_structure);
  326.         
  327.                 gpio_init_structure.Pin   =  GPIO_PIN_7;
  328.     gpio_init_structure.Mode  = GPIO_MODE_OUTPUT_PP;
  329.     gpio_init_structure.Pull  = GPIO_NOPULL;
  330.     gpio_init_structure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;

  331.     HAL_GPIO_Init(GPIOF, &gpio_init_structure);
  332.                
  333.                 gpio_init_structure.Pin   =  GPIO_PIN_10;
  334.     gpio_init_structure.Mode  = GPIO_MODE_OUTPUT_PP;
  335.     gpio_init_structure.Pull  = GPIO_NOPULL;
  336.     gpio_init_structure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;

  337.     HAL_GPIO_Init(GPIOC, &gpio_init_structure);
  338.                
  339.                 gpio_init_structure.Pin   =  GPIO_PIN_6;
  340.     gpio_init_structure.Mode  = GPIO_MODE_INPUT;
  341.     gpio_init_structure.Pull  = GPIO_PULLUP;
  342.     gpio_init_structure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;

  343.     HAL_GPIO_Init(GPIOA, &gpio_init_structure);
  344. }

  345. /* USER CODE BEGIN 4 */

  346. /**
  347.   * @brief  This function is executed in case of error occurrence.
  348.   * @param  None
  349.   * @retval None
  350.   */




  351. /* USER CODE END 4 */

  352. /**
  353.   * @brief  This function is executed in case of error occurrence.
  354.   * @retval None
  355.   */
  356. void Error_Handler(void)
  357. {
  358.   /* USER CODE BEGIN Error_Handler_Debug */
  359.   /* Turn LED3 on */
  360.   BSP_LED_On(LED3);
  361.   while (1)
  362.   {
  363.   }
  364.   /* USER CODE END Error_Handler_Debug */
  365. }

  366. #ifdef  USE_FULL_ASSERT
  367. /**
  368.   * @brief  Reports the name of the source file and the source line number
  369.   *         where the assert_param error has occurred.
  370.   * @param  file: pointer to the source file name
  371.   * @param  line: assert_param error line source number
  372.   * @retval None
  373.   */
  374. void assert_failed(uint8_t *file, uint32_t line)
  375. {
  376.   /* USER CODE BEGIN 6 */
  377.   /* User can add his own implementation to report the file name and line number,
  378.     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  379.   /* USER CODE END 6 */
  380. }
  381. #endif /* USE_FULL_ASSERT */

W5500.C:
  1. #include "W5500.h"        

  2. /***************----- ÍøÂç²ÎÊý±äÁ¿¶¨Òå -----***************/
  3. unsigned char Gateway_IP[4];//Íø¹ØIPµØÖ·
  4. unsigned char Sub_Mask[4];        //×ÓÍøÑÚÂë
  5. unsigned char Phy_Addr[6];        //ÎïÀíµØÖ·(MAC)
  6. unsigned char IP_Addr[4];        //±¾»úIPµØÖ·

  7. unsigned char S0_Port[2];        //¶Ë¿Ú0µÄ¶Ë¿ÚºÅ
  8. unsigned char S0_DIP[4];        //¶Ë¿Ú0Ä¿µÄIPµØÖ·
  9. unsigned char S0_DPort[2];        //¶Ë¿Ú0Ä¿µÄ¶Ë¿ÚºÅ

  10. unsigned char UDP_DIPR[4];        //UDP(¹ã²¥)ģʽ,Ä¿µÄÖ÷»úIPµØÖ·
  11. unsigned char UDP_DPORT[2];        //UDP(¹ã²¥)ģʽ,Ä¿µÄÖ÷»ú¶Ë¿ÚºÅ

  12. /***************----- ¶Ë¿ÚµÄÔËÐÐģʽ -----***************/
  13. unsigned char S0_Mode =3;        //¶Ë¿Ú0µÄÔËÐÐģʽ,0:TCP·þÎñÆ÷ģʽ,1:TCP¿Í»§¶Ëģʽ,2:UDP(¹ã²¥)ģʽ

  14. #define TCP_SERVER        0x00        //TCP·þÎñÆ÷ģʽ
  15. #define TCP_CLIENT        0x01        //TCP¿Í»§¶Ëģʽ
  16. #define UDP_MODE        0x02        //UDP(¹ã²¥)ģʽ

  17. /***************----- ¶Ë¿ÚµÄÔËÐÐ״̬ -----***************/
  18. unsigned char S0_State =0;        //¶Ë¿Ú0״̬¼Ç¼,1:¶Ë¿ÚÍê³É³õʼ»¯,2¶Ë¿ÚÍê³ÉÁ¬½Ó(¿ÉÒÔÕý³£´«ÊäÊý¾Ý)
  19. #define S_INIT                0x01        //¶Ë¿ÚÍê³É³õʼ»¯
  20. #define S_CONN                0x02        //¶Ë¿ÚÍê³ÉÁ¬½Ó,¿ÉÒÔÕý³£´«ÊäÊý¾Ý

  21. /***************----- ¶Ë¿ÚÊÕ·¢Êý¾ÝµÄ״̬ -----***************/
  22. unsigned char S0_Data;                //¶Ë¿Ú0½ÓÊպͷ¢ËÍÊý¾ÝµÄ״̬,1:¶Ë¿Ú½ÓÊÕµ½Êý¾Ý,2:¶Ë¿Ú·¢ËÍÊý¾ÝÍê³É
  23. #define S_RECEIVE         0x01        //¶Ë¿Ú½ÓÊÕµ½Ò»¸öÊý¾Ý°ü
  24. #define S_TRANSMITOK 0x02        //¶Ë¿Ú·¢ËÍÒ»¸öÊý¾Ý°üÍê³É

  25. /***************----- ¶Ë¿ÚÊý¾Ý»º³åÇø -----***************/
  26. unsigned char Rx_Buffer[30];        //¶Ë¿Ú½ÓÊÕÊý¾Ý»º³åÇø
  27. unsigned char Tx_Buffer[30];        //¶Ë¿Ú·¢ËÍÊý¾Ý»º³åÇø
  28. //unsigned char Tx_Buffer[30]="How are you?";        //¶Ë¿Ú·¢ËÍÊý¾Ý»º³åÇø
  29. unsigned char W5500_Interrupt;        //W5500ÖжϱêÖ¾(0:ÎÞÖжÏ,1:ÓÐÖжÏ)


  30. /*******************************************************************************
  31. * ???  : Delay
  32. * ??    : ????(ms)
  33. * ??    : d:????,?????
  34. * ??    : ?
  35. * ??    : ?
  36. * ??    : ?????Timer2??????1?????????
  37. *******************************************************************************/
  38. void Delay(unsigned int  x)
  39. {
  40.     unsigned int i,j;

  41.     for(j=0;j<5;j++)
  42.                 for(i=0;i<x;i++);
  43. }

  44. /*******************************************************************************
  45. * º¯ÊýÃû  : SPI_ReadByte
  46. * ÃèÊö    : ¶Áȡһ¸ö×Ö½ÚSPI·µ»ØµÄÊý¾Ý
  47. * ÊäÈë    : ÎÞ
  48. * Êä³ö    : ÎÞ
  49. * ·µ»ØÖµ  : ¶ÁÈ¡µ½µÄ¼Ä´æÆ÷Êý¾Ý
  50. * ˵Ã÷    : ÎÞ
  51. *******************************************************************************/
  52. unsigned char SPI_Read_Byte(void)
  53. {
  54.         unsigned char i,rByte=0;
  55.         
  56.         W5500_SCLK_0;
  57.         for(i=0;i<8;i++)
  58.         {
  59.                 W5500_SCLK_1;
  60.                 rByte<<=1;
  61.                 rByte|=W5500_MISO;
  62.                 W5500_SCLK_0;        
  63.         }
  64.         return rByte;
  65. }

  66. /*******************************************************************************
  67. * º¯ÊýÃû  : SPI_SendByte
  68. * ÃèÊö    : SPI·¢ËÍÒ»¸ö×Ö½ÚÊý¾Ý
  69. * ÊäÈë    : dt:´ý·¢Ë͵ÄÊý¾Ý
  70. * Êä³ö    : ÎÞ
  71. * ·µ»ØÖµ  : ÎÞ
  72. * ˵Ã÷    : ÎÞ
  73. *******************************************************************************/
  74. void SPI_Send_Byte(unsigned char dt)
  75. {
  76.         unsigned char i;
  77.                
  78.         for(i=0;i<8;i++)
  79.         {        
  80.                 W5500_SCLK_0;
  81.                 if((dt<<i)&0x80)
  82.                         W5500_MOSI_1;
  83.                 else
  84.                         W5500_MOSI_0;                                       
  85.                 W5500_SCLK_1;
  86.         }
  87.         W5500_SCLK_0;
  88. }

  89. /*******************************************************************************
  90. * º¯ÊýÃû  : SPI_Send_Short
  91. * ÃèÊö    : SPI·¢ËÍ2¸ö×Ö½ÚÊý¾Ý(16λ)
  92. * ÊäÈë    : dat:´ý·¢Ë͵Ä16λÊý¾Ý
  93. * Êä³ö    : ÎÞ
  94. * ·µ»ØÖµ  : ÎÞ
  95. * ˵Ã÷    : ÎÞ
  96. *******************************************************************************/
  97. void SPI_Send_Short(unsigned short dt)
  98. {
  99.         SPI_Send_Byte((unsigned char)(dt/256));        //дÊý¾Ý¸ßλ
  100.         SPI_Send_Byte(dt);                                                //дÊý¾ÝµÍλ
  101. }

  102. /*******************************************************************************
  103. * º¯ÊýÃû  : Write_W5500_1Byte
  104. * ÃèÊö    : ͨ¹ýSPIÏòÖ¸¶¨µØÖ·¼Ä´æÆ÷д1¸ö×Ö½ÚÊý¾Ý
  105. * ÊäÈë    : reg:16λ¼Ä´æÆ÷µØÖ·,dat:´ýдÈëµÄÊý¾Ý
  106. * Êä³ö    : ÎÞ
  107. * ·µ»ØÖµ  : ÎÞ
  108. * ˵Ã÷    : ÎÞ
  109. *******************************************************************************/
  110. void Write_W5500_1Byte(unsigned short reg, unsigned char dat)
  111. {
  112.         W5500_SCS_0;//ÖÃW5500µÄSCSΪµÍµçƽ

  113.         SPI_Send_Short(reg);//ͨ¹ýSPIд16λ¼Ä´æÆ÷µØÖ·
  114.         SPI_Send_Byte(FDM1|RWB_WRITE|COMMON_R);//ͨ¹ýSPIд¿ØÖÆ×Ö½Ú,1¸ö×Ö½ÚÊý¾Ý³¤¶È,дÊý¾Ý,Ñ¡ÔñͨÓüĴæÆ÷
  115.         SPI_Send_Byte(dat);//д1¸ö×Ö½ÚÊý¾Ý

  116.         W5500_SCS_1; //ÖÃW5500µÄSCSΪ¸ßµçƽ
  117. }

  118. /*******************************************************************************
  119. * º¯ÊýÃû  : Write_W5500_2Byte
  120. * ÃèÊö    : ͨ¹ýSPIÏòÖ¸¶¨µØÖ·¼Ä´æÆ÷д2¸ö×Ö½ÚÊý¾Ý
  121. * ÊäÈë    : reg:16λ¼Ä´æÆ÷µØÖ·,dat:16λ´ýдÈëµÄÊý¾Ý(2¸ö×Ö½Ú)
  122. * Êä³ö    : ÎÞ
  123. * ·µ»ØÖµ  : ÎÞ
  124. * ˵Ã÷    : ÎÞ
  125. *******************************************************************************/
  126. void Write_W5500_2Byte(unsigned short reg, unsigned short dat)
  127. {
  128.         W5500_SCS_0;//ÖÃW5500µÄSCSΪµÍµçƽ
  129.                
  130.         SPI_Send_Short(reg);//ͨ¹ýSPIд16λ¼Ä´æÆ÷µØÖ·
  131.         SPI_Send_Byte(FDM2|RWB_WRITE|COMMON_R);//ͨ¹ýSPIд¿ØÖÆ×Ö½Ú,2¸ö×Ö½ÚÊý¾Ý³¤¶È,дÊý¾Ý,Ñ¡ÔñͨÓüĴæÆ÷
  132.         SPI_Send_Short(dat);//д16λÊý¾Ý

  133.         W5500_SCS_1; //ÖÃW5500µÄSCSΪ¸ßµçƽ
  134. }

  135. /*******************************************************************************
  136. * º¯ÊýÃû  : Write_W5500_nByte
  137. * ÃèÊö    : ͨ¹ýSPIÏòÖ¸¶¨µØÖ·¼Ä´æÆ÷дn¸ö×Ö½ÚÊý¾Ý
  138. * ÊäÈë    : reg:16λ¼Ä´æÆ÷µØÖ·,*dat_ptr:´ýдÈëÊý¾Ý»º³åÇøÖ¸Õë,size:´ýдÈëµÄÊý¾Ý³¤¶È
  139. * Êä³ö    : ÎÞ
  140. * ·µ»ØÖµ  : ÎÞ
  141. * ˵Ã÷    : ÎÞ
  142. *******************************************************************************/
  143. void Write_W5500_nByte(unsigned short reg, unsigned char *dat_ptr, unsigned short size)
  144. {
  145.         unsigned short i;

  146.         W5500_SCS_0;//ÖÃW5500µÄSCSΪµÍµçƽ        
  147.                
  148.         SPI_Send_Short(reg);//ͨ¹ýSPIд16λ¼Ä´æÆ÷µØÖ·
  149.         SPI_Send_Byte(VDM|RWB_WRITE|COMMON_R);//ͨ¹ýSPIд¿ØÖÆ×Ö½Ú,N¸ö×Ö½ÚÊý¾Ý³¤¶È,дÊý¾Ý,Ñ¡ÔñͨÓüĴæÆ÷

  150.         for(i=0;i<size;i++)//Ñ­»·½«»º³åÇøµÄsize¸ö×Ö½ÚÊý¾ÝдÈëW5500
  151.         {
  152.                 SPI_Send_Byte(*dat_ptr++);//дһ¸ö×Ö½ÚÊý¾Ý
  153.         }

  154.         W5500_SCS_1; //ÖÃW5500µÄSCSΪ¸ßµçƽ
  155. }

  156. /*******************************************************************************
  157. * º¯ÊýÃû  : Write_W5500_SOCK_1Byte
  158. * ÃèÊö    : ͨ¹ýSPIÏòÖ¸¶¨¶Ë¿Ú¼Ä´æÆ÷д1¸ö×Ö½ÚÊý¾Ý
  159. * ÊäÈë    : s:¶Ë¿ÚºÅ,reg:16λ¼Ä´æÆ÷µØÖ·,dat:´ýдÈëµÄÊý¾Ý
  160. * Êä³ö    : ÎÞ
  161. * ·µ»ØÖµ  : ÎÞ
  162. * ˵Ã÷    : ÎÞ
  163. *******************************************************************************/
  164. void Write_W5500_SOCK_1Byte(SOCKET s, unsigned short reg, unsigned char dat)
  165. {
  166.         W5500_SCS_0;//ÖÃW5500µÄSCSΪµÍµçƽ        
  167.                
  168.         SPI_Send_Short(reg);//ͨ¹ýSPIд16λ¼Ä´æÆ÷µØÖ·
  169.         SPI_Send_Byte(FDM1|RWB_WRITE|(s*0x20+0x08));//ͨ¹ýSPIд¿ØÖÆ×Ö½Ú,1¸ö×Ö½ÚÊý¾Ý³¤¶È,дÊý¾Ý,Ñ¡Ôñ¶Ë¿ÚsµÄ¼Ä´æÆ÷
  170.         SPI_Send_Byte(dat);//д1¸ö×Ö½ÚÊý¾Ý

  171.         W5500_SCS_1; //ÖÃW5500µÄSCSΪ¸ßµçƽ
  172. }

  173. /*******************************************************************************
  174. * º¯ÊýÃû  : Write_W5500_SOCK_2Byte
  175. * ÃèÊö    : ͨ¹ýSPIÏòÖ¸¶¨¶Ë¿Ú¼Ä´æÆ÷д2¸ö×Ö½ÚÊý¾Ý
  176. * ÊäÈë    : s:¶Ë¿ÚºÅ,reg:16λ¼Ä´æÆ÷µØÖ·,dat:16λ´ýдÈëµÄÊý¾Ý(2¸ö×Ö½Ú)
  177. * Êä³ö    : ÎÞ
  178. * ·µ»ØÖµ  : ÎÞ
  179. * ˵Ã÷    : ÎÞ
  180. *******************************************************************************/
  181. void Write_W5500_SOCK_2Byte(SOCKET s, unsigned short reg, unsigned short dat)
  182. {
  183.         W5500_SCS_0;//ÖÃW5500µÄSCSΪµÍµçƽ
  184.                         
  185.         SPI_Send_Short(reg);//ͨ¹ýSPIд16λ¼Ä´æÆ÷µØÖ·
  186.         SPI_Send_Byte(FDM2|RWB_WRITE|(s*0x20+0x08));//ͨ¹ýSPIд¿ØÖÆ×Ö½Ú,2¸ö×Ö½ÚÊý¾Ý³¤¶È,дÊý¾Ý,Ñ¡Ôñ¶Ë¿ÚsµÄ¼Ä´æÆ÷
  187.         SPI_Send_Short(dat);//д16λÊý¾Ý

  188.         W5500_SCS_1; //ÖÃW5500µÄSCSΪ¸ßµçƽ
  189. }

  190. /*******************************************************************************
  191. * º¯ÊýÃû  : Write_W5500_SOCK_4Byte
  192. * ÃèÊö    : ͨ¹ýSPIÏòÖ¸¶¨¶Ë¿Ú¼Ä´æÆ÷д4¸ö×Ö½ÚÊý¾Ý
  193. * ÊäÈë    : s:¶Ë¿ÚºÅ,reg:16λ¼Ä´æÆ÷µØÖ·,*dat_ptr:´ýдÈëµÄ4¸ö×Ö½Ú»º³åÇøÖ¸Õë
  194. * Êä³ö    : ÎÞ
  195. * ·µ»ØÖµ  : ÎÞ
  196. * ˵Ã÷    : ÎÞ
  197. *******************************************************************************/
  198. void Write_W5500_SOCK_4Byte(SOCKET s, unsigned short reg, unsigned char *dat_ptr)
  199. {
  200.         W5500_SCS_0;//ÖÃW5500µÄSCSΪµÍµçƽ
  201.                         
  202.         SPI_Send_Short(reg);//ͨ¹ýSPIд16λ¼Ä´æÆ÷µØÖ·
  203.         SPI_Send_Byte(FDM4|RWB_WRITE|(s*0x20+0x08));//ͨ¹ýSPIд¿ØÖÆ×Ö½Ú,4¸ö×Ö½ÚÊý¾Ý³¤¶È,дÊý¾Ý,Ñ¡Ôñ¶Ë¿ÚsµÄ¼Ä´æÆ÷

  204.         SPI_Send_Byte(*dat_ptr++);//дµÚ1¸ö×Ö½ÚÊý¾Ý
  205.         SPI_Send_Byte(*dat_ptr++);//дµÚ2¸ö×Ö½ÚÊý¾Ý
  206.         SPI_Send_Byte(*dat_ptr++);//дµÚ3¸ö×Ö½ÚÊý¾Ý
  207.         SPI_Send_Byte(*dat_ptr++);//дµÚ4¸ö×Ö½ÚÊý¾Ý

  208.         W5500_SCS_1; //ÖÃW5500µÄSCSΪ¸ßµçƽ
  209. }

  210. /*******************************************************************************
  211. * º¯ÊýÃû  : Read_W5500_1Byte
  212. * ÃèÊö    : ¶ÁW5500Ö¸¶¨µØÖ·¼Ä´æÆ÷µÄ1¸ö×Ö½ÚÊý¾Ý
  213. * ÊäÈë    : reg:16λ¼Ä´æÆ÷µØÖ·
  214. * Êä³ö    : ÎÞ
  215. * ·µ»ØÖµ  : ¶ÁÈ¡µ½¼Ä´æÆ÷µÄ1¸ö×Ö½ÚÊý¾Ý
  216. * ˵Ã÷    : ÎÞ
  217. *******************************************************************************/
  218. unsigned char Read_W5500_1Byte(unsigned short reg)
  219. {
  220.         unsigned char i;

  221.         W5500_SCS_0;//ÖÃW5500µÄSCSΪµÍµçƽ
  222.                         
  223.         SPI_Send_Short(reg);//ͨ¹ýSPIд16λ¼Ä´æÆ÷µØÖ·
  224.         SPI_Send_Byte(FDM1|RWB_READ|COMMON_R);//ͨ¹ýSPIд¿ØÖÆ×Ö½Ú,1¸ö×Ö½ÚÊý¾Ý³¤¶È,¶ÁÊý¾Ý,Ñ¡ÔñͨÓüĴæÆ÷
  225.         i=SPI_Read_Byte();

  226.         W5500_SCS_1;//ÖÃW5500µÄSCSΪ¸ßµçƽ
  227.         return i;//·µ»Ø¶ÁÈ¡µ½µÄ¼Ä´æÆ÷Êý¾Ý
  228. }

  229. /*******************************************************************************
  230. * º¯ÊýÃû  : Read_W5500_SOCK_1Byte
  231. * ÃèÊö    : ¶ÁW5500Ö¸¶¨¶Ë¿Ú¼Ä´æÆ÷µÄ1¸ö×Ö½ÚÊý¾Ý
  232. * ÊäÈë    : s:¶Ë¿ÚºÅ,reg:16λ¼Ä´æÆ÷µØÖ·
  233. * Êä³ö    : ÎÞ
  234. * ·µ»ØÖµ  : ¶ÁÈ¡µ½¼Ä´æÆ÷µÄ1¸ö×Ö½ÚÊý¾Ý
  235. * ˵Ã÷    : ÎÞ
  236. *******************************************************************************/
  237. unsigned char Read_W5500_SOCK_1Byte(SOCKET s, unsigned short reg)
  238. {
  239.         unsigned char i;

  240.         W5500_SCS_0;//ÖÃW5500µÄSCSΪµÍµçƽ
  241.                         
  242.         SPI_Send_Short(reg);//ͨ¹ýSPIд16λ¼Ä´æÆ÷µØÖ·
  243.         SPI_Send_Byte(FDM1|RWB_READ|(s*0x20+0x08));//ͨ¹ýSPIд¿ØÖÆ×Ö½Ú,1¸ö×Ö½ÚÊý¾Ý³¤¶È,¶ÁÊý¾Ý,Ñ¡Ôñ¶Ë¿ÚsµÄ¼Ä´æÆ÷
  244.         i=SPI_Read_Byte();

  245.         W5500_SCS_1;//ÖÃW5500µÄSCSΪ¸ßµçƽ
  246.         return i;//·µ»Ø¶ÁÈ¡µ½µÄ¼Ä´æÆ÷Êý¾Ý
  247. }

  248. /*******************************************************************************
  249. * º¯ÊýÃû  : Read_W5500_SOCK_2Byte
  250. * ÃèÊö    : ¶ÁW5500Ö¸¶¨¶Ë¿Ú¼Ä´æÆ÷µÄ2¸ö×Ö½ÚÊý¾Ý
  251. * ÊäÈë    : s:¶Ë¿ÚºÅ,reg:16λ¼Ä´æÆ÷µØÖ·
  252. * Êä³ö    : ÎÞ
  253. * ·µ»ØÖµ  : ¶ÁÈ¡µ½¼Ä´æÆ÷µÄ2¸ö×Ö½ÚÊý¾Ý(16λ)
  254. * ˵Ã÷    : ÎÞ
  255. *******************************************************************************/
  256. unsigned short Read_W5500_SOCK_2Byte(SOCKET s, unsigned short reg)
  257. {
  258.         unsigned short i;

  259.         W5500_SCS_0;//ÖÃW5500µÄSCSΪµÍµçƽ
  260.                         
  261.         SPI_Send_Short(reg);//ͨ¹ýSPIд16λ¼Ä´æÆ÷µØÖ·
  262.         SPI_Send_Byte(FDM2|RWB_READ|(s*0x20+0x08));//ͨ¹ýSPIд¿ØÖÆ×Ö½Ú,2¸ö×Ö½ÚÊý¾Ý³¤¶È,¶ÁÊý¾Ý,Ñ¡Ôñ¶Ë¿ÚsµÄ¼Ä´æÆ÷

  263.         i=SPI_Read_Byte();
  264.         i*=256;
  265.         i+=SPI_Read_Byte();//¶ÁÈ¡µÍλÊý¾Ý

  266.         W5500_SCS_1;//ÖÃW5500µÄSCSΪ¸ßµçƽ
  267.         return i;//·µ»Ø¶ÁÈ¡µ½µÄ¼Ä´æÆ÷Êý¾Ý
  268. }

  269. /*******************************************************************************
  270. * º¯ÊýÃû  : Read_SOCK_Data_Buffer
  271. * ÃèÊö    : ´ÓW5500½ÓÊÕÊý¾Ý»º³åÇøÖжÁÈ¡Êý¾Ý
  272. * ÊäÈë    : s:¶Ë¿ÚºÅ,*dat_ptr:Êý¾Ý±£´æ»º³åÇøÖ¸Õë
  273. * Êä³ö    : ÎÞ
  274. * ·µ»ØÖµ  : ¶ÁÈ¡µ½µÄÊý¾Ý³¤¶È,rx_size¸ö×Ö½Ú
  275. * ˵Ã÷    : ÎÞ
  276. *******************************************************************************/
  277. unsigned short Read_SOCK_Data_Buffer(SOCKET s, unsigned char *dat_ptr)
  278. {
  279.         unsigned short rx_size;
  280.         unsigned short offset, offset1;
  281.         unsigned short i;
  282.         unsigned char j;

  283.         rx_size=Read_W5500_SOCK_2Byte(s,Sn_RX_RSR);
  284.         if(rx_size==0) return 0;//û½ÓÊÕµ½Êý¾ÝÔò·µ»Ø
  285.         if(rx_size>1460) rx_size=1460;

  286.         offset=Read_W5500_SOCK_2Byte(s,Sn_RX_RD);
  287.         offset1=offset;
  288.         offset&=(S_RX_SIZE-1);//¼ÆËãʵ¼ÊµÄÎïÀíµØÖ·

  289.         W5500_SCS_0;//ÖÃW5500µÄSCSΪµÍµçƽ

  290.         SPI_Send_Short(offset);//д16λµØÖ·
  291.         SPI_Send_Byte(VDM|RWB_READ|(s*0x20+0x18));//д¿ØÖÆ×Ö½Ú,N¸ö×Ö½ÚÊý¾Ý³¤¶È,¶ÁÊý¾Ý,Ñ¡Ôñ¶Ë¿ÚsµÄ¼Ä´æÆ÷
  292.         
  293.         if((offset+rx_size)<S_RX_SIZE)//Èç¹û×î´óµØÖ·Î´³¬¹ýW5500½ÓÊÕ»º³åÇø¼Ä´æÆ÷µÄ×î´óµØÖ·
  294.         {
  295.                 for(i=0;i<rx_size;i++)//Ñ­»·¶ÁÈ¡rx_size¸ö×Ö½ÚÊý¾Ý
  296.                 {
  297.                         j=SPI_Read_Byte();//¶ÁÈ¡1¸ö×Ö½ÚÊý¾Ý
  298.                         *dat_ptr=j;//½«¶ÁÈ¡µ½µÄÊý¾Ý±£´æµ½Êý¾Ý±£´æ»º³åÇø
  299.                         dat_ptr++;//Êý¾Ý±£´æ»º³åÇøÖ¸ÕëµØÖ·×ÔÔö1
  300.                 }
  301.         }
  302.         else//Èç¹û×î´óµØÖ·³¬¹ýW5500½ÓÊÕ»º³åÇø¼Ä´æÆ÷µÄ×î´óµØÖ·
  303.         {
  304.                 offset=S_RX_SIZE-offset;
  305.                 for(i=0;i<offset;i++)//Ñ­»·¶ÁÈ¡³öǰoffset¸ö×Ö½ÚÊý¾Ý
  306.                 {
  307.                         j=SPI_Read_Byte();//¶ÁÈ¡1¸ö×Ö½ÚÊý¾Ý
  308.                         *dat_ptr=j;//½«¶ÁÈ¡µ½µÄÊý¾Ý±£´æµ½Êý¾Ý±£´æ»º³åÇø
  309.                         dat_ptr++;//Êý¾Ý±£´æ»º³åÇøÖ¸ÕëµØÖ·×ÔÔö1
  310.                 }
  311.                 W5500_SCS_1; //ÖÃW5500µÄSCSΪ¸ßµçƽ

  312.                 W5500_SCS_0;//ÖÃW5500µÄSCSΪµÍµçƽ

  313.                 SPI_Send_Short(0x00);//д16λµØÖ·
  314.                 SPI_Send_Byte(VDM|RWB_READ|(s*0x20+0x18));//д¿ØÖÆ×Ö½Ú,N¸ö×Ö½ÚÊý¾Ý³¤¶È,¶ÁÊý¾Ý,Ñ¡Ôñ¶Ë¿ÚsµÄ¼Ä´æÆ÷

  315.                 for(;i<rx_size;i++)//Ñ­»·¶ÁÈ¡ºórx_size-offset¸ö×Ö½ÚÊý¾Ý
  316.                 {
  317.                         j=SPI_Read_Byte();//¶ÁÈ¡1¸ö×Ö½ÚÊý¾Ý
  318.                         *dat_ptr=j;//½«¶ÁÈ¡µ½µÄÊý¾Ý±£´æµ½Êý¾Ý±£´æ»º³åÇø
  319.                         dat_ptr++;//Êý¾Ý±£´æ»º³åÇøÖ¸ÕëµØÖ·×ÔÔö1
  320.                 }
  321.         }
  322.         W5500_SCS_1; //ÖÃW5500µÄSCSΪ¸ßµçƽ

  323.         offset1+=rx_size;//¸üÐÂʵ¼ÊÎïÀíµØÖ·,¼´Ï´ζÁÈ¡½ÓÊÕµ½µÄÊý¾ÝµÄÆðʼµØÖ·
  324.         Write_W5500_SOCK_2Byte(s, Sn_RX_RD, offset1);
  325.         Write_W5500_SOCK_1Byte(s, Sn_CR, RECV);//·¢ËÍÆô¶¯½ÓÊÕÃüÁî
  326.         return rx_size;//·µ»Ø½ÓÊÕµ½Êý¾ÝµÄ³¤¶È
  327. }

  328. /*******************************************************************************
  329. * º¯ÊýÃû  : Write_SOCK_Data_Buffer
  330. * ÃèÊö    : ½«Êý¾ÝдÈëW5500µÄÊý¾Ý·¢ËÍ»º³åÇø
  331. * ÊäÈë    : s:¶Ë¿ÚºÅ,*dat_ptr:Êý¾Ý±£´æ»º³åÇøÖ¸Õë,size:´ýдÈëÊý¾ÝµÄ³¤¶È
  332. * Êä³ö    : ÎÞ
  333. * ·µ»ØÖµ  : ÎÞ
  334. * ˵Ã÷    : ÎÞ
  335. *******************************************************************************/
  336. void Write_SOCK_Data_Buffer(SOCKET s, unsigned char *dat_ptr, unsigned short size)
  337. {
  338.         unsigned short offset,offset1;
  339.         unsigned short i;

  340.         //Èç¹ûÊÇUDPģʽ,¿ÉÒÔÔÚ´ËÉèÖÃÄ¿µÄÖ÷»úµÄIPºÍ¶Ë¿ÚºÅ
  341.         if((Read_W5500_SOCK_1Byte(s,Sn_MR)&0x0f) != SOCK_UDP)//Èç¹ûSocket´ò¿ªÊ§°Ü
  342.         {               
  343.                 Write_W5500_SOCK_4Byte(s, Sn_DIPR, UDP_DIPR);//ÉèÖÃÄ¿µÄÖ÷»úIP                  
  344.                 Write_W5500_SOCK_2Byte(s, Sn_DPORTR, UDP_DPORT[0]*256+UDP_DPORT[1]);//ÉèÖÃÄ¿µÄÖ÷»ú¶Ë¿ÚºÅ                                
  345.         }

  346.         offset=Read_W5500_SOCK_2Byte(s,Sn_TX_WR);
  347.         offset1=offset;
  348.         offset&=(S_TX_SIZE-1);//¼ÆËãʵ¼ÊµÄÎïÀíµØÖ·

  349.         W5500_SCS_0;//ÖÃW5500µÄSCSΪµÍµçƽ

  350.         SPI_Send_Short(offset);//д16λµØÖ·
  351.         SPI_Send_Byte(VDM|RWB_WRITE|(s*0x20+0x10));//д¿ØÖÆ×Ö½Ú,N¸ö×Ö½ÚÊý¾Ý³¤¶È,дÊý¾Ý,Ñ¡Ôñ¶Ë¿ÚsµÄ¼Ä´æÆ÷

  352.         if((offset+size)<S_TX_SIZE)//Èç¹û×î´óµØÖ·Î´³¬¹ýW5500·¢ËÍ»º³åÇø¼Ä´æÆ÷µÄ×î´óµØÖ·
  353.         {
  354.                 for(i=0;i<size;i++)//Ñ­»·Ð´Èësize¸ö×Ö½ÚÊý¾Ý
  355.                 {
  356.                         SPI_Send_Byte(*dat_ptr++);//дÈëÒ»¸ö×Ö½ÚµÄÊý¾Ý               
  357.                 }
  358.         }
  359.         else//Èç¹û×î´óµØÖ·³¬¹ýW5500·¢ËÍ»º³åÇø¼Ä´æÆ÷µÄ×î´óµØÖ·
  360.         {
  361.                 offset=S_TX_SIZE-offset;
  362.                 for(i=0;i<offset;i++)//Ñ­»·Ð´Èëǰoffset¸ö×Ö½ÚÊý¾Ý
  363.                 {
  364.                         SPI_Send_Byte(*dat_ptr++);//дÈëÒ»¸ö×Ö½ÚµÄÊý¾Ý
  365.                 }
  366.                 W5500_SCS_1; //ÖÃW5500µÄSCSΪ¸ßµçƽ

  367.                 W5500_SCS_0;//ÖÃW5500µÄSCSΪµÍµçƽ

  368.                 SPI_Send_Short(0x00);//д16λµØÖ·
  369.                 SPI_Send_Byte(VDM|RWB_WRITE|(s*0x20+0x10));//д¿ØÖÆ×Ö½Ú,N¸ö×Ö½ÚÊý¾Ý³¤¶È,дÊý¾Ý,Ñ¡Ôñ¶Ë¿ÚsµÄ¼Ä´æÆ÷

  370.                 for(;i<size;i++)//Ñ­»·Ð´Èësize-offset¸ö×Ö½ÚÊý¾Ý
  371.                 {
  372.                         SPI_Send_Byte(*dat_ptr++);//дÈëÒ»¸ö×Ö½ÚµÄÊý¾Ý
  373.                 }
  374.         }
  375.         W5500_SCS_1; //ÖÃW5500µÄSCSΪ¸ßµçƽ

  376.         offset1+=size;//¸üÐÂʵ¼ÊÎïÀíµØÖ·,¼´Ï´Îд´ý·¢ËÍÊý¾Ýµ½·¢ËÍÊý¾Ý»º³åÇøµÄÆðʼµØÖ·
  377.         Write_W5500_SOCK_2Byte(s, Sn_TX_WR, offset1);
  378.         Write_W5500_SOCK_1Byte(s, Sn_CR, SEND);//·¢ËÍÆô¶¯·¢ËÍÃüÁî                                
  379. }

  380. /*******************************************************************************
  381. * º¯ÊýÃû  : W5500_Hardware_Reset
  382. * ÃèÊö    : Ó²¼þ¸´Î»W5500
  383. * ÊäÈë    : ÎÞ
  384. * Êä³ö    : ÎÞ
  385. * ·µ»ØÖµ  : ÎÞ
  386. * ˵Ã÷    : W5500µÄ¸´Î»Òý½Å±£³ÖµÍµçƽÖÁÉÙ500usÒÔÉÏ,²ÅÄÜÖØÎ§W5500
  387. *******************************************************************************/
  388. void W5500_Hardware_Reset(void)
  389. {
  390.         W5500_RST_0;//¸´Î»Òý½ÅÀ­µÍ
  391.         HAL_Delay(200);
  392.         W5500_RST_1;//¸´Î»Òý½ÅÀ­¸ß
  393.         HAL_Delay(200);
  394.         while((Read_W5500_1Byte(PHYCFGR)&LINK)==0);//µÈ´ýÒÔÌ«ÍøÁ¬½ÓÍê³É
  395. }

  396. /*******************************************************************************
  397. * º¯ÊýÃû  : W5500_Init
  398. * ÃèÊö    : ³õʼ»¯W5500¼Ä´æÆ÷º¯Êý
  399. * ÊäÈë    : ÎÞ
  400. * Êä³ö    : ÎÞ
  401. * ·µ»ØÖµ  : ÎÞ
  402. * ˵Ã÷    : ÔÚʹÓÃW5500֮ǰ£¬ÏȶÔW5500³õʼ»¯
  403. *******************************************************************************/
  404. void W5500_Init(void)
  405. {
  406.         unsigned char i=0;

  407.         Write_W5500_1Byte(MR, RST);//Èí¼þ¸´Î»W5500,ÖÃ1ÓÐЧ,¸´Î»ºó×Ô¶¯Çå0
  408.         HAL_Delay(10);//ÑÓʱ10ms,×Ô¼º¶¨Òå¸Ãº¯Êý

  409.         //ÉèÖÃÍø¹Ø(Gateway)µÄIPµØÖ·,Gateway_IPΪ4×Ö½Úunsigned charÊý×é,×Ô¼º¶¨Òå
  410.         //ʹÓÃÍø¹Ø¿ÉÒÔʹͨÐÅÍ»ÆÆ×ÓÍøµÄ¾ÖÏÞ£¬Í¨¹ýÍø¹Ø¿ÉÒÔ·ÃÎʵ½ÆäËü×ÓÍø»ò½øÈëInternet
  411.         Write_W5500_nByte(GAR, Gateway_IP, 4);
  412.                         
  413.         //ÉèÖÃ×ÓÍøÑÚÂë(MASK)Öµ,SUB_MASKΪ4×Ö½Úunsigned charÊý×é,×Ô¼º¶¨Òå
  414.         //×ÓÍøÑÚÂëÓÃÓÚ×ÓÍøÔËËã
  415.         Write_W5500_nByte(SUBR,Sub_Mask,4);               
  416.         
  417.         //ÉèÖÃÎïÀíµØÖ·,PHY_ADDRΪ6×Ö½Úunsigned charÊý×é,×Ô¼º¶¨Òå,ÓÃÓÚΨһ±êÊ¶ÍøÂçÉ豸µÄÎïÀíµØÖ·Öµ
  418.         //¸ÃµØÖ·ÖµÐèÒªµ½IEEEÉêÇ룬°´ÕÕOUIµÄ¹æ¶¨£¬Ç°3¸ö×Ö½ÚΪ³§ÉÌ´úÂ룬ºóÈý¸ö×Ö½ÚΪ²úÆ·ÐòºÅ
  419.         //Èç¹û×Ô¼º¶¨ÒåÎïÀíµØÖ·£¬×¢ÒâµÚÒ»¸ö×Ö½Ú±ØÐëΪżÊý
  420.         Write_W5500_nByte(SHAR,Phy_Addr,6);               

  421.         //ÉèÖñ¾»úµÄIPµØÖ·,IP_ADDRΪ4×Ö½Úunsigned charÊý×é,×Ô¼º¶¨Òå
  422.         //×¢Òâ£¬Íø¹ØIP±ØÐëÓë±¾»úIPÊôÓÚͬһ¸ö×ÓÍø£¬·ñÔò±¾»ú½«ÎÞ·¨ÕÒµ½Íø¹Ø
  423.         Write_W5500_nByte(SIPR,IP_Addr,4);               
  424.         
  425.         //ÉèÖ÷¢ËÍ»º³åÇøºÍ½ÓÊÕ»º³åÇøµÄ´óС£¬²Î¿¼W5500Êý¾ÝÊÖ²á
  426.         for(i=0;i<8;i++)
  427.         {
  428.                 Write_W5500_SOCK_1Byte(i,Sn_RXBUF_SIZE, 0x02);//Socket Rx memory size=2k
  429.                 Write_W5500_SOCK_1Byte(i,Sn_TXBUF_SIZE, 0x02);//Socket Tx mempry size=2k
  430.         }

  431.         //ÉèÖÃÖØÊÔʱ¼ä£¬Ä¬ÈÏΪ2000(200ms)
  432.         //ÿһµ¥Î»ÊýֵΪ100΢Ãë,³õʼ»¯Ê±ÖµÉèΪ2000(0x07D0),µÈÓÚ200ºÁÃë
  433.         Write_W5500_2Byte(RTR, 0x07d0);

  434.         //ÉèÖÃÖØÊÔ´ÎÊý£¬Ä¬ÈÏΪ8´Î
  435.         //Èç¹ûÖØ·¢µÄ´ÎÊý³¬¹ýÉ趨ֵ,Ôò²úÉú³¬Ê±ÖжÏ(Ïà¹ØµÄ¶Ë¿ÚÖжϼĴæÆ÷ÖеÄSn_IR ³¬Ê±Î»(TIMEOUT)Öá°1¡±)
  436.         Write_W5500_1Byte(RCR,8);
  437. }

  438. /*******************************************************************************
  439. * º¯ÊýÃû  : Detect_Gateway
  440. * ÃèÊö    : ¼ì²éÍø¹Ø·þÎñÆ÷
  441. * ÊäÈë    : ÎÞ
  442. * Êä³ö    : ÎÞ
  443. * ·µ»ØÖµ  : ³É¹¦·µ»ØTRUE(0xFF),ʧ°Ü·µ»ØFALSE(0x00)
  444. * ˵Ã÷    : ÎÞ
  445. *******************************************************************************/
  446. unsigned char Detect_Gateway(void)
  447. {
  448.         unsigned char ip_adde[4];
  449.         ip_adde[0]=IP_Addr[0]+1;
  450.         ip_adde[1]=IP_Addr[1]+1;
  451.         ip_adde[2]=IP_Addr[2]+1;
  452.         ip_adde[3]=IP_Addr[3]+1;

  453.         //¼ì²éÍø¹Ø¼°»ñÈ¡Íø¹ØµÄÎïÀíµØÖ·
  454.         Write_W5500_SOCK_4Byte(0,Sn_DIPR,ip_adde);//ÏòÄ¿µÄµØÖ·¼Ä´æÆ÷дÈëÓë±¾»úIP²»Í¬µÄIPÖµ
  455.         Write_W5500_SOCK_1Byte(0,Sn_MR,MR_TCP);//ÉèÖÃsocketΪTCPģʽ
  456.         Write_W5500_SOCK_1Byte(0,Sn_CR,OPEN);//´ò¿ªSocket        
  457.         HAL_Delay(5);//ÑÓʱ5ms         
  458.         
  459.         if(Read_W5500_SOCK_1Byte(0,Sn_SR) != SOCK_INIT)//Èç¹ûsocket´ò¿ªÊ§°Ü
  460.         {
  461.                 Write_W5500_SOCK_1Byte(0,Sn_CR,CLOSE);//´ò¿ª²»³É¹¦,¹Ø±ÕSocket
  462.                 return FALSE;//·µ»ØFALSE(0x00)
  463.         }

  464.         Write_W5500_SOCK_1Byte(0,Sn_CR,CONNECT);//ÉèÖÃSocketΪConnectģʽ                                                

  465.         do
  466.         {
  467.                 unsigned char j=0;
  468.                 j=Read_W5500_SOCK_1Byte(0,Sn_IR);//¶ÁÈ¡Socket0ÖжϱêÖ¾¼Ä´æÆ÷
  469.                 if(j!=0)
  470.                 Write_W5500_SOCK_1Byte(0,Sn_IR,j);
  471.                 HAL_Delay(5);//ÑÓʱ5ms
  472.                 if((j&IR_TIMEOUT) == IR_TIMEOUT)
  473.                 {
  474.                         return FALSE;        
  475.                 }
  476.                 else if(Read_W5500_SOCK_1Byte(0,Sn_DHAR) != 0xff)
  477.                 {
  478.                         Write_W5500_SOCK_1Byte(0,Sn_CR,CLOSE);//¹Ø±ÕSocket
  479.                         return TRUE;                                                        
  480.                 }
  481.         }while(1);
  482. }

  483. /*******************************************************************************
  484. * º¯ÊýÃû  : Socket_Init
  485. * ÃèÊö    : Ö¸¶¨Socket(0~7)³õʼ»¯
  486. * ÊäÈë    : s:´ý³õʼ»¯µÄ¶Ë¿Ú
  487. * Êä³ö    : ÎÞ
  488. * ·µ»ØÖµ  : ÎÞ
  489. * ˵Ã÷    : ÎÞ
  490. *******************************************************************************/
  491. void Socket_Init(SOCKET s)
  492. {
  493.         //ÉèÖÃ·ÖÆ¬³¤¶È£¬²Î¿¼W5500Êý¾ÝÊֲᣬ¸ÃÖµ¿ÉÒÔ²»Ð޸Ġ       
  494.         Write_W5500_SOCK_2Byte(0, Sn_MSSR, 30);//×î´ó·ÖƬ×Ö½ÚÊý=30(0x001e)
  495.         //ÉèÖÃÖ¸¶¨¶Ë¿Ú
  496.         switch(s)
  497.         {
  498.                 case 0:
  499.                         //ÉèÖö˿Ú0µÄ¶Ë¿ÚºÅ
  500.                         Write_W5500_SOCK_2Byte(0, Sn_PORT, S0_Port[0]*256+S0_Port[1]);        
  501.                         
  502.                         break;

  503.                 case 1:
  504.                         break;

  505.                 case 2:
  506.                         break;

  507.                 case 3:
  508.                         break;

  509.                 case 4:
  510.                         break;

  511.                 case 5:
  512.                         break;

  513.                 case 6:
  514.                         break;

  515.                 case 7:
  516.                         break;

  517.                 default:
  518.                         break;
  519.         }
  520. }

  521. /*******************************************************************************
  522. * º¯ÊýÃû  : Socket_Connect
  523. * ÃèÊö    : ÉèÖÃÖ¸¶¨Socket(0~7)Ϊ¿Í»§¶ËÓëÔ¶³Ì·þÎñÆ÷Á¬½Ó
  524. * ÊäÈë    : s:´ýÉ趨µÄ¶Ë¿Ú
  525. * Êä³ö    : ÎÞ
  526. * ·µ»ØÖµ  : ³É¹¦·µ»ØTRUE(0xFF),ʧ°Ü·µ»ØFALSE(0x00)
  527. * ˵Ã÷    : µ±±¾»úSocket¹¤×÷ÔÚ¿Í»§¶Ëģʽʱ,ÒýÓøóÌÐò,ÓëÔ¶³Ì·þÎñÆ÷½¨Á¢Á¬½Ó
  528. *                        Èç¹ûÆô¶¯Á¬½Óºó³öÏÖ³¬Ê±Öжϣ¬ÔòÓë·þÎñÆ÷Á¬½Óʧ°Ü,ÐèÒªÖØÐµ÷ÓøóÌÐòÁ¬½Ó
  529. *                        ¸Ã³ÌÐòÿµ÷ÓÃÒ»´Î,¾ÍÓë·þÎñÆ÷²úÉúÒ»´ÎÁ¬½Ó
  530. *******************************************************************************/
  531. unsigned char Socket_Connect(SOCKET s)
  532. {
  533.         Write_W5500_SOCK_1Byte(s,Sn_MR,MR_TCP);//ÉèÖÃsocketΪTCPģʽ
  534.         Write_W5500_SOCK_1Byte(s,Sn_CR,OPEN);//´ò¿ªSocket
  535.         HAL_Delay(5);//ÑÓʱ5ms
  536.         if(Read_W5500_SOCK_1Byte(s,Sn_SR)!=SOCK_INIT)//Èç¹ûsocket´ò¿ªÊ§°Ü
  537.         {
  538.                 Write_W5500_SOCK_1Byte(s,Sn_CR,CLOSE);//´ò¿ª²»³É¹¦,¹Ø±ÕSocket
  539.                 return FALSE;//·µ»ØFALSE(0x00)
  540.         }
  541.         Write_W5500_SOCK_1Byte(s,Sn_CR,CONNECT);//ÉèÖÃSocketΪConnectģʽ
  542.         return TRUE;//·µ»ØTRUE,ÉèÖóɹ¦
  543. }

  544. /*******************************************************************************
  545. * º¯ÊýÃû  : Socket_Listen
  546. * ÃèÊö    : ÉèÖÃÖ¸¶¨Socket(0~7)×÷Ϊ·þÎñÆ÷µÈ´ýÔ¶³ÌÖ÷»úµÄÁ¬½Ó
  547. * ÊäÈë    : s:´ýÉ趨µÄ¶Ë¿Ú
  548. * Êä³ö    : ÎÞ
  549. * ·µ»ØÖµ  : ³É¹¦·µ»ØTRUE(0xFF),ʧ°Ü·µ»ØFALSE(0x00)
  550. * ˵Ã÷    : µ±±¾»úSocket¹¤×÷ÔÚ·þÎñÆ÷ģʽʱ,ÒýÓøóÌÐò,µÈµÈÔ¶³ÌÖ÷»úµÄÁ¬½Ó
  551. *                        ¸Ã³ÌÐòÖ»µ÷ÓÃÒ»´Î,¾ÍʹW5500ÉèÖÃΪ·þÎñÆ÷ģʽ
  552. *******************************************************************************/
  553. unsigned char Socket_Listen(SOCKET s)
  554. {
  555.         Write_W5500_SOCK_1Byte(s,Sn_MR,MR_TCP);//ÉèÖÃsocketΪTCPģʽ
  556.         Write_W5500_SOCK_1Byte(s,Sn_CR,OPEN);//´ò¿ªSocket        
  557.         HAL_Delay(5);//ÑÓʱ5ms
  558.         if(Read_W5500_SOCK_1Byte(s,Sn_SR)!=SOCK_INIT)//Èç¹ûsocket´ò¿ªÊ§°Ü
  559.         {
  560.                 Write_W5500_SOCK_1Byte(s,Sn_CR,CLOSE);//´ò¿ª²»³É¹¦,¹Ø±ÕSocket
  561.                 return FALSE;//·µ»ØFALSE(0x00)
  562.         }        
  563.         Write_W5500_SOCK_1Byte(s,Sn_CR,LISTEN);//ÉèÖÃSocketΪÕìÌýģʽ        
  564.         HAL_Delay(5);//ÑÓʱ5ms
  565.         if(Read_W5500_SOCK_1Byte(s,Sn_SR)!=SOCK_LISTEN)//Èç¹ûsocketÉèÖÃʧ°Ü
  566.         {
  567.                 Write_W5500_SOCK_1Byte(s,Sn_CR,CLOSE);//ÉèÖò»³É¹¦,¹Ø±ÕSocket
  568.                 return FALSE;//·µ»ØFALSE(0x00)
  569.         }

  570.         return TRUE;

  571.         //ÖÁ´ËÍê³ÉÁËSocketµÄ´ò¿ªºÍÉèÖÃÕìÌý¹¤×÷,ÖÁÓÚÔ¶³Ì¿Í»§¶ËÊÇ·ñÓëËü½¨Á¢Á¬½Ó,ÔòÐèÒªµÈ´ýSocketÖжϣ¬
  572.         //ÒÔÅжÏSocketµÄÁ¬½ÓÊÇ·ñ³É¹¦¡£²Î¿¼W5500Êý¾ÝÊÖ²áµÄSocketÖжÏ״̬
  573.         //ÔÚ·þÎñÆ÷ÕìÌýģʽ²»ÐèÒªÉèÖÃÄ¿µÄIPºÍÄ¿µÄ¶Ë¿ÚºÅ
  574. }

  575. /*******************************************************************************
  576. * º¯ÊýÃû  : Socket_UDP
  577. * ÃèÊö    : ÉèÖÃÖ¸¶¨Socket(0~7)ΪUDPģʽ
  578. * ÊäÈë    : s:´ýÉ趨µÄ¶Ë¿Ú
  579. * Êä³ö    : ÎÞ
  580. * ·µ»ØÖµ  : ³É¹¦·µ»ØTRUE(0xFF),ʧ°Ü·µ»ØFALSE(0x00)
  581. * ˵Ã÷    : Èç¹ûSocket¹¤×÷ÔÚUDPģʽ,ÒýÓøóÌÐò,ÔÚUDPģʽÏÂ,SocketͨÐŲ»ÐèÒª½¨Á¢Á¬½Ó
  582. *                        ¸Ã³ÌÐòÖ»µ÷ÓÃÒ»´Î£¬¾ÍʹW5500ÉèÖÃΪUDPģʽ
  583. *******************************************************************************/
  584. unsigned char Socket_UDP(SOCKET s)
  585. {
  586.         Write_W5500_SOCK_1Byte(s,Sn_MR,MR_UDP);//ÉèÖÃSocketΪUDPģʽ*/
  587.         Write_W5500_SOCK_1Byte(s,Sn_CR,OPEN);//´ò¿ªSocket*/
  588.         Delay(5);//ÑÓʱ5ms
  589.         if(Read_W5500_SOCK_1Byte(s,Sn_SR)!=SOCK_UDP)//Èç¹ûSocket´ò¿ªÊ§°Ü
  590.         {
  591.                 Write_W5500_SOCK_1Byte(s,Sn_CR,CLOSE);//´ò¿ª²»³É¹¦,¹Ø±ÕSocket
  592.                 return FALSE;//·µ»ØFALSE(0x00)
  593.         }
  594.         else
  595.                 return TRUE;

  596.         //ÖÁ´ËÍê³ÉÁËSocketµÄ´ò¿ªºÍUDPģʽÉèÖÃ,ÔÚÕâÖÖģʽÏÂËü²»ÐèÒªÓëÔ¶³ÌÖ÷»ú½¨Á¢Á¬½Ó
  597.         //ÒòΪSocket²»ÐèÒª½¨Á¢Á¬½Ó,ËùÒÔÔÚ·¢ËÍÊý¾Ýǰ¶¼¿ÉÒÔÉèÖÃÄ¿µÄÖ÷»úIPºÍÄ¿µÄSocketµÄ¶Ë¿ÚºÅ
  598.         //Èç¹ûÄ¿µÄÖ÷»úIPºÍÄ¿µÄSocketµÄ¶Ë¿ÚºÅÊǹ̶¨µÄ,ÔÚÔËÐйý³ÌÖÐûÓиıä,ÄÇôҲ¿ÉÒÔÔÚÕâÀïÉèÖÃ
  599. }

  600. /*******************************************************************************
  601. * º¯ÊýÃû  : W5500_Interrupt_Process
  602. * ÃèÊö    : W5500Öжϴ¦Àí³ÌÐò¿ò¼Ü
  603. * ÊäÈë    : ÎÞ
  604. * Êä³ö    : ÎÞ
  605. * ·µ»ØÖµ  : ÎÞ
  606. * ˵Ã÷    : ÎÞ
  607. *******************************************************************************/
  608. void W5500_Interrupt_Process(void)
  609. {
  610.         unsigned char i,j;

  611. IntDispose:

  612.         i=Read_W5500_1Byte(SIR);//¶ÁÈ¡¶Ë¿ÚÖжϱêÖ¾¼Ä´æÆ÷        
  613.         if((i & S0_INT) == S0_INT)//Socket0ʼþ´¦Àí
  614.         {
  615.                 j=Read_W5500_SOCK_1Byte(0,Sn_IR);//¶ÁÈ¡Socket0ÖжϱêÖ¾¼Ä´æÆ÷
  616.                 Write_W5500_SOCK_1Byte(0,Sn_IR,j);
  617.                 if(j&IR_CON)//ÔÚTCPģʽÏÂ,Socket0³É¹¦Á¬½Ó
  618.                 {
  619.                         S0_State|=S_CONN;//ÍøÂçÁ¬½Ó״̬0x02,¶Ë¿ÚÍê³ÉÁ¬½Ó£¬¿ÉÒÔÕý³£´«ÊäÊý¾Ý
  620.                 }
  621.                 if(j&IR_DISCON)//ÔÚTCPģʽÏÂSocket¶Ï¿ªÁ¬½Ó´¦Àí
  622.                 {
  623.                         Write_W5500_SOCK_1Byte(0,Sn_CR,CLOSE);//¹Ø±Õ¶Ë¿Ú,µÈ´ýÖØÐ´ò¿ªÁ¬½Ó
  624.                         Socket_Init(0);                //Ö¸¶¨Socket(0~7)³õʼ»¯,³õʼ»¯¶Ë¿Ú0
  625.                         S0_State=0;//ÍøÂçÁ¬½Ó״̬0x00,¶Ë¿ÚÁ¬½Óʧ°Ü
  626.                 }
  627.                 if(j&IR_SEND_OK)//Socket0Êý¾Ý·¢ËÍÍê³É,¿ÉÒÔÔÙ´ÎÆô¶¯S_tx_process()º¯Êý·¢ËÍÊý¾Ý
  628.                 {
  629.                         S0_Data|=S_TRANSMITOK;//¶Ë¿Ú·¢ËÍÒ»¸öÊý¾Ý°üÍê³É
  630.                 }
  631.                 if(j&IR_RECV)//Socket½ÓÊÕµ½Êý¾Ý,¿ÉÒÔÆô¶¯S_rx_process()º¯Êý
  632.                 {
  633.                         S0_Data|=S_RECEIVE;//¶Ë¿Ú½ÓÊÕµ½Ò»¸öÊý¾Ý°ü
  634.                 }
  635.                 if(j&IR_TIMEOUT)//SocketÁ¬½Ó»òÊý¾Ý´«Ê䳬ʱ´¦Àí
  636.                 {
  637.                         Write_W5500_SOCK_1Byte(0,Sn_CR,CLOSE);// ¹Ø±Õ¶Ë¿Ú,µÈ´ýÖØÐ´ò¿ªÁ¬½Ó                        
  638.                         S0_State=0;//ÍøÂçÁ¬½Ó״̬0x00,¶Ë¿ÚÁ¬½Óʧ°Ü
  639.                 }
  640.         }

  641.         if(Read_W5500_1Byte(SIR) != 0)
  642.                 goto IntDispose;
  643. }

效果图: 0.jpg 1.jpg
2.jpg 3.jpg
4.jpg
  

评论

@forgot :没有办法,在keil里显示正常,贴上就变了  发表于 2023-3-15 10:09
你这代码注释变成天书了  发表于 2023-3-15 08:45
lulugl 发表于 2023-3-13 15:50 | 显示全部楼层
哇,跑起来了,看来不错哦,花了很多时间调试吧。
 楼主| 比神乐 发表于 2023-3-13 15:56 | 显示全部楼层
lulugl 发表于 2023-3-13 15:50
哇,跑起来了,看来不错哦,花了很多时间调试吧。

是啊,硬件SPI怎么都搞不好,只能模拟时序了。
lulugl 发表于 2023-3-13 16:53 | 显示全部楼层
比神乐 发表于 2023-3-13 15:56
是啊,硬件SPI怎么都搞不好,只能模拟时序了。

大佬,板载有个stlinkV3你怎么还附加了一个呀。
 楼主| 比神乐 发表于 2023-3-13 18:46 | 显示全部楼层
lulugl 发表于 2023-3-13 16:53
大佬,板载有个stlinkV3你怎么还附加了一个呀。

我看工程里T调试工具没有STLINK呀?难道要装STLINK3的驱动吗?谢谢
 楼主| 比神乐 发表于 2023-3-13 21:04 | 显示全部楼层
lulugl 发表于 2023-3-13 16:53
大佬,板载有个stlinkV3你怎么还附加了一个呀。

在keil里面好像用不成STLINKV3
lulugl 发表于 2023-3-14 08:01 | 显示全部楼层
可以呀,我一直在用,速度比V2快吧。
 楼主| 比神乐 发表于 2023-3-14 08:57 | 显示全部楼层
lulugl 发表于 2023-3-14 08:01
可以呀,我一直在用,速度比V2快吧。

我的意思是说,板子上的那个STLINK3不能用吧?我插上一点反应都没有。
lulugl 发表于 2023-3-14 10:41 | 显示全部楼层
那可以换一块板子了。
 楼主| 比神乐 发表于 2023-3-14 11:22 | 显示全部楼层
lulugl 发表于 2023-3-14 10:41
那可以换一块板子了。

我上哪换去?再买一块吗?凑活用吧
朝生 发表于 2023-3-14 13:32 | 显示全部楼层
【用模拟时序没搞成功,只好模拟时序。】最后用的是模拟时序?
 楼主| 比神乐 发表于 2023-3-15 10:08 | 显示全部楼层
朝生 发表于 2023-3-14 13:32
【用模拟时序没搞成功,只好模拟时序。】最后用的是模拟时序?

多谢提醒。用硬件SPI没搞成功,已经在帖子里改过来了。
adolphcocker 发表于 2023-5-10 22:05 | 显示全部楼层
串口转以太网之后怎样建立tcp连接?
 楼主| 比神乐 发表于 2023-5-10 22:10 | 显示全部楼层
adolphcocker 发表于 2023-5-10 22:05
串口转以太网之后怎样建立tcp连接?

是SPI接口
maqianqu 发表于 2023-5-10 22:17 | 显示全部楼层
上位机与单片机网口TCP通信连接失败怎么办?
janewood 发表于 2023-5-11 21:21 | 显示全部楼层
怎样在NUCLEO-U575ZI-Q建立一个TCP服务器
primojones 发表于 2023-5-13 10:43 | 显示全部楼层
局域网TCP服务器,需要外网能访问,怎么做?
 楼主| 比神乐 发表于 2023-5-13 11:43 | 显示全部楼层
janewood 发表于 2023-5-11 21:21
怎样在NUCLEO-U575ZI-Q建立一个TCP服务器

网上好多例程
 楼主| 比神乐 发表于 2023-5-13 11:44 | 显示全部楼层
primojones 发表于 2023-5-13 10:43
局域网TCP服务器,需要外网能访问,怎么做?

不清楚
youtome 发表于 2023-5-13 12:58 | 显示全部楼层
TCP端口和UDP端口都是什么意思?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

470

主题

3537

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部