w5500.c 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. //*****************************************************************************
  2. //
  3. //! \file w5500.c
  4. //! \brief W5500 HAL Interface.
  5. //! \version 1.0.1
  6. //! \date 2013/10/21
  7. //! \par Revision history
  8. //! <2014/05/01> V1.0.2
  9. //! 1. Implicit type casting -> Explicit type casting. Refer to M20140501
  10. //! Fixed the problem on porting into under 32bit MCU
  11. //! Issued by Mathias ClauBen, wizwiki forum ID Think01 and bobh
  12. //! Thank for your interesting and serious advices.
  13. //! <2013/10/21> 1st Release
  14. //! <2013/12/20> V1.0.1
  15. //! 1. Remove warning
  16. //! 2. WIZCHIP_READ_BUF WIZCHIP_WRITE_BUF in case _WIZCHIP_IO_MODE_SPI_FDM_
  17. //! for loop optimized(removed). refer to M20131220
  18. //! \author MidnightCow
  19. //! \copyright
  20. //!
  21. //! Copyright (c) 2013, WIZnet Co., LTD.
  22. //! All rights reserved.
  23. //!
  24. //! Redistribution and use in source and binary forms, with or without
  25. //! modification, are permitted provided that the following conditions
  26. //! are met:
  27. //!
  28. //! * Redistributions of source code must retain the above copyright
  29. //! notice, this list of conditions and the following disclaimer.
  30. //! * Redistributions in binary form must reproduce the above copyright
  31. //! notice, this list of conditions and the following disclaimer in the
  32. //! documentation and/or other materials provided with the distribution.
  33. //! * Neither the name of the <ORGANIZATION> nor the names of its
  34. //! contributors may be used to endorse or promote products derived
  35. //! from this software without specific prior written permission.
  36. //!
  37. //! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  38. //! AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  39. //! IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  40. //! ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  41. //! LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  42. //! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  43. //! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  44. //! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  45. //! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  46. //! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
  47. //! THE POSSIBILITY OF SUCH DAMAGE.
  48. //
  49. //*****************************************************************************
  50. //#include <stdio.h>
  51. #include "w5500.h"
  52. #define _W5500_SPI_VDM_OP_ 0x00
  53. #define _W5500_SPI_FDM_OP_LEN1_ 0x01
  54. #define _W5500_SPI_FDM_OP_LEN2_ 0x02
  55. #define _W5500_SPI_FDM_OP_LEN4_ 0x03
  56. ////////////////////////////////////////////////////
  57. #define LPC_SSP0 (0)
  58. static void Chip_SSP_ReadFrames_Blocking(int dummy, uint8_t *buf, uint32_t len) {
  59. WIZCHIP.IF.SPI._read_bytes(buf, len);
  60. }
  61. static void Chip_SSP_WriteFrames_Blocking(int dummy, const uint8_t *buf, uint32_t len) {
  62. WIZCHIP.IF.SPI._write_bytes(buf, len);
  63. }
  64. uint8_t WIZCHIP_READ(uint32_t AddrSel)
  65. {
  66. uint8_t ret;
  67. uint8_t spi_data[3];
  68. WIZCHIP_CRITICAL_ENTER();
  69. WIZCHIP.CS._select();
  70. AddrSel |= (_W5500_SPI_READ_ | _W5500_SPI_VDM_OP_);
  71. //WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16);
  72. //WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >> 8);
  73. //WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >> 0);
  74. //ret = WIZCHIP.IF.SPI._read_byte();
  75. spi_data[0] = (AddrSel & 0x00FF0000) >> 16;
  76. spi_data[1] = (AddrSel & 0x0000FF00) >> 8;
  77. spi_data[2] = (AddrSel & 0x000000FF) >> 0;
  78. Chip_SSP_WriteFrames_Blocking(LPC_SSP0, spi_data, 3);
  79. Chip_SSP_ReadFrames_Blocking(LPC_SSP0, &ret, 1);
  80. WIZCHIP.CS._deselect();
  81. WIZCHIP_CRITICAL_EXIT();
  82. return ret;
  83. }
  84. void WIZCHIP_WRITE(uint32_t AddrSel, uint8_t wb )
  85. {
  86. uint8_t spi_data[4];
  87. WIZCHIP_CRITICAL_ENTER();
  88. WIZCHIP.CS._select();
  89. AddrSel |= (_W5500_SPI_WRITE_ | _W5500_SPI_VDM_OP_);
  90. //WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16);
  91. //WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >> 8);
  92. //WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >> 0);
  93. //WIZCHIP.IF.SPI._write_byte(wb);
  94. spi_data[0] = (AddrSel & 0x00FF0000) >> 16;
  95. spi_data[1] = (AddrSel & 0x0000FF00) >> 8;
  96. spi_data[2] = (AddrSel & 0x000000FF) >> 0;
  97. spi_data[3] = wb;
  98. Chip_SSP_WriteFrames_Blocking(LPC_SSP0, spi_data, 4);
  99. WIZCHIP.CS._deselect();
  100. WIZCHIP_CRITICAL_EXIT();
  101. }
  102. void WIZCHIP_READ_BUF (uint32_t AddrSel, uint8_t* pBuf, uint16_t len)
  103. {
  104. uint8_t spi_data[3];
  105. //uint16_t i;
  106. WIZCHIP_CRITICAL_ENTER();
  107. WIZCHIP.CS._select();
  108. AddrSel |= (_W5500_SPI_READ_ | _W5500_SPI_VDM_OP_);
  109. //WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16);
  110. //WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >> 8);
  111. //WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >> 0);
  112. //for(i = 0; i < len; i++)
  113. // pBuf[i] = WIZCHIP.IF.SPI._read_byte();
  114. spi_data[0] = (AddrSel & 0x00FF0000) >> 16;
  115. spi_data[1] = (AddrSel & 0x0000FF00) >> 8;
  116. spi_data[2] = (AddrSel & 0x000000FF) >> 0;
  117. Chip_SSP_WriteFrames_Blocking(LPC_SSP0, spi_data, 3);
  118. Chip_SSP_ReadFrames_Blocking(LPC_SSP0, pBuf, len);
  119. WIZCHIP.CS._deselect();
  120. WIZCHIP_CRITICAL_EXIT();
  121. }
  122. void WIZCHIP_WRITE_BUF(uint32_t AddrSel, uint8_t* pBuf, uint16_t len)
  123. {
  124. uint8_t spi_data[3];
  125. //uint16_t i;
  126. WIZCHIP_CRITICAL_ENTER();
  127. WIZCHIP.CS._select();
  128. AddrSel |= (_W5500_SPI_WRITE_ | _W5500_SPI_VDM_OP_);
  129. //WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16);
  130. //WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >> 8);
  131. //WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >> 0);
  132. //for(i = 0; i < len; i++)
  133. // WIZCHIP.IF.SPI._write_byte(pBuf[i]);
  134. spi_data[0] = (AddrSel & 0x00FF0000) >> 16;
  135. spi_data[1] = (AddrSel & 0x0000FF00) >> 8;
  136. spi_data[2] = (AddrSel & 0x000000FF) >> 0;
  137. Chip_SSP_WriteFrames_Blocking(LPC_SSP0, spi_data, 3);
  138. Chip_SSP_WriteFrames_Blocking(LPC_SSP0, pBuf, len);
  139. WIZCHIP.CS._deselect();
  140. WIZCHIP_CRITICAL_EXIT();
  141. }
  142. uint16_t getSn_TX_FSR(uint8_t sn)
  143. {
  144. uint16_t val=0,val1=0;
  145. do
  146. {
  147. val1 = WIZCHIP_READ(Sn_TX_FSR(sn));
  148. val1 = (val1 << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_TX_FSR(sn),1));
  149. if (val1 != 0)
  150. {
  151. val = WIZCHIP_READ(Sn_TX_FSR(sn));
  152. val = (val << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_TX_FSR(sn),1));
  153. }
  154. }while (val != val1);
  155. return val;
  156. }
  157. uint16_t getSn_RX_RSR(uint8_t sn)
  158. {
  159. uint16_t val=0,val1=0;
  160. do
  161. {
  162. val1 = WIZCHIP_READ(Sn_RX_RSR(sn));
  163. val1 = (val1 << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_RSR(sn),1));
  164. if (val1 != 0)
  165. {
  166. val = WIZCHIP_READ(Sn_RX_RSR(sn));
  167. val = (val << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_RSR(sn),1));
  168. }
  169. }while (val != val1);
  170. return val;
  171. }
  172. void wiz_send_data(uint8_t sn, uint8_t *wizdata, uint16_t len)
  173. {
  174. uint16_t ptr = 0;
  175. uint32_t addrsel = 0;
  176. if(len == 0) return;
  177. ptr = getSn_TX_WR(sn);
  178. //M20140501 : implict type casting -> explict type casting
  179. //addrsel = (ptr << 8) + (WIZCHIP_TXBUF_BLOCK(sn) << 3);
  180. addrsel = ((uint32_t)ptr << 8) + (WIZCHIP_TXBUF_BLOCK(sn) << 3);
  181. //
  182. WIZCHIP_WRITE_BUF(addrsel,wizdata, len);
  183. ptr += len;
  184. setSn_TX_WR(sn,ptr);
  185. }
  186. void wiz_recv_data(uint8_t sn, uint8_t *wizdata, uint16_t len)
  187. {
  188. uint16_t ptr = 0;
  189. uint32_t addrsel = 0;
  190. if(len == 0) return;
  191. ptr = getSn_RX_RD(sn);
  192. //M20140501 : implict type casting -> explict type casting
  193. //addrsel = ((ptr << 8) + (WIZCHIP_RXBUF_BLOCK(sn) << 3);
  194. addrsel = ((uint32_t)ptr << 8) + (WIZCHIP_RXBUF_BLOCK(sn) << 3);
  195. //
  196. WIZCHIP_READ_BUF(addrsel, wizdata, len);
  197. ptr += len;
  198. setSn_RX_RD(sn,ptr);
  199. }
  200. void wiz_recv_ignore(uint8_t sn, uint16_t len)
  201. {
  202. uint16_t ptr = 0;
  203. ptr = getSn_RX_RD(sn);
  204. ptr += len;
  205. setSn_RX_RD(sn,ptr);
  206. }