单片机
返回首页

STM32驱动W5100实现udp通信

2016-12-18 来源:eefocus

 


环境:

主机:WIN7

开发环境:MDK4.72

MCU:STM32F103ZE


源代码:

驱动层代码:

drv_w5100.h


  1. /********************************************************************* 

  2. *                               w5100驱动层头文件 

  3. *                             (c)copyright 2013,jdh 

  4. *                               All Right Reserved 

  5. *文件名:drv_w5100.h 

  6. *程序员:jdh 

  7. *修改日期:2013/10/22 

  8. *         2013/10/23 

  9. *         2013/10/24 

  10. **********************************************************************/  

  11. /********************************************************************* 

  12. 硬件连接说明 

  13. 电路标号            单片机引脚       特殊功能 

  14. W5100_MISO          PB4             SPI3_MISO 

  15. W5100_MOSI          PB5             SPI3_MOSI 

  16. W5100_CS            PA15            SPI3_NSS 

  17. W5100_SCLK          PB3             SPI3_SCK 

  18. /RESET              PD3  

  19. /INT                PD6 

  20. **********************************************************************/  

  21.   

  22. #ifndef _DRV_W5100_H_  

  23. #define _DRV_W5100_H_  

  24.   

  25. /********************************************************************* 

  26. *                           头文件 

  27. **********************************************************************/  

  28.   

  29. #include 'stm32f10x.h'  

  30. #include 'stm32f10x_spi.h'  

  31.   

  32. /********************************************************************* 

  33. *                           宏定义 

  34. **********************************************************************/  

  35.   

  36. /********************************************************************* 

  37. *                           读写操作 

  38. **********************************************************************/  

  39.   

  40. //写操作  

  41. #define WRITE_COMMAND           0xf0     

  42. //读操作  

  43. #define READ_COMMAND            0x0f      

  44.   

  45. /********************************************************************* 

  46. *                           基地址 

  47. **********************************************************************/  

  48.   

  49. #define COMMON_BASE 0x0000            

  50.   

  51. /********************************************************************* 

  52. *                           寄存器 

  53. **********************************************************************/  

  54.   

  55. //-----------------------------------------------------------------------------  

  56. //                               Common register  

  57. //-----------------------------------------------------------------------------  

  58. //Mode register, R/W, Default=0x00  

  59. #define SOCKET0       0  

  60. #define SOCKET1       1  

  61. #define SOCKET2       2  

  62. #define SOCKET3       3  

  63.   

  64. #define TCP_SERVER    0  

  65. #define TCP_CLIENT    1  

  66. #define UDP           2  

  67.   

  68. #define W5100_MODE  COMMON_BASE  

  69.     #define MODE_RST    0x80        //Software reset  

  70.     #define MODE_PB     0x10        //Ping block mode  

  71.     #define MODE_PPPOE  0x08        //PPOE mode  

  72.     #define MODE_AI     0x02        //Address auto increment in indirect bus I/F  

  73.     #define MODE_IND    0x01        //Indirect bus I/F mode  

  74.   

  75. //Gateway address register, R/W, default=0x00  

  76. #define W5100_GAR   COMMON_BASE+0x01  

  77.   

  78. //Subnet mask address, R/W, default=0x00  

  79. #define W5100_SUBR  COMMON_BASE+0x05  

  80.   

  81. //Source hardware address, R/W, default=0x00  

  82. #define W5100_SHAR  COMMON_BASE+0x09  

  83.   

  84. //Source IP address, R/W, default=0x00  

  85. #define W5100_SIPR  COMMON_BASE+0x0f  

  86.   

  87. //Interrupt and interrupt mask register  

  88. #define W5100_IR    COMMON_BASE+0x15    //RO, Default=0x00  

  89.     #define IR_CONFLICT 0x80        //IP conflict  

  90.     #define IR_UNREACH  0x40        //Destination unreachable  

  91.     #define IR_PPPOE    0x20        //PPOE close  

  92.     #define IR_S3_INT   0x08        //Occurrence of socket 3 socket interrupt  

  93.     #define IR_S2_INT   0x04        //Occurrence of socket 2 socket interrupt  

  94.     #define IR_S1_INT   0x02        //Occurrence of socket 1 socket interrupt  

  95.     #define IR_S0_INT   0x01        //Occurrence of socket 0 socket interrupt  

  96.   

  97. #define W5100_IMR   COMMON_BASE+0x16    //R/W, Default=0x00  

  98.     #define IMR_CONFLICT    0x80        //IP conflict  

  99.     #define IMR_UNREACH 0x40        //Destination unreachable  

  100.     #define IMR_PPPOE   0x20        //PPOE close  

  101.     #define IMR_S3_INT  0x08        //Occurrence of socket 3 socket interrupt  

  102.     #define IMR_S2_INT  0x04        //Occurrence of socket 2 socket interrupt  

  103.     #define IMR_S1_INT  0x02        //Occurrence of socket 1 socket interrupt  

  104.     #define IMR_S0_INT  0x01        //Occurrence of socket 0 socket interrupt  

  105.   

  106. //Retry time value. Value 1 means 100us, R/W, default=0x07D0  

  107. #define W5100_RTR   COMMON_BASE+0x17  

  108.   

  109. //Retry count, R/W, Default=0x08  

  110. #define W5100_RCR   COMMON_BASE+0X19  

  111.   

  112. //RX memory size register, R/W, default=0x55  

  113. //--------------------------------------------------------    S1      S0      Memory size  

  114. //  Socket3    |  Socket2    |  Socket1    |  Socket0    |    0       0           1KB  

  115. //-------------|-------------|-------------|-------------|    0       1           2KB  

  116. //S1       S0  |S1       S0  |S1       S0  |S1       S0  |    1       0           4KB  

  117. //--------------------------------------------------------    1       1           8KB  

  118. #define W5100_RMSR  COMMON_BASE+0x1a  

  119.   

  120. //TX memory size register, R/W, default=0x55  

  121. #define W5100_TMSR  COMMON_BASE+0x1b  

  122.   

  123. //Authentication type in PPPOE mode, R, default=0x0000  

  124. #define W5100_PATR  COMMON_BASE+0x1c  

  125.   

  126. //PPP LCP request timer register, R/W, default=0x28  

  127. //Value 1 is about 25ms  

  128. #define W5100_PTIMER    COMMON_BASE+0x28  

  129.   

  130. //PPP LCP magic number register, R/W, default=0x00  

  131. #define W5100_PMAGIC    COMMON_BASE+0x29  

  132.   

  133. //Unreachable IP address, RO, default=0x00  

  134. #define W5100_UIPR  COMMON_BASE+0x2a  

  135.   

  136. //Unreachable port register, RO, default=0x0000  

  137. #define W5100_UPORT COMMON_BASE+0x2e  

  138.   

  139.   

  140. //-----------------------------------------------------------------------------  

  141. //                                  Socket register  

  142. //-----------------------------------------------------------------------------  

  143. //Socket mode register, R/W, default=0x00  

  144. #define W5100_S0_MR COMMON_BASE+0x0400      //Socket 0  

  145. #define W5100_S1_MR COMMON_BASE+0x0500      //Socket 1  

  146. #define W5100_S2_MR COMMON_BASE+0x0600      //Socket 2  

  147. #define W5100_S3_MR COMMON_BASE+0x0700      //Socket 3  

  148.     #define S_MR_MULTI  0x80            //Multcasting  

  149.     #define S_MR_MC     0x20            //Multcast  

  150.   

  151.                                         //  P3   P2   P1   P0     Meaning  

  152.     #define S_MR_CLOSED     0x00        //  0    0    0    0      Closed  

  153.     #define S_MR_TCP        0x01        //  0    0    0    1      TCP  

  154.     #define S_MR_UDP        0x02        //  0    0    1    0      UDP  

  155.     #define S_MR_IPRAW      0x03        //  0    0    1    1      IPRAW  

  156.     #define S_MR_MACRAW     0x04        //  0    1    0    0      MACRAW  

  157.     #define S_MR_PPPOE      0x05        //  0    1    0    1      PPPOE  

  158.   

  159. //Socket command register, R/W, default=0x00  

  160. #define W5100_S0_CR COMMON_BASE+0x0401      //Socket 0  

  161. #define W5100_S1_CR COMMON_BASE+0x0501      //Socket 1  

  162. #define W5100_S2_CR COMMON_BASE+0x0601      //Socket 2  

  163. #define W5100_S3_CR COMMON_BASE+0x0701      //Socket 3  

  164.     #define S_CR_OPEN       0x01        //It is used to initialize the socket  

  165.     #define S_CR_LISTEN     0x02        //In TCP mode, it waits for a connection request from any remote peer(Client)  

  166.     #define S_CR_CONNECT    0x04        //In TCP mode, it sends a connection request to remote peer(SERVER)  

  167.     #define S_CR_DISCON     0x08        //In TCP mode, it sends a connection termination request  

  168.     #define S_CR_CLOSE      0x10        //Used to close the socket  

  169.     #define S_CR_SEND       0x20        //It transmit the data as much as the increase size of write pointer  

  170.     #define S_CR_SEND_MAC   0x21        //In UDP mode, same as SEND  

  171.     #define S_CR_SEND_KEEP  0x22        //In TCP mode  

  172.     #define S_CR_RECV       0x40        //Receiving is processed including the value of socket RX read  

  173.                                         //pointer register  

  174.   

  175.     /* Definition for PPPOE */  

  176.     #define S_CR_PCON   0x23        //Start of ADSL connection  

  177.     #define S_CR_PDISCON    0x24        //End of ADSL connection  

  178.     #define S_CR_PCR    0x25        //Send REQ message ineach phase  

  179.     #define S_CR_PCN    0x26        //Send NAK message in each phase  

  180.     #define S_CR_PCJ    0x27        //Senf REJECT message in each phase  

  181.   

  182. //Socket interrup register, RO, default=0x00  

  183. #define W5100_S0_IR COMMON_BASE+0x0402      //Socket 0  

  184. #define W5100_S1_IR COMMON_BASE+0x0502      //Socket 1  

  185. #define W5100_S2_IR COMMON_BASE+0x0602      //Socket 2  

  186. #define W5100_S3_IR COMMON_BASE+0x0702      //Socket 3  

  187.     #define S_IR_SENDOK     0x10        //Send data complete  

  188.     #define S_IR_TIMEOUT    0x08        //Set if timeout occurs during connection or termination  

  189.                                         //or data transmission  

  190.     #define S_IR_RECV       0x04        //Set if data is received  

  191.     #define S_IR_DISCON     0x02        //Set if receiv connection termination request  

  192.     #define S_IR_CON        0x01        //Set if connetion is established  

  193.   

  194.     /* Definition for PPPOE */  

  195.     #define S_IR_PRECV  0x80        //Indicate receiving no support option data  

  196.     #define S_IR_PFAIL  0x40        //Indicate PAP Authentication fail  

  197.     #define S_IR_PNEXT  0x20        //Go next phase  

  198.   

  199. //Socket status register, RO, default=0x00  

  200. #define W5100_S0_SSR    COMMON_BASE+0x0403      //Socket 0  

  201. #define W5100_S1_SSR    COMMON_BASE+0x0503      //Socket 1  

  202. #define W5100_S2_SSR    COMMON_BASE+0x0603      //Socket 2  

  203. #define W5100_S3_SSR    COMMON_BASE+0x0703      //Socket 3  

  204.     #define S_SSR_CLOSED    0x00        //In case that OPEN command are given to Sn_CR, Timeout interrupt  

  205.                         //is asserted or connection is terminated  

  206.     #define S_SSR_INIT  0x13        //In case that Sn_MR is set as TCP and OPEN commands are given to Sn_CR  

  207.     #define S_SSR_LISTEN    0x14        //In case that under the SOCK_INIT status, LISTEN commands  

  208.                         //are given to Sn_CR  

  209.     #define S_SSR_ESTABLISHED   0x17    //In case that connection is established  

  210.     #define S_SSR_CLOSE_WAIT    0x1c    //In case that connection temination request is received  

  211.     #define S_SSR_UDP   0x22        //In case that OPEN command is given to Sn_CR when Sn_MR is set as UDP  

  212.     #define S_SSR_IPRAW 0x32        //In case that OPEN command is given to Sn_CR when Sn_MR is set as IPRAW  

  213.     #define S_SSR_MACRAW    0x42        //In case that OPEN command is given to S0_CR when S0_MR is set as MACRAW  

  214.     #define S_SSR_PPPOE 0x5f        //In case that OPEN command is given to S0_CR when S0_MR is set as PPPOE  

  215.     //Below is shown in the status change, and does not need much attention  

  216.     #define S_SSR_SYNSEND   0x15  

  217.     #define S_SSR_SYNRECV   0x16  

  218.     #define S_SSR_FIN_WAIT  0x18  

  219.     #define S_SSR_CLOSING   0x1a  

  220.     #define S_SSR_TIME_WAIT 0x1b  

  221.     #define S_SSR_LAST_ACK  0x1d  

  222.     #define S_SSR_ARP0  0x11  

  223.     #define S_SSR_ARP1  0x21  

  224.     #define S_SSR_ARP2  0x31  

  225.   

  226. //Socket Source port register, R/W, default=0x00  

  227. #define W5100_S0_PORT   COMMON_BASE+0x0404      //Socket 0  

  228. #define W5100_S1_PORT   COMMON_BASE+0x0504      //Socket 1  

  229. #define W5100_S2_PORT   COMMON_BASE+0x0604      //Socket 2  

  230. #define W5100_S3_PORT   COMMON_BASE+0x0704      //Socket 3  

  231.   

  232. //Socket destination hardware address register, R/W, default=0x00  

  233. #define W5100_S0_DHAR   COMMON_BASE+0x0406      //Socket 0  

  234. #define W5100_S1_DHAR   COMMON_BASE+0x0506      //Socket 1  

  235. #define W5100_S2_DHAR   COMMON_BASE+0x0606      //Socket 2  

  236. #define W5100_S3_DHAR   COMMON_BASE+0x0706      //Socket 3  

  237.   

  238. //Socket destination IP address register, R/W, default=0x00  

  239. #define W5100_S0_DIPR   COMMON_BASE+0x040c      //Socket 0  

  240. #define W5100_S1_DIPR   COMMON_BASE+0x050c      //Socket 1  

  241. #define W5100_S2_DIPR   COMMON_BASE+0x060c      //Socket 2  

  242. #define W5100_S3_DIPR   COMMON_BASE+0x070c      //Socket 3  

  243.   

  244. //Socket destionation port register, R/W, default=0x00  

  245. #define W5100_S0_DPORT  COMMON_BASE+0x0410      //Socket 0  

  246. #define W5100_S1_DPORT  COMMON_BASE+0x0510      //Socket 1  

  247. #define W5100_S2_DPORT  COMMON_BASE+0x0610      //Socket 2  

  248. #define W5100_S3_DPORT  COMMON_BASE+0x0710      //Socket 3  

  249.   

  250. //Socket maximum segment size register, R/W, default=0x00  

  251. #define W5100_S0_MSS    COMMON_BASE+0x0412      //Socket 0  

  252. #define W5100_S1_MSS    COMMON_BASE+0x0512      //Socket 1  

  253. #define W5100_S2_MSS    COMMON_BASE+0x0612      //Socket 2  

  254. #define W5100_S3_MSS    COMMON_BASE+0x0712      //Socket 3  

  255.   

  256. //Socket IP protocol register, R/W, default=0x00  

  257. //See http://www.iana.org/assignments/protocol-number  

  258. #define W5100_S0_PROTO  COMMON_BASE+0x0414      //Socket 0  

  259. #define W5100_S1_PROTO  COMMON_BASE+0x0514      //Socket 1  

  260. #define W5100_S2_PROTO  COMMON_BASE+0x0614      //Socket 2  

  261. #define W5100_S3_PROTO  COMMON_BASE+0x0714      //Socket 3  

  262.   

  263. //Socket IP type of servce register, R/W, default=0x00  

  264. #define W5100_S0_TOS    COMMON_BASE+0x0415      //Socket 0  

  265. #define W5100_S1_TOS    COMMON_BASE+0x0515      //Socket 1  

  266. #define W5100_S2_TOS    COMMON_BASE+0x0615      //Socket 2  

  267. #define W5100_S3_TOS    COMMON_BASE+0x0715      //Socket 3  

  268.   

  269. //Socket IP time to live register, R/W, default=0x80  

  270. #define W5100_S0_TTL    COMMON_BASE+0x0416      //Socket 0  

  271. #define W5100_S1_TTL    COMMON_BASE+0x0516      //Socket 1  

  272. #define W5100_S2_TTL    COMMON_BASE+0x0616      //Socket 2  

  273. #define W5100_S3_TTL    COMMON_BASE+0x0716      //Socket 3  

  274.   

  275. //Socket TX free size register, RO, default=0x0800  

  276. //should read upper byte first and lower byte later  

  277. #define W5100_S0_TX_FSR     COMMON_BASE+0x0420      //Socket 0  

  278. #define W5100_S1_TX_FSR     COMMON_BASE+0x0520      //Socket 1  

  279. #define W5100_S2_TX_FSR     COMMON_BASE+0x0620      //Socket 2  

  280. #define W5100_S3_TX_FSR     COMMON_BASE+0x0720      //Socket 3  

  281.   

  282. //Socket TX read pointer register, RO, default=0x0000  

  283. //should read upper byte first and lower byte later  

  284. #define W5100_S0_TX_RR      COMMON_BASE+0x0422      //Socket 0  

  285. #define W5100_S1_TX_RR      COMMON_BASE+0x0522      //Socket 1  

  286. #define W5100_S2_TX_RR      COMMON_BASE+0x0622      //Socket 2  

  287. #define W5100_S3_TX_RR      COMMON_BASE+0x0722      //Socket 3  

  288.   

  289. //Socket TX write pointer register, R/W, default=0x0000  

  290. //should read upper byte first and lower byte later  

  291. #define W5100_S0_TX_WR      COMMON_BASE+0x0424      //Socket 0  

  292. #define W5100_S1_TX_WR      COMMON_BASE+0x0524      //Socket 1  

  293. #define W5100_S2_TX_WR      COMMON_BASE+0x0624      //Socket 2  

  294. #define W5100_S3_TX_WR      COMMON_BASE+0x0724      //Socket 3  

  295.   

  296. //Socket RX size register, RO, default=0x0000  

  297. //should read upper byte first and lower byte later  

  298. #define W5100_S0_RX_RSR     COMMON_BASE+0x0426      //Socket 0  

  299. #define W5100_S1_RX_RSR     COMMON_BASE+0x0526      //Socket 1  

  300. #define W5100_S2_RX_RSR     COMMON_BASE+0x0626      //Socket 2  

  301. #define W5100_S3_RX_RSR     COMMON_BASE+0x0726      //Socket 3  

  302.   

  303. //Socket RX read pointer register, R/W, default=0x0000  

  304. //should read upper byte first and lower byte later  

  305. #define W5100_S0_RX_RR      COMMON_BASE+0x0428      //Socket 0  

  306. #define W5100_S1_RX_RR      COMMON_BASE+0x0528      //Socket 1  

  307. #define W5100_S2_RX_RR      COMMON_BASE+0x0628      //Socket 2  

  308. #define W5100_S3_RX_RR      COMMON_BASE+0x0728      //Socket 3  

  309.   

  310. //Socket RX read pointer register, R/W, default=0x0000  

  311. //should read upper byte first and lower byte later  

  312. #define W5100_S0_RX_WR      COMMON_BASE+0x042A      //Socket 0  

  313. #define W5100_S1_RX_WR      COMMON_BASE+0x052A      //Socket 1  

  314. #define W5100_S2_RX_WR      COMMON_BASE+0x062A      //Socket 2  

  315. #define W5100_S3_RX_WR      COMMON_BASE+0x072A      //Socket 3  

  316.   

  317. //TX memory  

  318. #define W5100_TX    COMMON_BASE+0x4000  

  319.   

  320. //RX memory  

  321. #define W5100_RX    COMMON_BASE+0x6000  

  322.   

  323. /********************************************************************* 

  324. *                           数据结构 

  325. **********************************************************************/  

  326.   

  327. /********************************************************************* 

  328. *                           缓冲区结构 

  329. **********************************************************************/  

  330.   

  331. struct _W5100_Buf  

  332. {  

  333.     //缓冲区大小,单位字节  

  334.     uint16_t size;  

  335.     //基地址  

  336.     uint16_t base_addr;  

  337.     //屏蔽地址  

  338.     uint16_t mask_addr;  

  339. };  

  340.   

  341. /********************************************************************* 

  342. *                           全局变量声明 

  343. **********************************************************************/  

  344.   

  345. /********************************************************************* 

  346. *                           发送缓存区参数 

  347. **********************************************************************/  

  348.   

  349. extern struct _W5100_Buf W5100_Tx_Buf[4];  

  350.   

  351. /********************************************************************* 

  352. *                           接收缓存区参数 

  353. **********************************************************************/  

  354.   

  355. extern struct _W5100_Buf W5100_Rx_Buf[4];  

  356.   

  357. /********************************************************************* 

  358. *                           函数 

  359. **********************************************************************/  

  360.   

  361. /********************************************************************* 

  362. *                           初始化w5100 

  363. *参数:ip:本机ip,4字节 

  364. *     mac:本机mac,6字节 

  365. *     submask:掩码:4字节 

  366. *     gateway:网关,4字节 

  367. *     socket_tx_size:socket发送缓存大小,4字节 

  368. *     socket_rx_size:socket接收缓存大小,4字节 

  369. **********************************************************************/  

  370.   

  371. void drv_w5100_init(uint8_t *ip,uint8_t *mac,uint8_t *submask,uint8_t *gateway,\  

  372.                     uint8_t *socket_tx_size,uint8_t *socket_rx_size);  

  373.   

  374. /********************************************************************* 

  375. *                           初始化io 

  376. *说明:初始化/INT和/RESET引脚 

  377. **********************************************************************/  

  378.   

  379. void drv_w5100_init_io(void);  

  380.   

  381. /********************************************************************* 

  382. *                           初始化spi 

  383. **********************************************************************/  

  384.   

  385. void drv_w5100_init_spi(void);  

  386.   

  387. /********************************************************************* 

  388. *                           初始化中断 

  389. **********************************************************************/  

  390.   

  391. void drv_w5100_init_irq(void);  

  392.   

  393. /********************************************************************* 

  394. *                           复位w5100 

  395. **********************************************************************/  

  396.   

  397. void drv_w5100_reset(void);  

  398.   

  399. /********************************************************************* 

  400. *                           使能芯片 

  401. *参数:enable:1使能,0关闭 

  402. **********************************************************************/  

  403.   

  404. void drv_w5100_enable(uint8_t enable);  

  405.   

  406. /********************************************************************* 

  407. *                           spi口发送一个字节 

  408. *参数:byte:发送的字节 

  409. *返回:收到的字节 

  410. **********************************************************************/  

  411.   

  412. uint8_t drv_w5100_spi_tx_byte(uint8_t byte);  

  413.   

  414. /********************************************************************* 

  415. *                           w5100写入一个字节 

  416. *参数:addr:地址 

  417. *     byte:字节 

  418. **********************************************************************/  

  419.   

  420. void drv_w5100_tx_byte(uint16_t addr,uint8_t byte);  

  421.   

  422. /********************************************************************* 

  423. *                           w5100写缓存 

  424. *参数:addr:w5100缓存开始地址 

  425. *     buf:缓存区地址 

  426. *     len:缓存长度 

  427. **********************************************************************/  

  428.   

  429. void drv_w5100_tx_buf(uint16_t addr,uint8_t *buf,uint16_t len);  

  430.   

  431. /********************************************************************* 

  432. *                           w5100读取一个字节 

  433. *参数:addr:地址 

  434. *返回:读取的字节 

  435. **********************************************************************/  

  436.   

  437. uint8_t drv_w5100_rx_byte(uint16_t addr);  

  438.   

  439. /********************************************************************* 

  440. *                           w5100读取缓存 

  441. *参数:addr:w5100缓存开始地址 

  442. *     buf:读取存放的缓存区地址 

  443. *     len:读取长度 

  444. **********************************************************************/  

  445.   

  446. void drv_w5100_rx_buf(uint16_t addr,uint8_t *buf,uint16_t len);  

  447.   

  448. /********************************************************************* 

  449. *                           w5100设置网关 

  450. *参数:addr:需要设置的网关,4字节 

  451. **********************************************************************/  

  452.   

  453. void drv_w5100_set_gateway(uint8_t *addr);  

  454.   

  455. /********************************************************************* 

  456. *                           读取w5100网关 

  457. *参数:addr:读取的网关存放地址,4字节长度 

  458. **********************************************************************/  

  459.   

  460. void drv_w5100_get_gateway(uint8_t *addr);  

  461.   

  462. /********************************************************************* 

  463. *                           w5100设置子网掩码 

  464. *参数:addr:需要设置的子网掩码,4字节 

  465. **********************************************************************/  

  466.   

  467. void drv_w5100_set_submask(uint8_t *addr);  

  468.   

  469. /********************************************************************* 

  470. *                           读取w5100子网掩码 

  471. *参数:addr:读取的子网掩码,4字节 

  472. **********************************************************************/  

  473.   

  474. void drv_w5100_get_submask(uint8_t *addr);  

  475.   

  476. /********************************************************************* 

  477. *                           w5100设置mac地址 

  478. *参数:mac:需要设置的mac,6字节 

  479. **********************************************************************/  

  480.   

  481. void drv_w5100_set_mac(uint8_t *mac);  

  482.   

  483. /********************************************************************* 

  484. *                           读取w5100的mac地址 

  485. *参数:addr:读取mac地址,6字节 

  486. **********************************************************************/  

  487.   

  488. void drv_w5100_get_mac(uint8_t *mac);  

  489.   

  490. /********************************************************************* 

  491. *                           w5100设置本机ip 

  492. *参数:ip:需要设置的ip,4字节 

  493. **********************************************************************/  

  494.   

  495. void drv_w5100_set_ip(uint8_t *ip);  

  496.   

  497. /********************************************************************* 

  498. *                           读取w5100的ip地址 

  499. *参数:addr:读取ip地址,4字节 

  500. **********************************************************************/  

  501.   

  502. void drv_w5100_get_ip(uint8_t *ip);  

  503.   

  504. /********************************************************************* 

  505. *                           w5100设置端口的端口号 

  506. *参数:socket:端口:0-3 

  507. *     port:端口号 

  508. **********************************************************************/  

  509.   

  510. void drv_w5100_set_socket_port(uint8_t socket,uint16_t port);  

  511.   

  512. /********************************************************************* 

  513. *                           读取w5100端口的端口号 

  514. *参数:socket:端口:0-3 

  515. *返回:端口号 

  516. **********************************************************************/  

  517.   

  518. uint16_t drv_w5100_get_socket_port(uint8_t socket);  

  519.   

  520. /********************************************************************* 

  521. *                           w5100设置端口的目的mac地址 

  522. *参数:socket:端口:0-3 

  523. *     mac:需要设置的mac,6字节 

  524. **********************************************************************/  

  525.   

  526. void drv_w5100_set_socket_mac(uint8_t socket,uint8_t *mac);  

  527.   

  528. /********************************************************************* 

  529. *                           读取w5100端口的目的mac地址 

  530. *参数:socket:端口:0-3 

  531. *     mac:读取的目的mac,6字节 

  532. **********************************************************************/  

  533.   

  534. void drv_w5100_get_socket_mac(uint8_t socket,uint8_t *mac);  

  535.   

  536. /********************************************************************* 

  537. *                           w5100设置端口的目的ip地址 

  538. *参数:socket:端口:0-3 

  539. *     ip:需要设置的ip,4字节 

  540. **********************************************************************/  

  541.   

  542. void drv_w5100_set_socket_dst_ip(uint8_t socket,uint8_t *ip);  

  543.   

  544. /********************************************************************* 

  545. *                           读取w5100端口的目的ip地址 

  546. *参数:socket:端口:0-3 

  547. *     ip:读取的目的ip,4字节 

  548. **********************************************************************/  

  549.   

  550. void drv_w5100_get_socket_dst_ip(uint8_t socket,uint8_t *ip);  

  551.   

  552. /********************************************************************* 

  553. *                           w5100设置端口的目的端口号 

  554. *参数:socket:端口:0-3 

  555. *     port:目的端口号 

  556. **********************************************************************/  

  557.   

  558. void drv_w5100_set_socket_dst_port(uint8_t socket,uint16_t port);  

  559.   

  560. /********************************************************************* 

  561. *                           读取w5100端口的目的端口号 

  562. *参数:socket:端口:0-3 

  563. *返回:端口号 

  564. **********************************************************************/  

  565.   

  566. uint16_t drv_w5100_get_socket_dst_port(uint8_t socket);  

  567.   

  568. /********************************************************************* 

  569. *                           设置w5100端口缓存大小 

  570. *说明:4个端口发送总缓存为8KB,接收总缓存为8KB 

  571. *参数:tx_size:发送缓存大小数组,4字节长度,值只能取1,2,4,8这4个.单位为KB 

  572. *     rx_size:发送缓存大小数组,4字节长度,值只能取1,2,4,8这4个.单位为KB 

  573. **********************************************************************/  

  574.   

  575. void drv_w5100_set_socket_buf_size(uint8_t *tx_size,uint8_t *rx_size);  

  576.   

  577. /********************************************************************* 

  578. *                           读取w5100端口的发送存储器剩余空间寄存器 

  579. *参数:socket:端口:0-3 

  580. *返回:发送存储器剩余空间 

  581. **********************************************************************/  

  582.   

  583. uint16_t drv_w5100_get_socket_tx_fsr(uint8_t socket);  

  584.   

  585. /********************************************************************* 

  586. *                           读取w5100端口的接收数据字节数寄存器 

  587. *参数:socket:端口:0-3 

  588. *返回:接收数据字节数 

  589. **********************************************************************/  

  590.   

  591. uint16_t drv_w5100_get_socket_rx_rsr(uint8_t socket);  

  592.   

  593. /********************************************************************* 

  594. *                           读取w5100端口接收的数据 

  595. *参数:socket:端口:0-3 

  596. *     buf:接收的数据存放的缓存 

  597. *     len:读取接收数据长度 

  598. **********************************************************************/  

  599.   

  600. //void drv_w5100_socket_rx(uint8_t socket,uint8_t *buf,uint16_t len);  

  601.   

  602. /********************************************************************* 

  603. *                           读取w5100端口接收的数据 

  604. *参数:socket:端口:0-3 

  605. *     buf:接收的数据存放的缓存 

  606. *     len:读取接收数据长度 

  607. *     ip:接收数据的ip 

  608. *     port:接收数据的端口 

  609. **********************************************************************/  

  610.   

  611. void drv_w5100_socket_rx(uint8_t socket,uint8_t *buf,uint16_t len,uint8_t *ip,uint16_t *port);  

  612.   

  613. /********************************************************************* 

  614. *                           w5100端口发送数据 

  615. *参数:socket:端口:0-3 

  616. *     buf:发送的数据存放的缓存 

  617. *     len:发送数据长度 

  618. **********************************************************************/  

  619.   

  620. void drv_w5100_socket_tx(uint8_t socket,uint8_t *buf,uint16_t len);  

  621.   

  622. #endif  

  623.   

  624.   


drv_w5100.c


  1. /********************************************************************* 

  2. *                               w5100驱动层文件 

  3. *                             (c)copyright 2013,jdh 

  4. *                               All Right Reserved 

  5. *文件名:drv_w5100.c 

  6. *程序员:jdh 

  7. *修改日期:2013/10/22 

  8. *         2013/10/23 

  9. *         2013/10/24 

  10. **********************************************************************/  

  11.   

  12. /********************************************************************* 

  13. *                           头文件 

  14. **********************************************************************/  

  15.   

  16. #include 'drv_w5100.h'  

  17. #include 'drv_delay.h'  

  18.   

  19. /********************************************************************* 

  20. *                           全局变量定义 

  21. **********************************************************************/  

  22.   

  23. /********************************************************************* 

  24. *                           发送缓存区参数 

  25. **********************************************************************/  

  26.   

  27. struct _W5100_Buf W5100_Tx_Buf[4];  

  28.   

  29. /********************************************************************* 

  30. *                           接收缓存区参数 

  31. **********************************************************************/  

  32.   

  33. struct _W5100_Buf W5100_Rx_Buf[4];  

  34.   

  35. /********************************************************************* 

  36. *                           函数 

  37. **********************************************************************/  

  38.   

  39. /********************************************************************* 

  40. *                           初始化w5100 

  41. *参数:ip:本机ip,4字节 

  42. *     mac:本机mac,6字节 

  43. *     submask:掩码:4字节 

  44. *     gateway:网关,4字节 

  45. *     socket_tx_size:socket发送缓存大小,4字节 

  46. *     socket_rx_size:socket接收缓存大小,4字节 

  47. **********************************************************************/  

  48.   

  49. void drv_w5100_init(uint8_t *ip,uint8_t *mac,uint8_t *submask,uint8_t *gateway,\  

  50.                     uint8_t *socket_tx_size,uint8_t *socket_rx_size)  

  51. {  

  52.     uint8_t value = 0;  

  53.       

  54.     //初始化IO  

  55.     drv_w5100_init_io();  

  56.     //SPI初始化  

  57.     drv_w5100_init_spi();  

  58.     //中断初始化  

  59.     drv_w5100_init_irq();  

  60.       

  61.     //复位w5100  

  62.     drv_w5100_reset();  

  63.     //软复位  

  64.     drv_w5100_tx_byte(W5100_MODE,MODE_RST);  

  65.     drv_delay_ms(300);  

  66.       

  67.     //设置ip  

  68.     drv_w5100_set_ip(ip);  

  69.     //设置mac  

  70.     drv_w5100_set_mac(mac);  

  71.     //设置掩码  

  72.     drv_w5100_set_submask(submask);  

  73.     //设置网关  

  74.     drv_w5100_set_gateway(gateway);  

  75.     //端口缓存设置  

  76.     drv_w5100_set_socket_buf_size(socket_tx_size,socket_rx_size);  

  77.       

  78.     //设置中断  

  79.     value = drv_w5100_rx_byte(W5100_IMR);  

  80.     value |= IMR_CONFLICT | IMR_UNREACH | \  

  81.              IMR_S0_INT | IMR_S1_INT | IMR_S2_INT | IMR_S3_INT;  

  82.     drv_w5100_tx_byte(W5100_IMR,value);  

  83. }  

  84.   

  85. /********************************************************************* 

  86. *                           初始化io 

  87. *说明:初始化/INT和/RESET引脚 

  88. **********************************************************************/  

  89.   

  90. void drv_w5100_init_io(void)  

  91. {  

  92.     //定义IO初始化结构体  

  93.     GPIO_InitTypeDef GPIO_InitStructure;  

  94.   

  95.     //初始化时钟  

  96.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);  

  97.     //管脚初始化    

  98.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;  

  99.     //选择GPIO响应速度  

  100.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;      

  101.     //设置为输出             

  102.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   

  103.     //初始化                 

  104.     GPIO_Init(GPIOD, &GPIO_InitStructure);    

  105.       

  106.     //初始化时钟  

  107.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);  

  108.     //管脚初始化    

  109.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;  

  110.     //选择GPIO响应速度  

  111.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;      

  112.     //设置为输入           

  113.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   

  114.     //初始化                 

  115.     GPIO_Init(GPIOD, &GPIO_InitStructure);    

  116. }  

  117.   

  118. /********************************************************************* 

  119. *                           初始化spi 

  120. **********************************************************************/  

  121.   

  122. void drv_w5100_init_spi(void)  

  123. {  

  124.     //定义IO初始化结构体  

  125.     GPIO_InitTypeDef GPIO_InitStructure ;  

  126.     //定义SPI初始化结构体  

  127.     SPI_InitTypeDef  SPI_InitStructure ;  

  128.   

  129.     //配置其他引脚  

  130.     //配置CS  

  131.     //开启时钟  

  132.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE ) ;  

  133.     //配置SPI引脚CSN  

  134.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15 | GPIO_Pin_12;  

  135.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;  

  136.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ;  

  137.     GPIO_Init( GPIOA, &GPIO_InitStructure );  

  138.     //PA15默认是JTDI脚,重映射关闭JTDI功能  

  139.     GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);  

  140.       

  141.     //关闭w5100  

  142.     drv_w5100_enable(0);  

  143.     drv_w5100_enable(1);  

  144.     drv_w5100_enable(0);  

  145.   

  146.     //初始化SPI  

  147.     //关闭SPI  

  148.     SPI_Cmd(SPI3,DISABLE);  

  149.     //初始化SPI时钟    

  150.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3,ENABLE);  

  151.     //设置IO口时钟        

  152.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);   

  153.     //配置SPI3引脚:SCK, MISO and MOSI  

  154.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;  

  155.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP ;  

  156.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ;  

  157.     GPIO_Init( GPIOB, &GPIO_InitStructure );  

  158.     // SPI配置  

  159.     SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex ;  

  160.     SPI_InitStructure.SPI_Mode = SPI_Mode_Master ;  

  161.     SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b ;  

  162.     SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low ;  

  163.     SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge ;  

  164.     SPI_InitStructure.SPI_NSS = SPI_NSS_Soft ;  

  165.     //SPI波特率分频设置:72M-18M,64M-16M  

  166.     SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4 ;  

  167.     //SPI设置成LSB模式  

  168.     SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB ;  

  169.     SPI_InitStructure.SPI_CRCPolynomial = 7 ;  

  170.     SPI_Init( SPI3, &SPI_InitStructure ) ;  

  171.   

  172.     //启动SPI  

  173.     SPI_Cmd(SPI3,ENABLE);  

  174. }  

  175.   

  176. /********************************************************************* 

  177. *                           初始化中断 

  178. **********************************************************************/  

  179.   

  180. void drv_w5100_init_irq(void)  

  181. {  

  182.     //定义中断结构体  

  183.     NVIC_InitTypeDef NVIC_InitStructure ;  

  184.     //定义外部中断结构体  

  185.     EXTI_InitTypeDef EXTI_InitStructure;  

  186.   

  187.     //初始化中断脚PD6时钟  

  188.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);  

  189.     //配置中断源为PD6  

  190.     GPIO_EXTILineConfig(GPIO_PortSourceGPIOD,GPIO_PinSource6);  

  191.     // 配置EXTI_Line6下降沿触发  

  192.     EXTI_ClearITPendingBit(EXTI_Line6);  

  193.     EXTI_InitStructure.EXTI_Line = EXTI_Line6;  

  194.     EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;  

  195.     EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;  

  196.     EXTI_InitStructure.EXTI_LineCmd = ENABLE;  

  197.     EXTI_Init(&EXTI_InitStructure);  

  198.     //打开NTRX中断  

  199.     NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;              //通道设置为外部中断线  

  200.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;       //中断抢占先等级  

  201.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;              //中断响应优先级  

  202.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                 //打开中断  

  203.     NVIC_Init(&NVIC_InitStructure);                                 //初始化  

  204.       

  205.     //清中断  

  206.     //EXTI_ClearITPendingBit(EXTI9_5_IRQn);  

  207.     //EXTI_Line0中断允许  

  208.     //EXTI_GenerateSWInterrupt(EXTI_Line6);  

  209. }  

  210.   

  211. /********************************************************************* 

  212. *                           复位w5100 

  213. **********************************************************************/  

  214.   

  215. void drv_w5100_reset(void)  

  216. {  

  217.     GPIO_ResetBits(GPIOD,GPIO_Pin_3);   

  218.     drv_delay_ms(20);     

  219.     GPIO_SetBits(GPIOD,GPIO_Pin_3);                    

  220. }  

  221.   

  222. /********************************************************************* 

  223. *                           使能芯片 

  224. *参数:enable:1使能,0关闭 

  225. **********************************************************************/  

  226.   

  227. void drv_w5100_enable(uint8_t enable)  

  228. {  

  229.     if (enable)  

  230.     {  

  231.         //使能  

  232.         GPIO_ResetBits(GPIOA,GPIO_Pin_15);   

  233.     }  

  234.     else  

  235.     {  

  236.         //关闭  

  237.         GPIO_SetBits(GPIOA,GPIO_Pin_15);  

  238.     }  

  239. }  

  240.   

  241. /********************************************************************* 

  242. *                           spi口发送一个字节 

  243. *参数:byte:发送的字节 

  244. *返回:收到的字节 

  245. **********************************************************************/  

  246.   

  247. uint8_t drv_w5100_spi_tx_byte(uint8_t byte)  

  248. {  

  249.     while (SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == RESET);  

  250.     SPI_I2S_SendData(SPI3,byte);      

  251.   

  252.     while (SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_RXNE) == RESET);  

  253.     return SPI_I2S_ReceiveData(SPI3);     

  254. }  

  255.   

  256. /********************************************************************* 

  257. *                           w5100写入一个字节 

  258. *参数:addr:地址 

  259. *     byte:字节 

  260. **********************************************************************/  

  261.   

  262. void drv_w5100_tx_byte(uint16_t addr,uint8_t byte)  

  263. {     

  264.     //使能w5100  

  265.     drv_w5100_enable(1);  

  266.     

  267.     drv_w5100_spi_tx_byte(WRITE_COMMAND);  

  268.     drv_w5100_spi_tx_byte(addr / 256);        

  269.     drv_w5100_spi_tx_byte(addr % 256);        

  270.     drv_w5100_spi_tx_byte(byte);              

  271.     

  272.     //关闭w5100  

  273.     drv_w5100_enable(0);  

  274. }  

  275.   

  276. /********************************************************************* 

  277. *                           w5100写缓存 

  278. *参数:addr:w5100缓存开始地址 

  279. *     buf:缓存区地址 

  280. *     len:缓存长度 

  281. **********************************************************************/  

  282.   

  283. void drv_w5100_tx_buf(uint16_t addr,uint8_t *buf,uint16_t len)  

  284. {  

  285.     uint16_t i;  

  286.   

  287.     for (i = 0; i < len; i++)  

  288.     {  

  289.         drv_w5100_tx_byte(addr + i,*buf++);  

  290.     }     

  291. }  

  292.   

  293. /********************************************************************* 

  294. *                           w5100读取一个字节 

  295. *参数:addr:地址 

  296. *返回:读取的字节 

  297. **********************************************************************/  

  298.   

  299. uint8_t drv_w5100_rx_byte(uint16_t addr)  

  300. {  

  301.     uint8_t byte = 0;  

  302.       

  303.     //使能w5100  

  304.     drv_w5100_enable(1);  

  305.       

  306.     drv_w5100_spi_tx_byte(READ_COMMAND);  

  307.     drv_w5100_spi_tx_byte(addr / 256);        

  308.     drv_w5100_spi_tx_byte(addr % 256);        

  309.     byte = drv_w5100_spi_tx_byte(0);              

  310.     

  311.     //关闭w5100  

  312.     drv_w5100_enable(0);  

  313.     

  314.     return byte;  

  315. }  

  316.   

  317. /********************************************************************* 

  318. *                           w5100读取缓存 

  319. *参数:addr:w5100缓存开始地址 

  320. *     buf:读取存放的缓存区地址 

  321. *     len:读取长度 

  322. **********************************************************************/  

  323.   

  324. void drv_w5100_rx_buf(uint16_t addr,uint8_t *buf,uint16_t len)  

  325. {  

  326.     uint16_t i;  

  327.   

  328.     for (i = 0; i < len; i++)  

  329.     {  

  330.         *buf++ = drv_w5100_rx_byte(addr++);  

  331.     }     

  332. }   

  333.   

  334. /********************************************************************* 

  335. *                           w5100设置网关 

  336. *参数:addr:需要设置的网关,4字节 

  337. **********************************************************************/  

  338.   

  339. void drv_w5100_set_gateway(uint8_t *addr)  

  340. {     

  341.     uint8_t i = 0;  

  342.       

  343.     for (i = 0;i < 4;i++)  

  344.     {  

  345.         drv_w5100_tx_byte(W5100_GAR + i,addr[i]);  

  346.     }  

  347. }  

  348.   

  349. /********************************************************************* 

  350. *                           读取w5100网关 

  351. *参数:addr:读取的网关存放地址,4字节长度 

  352. **********************************************************************/  

  353.   

  354. void drv_w5100_get_gateway(uint8_t *addr)  

  355. {  

  356.     uint8_t i = 0;  

  357.       

  358.     for (i = 0;i < 4;i++)  

  359.     {  

  360.         addr[i] = drv_w5100_rx_byte(W5100_GAR + i);  

  361.     }  

  362. }  

  363.   

  364. /********************************************************************* 

  365. *                           w5100设置子网掩码 

  366. *参数:addr:需要设置的子网掩码,4字节 

  367. **********************************************************************/  

  368.   

  369. void drv_w5100_set_submask(uint8_t *addr)  

  370. {  

  371.     uint8_t i = 0;  

  372.       

  373.     for (i = 0;i < 4;i++)  

  374.     {  

  375.         drv_w5100_tx_byte(W5100_SUBR + i,addr[i]);  

  376.     }  

  377. }  

  378.   

  379. /********************************************************************* 

  380. *                           读取w5100子网掩码 

  381. *参数:addr:读取的子网掩码,4字节 

  382. **********************************************************************/  

  383.   

  384. void drv_w5100_get_submask(uint8_t *addr)  

  385. {     

  386.     uint8_t i = 0;  

  387.       

  388.     for (i = 0;i < 4;i++)  

  389.     {  

  390.         addr[i] = drv_w5100_rx_byte(W5100_SUBR + i);  

  391.     }  

  392. }  

  393.   

  394. /********************************************************************* 

  395. *                           w5100设置mac地址 

  396. *参数:mac:需要设置的mac,6字节 

  397. **********************************************************************/  

  398.   

  399. void drv_w5100_set_mac(uint8_t *mac)  

  400. {  

  401.     uint8_t i = 0;  

  402.       

  403.     for (i = 0;i < 6;i++)  

  404.     {  

  405.         drv_w5100_tx_byte(W5100_SHAR + i,mac[i]);  

  406.     }  

  407. }  

  408.   

  409. /********************************************************************* 

  410. *                           读取w5100的mac地址 

  411. *参数:addr:读取mac地址,6字节 

  412. **********************************************************************/  

  413.   

  414. void drv_w5100_get_mac(uint8_t *mac)  

  415. {     

  416.     uint8_t i = 0;  

  417.       

  418.     for (i = 0;i < 6;i++)  

  419.     {  

  420.         mac[i] = drv_w5100_rx_byte(W5100_SHAR + i);  

  421.     }  

  422. }  

  423.   

  424. /********************************************************************* 

  425. *                           w5100设置本机ip 

  426. *参数:ip:需要设置的ip,4字节 

  427. **********************************************************************/  

  428.   

  429. void drv_w5100_set_ip(uint8_t *ip)  

  430. {  

  431.     uint8_t i = 0;  

  432.       

  433.     for (i = 0;i < 4;i++)  

  434.     {  

  435.         drv_w5100_tx_byte(W5100_SIPR + i,ip[i]);  

  436.     }  

  437. }  

  438.   

  439. /********************************************************************* 

  440. *                           读取w5100的ip地址 

  441. *参数:addr:读取ip地址,4字节 

  442. **********************************************************************/  

  443.   

  444. void drv_w5100_get_ip(uint8_t *ip)  

  445. {     

  446.     uint8_t i = 0;  

  447.       

  448.     for (i = 0;i < 4;i++)  

  449.     {  

  450.         ip[i] = drv_w5100_rx_byte(W5100_SIPR + i);  

  451.     }  

  452. }  

  453.   

  454. /********************************************************************* 

  455. *                           w5100设置端口的端口号 

  456. *参数:socket:端口:0-3 

  457. *     port:端口号 

  458. **********************************************************************/  

  459.   

  460. void drv_w5100_set_socket_port(uint8_t socket,uint16_t port)  

  461. {  

  462.     uint16_t reg = 0;  

  463.       

  464.     //根据端口号选择寄存器地址  

  465.     reg = W5100_S0_PORT + socket * 0x100;  

  466.     //设置端口号  

  467.     drv_w5100_tx_byte(reg,(port >> 8) & 0xff);  

  468.     drv_w5100_tx_byte(reg + 1,port & 0xff);  

  469. }  

  470.   

  471. /********************************************************************* 

  472. *                           读取w5100端口的端口号 

  473. *参数:socket:端口:0-3 

  474. *返回:端口号 

  475. **********************************************************************/  

  476.   

  477. uint16_t drv_w5100_get_socket_port(uint8_t socket)  

  478. {  

  479.     uint16_t reg = 0;  

  480.     uint16_t port = 0;  

  481.       

  482.     //根据端口号选择寄存器地址  

  483.     reg = W5100_S0_PORT + socket * 0x100;  

  484.     //设置端口号  

  485.     port = drv_w5100_rx_byte(reg);  

  486.     port = (port << 8) + drv_w5100_rx_byte(reg + 1);  

  487.       

  488.     return port;  

  489. }  

  490.   

  491. /********************************************************************* 

  492. *                           w5100设置端口的目的mac地址 

  493. *参数:socket:端口:0-3 

  494. *     mac:需要设置的mac,6字节 

  495. **********************************************************************/  

  496.   

  497. void drv_w5100_set_socket_mac(uint8_t socket,uint8_t *mac)  

  498. {  

  499.     uint8_t i = 0;  

  500.     uint16_t reg = 0;  

  501.       

  502.     //根据端口号选择寄存器地址  

  503.     reg = W5100_S0_DHAR + socket * 0x100;  

  504.     //设置mac  

  505.     for (i = 0;i < 6;i++)  

  506.     {  

  507.         drv_w5100_tx_byte(reg + i,mac[i]);  

  508.     }  

  509. }  

  510.   

  511. /********************************************************************* 

  512. *                           读取w5100端口的目的mac地址 

  513. *参数:socket:端口:0-3 

  514. *     mac:读取的目的mac,6字节 

  515. **********************************************************************/  

  516.   

  517. void drv_w5100_get_socket_mac(uint8_t socket,uint8_t *mac)  

  518. {  

  519.     uint8_t i = 0;  

  520.     uint16_t reg = 0;  

  521.       

  522.     //根据端口号选择寄存器地址  

  523.     reg = W5100_S0_DHAR + socket * 0x100;  

  524.     //设置mac  

  525.     for (i = 0;i < 6;i++)  

  526.     {  

  527.         mac[i] = drv_w5100_rx_byte(reg + i);  

  528.     }  

  529. }  

  530.   

  531. /********************************************************************* 

  532. *                           w5100设置端口的目的ip地址 

  533. *参数:socket:端口:0-3 

  534. *     ip:需要设置的ip,4字节 

  535. **********************************************************************/  

  536.   

  537. void drv_w5100_set_socket_dst_ip(uint8_t socket,uint8_t *ip)  

  538. {  

  539.     uint8_t i = 0;  

  540.     uint16_t reg = 0;  

  541.       

  542.     //根据端口号选择寄存器地址  

  543.     reg = W5100_S0_DIPR + socket * 0x100;  

  544.     //设置ip  

  545.     for (i = 0;i < 4;i++)  

  546.     {  

  547.         drv_w5100_tx_byte(reg + i,ip[i]);  

  548.     }  

  549. }  

  550.   

  551. /********************************************************************* 

  552. *                           读取w5100端口的目的ip地址 

  553. *参数:socket:端口:0-3 

  554. *     ip:读取的目的ip,4字节 

  555. **********************************************************************/  

  556.   

  557. void drv_w5100_get_socket_dst_ip(uint8_t socket,uint8_t *ip)  

  558. {  

  559.     uint8_t i = 0;  

  560.     uint16_t reg = 0;  

  561.       

  562.     //根据端口号选择寄存器地址  

  563.     reg = W5100_S0_DIPR + socket * 0x100;  

  564.     //读取ip  

  565.     for (i = 0;i < 4;i++)  

  566.     {  

  567.         ip[i] = drv_w5100_rx_byte(reg + i);  

  568.     }  

  569. }  

  570.   

  571. /********************************************************************* 

  572. *                           w5100设置端口的目的端口号 

  573. *参数:socket:端口:0-3 

  574. *     port:目的端口号 

  575. **********************************************************************/  

  576.   

  577. void drv_w5100_set_socket_dst_port(uint8_t socket,uint16_t port)  

  578. {  

  579.     uint16_t reg = 0;  

  580.       

  581.     //根据端口号选择寄存器地址  

  582.     reg = W5100_S0_DPORT + socket * 0x100;  

  583.     //设置端口号  

  584.     drv_w5100_tx_byte(reg,(port >> 8) & 0xff);  

  585.     drv_w5100_tx_byte(reg + 1,port & 0xff);  

  586. }  

  587.   

  588. /********************************************************************* 

  589. *                           读取w5100端口的目的端口号 

  590. *参数:socket:端口:0-3 

  591. *返回:端口号 

  592. **********************************************************************/  

  593.   

  594. uint16_t drv_w5100_get_socket_dst_port(uint8_t socket)  

  595. {  

  596.     uint16_t reg = 0;  

  597.     uint16_t port = 0;  

  598.       

  599.     //根据端口号选择寄存器地址  

  600.     reg = W5100_S0_DPORT + socket * 0x100;  

  601.     //设置端口号  

  602.     port = drv_w5100_rx_byte(reg);  

  603.     port = (port << 8) + drv_w5100_rx_byte(reg + 1);  

  604.       

  605.     return port;  

  606. }  

  607.   

  608. /********************************************************************* 

  609. *                           设置w5100端口缓存大小 

  610. *说明:4个端口发送总缓存为8KB,接收总缓存为8KB 

  611. *参数:tx_size:发送缓存大小数组,4字节长度,值只能取1,2,4,8这4个.单位为KB 

  612. *     rx_size:发送缓存大小数组,4字节长度,值只能取1,2,4,8这4个.单位为KB 

  613. **********************************************************************/  

  614.   

  615. void drv_w5100_set_socket_buf_size(uint8_t *tx_size,uint8_t *rx_size)  

  616. {  

  617.     uint8_t value = 0;  

  618.     uint8_t i = 0;  

  619.     uint8_t tx_reg[4] = {0};  

  620.     uint8_t rx_reg[4] = {0};  

  621.       

  622.     for (i = 0;i < 4;i++)  

  623.     {  

  624.         switch (tx_size[i])  

  625.         {  

  626.         case 1:  

  627.             {  

  628.                 tx_reg[i] = 0;  

  629.                 break;  

  630.             }  

  631.         case 2:  

  632.             {  

  633.                 tx_reg[i] = 1;  

  634.                 break;  

  635.             }  

  636.         case 4:  

  637.             {  

  638.                 tx_reg[i] = 2;  

  639.                 break;  

  640.             }  

  641.         case 8:  

  642.             {  

  643.                 tx_reg[i] = 3;  

  644.                 break;  

  645.             }  

  646.         }  

  647.           

  648.         switch (rx_size[i])  

  649.         {  

  650.         case 1:  

  651.             {  

  652.                 rx_reg[i] = 0;  

  653.                 break;  

  654.             }  

  655.         case 2:  

  656.             {  

  657.                 rx_reg[i] = 1;  

  658.                 break;  

  659.             }  

  660.         case 4:  

  661.             {  

  662.                 rx_reg[i] = 2;  

  663.                 break;  

  664.             }  

  665.         case 8:  

  666.             {  

  667.                 rx_reg[i] = 3;  

  668.                 break;  

  669.             }  

  670.         }  

  671.     }  

  672.       

  673.     //设置写缓存大小  

  674.     value = (tx_reg[3] << 6) + (tx_reg[2] << 4) + \  

  675.             (tx_reg[1] << 2) + tx_reg[0];  

  676.     drv_w5100_tx_byte(W5100_TMSR, value);  

  677.       

  678.     //设置读缓存大小  

  679.     value = (rx_reg[3] << 6) + (rx_reg[2] << 4) + \  

  680.             (rx_reg[1] << 2) + rx_reg[0];  

  681.     drv_w5100_tx_byte(W5100_RMSR, value);  

  682.       

  683.     //设置缓冲区参数  

  684.     for (i = 0;i < 4;i++)  

  685.     {  

  686.         //缓冲区大小  

  687.         W5100_Tx_Buf[i].size = tx_size[i] * 1024;  

  688.         W5100_Rx_Buf[i].size = rx_size[i] * 1024;  

  689.           

  690.         //屏蔽地址  

  691.         W5100_Tx_Buf[i].mask_addr = W5100_Tx_Buf[i].size - 1;  

  692.         W5100_Rx_Buf[i].mask_addr = W5100_Rx_Buf[i].size - 1;  

  693.           

  694.         //基地址  

  695.         if (i == 0)  

  696.         {  

  697.             W5100_Tx_Buf[i].base_addr = W5100_TX;  

  698.             W5100_Rx_Buf[i].base_addr = W5100_RX;  

  699.         }  

  700.         else  

  701.         {  

  702.             W5100_Tx_Buf[i].base_addr = W5100_Tx_Buf[i - 1].base_addr + W5100_Tx_Buf[i - 1].size;  

  703.             W5100_Rx_Buf[i].base_addr = W5100_Rx_Buf[i - 1].base_addr + W5100_Tx_Buf[i - 1].size;  

  704.         }  

  705.     }  

  706. }  

  707.   

  708. /********************************************************************* 

  709. *                           读取w5100端口的发送存储器剩余空间寄存器 

  710. *参数:socket:端口:0-3 

  711. *返回:发送存储器剩余空间 

  712. **********************************************************************/  

  713.   

  714. uint16_t drv_w5100_get_socket_tx_fsr(uint8_t socket)  

  715. {  

  716.     uint16_t reg = 0;  

  717.     uint16_t size1 = 0;  

  718.     uint16_t size2 = 0;  

  719.       

  720.     //根据端口号选择寄存器地址  

  721.     reg = W5100_S0_TX_FSR + socket * 0x100;  

  722.       

  723.     while (1)  

  724.     {  

  725.         //读取中断寄存器  

  726.         size1 = drv_w5100_rx_byte(reg);  

  727.         size1 = (size1 << 8) + drv_w5100_rx_byte(reg + 1);  

  728.         if (size1 != 0)  

  729.         {  

  730.             size2 = drv_w5100_rx_byte(reg);  

  731.             size2 = (size2 << 8) + drv_w5100_rx_byte(reg + 1);  

  732.               

  733.             if (size1 == size2)  

  734.             {  

  735.                 break;  

  736.             }  

  737.         }  

  738.     }  

  739.       

  740.     return size1;  

  741. }  

  742.   

  743. /********************************************************************* 

  744. *                           读取w5100端口的接收数据字节数寄存器 

  745. *参数:socket:端口:0-3 

  746. *返回:接收数据字节数 

  747. **********************************************************************/  

  748.   

  749. uint16_t drv_w5100_get_socket_rx_rsr(uint8_t socket)  

  750. {  

  751.     uint16_t reg = 0;  

  752.     uint16_t size1 = 0;  

  753.     uint16_t size2 = 0;  

  754.       

  755.     //根据端口号选择寄存器地址  

  756.     reg = W5100_S0_RX_RSR + socket * 0x100;  

  757.       

  758.     while (1)  

  759.     {  

  760.         //读取中断寄存器  

  761.         size1 = drv_w5100_rx_byte(reg);  

  762.         size1 = (size1 << 8) + drv_w5100_rx_byte(reg + 1);  

  763.         if (size1 != 0)  

  764.         {  

  765.             size2 = drv_w5100_rx_byte(reg);  

  766.             size2 = (size2 << 8) + drv_w5100_rx_byte(reg + 1);  

  767.               

  768.             if (size1 == size2)  

  769.             {  

  770.                 break;  

  771.             }  

  772.         }  

  773.     }  

  774.       

  775.     return size1;  

  776. }  

  777.   

  778. /********************************************************************* 

  779. *                           读取w5100端口接收的数据 

  780. *参数:socket:端口:0-3 

  781. *     buf:接收的数据存放的缓存 

  782. *     len:读取接收数据长度 

  783. *     ip:接收数据的ip 

  784. *     port:接收数据的端口 

  785. **********************************************************************/  

  786.   

  787. void drv_w5100_socket_rx(uint8_t socket,uint8_t *buf,uint16_t len,uint8_t *ip,uint16_t *port)  

  788. {  

  789.     uint16_t shift = 0;  

  790.     uint16_t addr = 0;  

  791.     uint16_t reg = 0;  

  792.     uint16_t size = 0;  

  793.     uint16_t i = 0;  

  794.     uint8_t header[8] = {0};  

  795.       

  796.     //读取接收缓冲区偏移量  

  797.     reg = W5100_S0_RX_RR + socket * 0x100;  

  798.     shift = drv_w5100_rx_byte(reg);  

  799.     shift = (shift << 8) + drv_w5100_rx_byte(reg + 1);  

  800.     //实际的偏移量  

  801.     shift &= W5100_Rx_Buf[socket].mask_addr;  

  802.     //物理地址  

  803.     addr = W5100_Rx_Buf[socket].base_addr + shift;  

  804.   

  805.     /* 

  806.     for (i = 0;i < len;i++) 

  807.     { 

  808.         if (shift >= W5100_Rx_Buf[socket].size) 

  809.         { 

  810.             addr = W5100_Rx_Buf[socket].base_addr; 

  811.             shift = 0; 

  812.         } 

  813.         buf[i] = drv_w5100_rx_byte(addr++); 

  814.         shift++; 

  815.     } 

  816.     */  

  817.     /* 

  818.     //读取正文 

  819.     if (shift + len > W5100_Rx_Buf[socket].size) 

  820.     { 

  821.         size = W5100_Rx_Buf[socket].size - shift; 

  822.         drv_w5100_rx_buf(addr, buf, size); 

  823.         drv_w5100_rx_buf(W5100_Rx_Buf[socket].base_addr, buf + size, len - size); 

  824.     } 

  825.     else 

  826.     { 

  827.         drv_w5100_rx_buf(addr, buf, len); 

  828.     } 

  829.     */  

  830.     //读取帧头  

  831.     if (shift + 8 > W5100_Rx_Buf[socket].size)  

  832.     {  

  833.         size = W5100_Rx_Buf[socket].size - shift;  

  834.         drv_w5100_rx_buf(addr, header, size);  

  835.         drv_w5100_rx_buf(W5100_Rx_Buf[socket].base_addr, header + size, 8 - size);  

  836.         shift = 8 - size;  

  837.     }  

  838.     else  

  839.     {  

  840.         drv_w5100_rx_buf(addr, header, 8);  

  841.         shift += 8;  

  842.     }  

  843.       

  844.     //保存帧头  

  845.     //读取ip  

  846.     ip[0] = header[0];  

  847.     ip[1] = header[1];  

  848.     ip[2] = header[2];  

  849.     ip[3] = header[3];  

  850.     //端口  

  851.     *port = (header[4] << 8) + header[5];  

  852.       

  853.     //实际地址更改  

  854.     addr = W5100_Rx_Buf[socket].base_addr + shift;  

  855.     //接收数据长度更改  

  856.     len -= 8;  

  857.       

  858.     //读取正文  

  859.     if (shift + len > W5100_Rx_Buf[socket].size)  

  860.     {  

  861.         size = W5100_Rx_Buf[socket].size - shift;  

  862.         drv_w5100_rx_buf(addr, buf, size);  

  863.         drv_w5100_rx_buf(W5100_Rx_Buf[socket].base_addr, buf + size, len - size);  

  864.     }  

  865.     else  

  866.     {  

  867.         drv_w5100_rx_buf(addr, buf, len);  

  868.     }  

  869.       

  870.     //计算下一次偏移量  

  871.     shift = drv_w5100_rx_byte(reg);  

  872.     shift = (shift << 8) + drv_w5100_rx_byte(reg + 1);  

  873.     shift += len + 8;  

  874.     drv_w5100_tx_byte(reg,(shift >> 8) & 0xff);  

  875.     drv_w5100_tx_byte(reg + 1,shift & 0xff);  

  876.       

  877.     //接收处理完成  

  878.     reg = W5100_S0_CR + socket * 0x100;  

  879.     drv_w5100_tx_byte(reg,S_CR_RECV);  

  880. }  

  881.   

  882. /********************************************************************* 

  883. *                           w5100端口发送数据 

  884. *参数:socket:端口:0-3 

  885. *     buf:发送的数据存放的缓存 

  886. *     len:发送数据长度 

  887. **********************************************************************/  

  888.   

  889. void drv_w5100_socket_tx(uint8_t socket,uint8_t *buf,uint16_t len)  

  890. {  

  891.     uint16_t shift = 0;  

  892.     uint16_t addr = 0;  

  893.     uint16_t reg = 0;  

  894.     uint16_t size = 0;  

  895.       

  896.     //根据端口号选择寄存器地址  

  897.     reg = W5100_S0_TX_WR + socket * 0x100;  

  898.     //获得接收缓冲区读指针地址  

  899.     shift = drv_w5100_rx_byte(reg);  

  900.     shift = (shift << 8) + drv_w5100_rx_byte(reg + 1);  

  901.     //偏移地址  

  902.     shift &= W5100_Tx_Buf[socket].mask_addr;  

  903.     //实际地址  

  904.     addr = W5100_Tx_Buf[socket].base_addr + shift;  

  905.       

  906.     //发送数据  

  907.     if (shift + len > W5100_Tx_Buf[socket].size)  

  908.     {  

  909.         size = W5100_Tx_Buf[socket].size - shift;  

  910.         drv_w5100_tx_buf(addr, buf, size);  

  911.         drv_w5100_tx_buf(W5100_Tx_Buf[socket].base_addr, buf + size, len - size);  

  912.     }  

  913.     else  

  914.     {  

  915.         drv_w5100_tx_buf(addr, buf, len);  

  916.     }  

  917.       

  918.     //发送指针偏移  

  919.     shift = drv_w5100_rx_byte(reg);  

  920.     shift = (shift << 8) + drv_w5100_rx_byte(reg + 1);  

  921.     shift += len;  

  922.     drv_w5100_tx_byte(reg, (shift >> 8) & 0xff);  

  923.     drv_w5100_tx_byte(reg + 1, shift & 0xff);  

  924.       

  925.     //根据端口号选择寄存器地址  

  926.     reg = W5100_S0_CR + socket * 0x100;  

  927.     //发送  

  928.     drv_w5100_tx_byte(reg, S_CR_SEND);  

  929. }  

  930.   

  931.   



接口层文件:

inf_w5100.h


  1. /********************************************************************* 

  2. *                         w5100接口层头文件 

  3. *                       (c)copyright 2013,jdh 

  4. *                         All Right Reserved 

  5. *文件名:inf_w5100.h 

  6. *程序员:jdh 

  7. *修改日期:2013/10/24 

  8. **********************************************************************/  

  9.   

  10. #ifndef _INF_W5100_H_  

  11. #define _INF_W5100_H_  

  12.   

  13. /********************************************************************* 

  14. *                           头文件 

  15. **********************************************************************/  

  16.   

  17. //驱动层头文件  

  18. #include 'drv_w5100.h'  

  19.   

  20. /********************************************************************* 

  21. *                           数据结构 

  22. **********************************************************************/  

  23.   

  24. /********************************************************************* 

  25. *                           数据结构 

  26. **********************************************************************/  

  27.   

  28. /********************************************************************* 

  29. *                           w5100端口中断信息 

  30. **********************************************************************/  

  31.   

  32. struct _W5100_Socket_Irq_Msg  

  33. {  

  34.     //端口中断  

  35.     uint8_t socket_int;  

  36.       

  37.     //数据发送完成  

  38.     uint8_t send_ok;  

  39.     //在连接或终止,数据发送等过程超时  

  40.     uint8_t timeout;  

  41.     //当端口接收到数据时  

  42.     uint8_t recv;  

  43.     //当收到终止连接请求或终止连接过程已结束  

  44.     uint8_t discon;  

  45.     //当连接成功时  

  46.     uint8_t con;  

  47.       

  48.     //接收ip  

  49.     uint8_t ip[4];  

  50.     //接收端口  

  51.     uint16_t port;  

  52.     //接收数据的字节数  

  53.     uint16_t size;  

  54. };  

  55.   

  56. /********************************************************************* 

  57. *                           w5100中断信息 

  58. **********************************************************************/  

  59.   

  60. struct _W5100_Irq_Msg  

  61. {  

  62.     //ip冲突  

  63.     uint8_t confict;  

  64.     //无法到达地址  

  65.     uint8_t unreach;  

  66.     //PPPoe连接关闭  

  67.     uint8_t pppoe;  

  68.       

  69.     //端口中断信息  

  70.     struct _W5100_Socket_Irq_Msg socket_msg[4];  

  71. };  

  72.   

  73. /********************************************************************* 

  74. *                           函数 

  75. **********************************************************************/  

  76.   

  77. /********************************************************************* 

  78. *                           初始化w5100 

  79. *参数:ip:本机ip,4字节 

  80. *     mac:本机mac,6字节 

  81. *     submask:掩码:4字节 

  82. *     gateway:网关,4字节 

  83. *     socket_tx_size:socket发送缓存大小,4字节 

  84. *     socket_rx_size:socket接收缓存大小,4字节 

  85. **********************************************************************/  

  86.   

  87. void inf_w5100_init(uint8_t *ip,uint8_t *mac,uint8_t *submask,uint8_t *gateway,\  

  88.                     uint8_t *socket_tx_size,uint8_t *socket_rx_size);  

  89.                       

  90. /********************************************************************* 

  91. *                           w5100设置本机ip 

  92. *参数:ip:需要设置的ip,4字节 

  93. **********************************************************************/  

  94.   

  95. void inf_w5100_set_ip(uint8_t *ip);  

  96.   

  97. /********************************************************************* 

  98. *                           读取w5100的ip地址 

  99. *参数:addr:读取ip地址,4字节 

  100. **********************************************************************/  

  101.   

  102. void inf_w5100_get_ip(uint8_t *ip);  

  103.   

  104. /********************************************************************* 

  105. *                           w5100设置mac地址 

  106. *参数:mac:需要设置的mac,6字节 

  107. **********************************************************************/  

  108.   

  109. void inf_w5100_set_mac(uint8_t *mac);  

  110.   

  111. /********************************************************************* 

  112. *                           读取w5100的mac地址 

  113. *参数:addr:读取mac地址,4字节 

  114. **********************************************************************/  

  115.   

  116. void inf_w5100_get_mac(uint8_t *mac);  

  117.   

  118. /********************************************************************* 

  119. *                           w5100设置网关 

  120. *参数:addr:需要设置的网关,4字节 

  121. **********************************************************************/  

  122.   

  123. void inf_w5100_set_gateway(uint8_t *addr);  

  124.   

  125. /********************************************************************* 

  126. *                           读取w5100网关 

  127. *参数:addr:读取的网关存放地址,4字节长度 

  128. **********************************************************************/  

  129.   

  130. void inf_w5100_get_gateway(uint8_t *addr);  

  131.   

  132. /********************************************************************* 

  133. *                           w5100设置子网掩码 

  134. *参数:addr:需要设置的子网掩码,4字节 

  135. **********************************************************************/  

  136.   

  137. void inf_w5100_set_submask(uint8_t *addr);  

  138.   

  139. /********************************************************************* 

  140. *                           读取w5100子网掩码 

  141. *参数:addr:读取的子网掩码,4字节 

  142. **********************************************************************/  

  143.   

  144. void inf_w5100_get_submask(uint8_t *addr);  

  145.   

  146. /********************************************************************* 

  147. *                           读取w5100端口的目的ip地址 

  148. *参数:socket:端口:0-3 

  149. *     ip:读取的目的ip,4字节 

  150. **********************************************************************/  

  151.   

  152. void inf_w5100_get_socket_dst_ip(uint8_t socket,uint8_t *ip);  

  153.   

  154. /********************************************************************* 

  155. *                           读取w5100端口的目的端口号 

  156. *参数:socket:端口:0-3 

  157. *返回:端口号 

  158. **********************************************************************/  

  159.   

  160. uint16_t inf_w5100_get_socket_dst_port(uint8_t socket);  

  161.   

  162. /********************************************************************* 

  163. *                           读取w5100端口的端口号 

  164. *参数:socket:端口:0-3 

  165. *返回:端口号 

  166. **********************************************************************/  

  167.   

  168. uint16_t inf_w5100_get_socket_port(uint8_t socket);  

  169.   

  170. /********************************************************************* 

  171. *                           w5100设置端口为udp模式 

  172. *参数:socket:端口:0-3 

  173. *     port:端口号 

  174. **********************************************************************/  

  175.   

  176. void inf_w5100_set_socket_udp_mode(uint8_t socket,uint16_t port);  

  177.   

  178. /********************************************************************* 

  179. *                           w5100发送数据 

  180. *参数:socket:端口 

  181. *     data:数据 

  182. *     size:大小,单位字节 

  183. *     ip:目标ip 

  184. *     port:目标端口号 

  185. **********************************************************************/  

  186.   

  187. void inf_w5100_write_data(uint16_t socket,uint8_t *data,uint16_t size,\  

  188.                           uint8_t *ip,uint16_t port);  

  189.   

  190. /********************************************************************* 

  191. *                           清除中断信息结构体 

  192. *参数:msg:中断结构体地址 

  193. **********************************************************************/  

  194.   

  195. void inf_w5100_clear_w5100_irg_msg(struct _W5100_Irq_Msg *msg);  

  196.                             

  197. /********************************************************************* 

  198. *                           w5100中断处理函数 

  199. *参数:msg:中断信息 

  200. *     buf0:接收socket0数据地址 

  201. *     buf1:接收socket1数据地址 

  202. *     buf2:接收socket2数据地址 

  203. *     buf3:接收socket3数据地址 

  204. **********************************************************************/  

  205.   

  206. void inf_w5100_irq_handler(struct _W5100_Irq_Msg *msg,uint8_t *buf0,uint8_t *buf1,uint8_t *buf2,uint8_t *buf3);  

  207.   

  208. #endif  

  209.   

  210.   


inf_w5100.c


  1. /********************************************************************* 

  2. *                         w5100接口层文件 

  3. *                       (c)copyright 2013,jdh 

  4. *                         All Right Reserved 

  5. *文件名:inf_w5100.c 

  6. *程序员:jdh 

  7. *修改日期:2013/10/24 

  8. **********************************************************************/  

  9.   

  10. /********************************************************************* 

  11. *                           头文件 

  12. **********************************************************************/  

  13.   

  14. #include 'inf_w5100.h'  

  15.   

  16. /********************************************************************* 

  17. *                           函数 

  18. **********************************************************************/  

  19.   

  20. /********************************************************************* 

  21. *                           初始化w5100 

  22. *参数:ip:本机ip,4字节 

  23. *     mac:本机mac,6字节 

  24. *     submask:掩码:4字节 

  25. *     gateway:网关,4字节 

  26. *     socket_tx_size:socket发送缓存大小,4字节 

  27. *     socket_rx_size:socket接收缓存大小,4字节 

  28. **********************************************************************/  

  29.   

  30. void inf_w5100_init(uint8_t *ip,uint8_t *mac,uint8_t *submask,uint8_t *gateway,\  

  31.                     uint8_t *socket_tx_size,uint8_t *socket_rx_size)  

  32. {  

  33.     drv_w5100_init(ip,mac,submask,gateway,socket_tx_size,socket_rx_size);  

  34. }  

  35.   

  36. /********************************************************************* 

  37. *                           w5100设置本机ip 

  38. *参数:ip:需要设置的ip,4字节 

  39. **********************************************************************/  

  40.   

  41. void inf_w5100_set_ip(uint8_t *ip)  

  42. {  

  43.     drv_w5100_set_ip(ip);  

  44. }  

  45.   

  46. /********************************************************************* 

  47. *                           读取w5100的ip地址 

  48. *参数:addr:读取ip地址,4字节 

  49. **********************************************************************/  

  50.   

  51. void inf_w5100_get_ip(uint8_t *ip)  

  52. {  

  53.     drv_w5100_get_ip(ip);  

  54. }  

  55.   

  56. /********************************************************************* 

  57. *                           w5100设置mac地址 

  58. *参数:mac:需要设置的mac,6字节 

  59. **********************************************************************/  

  60.   

  61. void inf_w5100_set_mac(uint8_t *mac)  

  62. {  

  63.     drv_w5100_set_mac(mac);  

  64. }  

  65.   

  66. /********************************************************************* 

  67. *                           读取w5100的mac地址 

  68. *参数:addr:读取mac地址,4字节 

  69. **********************************************************************/  

  70.   

  71. void inf_w5100_get_mac(uint8_t *mac)  

  72. {  

  73.     drv_w5100_get_mac(mac);  

  74. }  

  75.   

  76. /********************************************************************* 

  77. *                           w5100设置网关 

  78. *参数:addr:需要设置的网关,4字节 

  79. **********************************************************************/  

  80.   

  81. void inf_w5100_set_gateway(uint8_t *addr)  

  82. {  

  83.     drv_w5100_set_gateway(addr);  

  84. }  

  85.   

  86. /********************************************************************* 

  87. *                           读取w5100网关 

  88. *参数:addr:读取的网关存放地址,4字节长度 

  89. **********************************************************************/  

  90.   

  91. void inf_w5100_get_gateway(uint8_t *addr)  

  92. {  

  93.     drv_w5100_get_gateway(addr);  

  94. }  

  95.   

  96. /********************************************************************* 

  97. *                           w5100设置子网掩码 

  98. *参数:addr:需要设置的子网掩码,4字节 

  99. **********************************************************************/  

  100.   

  101. void inf_w5100_set_submask(uint8_t *addr)  

  102. {  

  103.     drv_w5100_set_submask(addr);  

  104. }  

  105.   

  106. /********************************************************************* 

  107. *                           读取w5100子网掩码 

  108. *参数:addr:读取的子网掩码,4字节 

  109. **********************************************************************/  

  110.   

  111. void inf_w5100_get_submask(uint8_t *addr)  

  112. {  

  113.     drv_w5100_get_submask(addr);  

  114. }  

  115.   

  116. /********************************************************************* 

  117. *                           读取w5100端口的目的ip地址 

  118. *参数:socket:端口:0-3 

  119. *     ip:读取的目的ip,4字节 

  120. **********************************************************************/  

  121.   

  122. void inf_w5100_get_socket_dst_ip(uint8_t socket,uint8_t *ip)  

  123. {  

  124.     drv_w5100_get_socket_dst_ip(socket,ip);  

  125. }  

  126.   

  127. /********************************************************************* 

  128. *                           读取w5100端口的目的端口号 

  129. *参数:socket:端口:0-3 

  130. *返回:端口号 

  131. **********************************************************************/  

  132.   

  133. uint16_t inf_w5100_get_socket_dst_port(uint8_t socket)  

  134. {  

  135.     return drv_w5100_get_socket_dst_port(socket);  

  136. }  

  137.   

  138. /********************************************************************* 

  139. *                           读取w5100端口的端口号 

  140. *参数:socket:端口:0-3 

  141. *返回:端口号 

  142. **********************************************************************/  

  143.   

  144. uint16_t inf_w5100_get_socket_port(uint8_t socket)  

  145. {  

  146.     return drv_w5100_get_socket_port(socket);  

  147. }  

  148.   

  149. /********************************************************************* 

  150. *                           w5100设置端口为udp模式 

  151. *参数:socket:端口:0-3 

  152. *     port:端口号 

  153. **********************************************************************/  

  154.   

  155. void inf_w5100_set_socket_udp_mode(uint8_t socket,uint16_t port)  

  156. {  

  157.     uint8_t state = 0;  

  158.     uint16_t reg = 0;  

  159.       

  160.     while (1)  

  161.     {  

  162.         //设置为udp模式  

  163.         //根据端口号选择寄存器地址  

  164.         reg = W5100_S0_MR + socket * 0x100;  

  165.         //设置端口模式  

  166.         drv_w5100_tx_byte(reg,S_MR_UDP);  

  167.               

  168.         //设置端口号  

  169.         drv_w5100_set_socket_port(socket,port);  

  170.           

  171.         //打开端口  

  172.         //根据端口号选择寄存器地址  

  173.         reg = W5100_S0_CR + socket * 0x100;  

  174.         //端口开关  

  175.         drv_w5100_tx_byte(reg,S_CR_OPEN);  

  176.           

  177.         //读取端口状态  

  178.         reg = W5100_S0_SSR + socket * 0x100;  

  179.         state = drv_w5100_rx_byte(reg);  

  180.         if (state == S_SSR_UDP)  

  181.         {  

  182.             break;  

  183.         }  

  184.         else  

  185.         {  

  186.             //关闭端口  

  187.             //根据端口号选择寄存器地址  

  188.             reg = W5100_S0_CR + socket * 0x100;  

  189.             //端口开关  

  190.             drv_w5100_tx_byte(reg,0x10);  

  191.         }  

  192.     }  

  193. }  

  194.   

  195. /********************************************************************* 

  196. *                           w5100发送数据 

  197. *参数:socket:端口 

  198. *     data:数据 

  199. *     size:大小,单位字节 

  200. *     ip:目标ip,4字节 

  201. *     port:目标端口号 

  202. **********************************************************************/  

  203.   

  204. void inf_w5100_write_data(uint16_t socket,uint8_t *data,uint16_t size,\  

  205.                           uint8_t *ip,uint16_t port)  

  206. {  

  207.     uint16_t free_bytes = 0;  

  208.     uint8_t dst_ip[4] = {0};  

  209.       

  210.     //等待端口有足够空间发送  

  211.     while (1)  

  212.     {  

  213.         free_bytes = drv_w5100_get_socket_tx_fsr(socket);  

  214.         if (free_bytes >= size)  

  215.         {  

  216.             break;  

  217.         }  

  218.     }  

  219.     //设置目标ip  

  220.     drv_w5100_set_socket_dst_ip(socket,ip);  

  221.     //设置目标端口  

  222.     drv_w5100_set_socket_dst_port(socket,port);  

  223.     //发送数据  

  224.     drv_w5100_socket_tx(socket,data,size);  

  225. }  

  226.   

  227. /********************************************************************* 

  228. *                           清除中断信息结构体 

  229. *参数:msg:中断结构体地址 

  230. **********************************************************************/  

  231.   

  232. void inf_w5100_clear_w5100_irg_msg(struct _W5100_Irq_Msg *msg)  

  233. {  

  234.     uint8_t i = 0;  

  235.       

  236.     //ip冲突  

  237.     msg->confict = 0;  

  238.     //无法到达地址  

  239.     msg->unreach = 0;  

  240.     //PPPoe连接关闭  

  241.     msg->pppoe = 0;  

  242.       

  243.     for (i = 0;i < 4;i++)  

  244.     {  

  245.         //端口中断  

  246.         msg->socket_msg[i].socket_int = 0;  

  247.           

  248.         //端口中断信息  

  249.         //数据发送完成  

  250.         msg->socket_msg[i].send_ok = 0;  

  251.         //在连接或终止,数据发送等过程超时  

  252.         msg->socket_msg[i].timeout = 0;  

  253.         //当端口接收到数据时  

  254.         msg->socket_msg[i].recv = 0;  

  255.         //当收到终止连接请求或终止连接过程已结束  

  256.         msg->socket_msg[i].discon = 0;  

  257.         //当连接成功时  

  258.         msg->socket_msg[i].con = 0;  

  259.           

  260.         //ip  

  261.         msg->socket_msg[i].ip[0] = 0;  

  262.         msg->socket_msg[i].ip[1] = 0;  

  263.         msg->socket_msg[i].ip[2] = 0;  

  264.         msg->socket_msg[i].ip[3] = 0;  

  265.         //端口  

  266.         msg->socket_msg[i].port = 0;  

  267.         //接收的字节数  

  268.         msg->socket_msg[i].size = 0;  

  269.     }  

  270. }  

  271.   

  272. /********************************************************************* 

  273. *                           w5100中断处理函数 

  274. *参数:msg:中断信息 

  275. *     buf0:接收socket0数据地址 

  276. *     buf1:接收socket1数据地址 

  277. *     buf2:接收socket2数据地址 

  278. *     buf3:接收socket3数据地址 

  279. **********************************************************************/  

  280.   

  281. void inf_w5100_irq_handler(struct _W5100_Irq_Msg *msg,uint8_t *buf0,uint8_t *buf1,uint8_t *buf2,uint8_t *buf3)  

  282. {  

  283.     uint8_t reg_value = 0;  

  284.     uint8_t i = 0;  

  285.     uint8_t flag[4] = {0};  

  286.     uint16_t reg_addr = 0;  

  287.     uint16_t shift = 0;  

  288.       

  289.     //清除中断信号  

  290.     inf_w5100_clear_w5100_irg_msg(msg);  

  291.       

  292.     //读取中断寄存器,判断中断类型  

  293.     reg_value = drv_w5100_rx_byte(W5100_IR);  

  294.     //清中断标志  

  295.     drv_w5100_tx_byte(W5100_IR,reg_value & 0xf0);  

  296.       

  297.     //判断中断类型  

  298.     //IP地址冲突  

  299.     if ((reg_value & IR_CONFLICT) == IR_CONFLICT)  

  300.     {  

  301.         msg->confict = 1;  

  302.     }  

  303.       

  304.     //无法抵达地址  

  305.     if ((reg_value & IR_UNREACH) == IR_UNREACH)  

  306.     {  

  307.         msg->unreach = 1;  

  308.     }  

  309.       

  310.     //端口0中断  

  311.     if ((reg_value & IR_S0_INT) == IR_S0_INT)  

  312.     {  

  313.         flag[0] = 1;  

  314.     }  

  315.       

  316.     //端口1中断  

  317.     if ((reg_value & IR_S1_INT) == IR_S1_INT)  

  318.     {  

  319.         flag[1] = 1;  

  320.     }  

  321.       

  322.     //端口2中断  

  323.     if ((reg_value & IR_S2_INT) == IR_S2_INT)  

  324.     {  

  325.         flag[2] = 1;  

  326.     }  

  327.       

  328.     //端口3中断  

  329.     if ((reg_value & IR_S3_INT) == IR_S3_INT)  

  330.     {  

  331.         flag[3] = 1;  

  332.     }  

  333.       

  334.     for (i = 0;i < 4;i++)  

  335.     {  

  336.         if (flag[i])  

  337.         {  

  338.             msg->socket_msg[i].socket_int = 1;  

  339.               

  340.             //读取端口中断寄存器  

  341.             reg_addr = W5100_S0_IR + i * 0x100;  

  342.             reg_value = drv_w5100_rx_byte(reg_addr);  

  343.             //清中断标志  

  344.             drv_w5100_tx_byte(reg_addr,reg_value);  

  345.                   

  346.             //判断中断类型  

  347.             //数据发送完成  

  348.             if ((reg_value & S_IR_SENDOK) == S_IR_SENDOK)  

  349.             {  

  350.                 msg->socket_msg[i].send_ok = 1;  

  351.             }  

  352.               

  353.             //在连接或终止,数据发送等过程超时  

  354.             if ((reg_value & S_IR_TIMEOUT) == S_IR_TIMEOUT)  

  355.             {  

  356.                 msg->socket_msg[i].timeout = 1;  

  357.             }  

  358.               

  359.             //当端口接收到数据时  

  360.             if ((reg_value & S_IR_RECV) == S_IR_RECV)  

  361.             {  

  362.                 msg->socket_msg[i].recv = 1;  

  363.                 msg->socket_msg[i].size = drv_w5100_get_socket_rx_rsr(i);  

  364.                   

  365.                 //读取接收字节数  

  366.                 switch (i)  

  367.                 {  

  368.                 case 0:  

  369.                     {  

  370.                         drv_w5100_socket_rx(i,buf0,msg->socket_msg[i].size,\  

  371.                                             msg->socket_msg[i].ip,&msg->socket_msg[i].port);  

  372.                         break;  

  373.                     }  

  374.                 case 1:  

  375.                     {  

  376.                         drv_w5100_socket_rx(i,buf1,msg->socket_msg[i].size,\  

  377.                                             msg->socket_msg[i].ip,&msg->socket_msg[i].port);  

  378.                         break;  

  379.                     }  

  380.                 case 2:  

  381.                     {  

  382.                         drv_w5100_socket_rx(i,buf2,msg->socket_msg[i].size,\  

  383.                                             msg->socket_msg[i].ip,&msg->socket_msg[i].port);  

  384.                         break;  

  385.                     }  

  386.                 case 3:  

  387.                     {  

  388.                         drv_w5100_socket_rx(i,buf3,msg->socket_msg[i].size,\  

  389.                                             msg->socket_msg[i].ip,&msg->socket_msg[i].port);  

  390.                         break;  

  391.                     }  

  392.                 }  

  393.                   

  394.                 //接收正文字节数  

  395.                 msg->socket_msg[i].size -= 8;  

  396.             }  

  397.               

  398.             //当收到终止连接请求或终止连接过程已结束  

  399.             if ((reg_value & S_IR_DISCON) == S_IR_DISCON)  

  400.             {  

  401.                 msg->socket_msg[i].discon = 1;  

  402.             }  

  403.               

  404.             //当连接成功时  

  405.             if ((reg_value & S_IR_CON) == S_IR_CON)  

  406.             {  

  407.                 msg->socket_msg[i].con = 1;  

  408.             }  

  409.         }  

  410.     }  

  411. }  

  412.   


测试代码:


main.c:初始化w5100


  1. int main(void)  

  2. {  

  3.     uint8_t i = 0;  

  4.     uint16_t buf1[3] = {1,2,3};  

  5.     uint16_t buf2[10] = {0};  

  6.     uint8_t ip[4] = {10,58,1,5};  

  7.   

  8.     uint8_t mac[6] = {0x00,0xe0,0x4c,0x36,0xc9,0xb0};  

  9.     uint8_t submask[4] = {255,255,255,0};  

  10.     uint8_t gateway[4] = {10,58,1,1};  

  11.     uint8_t socket_tx_size[4] = {2,2,2,2};  

  12.     uint8_t socket_rx_size[4] = {2,2,2,2};  

  13.   

  14.     uint8_t dst_ip[4] = {10,58,1,3};  

  15.     uint8_t buf[3] = {'j','d','h'};  

  16.   

  17.     uint8_t arr[10] = {0};  

  18.       

  19.     //初始化设备  

  20.     init_device();  

  21.   

  22. #ifndef DEBUG     

  23.     //打开内部看门狗  

  24.     inf_enable_iwdg();  

  25. #endif  

  26.       

  27.     //sram测试代码  

  28.     //FSMC_SRAM_WriteHalfWord(0,1);  

  29.     //FSMC_SRAM_WriteHalfWord(2,2);  

  30.     //FSMC_SRAM_WriteHalfWord(4,3);  

  31.     //Test_Data = FSMC_SRAM_ReadHalfWord(2);  

  32.     //FSMC_SRAM_WriteBuffer(buf1,0,3);  

  33.     //FSMC_SRAM_ReadBuffer(buf2,0,3);  

  34.     test_sram[0] = 5;  

  35.     test_sram[1] = 2;  

  36.     test_sram[2] = 3;  

  37.     FSMC_SRAM_ReadBuffer(buf2,0,10);  

  38.     __nop();  

  39.       

  40.     //初始化网络  

  41.     inf_w5100_init(ip,mac,submask,gateway,socket_tx_size,socket_rx_size);  

  42.       

  43.     //打开端口  

  44.     inf_w5100_set_socket_udp_mode(SOCKET0,2000);  

  45.       

  46.     //inf_delay_ms(5000);  

  47.       

  48.     //发送数据  

  49.     //inf_w5100_write_data(SOCKET0,ip,4,dst_ip,2000);  

  50.       

  51.       

  52.       

  53.   

  54.     //状态机执行  

  55.     while (1)  

  56.     {  

  57.         for (i = 0;i < 6;i++)  

  58.         {  

  59.             inf_set_led(i + 1,LED_ON);  

  60.             inf_delay_ms(10);  

  61.             inf_set_led(i + 1,LED_OFF);  

  62.             inf_delay_ms(10);  

  63.         }  

  64.     }  

  65. }  


中断函数:定时发送,接收处理


  1. /********************************************************************* 

  2. *                           系统滴答中断函数 

  3. **********************************************************************/  

  4.   

  5. void SysTick_Handler(void)  

  6. {  

  7.     uint8_t ip[4] = {10,58,1,5};  

  8.     uint8_t dst_ip[4] = {10,58,1,3};  

  9.     char *str = 'zhang ling';  

  10.   

  11.     Tick++;  

  12.       

  13.     //if (Tick > 50 && Tick % 20 == 0)  

  14.     if (Tick > 50)  

  15.     {  

  16.         inf_w5100_write_data(SOCKET0,(uint8_t *)str,11,dst_ip,2000);  

  17.     }  

  18. }  

  19.   

  20. /********************************************************************* 

  21. *                           w5100中断处理 

  22. **********************************************************************/  

  23.   

  24. void EXTI9_5_IRQHandler(void)  

  25. {  

  26.     if(EXTI_GetITStatus(EXTI_Line6) != RESET)  

  27.     {  

  28.         //清中断  

  29.         EXTI_ClearITPendingBit(EXTI_Line6);   

  30.           

  31.         //处理w5100中断  

  32.         inf_w5100_irq_handler(&Msg,Buf0,Buf1,Buf2,Buf3);  

  33.     }  

  34. }   

  35.   




进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

最新器件
精选电路图
  • 光控音效发生器电路

  • 非常简单的150W功放电路图

  • 一个简单的警笛电路图

  • 基于IC555的可变PWM振荡器电路

  • 分享一个电网倾角计电路

  • 电谐波图形均衡器示意图

    相关电子头条文章