Ethernet.c
上传用户:yyyd609
上传日期:2022-07-18
资源大小:183k
文件大小:2k
源码类别:

微处理器开发

开发平台:

C/C++

  1. #include "Ethernet.h"
  2. u16 local_eth_addr[3] = {0x4422, 0x8866, 0xCCAA};
  3. inline u16 NIC_InPort(u16 reg)
  4. {
  5. ETH_Addr_Port = reg;
  6. return ETH_Data_Port;
  7. }
  8. inline void NIC_OutPort(u16 reg, u16 x)
  9. {
  10. ETH_Addr_Port = reg;
  11. ETH_Data_Port = x;
  12. }
  13. inline void RequestSend(u16 FrameSize)
  14. {
  15. ETH_TX_CMD_Port = TX_START_ALL_BYTES;
  16. ETH_TX_LEN_Port = FrameSize;
  17. }
  18. void NIC_Init(void)
  19. {
  20. u16 t;
  21. GPIO_Config(GPIO2, 0x000F, GPIO_AF_PP);
  22. EMI_Config(2, EMI_ENABLE | EMI_WAITSTATE(15) | EMI_SIZE_16);
  23. NIC_OutPort(PP_SelfCTL, POWER_ON_RESET);
  24. t = ETH_Port(1);
  25. t = ETH_Port(0);
  26. t = ETH_Port(1);
  27. while(!(NIC_InPort(PP_SelfST) & INIT_DONE));
  28. NIC_OutPort(PP_IA + 0, local_eth_addr[0]);
  29. NIC_OutPort(PP_IA + 2, local_eth_addr[1]);
  30. NIC_OutPort(PP_IA + 4, local_eth_addr[2]);
  31. NIC_OutPort(PP_RxCTL, RX_OK_ACCEPT | RX_IA_ACCEPT | RX_BROADCAST_ACCEPT);
  32. NIC_OutPort(PP_LineCTL, SERIAL_RX_ON | SERIAL_TX_ON);
  33. }
  34. int NIC_RecvPack(u16 *buf)
  35. {
  36. int stat = NIC_InPort(PP_RxEvent);
  37. if((stat & RX_OK) && (stat & (RX_IA | RX_BROADCAST)))
  38. {
  39. int len, i;
  40. stat = ETH_RX_Frame_Port;
  41. len = ETH_RX_Frame_Port;
  42. if(len < 60 || len > 1514)
  43. return -1;
  44. for(i = 0; i < len; i += 2)
  45. *buf++ = ETH_RX_Frame_Port;
  46. return len;
  47. }
  48. return 0;
  49. }
  50. int NIC_SendPack(u16 *buf, int len)
  51. {
  52. if(!(NIC_InPort(PP_LineST) & LINK_OK))
  53. return -1;
  54. if(len < 60)
  55. len = 60;
  56. RequestSend(len);
  57. while(!(NIC_InPort(PP_BusST) & READY_FOR_TX_NOW))
  58. NIC_OutPort(PP_RxCFG, SKIP_1 | RX_OK_ENBL);
  59. if(NIC_InPort(PP_BusST) & READY_FOR_TX_NOW)
  60. {
  61. int i;
  62. for(i = 0; i < len; i += 2)
  63. ETH_TX_Frame_Port = *buf++;
  64. }
  65. return 0;
  66. }