STM_ENC28_J60.cpp 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. #include "STM_ENC28_J60.h"
  2. //variables
  3. extern SPI_HandleTypeDef hspi1;
  4. static uint8_t Enc28_Bank;
  5. uint8_t dataWatch8;
  6. uint16_t dataWatch16;
  7. uint8_t ENC28_readOp(uint8_t oper, uint8_t addr)
  8. {
  9. uint8_t spiData[2];
  10. HAL_GPIO_WritePin(GPIOD, GPIO_PIN_7, GPIO_PIN_RESET);
  11. spiData[0] = (oper| (addr & ADDR_MASK));
  12. HAL_SPI_Transmit(&hspi1, spiData, 1, 100);
  13. if(addr & 0x80)
  14. {
  15. //HAL_SPI_Transmit(&hspi1, spiData, 1, 100);
  16. HAL_SPI_Receive(&hspi1, &spiData[1], 1, 100);
  17. }
  18. HAL_SPI_Receive(&hspi1, &spiData[1], 1, 100);
  19. HAL_GPIO_WritePin(GPIOD, GPIO_PIN_7, GPIO_PIN_SET);
  20. return spiData[1];
  21. }
  22. void ENC28_writeOp(uint8_t oper, uint8_t addr, uint8_t data)
  23. {
  24. uint8_t spiData[2];
  25. HAL_GPIO_WritePin(GPIOD, GPIO_PIN_7, GPIO_PIN_RESET);
  26. spiData[0] = (oper| (addr & ADDR_MASK)); //((oper<<5)&0xE0)|(addr & ADDR_MASK);
  27. spiData[1] = data;
  28. HAL_SPI_Transmit(&hspi1, spiData, 2, 100);
  29. HAL_GPIO_WritePin(GPIOD, GPIO_PIN_7, GPIO_PIN_SET);
  30. }
  31. uint8_t ENC28_readReg8(uint8_t addr)
  32. {
  33. ENC28_setBank(addr);
  34. return ENC28_readOp(ENC28_READ_CTRL_REG, addr);
  35. }
  36. void ENC28_writeReg8(uint8_t addr, uint8_t data)
  37. {
  38. ENC28_setBank(addr);
  39. ENC28_writeOp(ENC28_WRITE_CTRL_REG, addr, data);
  40. }
  41. uint16_t ENC28_readReg16( uint8_t addr)
  42. {
  43. return ENC28_readReg8(addr) + (ENC28_readReg8(addr+1) << 8);
  44. }
  45. void ENC28_writeReg16(uint8_t addrL, uint16_t data)
  46. {
  47. ENC28_writeReg8(addrL, data);
  48. ENC28_writeReg8(addrL+1, data >> 8);
  49. }
  50. void ENC28_setBank(uint8_t addr)
  51. {
  52. if ((addr & BANK_MASK) != Enc28_Bank)
  53. {
  54. ENC28_writeOp(ENC28_BIT_FIELD_CLR, ECON1, ECON1_BSEL1|ECON1_BSEL0);
  55. Enc28_Bank = addr & BANK_MASK;
  56. ENC28_writeOp(ENC28_BIT_FIELD_SET, ECON1, Enc28_Bank>>5);
  57. }
  58. }
  59. void ENC28_writePhy(uint8_t addr, uint16_t data)
  60. {
  61. ENC28_writeReg8(MIREGADR, addr);
  62. ENC28_writeReg8(MIWR, data);
  63. while (ENC28_readReg8(MISTAT) & MISTAT_BUSY);
  64. }
  65. uint16_t ENC28_readPhy(uint8_t addr)
  66. {
  67. ENC28_writeReg8(MIREGADR, addr); // pass the PHY address to the MII
  68. ENC28_writeReg8(MICMD, MICMD_MIIRD); // Enable Read bit
  69. while (ENC28_readReg8(MISTAT) & MISTAT_BUSY); // Poll for end of reading
  70. ENC28_writeReg8(MICMD, 0x00); // Disable MII Read
  71. return ENC28_readReg8(MIRD) + (ENC28_readReg8(MIRD+1) << 8);
  72. }
  73. void ENC28_Init(void)
  74. {
  75. uint8_t spiData[2];
  76. // (1): Disable the chip CS pin
  77. HAL_GPIO_WritePin(GPIOD, GPIO_PIN_7, GPIO_PIN_SET);
  78. HAL_Delay(1);
  79. // (2): Perform soft reset to the ENC28J60 module
  80. ENC28_writeOp(ENC28_SOFT_RESET, 0, ENC28_SOFT_RESET);
  81. HAL_Delay(2);
  82. // (3): Wait untill Clock is ready
  83. while(!ENC28_readOp(ENC28_READ_CTRL_REG, ESTAT) & ESTAT_CLKRDY);
  84. // (4): Initialise RX and TX buffer size
  85. ENC28_writeReg16(ERXST, RXSTART_INIT);
  86. ENC28_writeReg16(ERXND, RXSTOP_INIT);
  87. ENC28_writeReg16(ETXST, TXSTART_INIT);
  88. ENC28_writeReg16(ETXND, TXSTOP_INIT);
  89. ENC28_writeReg16(ERXRDPT, RXSTART_INIT);
  90. ENC28_writeReg16(ERXWRPT, RXSTART_INIT);
  91. dataWatch16 = ENC28_readReg16(ERXND);
  92. // (5): Reviece buffer filters
  93. ENC28_writeReg8(ERXFCON, ERXFCON_UCEN|ERXFCON_ANDOR|ERXFCON_CRCEN);
  94. dataWatch8 = ENC28_readReg8(ERXFCON);
  95. // (6): MAC Control Register 1
  96. ENC28_writeReg8(MACON1, MACON1_MARXEN|MACON1_TXPAUS|MACON1_RXPAUS|MACON1_PASSALL);
  97. dataWatch8 = ENC28_readReg8(ERXFCON);
  98. // (7): MAC Control Register 3
  99. ENC28_writeOp(ENC28_BIT_FIELD_SET, MACON3,MACON3_PADCFG0|MACON3_TXCRCEN|MACON3_FRMLNEN);
  100. // (8): NON/Back to back gap
  101. ENC28_writeReg16(MAIPG, 0x0C12); // NonBackToBack gap
  102. ENC28_writeReg8(MABBIPG, 0x12); // BackToBack gap
  103. // (9): Set Maximum framelenght
  104. ENC28_writeReg16(MAMXFL, MAX_FRAMELEN); // Set Maximum frame length (any packet bigger will be discarded)
  105. // (10): Set the MAC address of the device
  106. ENC28_writeReg8(MAADR1, MAC_1);
  107. ENC28_writeReg8(MAADR2, MAC_2);
  108. ENC28_writeReg8(MAADR3, MAC_3);
  109. ENC28_writeReg8(MAADR4, MAC_4);
  110. ENC28_writeReg8(MAADR5, MAC_5);
  111. ENC28_writeReg8(MAADR6, MAC_6);
  112. dataWatch8 = ENC28_readReg8(MAADR1);
  113. dataWatch8 = ENC28_readReg8(MAADR2);
  114. dataWatch8 = ENC28_readReg8(MAADR3);
  115. dataWatch8 = ENC28_readReg8(MAADR4);
  116. dataWatch8 = ENC28_readReg8(MAADR5);
  117. dataWatch8 = ENC28_readReg8(MAADR6);
  118. if(dataWatch8==MAC_6)HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_SET);
  119. //**********Advanced Initialisations************//
  120. // (1): Initialise PHY layer registers
  121. ENC28_writePhy(PHLCON, PHLCON_LED);
  122. ENC28_writePhy(PHCON2, PHCON2_HDLDIS);
  123. // (2): Enable Rx interrupt line
  124. ENC28_setBank(ECON1);
  125. ENC28_writeOp(ENC28_BIT_FIELD_SET, ECON1, ECON1_RXEN);
  126. // ENC28_writeOp(ENC28_BIT_FIELD_SET, EIE, EIE_INTIE|EIE_PKTIE);
  127. // ENC28_writeOp(ENC28_BIT_FIELD_SET, EIR, EIR_PKTIF);
  128. }
  129. void ENC28_packetSend(uint16_t len, uint8_t* dataBuf)
  130. {
  131. uint8_t retry = 0;
  132. while(1)
  133. {
  134. ENC28_writeOp(ENC28_BIT_FIELD_SET, ECON1, ECON1_TXRST);
  135. ENC28_writeOp(ENC28_BIT_FIELD_CLR, ECON1, ECON1_TXRST);
  136. ENC28_writeOp(ENC28_BIT_FIELD_CLR, EIR, EIR_TXERIF|EIR_TXIF);
  137. // prepare new transmission
  138. if(retry == 0)
  139. {
  140. ENC28_writeReg16(EWRPT, TXSTART_INIT);
  141. ENC28_writeReg16(ETXND, TXSTART_INIT+len);
  142. ENC28_writeOp(ENC28_WRITE_BUF_MEM, 0, 0); //line 485 enc28j60.cpp
  143. ENC28_writeBuf(len, dataBuf);
  144. }
  145. // initiate transmission
  146. ENC28_writeOp(ENC28_BIT_FIELD_SET, ECON1, ECON1_TXRTS);
  147. uint16_t count = 0;
  148. while ((ENC28_readReg8(EIR) & (EIR_TXIF | EIR_TXERIF)) == 0 && ++count < 1000U);
  149. if (!(ENC28_readReg8(EIR) & EIR_TXERIF) && count < 1000U)
  150. {
  151. // no error; start new transmission
  152. break;
  153. }
  154. // cancel previous transmission if stuck
  155. ENC28_writeOp(ENC28_BIT_FIELD_CLR, ECON1, ECON1_TXRTS);
  156. break;
  157. }
  158. }
  159. void ENC28_writeBuf(uint16_t len, uint8_t* data)
  160. {
  161. uint8_t spiData[2];
  162. HAL_GPIO_WritePin(GPIOD, GPIO_PIN_7, GPIO_PIN_RESET);
  163. spiData[0] = ENC28_WRITE_BUF_MEM;
  164. HAL_SPI_Transmit(&hspi1, spiData, 1, 100);
  165. HAL_SPI_Transmit(&hspi1, data, len, 100);
  166. HAL_GPIO_WritePin(GPIOD, GPIO_PIN_7, GPIO_PIN_SET);
  167. }