久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2980|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

STM32溫濕度傳感器檢測,W5500以太網(wǎng)發(fā)送程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:316613 發(fā)表于 2021-7-25 14:49 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. /**********************************************************************************
  2. * 文件名  :W5500.c
  3. * 描述    :W5500 驅(qū)動函數(shù)庫         
  4. * 庫版本  :ST_v3.5
  5. **********************************************************************************/

  6. #include "stm32f10x.h"
  7. #include "stm32f10x_spi.h"                                
  8. #include "W5500.h"        
  9. #include "delay.h"
  10. /***************----- 網(wǎng)絡(luò)參數(shù)變量定義 -----***************/
  11. unsigned char Gateway_IP[4];//網(wǎng)關(guān)IP地址
  12. unsigned char Sub_Mask[4];        //子網(wǎng)掩碼
  13. unsigned char Phy_Addr[6];        //物理地址(MAC)
  14. unsigned char IP_Addr[4];        //本機IP地址

  15. unsigned char S0_Port[2];        //端口0的端口號(5000)
  16. unsigned char S0_DIP[4];        //端口0目的IP地址
  17. unsigned char S0_DPort[2];        //端口0目的端口號(6000)

  18. unsigned char UDP_DIPR[4];        //UDP(廣播)模式,目的主機IP地址
  19. unsigned char UDP_DPORT[2];        //UDP(廣播)模式,目的主機端口號

  20. /***************----- 端口的運行模式 -----***************/
  21. unsigned char S0_Mode =3;        //端口0的運行模式,0:TCP服務(wù)器模式,1:TCP客戶端模式,2:UDP(廣播)模式
  22. #define TCP_SERVER        0x00        //TCP服務(wù)器模式
  23. #define TCP_CLIENT        0x01        //TCP客戶端模式
  24. #define UDP_MODE        0x02        //UDP(廣播)模式

  25. /***************----- 端口的運行狀態(tài) -----***************/
  26. unsigned char S0_State =0;        //端口0狀態(tài)記錄,1:端口完成初始化,2端口完成連接(可以正常傳輸數(shù)據(jù))
  27. #define S_INIT                0x01        //端口完成初始化
  28. #define S_CONN                0x02        //端口完成連接,可以正常傳輸數(shù)據(jù)

  29. /***************----- 端口收發(fā)數(shù)據(jù)的狀態(tài) -----***************/
  30. unsigned char S0_Data;                //端口0接收和發(fā)送數(shù)據(jù)的狀態(tài),1:端口接收到數(shù)據(jù),2:端口發(fā)送數(shù)據(jù)完成
  31. #define S_RECEIVE         0x01        //端口接收到一個數(shù)據(jù)包
  32. #define S_TRANSMITOK 0x02        //端口發(fā)送一個數(shù)據(jù)包完成

  33. /***************----- 端口數(shù)據(jù)緩沖區(qū) -----***************/
  34. unsigned char Rx_Buffer[2048];        //端口接收數(shù)據(jù)緩沖區(qū)
  35. unsigned char Tx_Buffer[2048];        //端口發(fā)送數(shù)據(jù)緩沖區(qū)

  36. unsigned char W5500_Interrupt;        //W5500中斷標(biāo)志(0:無中斷,1:有中斷)

  37. /*******************************************************************************
  38. * 函數(shù)名  : W5500_GPIO_Configuration
  39. * 描述    : W5500 GPIO初始化配置
  40. * 輸入    : 無
  41. * 輸出    : 無
  42. * 返回值  : 無
  43. * 說明    : 無
  44. *******************************************************************************/
  45. void W5500_GPIO_Configuration(void)
  46. {
  47.         GPIO_InitTypeDef  GPIO_InitStructure;
  48.         EXTI_InitTypeDef  EXTI_InitStructure;        

  49.         /* W5500_RST引腳初始化配置(PC5) */
  50.         GPIO_InitStructure.GPIO_Pin  = W5500_RST;                                   //pin 5
  51.         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;                        //速率10MHZ
  52.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                //推挽輸出
  53.         GPIO_Init(W5500_RST_PORT, &GPIO_InitStructure);                        //PC
  54.         GPIO_ResetBits(W5500_RST_PORT, W5500_RST);                                   //默認(rèn)PC5置低                        
  55.         
  56.         /* W5500_INT引腳初始化配置(PC4) */        
  57.         GPIO_InitStructure.GPIO_Pin = W5500_INT;
  58.         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  59.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  60.         GPIO_Init(W5500_INT_PORT, &GPIO_InitStructure);
  61.                
  62.         /* Connect EXTI Line4 to PC4 */
  63.         GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource4);

  64.         /* PC4 as W5500 interrupt input */
  65.         EXTI_InitStructure.EXTI_Line = EXTI_Line4;
  66.         EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  67.         EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  68.         EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  69.         EXTI_Init(&EXTI_InitStructure);
  70. }

  71. /*******************************************************************************
  72. * 函數(shù)名  : W5500_NVIC_Configuration
  73. * 描述    : W5500 接收引腳中斷優(yōu)先級設(shè)置
  74. * 輸入    : 無
  75. * 輸出    : 無
  76. * 返回值  : 無
  77. * 說明    : 無
  78. *******************************************************************************/
  79. void W5500_NVIC_Configuration(void)
  80. {
  81.           NVIC_InitTypeDef NVIC_InitStructure;

  82.         /* Enable the EXTI4 Interrupt */
  83.         NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;
  84.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  85.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  86.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  87.         NVIC_Init(&NVIC_InitStructure);
  88. }

  89. /*******************************************************************************
  90. * 函數(shù)名  : EXTI4_IRQHandler
  91. * 描述    : 中斷線4中斷服務(wù)函數(shù)(W5500 INT引腳中斷服務(wù)函數(shù))
  92. * 輸入    : 無
  93. * 輸出    : 無
  94. * 返回值  : 無
  95. * 說明    : 無
  96. *******************************************************************************/
  97. void EXTI4_IRQHandler(void)
  98. {
  99.         if(EXTI_GetITStatus(EXTI_Line4) != RESET)
  100.         {
  101.                 EXTI_ClearITPendingBit(EXTI_Line4);
  102.                 W5500_Interrupt=1;
  103.         }
  104. }

  105. /*******************************************************************************
  106. * 函數(shù)名  : SPI_Configuration
  107. * 描述    : W5500 SPI初始化配置(STM32 SPI1)
  108. * 輸入    : 無
  109. * 輸出    : 無
  110. * 返回值  : 無
  111. * 說明    : 無
  112. *******************************************************************************/
  113. void SPI_Configuration(void)
  114. {
  115.         GPIO_InitTypeDef         GPIO_InitStructure;
  116.         SPI_InitTypeDef           SPI_InitStructure;           

  117.           RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_SPI1 | RCC_APB2Periph_AFIO, ENABLE);        

  118.         /* 初始化SCK、MISO、MOSI引腳 */
  119.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
  120.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  121.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //復(fù)用推挽   PA5,6,7
  122.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  123.         GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);

  124.         /* 初始化CS引腳 */
  125.         GPIO_InitStructure.GPIO_Pin = W5500_SCS;
  126.         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  127.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
  128.         GPIO_Init(W5500_SCS_PORT, &GPIO_InitStructure);
  129.         GPIO_SetBits(W5500_SCS_PORT, W5500_SCS);

  130.         /* 初始化配置STM32 SPI1 */
  131.         SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;        //SPI設(shè)置為雙線雙向全雙工
  132.         SPI_InitStructure.SPI_Mode=SPI_Mode_Master;                                                        //設(shè)置為主SPI
  133.         SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;                                                //SPI發(fā)送接收8位幀結(jié)構(gòu)
  134.         SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low;                                                        //時鐘懸空低
  135.         SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge;                                                        //數(shù)據(jù)捕獲于第1個時鐘沿
  136.         SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;                                                                //NSS由外部管腳管理
  137.         SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_2;        //波特率預(yù)分頻值為2
  138.         SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;                                        //數(shù)據(jù)傳輸從MSB位開始
  139.         SPI_InitStructure.SPI_CRCPolynomial=7;                                                                //CRC多項式為7
  140.         SPI_Init(SPI1,&SPI_InitStructure);                                                                        //根據(jù)SPI_InitStruct中指定的參數(shù)初始化外設(shè)SPI1寄存器

  141.         SPI_Cmd(SPI1,ENABLE);        //STM32使能SPI1
  142. }

  143. /*******************************************************************************
  144. * 函數(shù)名  : SPI1_Send_Byte
  145. * 描述    : SPI1發(fā)送1個字節(jié)數(shù)據(jù)
  146. * 輸入    : dat:待發(fā)送的數(shù)據(jù)
  147. * 輸出    : 無
  148. * 返回值  : 無
  149. * 說明    : 無
  150. *******************************************************************************/
  151. void SPI1_Send_Byte(unsigned char dat)
  152. {
  153.         SPI_I2S_SendData(SPI1,dat);//寫1個字節(jié)數(shù)據(jù)
  154.         while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);//等待數(shù)據(jù)寄存器空
  155. }

  156. /*******************************************************************************
  157. * 函數(shù)名  : SPI1_Send_Short
  158. * 描述    : SPI1發(fā)送2個字節(jié)數(shù)據(jù)(16位)
  159. * 輸入    : dat:待發(fā)送的16位數(shù)據(jù)
  160. * 輸出    : 無
  161. * 返回值  : 無
  162. * 說明    : 無
  163. *******************************************************************************/
  164. void SPI1_Send_Short(unsigned short dat)
  165. {
  166.         SPI1_Send_Byte(dat/256);//寫數(shù)據(jù)高位
  167.         SPI1_Send_Byte(dat);        //寫數(shù)據(jù)低位
  168. }

  169. /*******************************************************************************
  170. * 函數(shù)名  : Write_W5500_1Byte
  171. * 描述    : 通過SPI1向指定地址寄存器寫1個字節(jié)數(shù)據(jù)
  172. * 輸入    : reg:16位寄存器地址,dat:待寫入的數(shù)據(jù)
  173. * 輸出    : 無
  174. * 返回值  : 無
  175. * 說明    : 無
  176. *******************************************************************************/
  177. void Write_W5500_1Byte(unsigned short reg, unsigned char dat)
  178. {
  179.         GPIO_ResetBits(W5500_SCS_PORT, W5500_SCS);//置W5500的SCS為低電平 PA4

  180.         SPI1_Send_Short(reg);//通過SPI1寫16位寄存器地址
  181.         SPI1_Send_Byte(FDM1|RWB_WRITE|COMMON_R);//通過SPI1寫控制字節(jié),1個字節(jié)數(shù)據(jù)長度,寫數(shù)據(jù),選擇通用寄存器
  182.         SPI1_Send_Byte(dat);//寫1個字節(jié)數(shù)據(jù)

  183.         GPIO_SetBits(W5500_SCS_PORT, W5500_SCS); //置W5500的SCS為高電平
  184. }

  185. /*******************************************************************************
  186. * 函數(shù)名  : Write_W5500_2Byte
  187. * 描述    : 通過SPI1向指定地址寄存器寫2個字節(jié)數(shù)據(jù)
  188. * 輸入    : reg:16位寄存器地址,dat:16位待寫入的數(shù)據(jù)(2個字節(jié))
  189. * 輸出    : 無
  190. * 返回值  : 無
  191. * 說明    : 無
  192. *******************************************************************************/
  193. void Write_W5500_2Byte(unsigned short reg, unsigned short dat)
  194. {
  195.         GPIO_ResetBits(W5500_SCS_PORT, W5500_SCS);//置W5500的SCS為低電平
  196.                
  197.         SPI1_Send_Short(reg);//通過SPI1寫16位寄存器地址
  198.         SPI1_Send_Byte(FDM2|RWB_WRITE|COMMON_R);//通過SPI1寫控制字節(jié),2個字節(jié)數(shù)據(jù)長度,寫數(shù)據(jù),選擇通用寄存器
  199.         SPI1_Send_Short(dat);//寫16位數(shù)據(jù)

  200.         GPIO_SetBits(W5500_SCS_PORT, W5500_SCS); //置W5500的SCS為高電平
  201. }

  202. /*******************************************************************************
  203. * 函數(shù)名  : Write_W5500_nByte
  204. * 描述    : 通過SPI1向指定地址寄存器寫n個字節(jié)數(shù)據(jù)
  205. * 輸入    : reg:16位寄存器地址,*dat_ptr:待寫入數(shù)據(jù)緩沖區(qū)指針,size:待寫入的數(shù)據(jù)長度
  206. * 輸出    : 無
  207. * 返回值  : 無
  208. * 說明    : 無
  209. *******************************************************************************/
  210. void Write_W5500_nByte(unsigned short reg, unsigned char *dat_ptr, unsigned short size)
  211. {
  212.         unsigned short i;

  213.         GPIO_ResetBits(W5500_SCS_PORT, W5500_SCS);//置W5500的SCS為低電平        
  214.                
  215.         SPI1_Send_Short(reg);//通過SPI1寫16位寄存器地址
  216.         SPI1_Send_Byte(VDM|RWB_WRITE|COMMON_R);//通過SPI1寫控制字節(jié),N個字節(jié)數(shù)據(jù)長度,寫數(shù)據(jù),選擇通用寄存器

  217.         for(i=0;i<size;i++)//循環(huán)將緩沖區(qū)的size個字節(jié)數(shù)據(jù)寫入W5500
  218.         {
  219.                 SPI1_Send_Byte(*dat_ptr++);//寫一個字節(jié)數(shù)據(jù)
  220.         }

  221.         GPIO_SetBits(W5500_SCS_PORT, W5500_SCS); //置W5500的SCS為高電平
  222. }

  223. /*******************************************************************************
  224. * 函數(shù)名  : Write_W5500_SOCK_1Byte
  225. * 描述    : 通過SPI1向指定端口寄存器寫1個字節(jié)數(shù)據(jù)
  226. * 輸入    : s:端口號,reg:16位寄存器地址,dat:待寫入的數(shù)據(jù)
  227. * 輸出    : 無
  228. * 返回值  : 無
  229. * 說明    : 無
  230. *******************************************************************************/
  231. void Write_W5500_SOCK_1Byte(SOCKET s, unsigned short reg, unsigned char dat)
  232. {
  233.         GPIO_ResetBits(W5500_SCS_PORT, W5500_SCS);//置W5500的SCS為低電平        
  234.                
  235.         SPI1_Send_Short(reg);//通過SPI1寫16位寄存器地址
  236.         SPI1_Send_Byte(FDM1|RWB_WRITE|(s*0x20+0x08));//通過SPI1寫控制字節(jié),1個字節(jié)數(shù)據(jù)長度,寫數(shù)據(jù),選擇端口s的寄存器
  237.         SPI1_Send_Byte(dat);//寫1個字節(jié)數(shù)據(jù)

  238.         GPIO_SetBits(W5500_SCS_PORT, W5500_SCS); //置W5500的SCS為高電平
  239. }

  240. /*******************************************************************************
  241. * 函數(shù)名  : Write_W5500_SOCK_2Byte
  242. * 描述    : 通過SPI1向指定端口寄存器寫2個字節(jié)數(shù)據(jù)
  243. * 輸入    : s:端口號,reg:16位寄存器地址,dat:16位待寫入的數(shù)據(jù)(2個字節(jié))
  244. * 輸出    : 無
  245. * 返回值  : 無
  246. * 說明    : 無
  247. *******************************************************************************/
  248. void Write_W5500_SOCK_2Byte(SOCKET s, unsigned short reg, unsigned short dat)
  249. {
  250.         GPIO_ResetBits(W5500_SCS_PORT, W5500_SCS);//置W5500的SCS為低電平
  251.                         
  252.         SPI1_Send_Short(reg);//通過SPI1寫16位寄存器地址
  253.         SPI1_Send_Byte(FDM2|RWB_WRITE|(s*0x20+0x08));//通過SPI1寫控制字節(jié),2個字節(jié)數(shù)據(jù)長度,寫數(shù)據(jù),選擇端口s的寄存器
  254.         SPI1_Send_Short(dat);//寫16位數(shù)據(jù)

  255.         GPIO_SetBits(W5500_SCS_PORT, W5500_SCS); //置W5500的SCS為高電平
  256. }

  257. /*******************************************************************************
  258. * 函數(shù)名  : Write_W5500_SOCK_4Byte
  259. * 描述    : 通過SPI1向指定端口寄存器寫4個字節(jié)數(shù)據(jù)
  260. * 輸入    : s:端口號,reg:16位寄存器地址,*dat_ptr:待寫入的4個字節(jié)緩沖區(qū)指針
  261. * 輸出    : 無
  262. * 返回值  : 無
  263. * 說明    : 無
  264. *******************************************************************************/
  265. void Write_W5500_SOCK_4Byte(SOCKET s, unsigned short reg, unsigned char *dat_ptr)
  266. {
  267.         GPIO_ResetBits(W5500_SCS_PORT, W5500_SCS);//置W5500的SCS為低電平
  268.                         
  269.         SPI1_Send_Short(reg);//通過SPI1寫16位寄存器地址
  270.         SPI1_Send_Byte(FDM4|RWB_WRITE|(s*0x20+0x08));//通過SPI1寫控制字節(jié),4個字節(jié)數(shù)據(jù)長度,寫數(shù)據(jù),選擇端口s的寄存器

  271.         SPI1_Send_Byte(*dat_ptr++);//寫第1個字節(jié)數(shù)據(jù)
  272.         SPI1_Send_Byte(*dat_ptr++);//寫第2個字節(jié)數(shù)據(jù)
  273.         SPI1_Send_Byte(*dat_ptr++);//寫第3個字節(jié)數(shù)據(jù)
  274.         SPI1_Send_Byte(*dat_ptr++);//寫第4個字節(jié)數(shù)據(jù)

  275.         GPIO_SetBits(W5500_SCS_PORT, W5500_SCS); //置W5500的SCS為高電平
  276. }

  277. /*******************************************************************************
  278. * 函數(shù)名  : Read_W5500_1Byte
  279. * 描述    : 讀W5500指定地址寄存器的1個字節(jié)數(shù)據(jù)
  280. * 輸入    : reg:16位寄存器地址
  281. * 輸出    : 無
  282. * 返回值  : 讀取到寄存器的1個字節(jié)數(shù)據(jù)
  283. * 說明    : 無
  284. *******************************************************************************/
  285. unsigned char Read_W5500_1Byte(unsigned short reg)
  286. {
  287.         unsigned char i;

  288.         GPIO_ResetBits(W5500_SCS_PORT, W5500_SCS);//置W5500的SCS為低電平
  289.                         
  290.         SPI1_Send_Short(reg);//通過SPI1寫16位寄存器地址
  291.         SPI1_Send_Byte(FDM1|RWB_READ|COMMON_R);//通過SPI1寫控制字節(jié),1個字節(jié)數(shù)據(jù)長度,讀數(shù)據(jù),選擇通用寄存器

  292.         i=SPI_I2S_ReceiveData(SPI1);
  293.         SPI1_Send_Byte(0x00);//發(fā)送一個啞數(shù)據(jù)
  294.         i=SPI_I2S_ReceiveData(SPI1);//讀取1個字節(jié)數(shù)據(jù)

  295.         GPIO_SetBits(W5500_SCS_PORT, W5500_SCS);//置W5500的SCS為高電平
  296.         return i;//返回讀取到的寄存器數(shù)據(jù)
  297. }

  298. /*******************************************************************************
  299. * 函數(shù)名  : Read_W5500_SOCK_1Byte
  300. * 描述    : 讀W5500指定端口寄存器的1個字節(jié)數(shù)據(jù)
  301. * 輸入    : s:端口號,reg:16位寄存器地址
  302. * 輸出    : 無
  303. * 返回值  : 讀取到寄存器的1個字節(jié)數(shù)據(jù)
  304. * 說明    : 無
  305. *******************************************************************************/
  306. unsigned char Read_W5500_SOCK_1Byte(SOCKET s, unsigned short reg)
  307. {
  308.         unsigned char i;

  309.         GPIO_ResetBits(W5500_SCS_PORT, W5500_SCS);//置W5500的SCS為低電平
  310.                         
  311.         SPI1_Send_Short(reg);//通過SPI1寫16位寄存器地址
  312.         SPI1_Send_Byte(FDM1|RWB_READ|(s*0x20+0x08));//通過SPI1寫控制字節(jié),1個字節(jié)數(shù)據(jù)長度,讀數(shù)據(jù),選擇端口s的寄存器

  313.         i=SPI_I2S_ReceiveData(SPI1);
  314.         SPI1_Send_Byte(0x00);//發(fā)送一個啞數(shù)據(jù)
  315.         i=SPI_I2S_ReceiveData(SPI1);//讀取1個字節(jié)數(shù)據(jù)

  316.         GPIO_SetBits(W5500_SCS_PORT, W5500_SCS);//置W5500的SCS為高電平
  317.         return i;//返回讀取到的寄存器數(shù)據(jù)
  318. }

  319. /*******************************************************************************
  320. * 函數(shù)名  : Read_W5500_SOCK_2Byte
  321. * 描述    : 讀W5500指定端口寄存器的2個字節(jié)數(shù)據(jù)
  322. * 輸入    : s:端口號,reg:16位寄存器地址
  323. * 輸出    : 無
  324. * 返回值  : 讀取到寄存器的2個字節(jié)數(shù)據(jù)(16位)
  325. * 說明    : 無
  326. *******************************************************************************/
  327. unsigned short Read_W5500_SOCK_2Byte(SOCKET s, unsigned short reg)
  328. {
  329.         unsigned short i;

  330.         GPIO_ResetBits(W5500_SCS_PORT, W5500_SCS);//置W5500的SCS為低電平
  331.                         
  332.         SPI1_Send_Short(reg);//通過SPI1寫16位寄存器地址
  333.         SPI1_Send_Byte(FDM2|RWB_READ|(s*0x20+0x08));//通過SPI1寫控制字節(jié),2個字節(jié)數(shù)據(jù)長度,讀數(shù)據(jù),選擇端口s的寄存器

  334.         i=SPI_I2S_ReceiveData(SPI1);
  335.         SPI1_Send_Byte(0x00);//發(fā)送一個啞數(shù)據(jù)
  336.         i=SPI_I2S_ReceiveData(SPI1);//讀取高位數(shù)據(jù)
  337.         SPI1_Send_Byte(0x00);//發(fā)送一個啞數(shù)據(jù)
  338.         i*=256;
  339.         i+=SPI_I2S_ReceiveData(SPI1);//讀取低位數(shù)據(jù)

  340.         GPIO_SetBits(W5500_SCS_PORT, W5500_SCS);//置W5500的SCS為高電平
  341.         return i;//返回讀取到的寄存器數(shù)據(jù)
  342. }

  343. /*******************************************************************************
  344. * 函數(shù)名  : Read_SOCK_Data_Buffer
  345. * 描述    : 從W5500接收數(shù)據(jù)緩沖區(qū)中讀取數(shù)據(jù)
  346. * 輸入    : s:端口號,*dat_ptr:數(shù)據(jù)保存緩沖區(qū)指針
  347. * 輸出    : 無
  348. * 返回值  : 讀取到的數(shù)據(jù)長度,rx_size個字節(jié)
  349. * 說明    : 無
  350. *******************************************************************************/
  351. unsigned short Read_SOCK_Data_Buffer(SOCKET s, unsigned char *dat_ptr)
  352. {
  353.         unsigned short rx_size;
  354.         unsigned short offset, offset1;
  355.         unsigned short i;
  356.         unsigned char j;

  357.         rx_size=Read_W5500_SOCK_2Byte(s,Sn_RX_RSR);
  358.         if(rx_size==0) return 0;//沒接收到數(shù)據(jù)則返回
  359.         if(rx_size>1460) rx_size=1460;

  360.         offset=Read_W5500_SOCK_2Byte(s,Sn_RX_RD);
  361.         offset1=offset;
  362.         offset&=(S_RX_SIZE-1);//計算實際的物理地址

  363.         GPIO_ResetBits(W5500_SCS_PORT, W5500_SCS);//置W5500的SCS為低電平

  364.         SPI1_Send_Short(offset);//寫16位地址
  365.         SPI1_Send_Byte(VDM|RWB_READ|(s*0x20+0x18));//寫控制字節(jié),N個字節(jié)數(shù)據(jù)長度,讀數(shù)據(jù),選擇端口s的寄存器
  366.         j=SPI_I2S_ReceiveData(SPI1);
  367.         
  368.         if((offset+rx_size)<S_RX_SIZE)//如果最大地址未超過W5500接收緩沖區(qū)寄存器的最大地址
  369.         {
  370.                 for(i=0;i<rx_size;i++)//循環(huán)讀取rx_size個字節(jié)數(shù)據(jù)
  371.                 {
  372.                         SPI1_Send_Byte(0x00);//發(fā)送一個啞數(shù)據(jù)
  373.                         j=SPI_I2S_ReceiveData(SPI1);//讀取1個字節(jié)數(shù)據(jù)
  374.                         *dat_ptr=j;//將讀取到的數(shù)據(jù)保存到數(shù)據(jù)保存緩沖區(qū)
  375.                         dat_ptr++;//數(shù)據(jù)保存緩沖區(qū)指針地址自增1
  376.                 }
  377.         }
  378.         else//如果最大地址超過W5500接收緩沖區(qū)寄存器的最大地址
  379.         {
  380.                 offset=S_RX_SIZE-offset;
  381.                 for(i=0;i<offset;i++)//循環(huán)讀取出前offset個字節(jié)數(shù)據(jù)
  382.                 {
  383.                         SPI1_Send_Byte(0x00);//發(fā)送一個啞數(shù)據(jù)
  384.                         j=SPI_I2S_ReceiveData(SPI1);//讀取1個字節(jié)數(shù)據(jù)
  385.                         *dat_ptr=j;//將讀取到的數(shù)據(jù)保存到數(shù)據(jù)保存緩沖區(qū)
  386.                         dat_ptr++;//數(shù)據(jù)保存緩沖區(qū)指針地址自增1
  387.                 }
  388.                 GPIO_SetBits(W5500_SCS_PORT, W5500_SCS); //置W5500的SCS為高電平

  389.                 GPIO_ResetBits(W5500_SCS_PORT, W5500_SCS);//置W5500的SCS為低電平

  390.                 SPI1_Send_Short(0x00);//寫16位地址
  391.                 SPI1_Send_Byte(VDM|RWB_READ|(s*0x20+0x18));//寫控制字節(jié),N個字節(jié)數(shù)據(jù)長度,讀數(shù)據(jù),選擇端口s的寄存器
  392.                 j=SPI_I2S_ReceiveData(SPI1);

  393.                 for(;i<rx_size;i++)//循環(huán)讀取后rx_size-offset個字節(jié)數(shù)據(jù)
  394.                 {
  395.                         SPI1_Send_Byte(0x00);//發(fā)送一個啞數(shù)據(jù)
  396.                         j=SPI_I2S_ReceiveData(SPI1);//讀取1個字節(jié)數(shù)據(jù)
  397.                         *dat_ptr=j;//將讀取到的數(shù)據(jù)保存到數(shù)據(jù)保存緩沖區(qū)
  398.                         dat_ptr++;//數(shù)據(jù)保存緩沖區(qū)指針地址自增1
  399.                 }
  400.         }
  401.         GPIO_SetBits(W5500_SCS_PORT, W5500_SCS); //置W5500的SCS為高電平

  402.         offset1+=rx_size;//更新實際物理地址,即下次讀取接收到的數(shù)據(jù)的起始地址
  403.         Write_W5500_SOCK_2Byte(s, Sn_RX_RD, offset1);
  404.         Write_W5500_SOCK_1Byte(s, Sn_CR, RECV);//發(fā)送啟動接收命令
  405.         return rx_size;//返回接收到數(shù)據(jù)的長度
  406. }

  407. /*******************************************************************************
  408. * 函數(shù)名  : Write_SOCK_Data_Buffer
  409. * 描述    : 將數(shù)據(jù)寫入W5500的數(shù)據(jù)發(fā)送緩沖區(qū)
  410. * 輸入    : s:端口號,*dat_ptr:數(shù)據(jù)保存緩沖區(qū)指針,size:待寫入數(shù)據(jù)的長度
  411. * 輸出    : 無
  412. * 返回值  : 無
  413. * 說明    : 無
  414. *******************************************************************************/
  415. void Write_SOCK_Data_Buffer(SOCKET s, unsigned char *dat_ptr, unsigned short size)
  416. {
  417.         unsigned short offset,offset1;
  418.         unsigned short i;

  419.         //如果是UDP模式,可以在此設(shè)置目的主機的IP和端口號
  420.         if((Read_W5500_SOCK_1Byte(s,Sn_MR)&0x0f) != SOCK_UDP)//如果Socket打開失敗
  421.         {               
  422.                 Write_W5500_SOCK_4Byte(s, Sn_DIPR, UDP_DIPR);//設(shè)置目的主機IP                  
  423.                 Write_W5500_SOCK_2Byte(s, Sn_DPORTR, UDP_DPORT[0]*256+UDP_DPORT[1]);//設(shè)置目的主機端口號                                
  424.         }

  425.         offset=Read_W5500_SOCK_2Byte(s,Sn_TX_WR);
  426.         offset1=offset;
  427.         offset&=(S_TX_SIZE-1);//計算實際的物理地址

  428.         GPIO_ResetBits(W5500_SCS_PORT, W5500_SCS);//置W5500的SCS為低電平

  429.         SPI1_Send_Short(offset);//寫16位地址
  430.         SPI1_Send_Byte(VDM|RWB_WRITE|(s*0x20+0x10));//寫控制字節(jié),N個字節(jié)數(shù)據(jù)長度,寫數(shù)據(jù),選擇端口s的寄存器

  431.         if((offset+size)<S_TX_SIZE)//如果最大地址未超過W5500發(fā)送緩沖區(qū)寄存器的最大地址
  432.         {
  433.                 for(i=0;i<size;i++)//循環(huán)寫入size個字節(jié)數(shù)據(jù)
  434.                 {
  435.                         SPI1_Send_Byte(*dat_ptr++);//寫入一個字節(jié)的數(shù)據(jù)               
  436.                 }
  437.         }
  438.         else//如果最大地址超過W5500發(fā)送緩沖區(qū)寄存器的最大地址
  439.         {
  440.                 offset=S_TX_SIZE-offset;
  441.                 for(i=0;i<offset;i++)//循環(huán)寫入前offset個字節(jié)數(shù)據(jù)
  442.                 {
  443.                         SPI1_Send_Byte(*dat_ptr++);//寫入一個字節(jié)的數(shù)據(jù)
  444.                 }
  445.                 GPIO_SetBits(W5500_SCS_PORT, W5500_SCS); //置W5500的SCS為高電平

  446.                 GPIO_ResetBits(W5500_SCS_PORT, W5500_SCS);//置W5500的SCS為低電平

  447.                 SPI1_Send_Short(0x00);//寫16位地址
  448.                 SPI1_Send_Byte(VDM|RWB_WRITE|(s*0x20+0x10));//寫控制字節(jié),N個字節(jié)數(shù)據(jù)長度,寫數(shù)據(jù),選擇端口s的寄存器

  449.                 for(;i<size;i++)//循環(huán)寫入size-offset個字節(jié)數(shù)據(jù)
  450.                 {
  451.                         SPI1_Send_Byte(*dat_ptr++);//寫入一個字節(jié)的數(shù)據(jù)
  452.                 }
  453.         }
  454.         GPIO_SetBits(W5500_SCS_PORT, W5500_SCS); //置W5500的SCS為高電平

  455.         offset1+=size;//更新實際物理地址,即下次寫待發(fā)送數(shù)據(jù)到發(fā)送數(shù)據(jù)緩沖區(qū)的起始地址
  456.         Write_W5500_SOCK_2Byte(s, Sn_TX_WR, offset1);
  457.         Write_W5500_SOCK_1Byte(s, Sn_CR, SEND);//發(fā)送啟動發(fā)送命令                                
  458. }

  459. /*******************************************************************************
  460. * 函數(shù)名  : W5500_Hardware_Reset
  461. * 描述    : 硬件復(fù)位W5500
  462. * 輸入    : 無
  463. * 輸出    : 無
  464. * 返回值  : 無
  465. * 說明    : W5500的復(fù)位引腳保持低電平至少500us以上,才能重圍W5500
  466. *******************************************************************************/
  467. void W5500_Hardware_Reset(void)
  468. {
  469.         GPIO_ResetBits(W5500_RST_PORT, W5500_RST);//復(fù)位引腳拉低
  470.         delay_ms(100);
  471.         GPIO_SetBits(W5500_RST_PORT, W5500_RST);//復(fù)位引腳拉高
  472.         delay_ms(200);
  473.         while((Read_W5500_1Byte(PHYCFGR)&LINK)==0);//等待以太網(wǎng)連接完成
  474. }

  475. /*******************************************************************************
  476. * 函數(shù)名  : W5500_Init
  477. * 描述    : 初始化W5500寄存器函數(shù)
  478. * 輸入    : 無
  479. * 輸出    : 無
  480. * 返回值  : 無
  481. * 說明    : 在使用W5500之前,先對W5500初始化
  482. *******************************************************************************/
  483. void W5500_Init(void)
  484. {
  485.         u8 i=0;

  486.         Write_W5500_1Byte(MR, RST);//軟件復(fù)位W5500,置1有效,復(fù)位后自動清0
  487.         delay_ms(20);//延時10ms,自己定義該函數(shù)

  488.         //設(shè)置網(wǎng)關(guān)(Gateway)的IP地址,Gateway_IP為4字節(jié)unsigned char數(shù)組,自己定義
  489.         //使用網(wǎng)關(guān)可以使通信突破子網(wǎng)的局限,通過網(wǎng)關(guān)可以訪問到其它子網(wǎng)或進(jìn)入Internet
  490.         Write_W5500_nByte(GAR, Gateway_IP, 4);
  491.                         
  492.         //設(shè)置子網(wǎng)掩碼(MASK)值,SUB_MASK為4字節(jié)unsigned char數(shù)組,自己定義
  493.         //子網(wǎng)掩碼用于子網(wǎng)運算
  494.         Write_W5500_nByte(SUBR,Sub_Mask,4);               
  495.         
  496.         //設(shè)置物理地址,PHY_ADDR為6字節(jié)unsigned char數(shù)組,自己定義,用于唯一標(biāo)識網(wǎng)絡(luò)設(shè)備的物理地址值
  497.         //該地址值需要到IEEE申請,按照OUI的規(guī)定,前3個字節(jié)為廠商代碼,后三個字節(jié)為產(chǎn)品序號
  498.         //如果自己定義物理地址,注意第一個字節(jié)必須為偶數(shù)
  499.         Write_W5500_nByte(SHAR,Phy_Addr,6);               

  500.         //設(shè)置本機的IP地址,IP_ADDR為4字節(jié)unsigned char數(shù)組,自己定義
  501.         //注意,網(wǎng)關(guān)IP必須與本機IP屬于同一個子網(wǎng),否則本機將無法找到網(wǎng)關(guān)
  502.         Write_W5500_nByte(SIPR,IP_Addr,4);               
  503.         
  504.         //設(shè)置發(fā)送緩沖區(qū)和接收緩沖區(qū)的大小,參考W5500數(shù)據(jù)手冊
  505.         for(i=0;i<8;i++)
  506.         {
  507.                 Write_W5500_SOCK_1Byte(i,Sn_RXBUF_SIZE, 0x02);//Socket Rx memory size=2k
  508.                 Write_W5500_SOCK_1Byte(i,Sn_TXBUF_SIZE, 0x02);//Socket Tx mempry size=2k
  509.         }

  510.         //設(shè)置重試時間,默認(rèn)為2000(200ms)
  511.         //每一單位數(shù)值為100微秒,初始化時值設(shè)為2000(0x07D0),等于200毫秒
  512.         Write_W5500_2Byte(RTR, 0x07d0);

  513.         //設(shè)置重試次數(shù),默認(rèn)為8次
  514.         //如果重發(fā)的次數(shù)超過設(shè)定值,則產(chǎn)生超時中斷(相關(guān)的端口中斷寄存器中的Sn_IR 超時位(TIMEOUT)置“1”)
  515.         Write_W5500_1Byte(RCR,8);

  516.         //啟動中斷,參考W5500數(shù)據(jù)手冊確定自己需要的中斷類型
  517.         //IMR_CONFLICT是IP地址沖突異常中斷,IMR_UNREACH是UDP通信時,地址無法到達(dá)的異常中斷
  518.         //其它是Socket事件中斷,根據(jù)需要添加
  519.         Write_W5500_1Byte(IMR,IM_IR7 | IM_IR6);
  520.         Write_W5500_1Byte(SIMR,S0_IMR);
  521.         Write_W5500_SOCK_1Byte(0, Sn_IMR, IMR_SENDOK | IMR_TIMEOUT | IMR_RECV | IMR_DISCON | IMR_CON);
  522. }

  523. /*******************************************************************************
  524. * 函數(shù)名  : Detect_Gateway
  525. * 描述    : 檢查網(wǎng)關(guān)服務(wù)器
  526. * 輸入    : 無
  527. * 輸出    : 無
  528. * 返回值  : 成功返回TRUE(0xFF),失敗返回FALSE(0x00)
  529. * 說明    : 無
  530. *******************************************************************************/
  531. unsigned char Detect_Gateway(void)
  532. {
  533.         unsigned char ip_adde[4];
  534.         ip_adde[0]=IP_Addr[0]+1;
  535.         ip_adde[1]=IP_Addr[1]+1;
  536.         ip_adde[2]=IP_Addr[2]+1;
  537.         ip_adde[3]=IP_Addr[3]+1;

  538.         //檢查網(wǎng)關(guān)及獲取網(wǎng)關(guān)的物理地址
  539.         Write_W5500_SOCK_4Byte(0,Sn_DIPR,ip_adde);//向目的地址寄存器寫入與本機IP不同的IP值
  540.         Write_W5500_SOCK_1Byte(0,Sn_MR,MR_TCP);//設(shè)置socket為TCP模式
  541.         Write_W5500_SOCK_1Byte(0,Sn_CR,OPEN);//打開Socket        
  542.         delay_ms(5);//延時5ms         
  543.         
  544.         if(Read_W5500_SOCK_1Byte(0,Sn_SR) != SOCK_INIT)//如果socket打開失敗
  545.         {
  546.                 Write_W5500_SOCK_1Byte(0,Sn_CR,CLOSE);//打開不成功,關(guān)閉Socket
  547.                 return FALSE;//返回FALSE(0x00)
  548.         }

  549.         Write_W5500_SOCK_1Byte(0,Sn_CR,CONNECT);//設(shè)置Socket為Connect模式                                                

  550.         do
  551.         {
  552.                 u8 j=0;
  553.                 j=Read_W5500_SOCK_1Byte(0,Sn_IR);//讀取Socket0中斷標(biāo)志寄存器
  554.                 if(j!=0)
  555.                 Write_W5500_SOCK_1Byte(0,Sn_IR,j);
  556.                 delay_ms(5);//延時5ms
  557.                 if((j&IR_TIMEOUT) == IR_TIMEOUT)
  558.                 {
  559.                         return FALSE;        
  560.                 }
  561.                 else if(Read_W5500_SOCK_1Byte(0,Sn_DHAR) != 0xff)
  562.                 {
  563.                         Write_W5500_SOCK_1Byte(0,Sn_CR,CLOSE);//關(guān)閉Socket
  564.                         return TRUE;                                                        
  565.                 }
  566.         }while(1);
  567. }

  568. /*******************************************************************************
  569. * 函數(shù)名  : Socket_Init
  570. * 描述    : 指定Socket(0~7)初始化
  571. * 輸入    : s:待初始化的端口
  572. * 輸出    : 無
  573. * 返回值  : 無
  574. * 說明    : 無
  575. *******************************************************************************/
  576. void Socket_Init(SOCKET s)
  577. {
  578.         //設(shè)置分片長度,參考W5500數(shù)據(jù)手冊,該值可以不修改        
  579.         Write_W5500_SOCK_2Byte(0, Sn_MSSR, 1460);//最大分片字節(jié)數(shù)=1460(0x5b4)
  580.         //設(shè)置指定端口
  581.         switch(s)
  582.         {
  583.                 case 0:
  584.                         //設(shè)置端口0的端口號
  585.                         Write_W5500_SOCK_2Byte(0, Sn_PORT, S0_Port[0]*256+S0_Port[1]);
  586.                         //設(shè)置端口0目的(遠(yuǎn)程)端口號
  587.                         Write_W5500_SOCK_2Byte(0, Sn_DPORTR, S0_DPort[0]*256+S0_DPort[1]);
  588.                         //設(shè)置端口0目的(遠(yuǎn)程)IP地址
  589.                         Write_W5500_SOCK_4Byte(0, Sn_DIPR, S0_DIP);                        
  590.                         
  591.                         break;

  592.                 case 1:
  593.                         break;

  594.                 case 2:
  595.                         break;

  596.                 case 3:
  597.                         break;

  598.                 case 4:
  599.                         break;

  600.                 case 5:
  601.                         break;

  602.                 case 6:
  603.                         break;

  604.                 case 7:
  605.                         break;

  606.                 default:
  607.                         break;
  608.         }
  609. }

  610. /*******************************************************************************
  611. * 函數(shù)名  : Socket_Connect
  612. * 描述    : 設(shè)置指定Socket(0~7)為客戶端與遠(yuǎn)程服務(wù)器連接
  613. * 輸入    : s:待設(shè)定的端口
  614. * 輸出    : 無
  615. * 返回值  : 成功返回TRUE(0xFF),失敗返回FALSE(0x00)
  616. * 說明    : 當(dāng)本機Socket工作在客戶端模式時,引用該程序,與遠(yuǎn)程服務(wù)器建立連接
  617. *                        如果啟動連接后出現(xiàn)超時中斷,則與服務(wù)器連接失敗,需要重新調(diào)用該程序連接
  618. *                        該程序每調(diào)用一次,就與服務(wù)器產(chǎn)生一次連接
  619. *******************************************************************************/
  620. unsigned char Socket_Connect(SOCKET s)
  621. {
  622.         Write_W5500_SOCK_1Byte(s,Sn_MR,MR_TCP);//設(shè)置socket為TCP模式
  623.         Write_W5500_SOCK_1Byte(s,Sn_CR,OPEN);//打開Socket
  624.         delay_ms(5);//延時5ms
  625.         if(Read_W5500_SOCK_1Byte(s,Sn_SR)!=SOCK_INIT)//如果socket打開失敗
  626.         {
  627.                 Write_W5500_SOCK_1Byte(s,Sn_CR,CLOSE);//打開不成功,關(guān)閉Socket
  628.                 return FALSE;//返回FALSE(0x00)
  629.         }
  630.         Write_W5500_SOCK_1Byte(s,Sn_CR,CONNECT);//設(shè)置Socket為Connect模式
  631.         return TRUE;//返回TRUE,設(shè)置成功
  632. }

  633. /*******************************************************************************
  634. * 函數(shù)名  : Socket_Listen
  635. * 描述    : 設(shè)置指定Socket(0~7)作為服務(wù)器等待遠(yuǎn)程主機的連接
  636. * 輸入    : s:待設(shè)定的端口
  637. * 輸出    : 無
  638. * 返回值  : 成功返回TRUE(0xFF),失敗返回FALSE(0x00)
  639. * 說明    : 當(dāng)本機Socket工作在服務(wù)器模式時,引用該程序,等等遠(yuǎn)程主機的連接
  640. *                        該程序只調(diào)用一次,就使W5500設(shè)置為服務(wù)器模式
  641. *******************************************************************************/
  642. unsigned char Socket_Listen(SOCKET s)
  643. {
  644.         Write_W5500_SOCK_1Byte(s,Sn_MR,MR_TCP);//設(shè)置socket為TCP模式
  645.         Write_W5500_SOCK_1Byte(s,Sn_CR,OPEN);//打開Socket        
  646.         delay_ms(5);//延時5ms
  647.         if(Read_W5500_SOCK_1Byte(s,Sn_SR)!=SOCK_INIT)//如果socket打開失敗
  648.         {
  649.                 Write_W5500_SOCK_1Byte(s,Sn_CR,CLOSE);//打開不成功,關(guān)閉Socket
  650.                 return FALSE;//返回FALSE(0x00)
  651.         }        
  652.         Write_W5500_SOCK_1Byte(s,Sn_CR,LISTEN);//設(shè)置Socket為偵聽模式        
  653.         delay_ms(5);//延時5ms
  654.         if(Read_W5500_SOCK_1Byte(s,Sn_SR)!=SOCK_LISTEN)//如果socket設(shè)置失敗
  655.         {
  656.                 Write_W5500_SOCK_1Byte(s,Sn_CR,CLOSE);//設(shè)置不成功,關(guān)閉Socket
  657.                 return FALSE;//返回FALSE(0x00)
  658.         }

  659.         return TRUE;

  660.         //至此完成了Socket的打開和設(shè)置偵聽工作,至于遠(yuǎn)程客戶端是否與它建立連接,則需要等待Socket中斷,
  661.         //以判斷Socket的連接是否成功。參考W5500數(shù)據(jù)手冊的Socket中斷狀態(tài)
  662.         //在服務(wù)器偵聽模式不需要設(shè)置目的IP和目的端口號
  663. }
  664. ……………………

  665. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

代碼工程51hei附件下載: (溫濕度監(jiān)測+W5500 AD采集)服務(wù)器端 單AD 多通道.7z (211.5 KB, 下載次數(shù): 63)

評分

參與人數(shù) 1黑幣 +30 收起 理由
admin + 30 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:270137 發(fā)表于 2024-7-1 16:52 | 只看該作者
good 收藏了
回復(fù)

使用道具 舉報

板凳
ID:270137 發(fā)表于 2024-7-1 16:52 | 只看該作者
good 收下了
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 999国产视频 | 亚洲成人久久久 | 男人的天堂视频网站 | 亚洲日日夜夜 | 国产日韩欧美在线播放 | 国产精品伦一区二区三级视频 | 性网址 | 国产精品成av人在线视午夜片 | 精品久久久久久久久久久院品网 | 中文字幕免费在线 | 91久久精品一区二区二区 | 日韩视频一区二区三区 | 亚洲欧美一区二区在线观看 | 国产在线精品一区二区 | 国产精品成人69xxx免费视频 | 中文天堂在线一区 | 国产精品亚洲综合 | 欧美一级欧美三级在线观看 | 国产一级免费视频 | 免费播放一级片 | pacopacomama在线 | 亚洲国产日韩一区 | 日本三级网站在线 | 精品日韩在线 | 成人福利片 | 男人天堂社区 | 久久99精品久久 | 啪一啪在线视频 | 久久美女网 | 中文字幕亚洲无线 | 综合国产 | 鲁一鲁资源影视 | 正在播放国产精品 | 国产欧美一区二区精品久导航 | 久久久国产一区二区三区四区小说 | 国产精品高潮呻吟久久av野狼 | 日韩国产中文字幕 | 免费一区二区在线观看 | 日韩中文字幕高清 | www.亚洲一区| 激情五月婷婷综合 |