⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nic.c

📁 embedded ethernet code for pic18F
💻 C
📖 第 1 页 / 共 2 页
字号:
//******************************************************************
//*	PacketPage Bus Status Bit Definitions
//******************************************************************
#define	BUSSTA_TX_BID_ERR		0x0080
//#define	BUSSTA_RDY4TXNOW_BIT	0x0000
#define BUSSTA_RDY4TXNOW_BIT	0x0008
#define	BUSSTA_RDY4TXNOW		0x0100


//extern unsigned char packet[];
//extern unsigned char MYIP[];
//extern unsigned char MYMAC[];

//******************************************************************
//*	PPRead (PacketPage Read)
//*	Reads Data at ppoffsetH/L
//******************************************************************
void RPP(unsigned int ppoffset,unsigned int *datum)
{
	unsigned char h,l;
	
   dataport_out;
   WpppL(pageport_Ptr,ppoffset&0xff);
   WpppH(pageport_Ptr,(ppoffset>>8)&0xff);
   dataport_in;
   RpppL(pageport_Data0,l);
   RpppH(pageport_Data0,h);
   
   *datum=(((unsigned int)h)<<8)|l;
}
//******************************************************************
//*	PPWrite (PacketPage Write)
//*	Writes Data to ppoffsetH/L
//******************************************************************
void WPP(unsigned int ppoffset,unsigned int datum)
{
   dataport_out;
   WpppL(pageport_Ptr,ppoffset&0xff);
   WpppH(pageport_Ptr,ppoffset>>8);
   WpppL(pageport_Data0,datum&0xff);
   WpppH(pageport_Data0,datum>>8);
}
//******************************************************************
//*	RPP (Read PacketPage)
//*	Reads Data at PacketPage Offset
//*      PPoffset = PacketPage Data Offset
//******************************************************************
//void RPP(unsigned int ppoffset)
//{
//   ppoffsetL = make8(ppoffset,0);
//   ppoffsetH = make8(ppoffset,1);
//   PPRead();
//}
//******************************************************************
//*	WPP (Write PacketPage)
//*	Writes Data (datum) at PacketPage Offset
//*      PPoffset = PacketPage Data Offset
//******************************************************************
//void WPP(unsigned int ppoffset, unsigned int datum)
//{
//   ppoffsetL = make8(ppoffset,0);
//   ppoffsetH = make8(ppoffset,1);
//   data_L = make8(datum,0);
//   data_H = make8(datum,1);
//   PPWrite();
//}






// wait for ready to write

void waitToTransmit(void)
{
	unsigned int i;
	
	do
	{
		RPP(ppageTxEvent,&i);
		ClrWdt();
	} while(!(i&TXEVENT_TX_OK));
}

void waitToWrite(void)
{
	unsigned int i;
  do{
       RPP(ppageBusStatus,&i);
       ClrWdt();
     }while(!(i&BUSSTA_RDY4TXNOW));
}

//wait for data

void waitToRead(void)
{
	unsigned int i;
	do{
        RPP(ppageRxEvent,&i);
        ClrWdt();
      }while(!(i&RXEVENT_RX_OK));
}

// tell me if there is a packet

unsigned char dataToRead(void)
{
	unsigned int i;
	
	RPP(ppageRxEvent,&i);
	ClrWdt();
	return (i&RXEVENT_RX_OK) ? 1 : 0;
}

//******************************************************************
//*	ECHO THE PACKET
//******************************************************************



void echo_packet(unsigned int txlen,unsigned char *pkt)
{
	unsigned int i;
	unsigned char lenL,lenH;
	
	lenL=txlen&0xff;
	lenH=(txlen>>8)&0xff;
	//putrsUSART("Outputting packet of length ");printByte(lenH);printByte(lenL);putrsUSART("\r\n");
	
	
   dataport_out;
   WpppL(pageport_TxCmd,TXCMD_AFTER_ALL);
   WpppH(pageport_TxCmd,0x00);
   WpppL(pageport_TxLen,lenL /*pageheader[enetpacketLenL] */);
   WpppH(pageport_TxLen,lenH /*pageheader[enetpacketLenH] */);
   //do{
   //    RPP(ppageBusStatus);
   //  }while(!(bit_test(data_H,BUSSTA_RDY4TXNOW_BIT)));
   
   waitToWrite();
   dataport_out;
   //txlen = make16(pageheader[enetpacketLenH],pageheader[enetpacketLenL]);
   for(i=0;i<txlen;i+=2)
   {
    WpppL(pageport_RxTxData0,pkt[i]);
    WpppH(pageport_RxTxData0,pkt[i+1]);
    ClrWdt();
   }
}



void ignoreFrame(void)
{
	unsigned int i;
	
	RPP(ppageRxCFG,&i);
	i|=RXCFG_SKIP;
    WPP(ppageRxCFG,i); //PPWrite();
}

unsigned int getPacket(unsigned int maxLen,unsigned char *pkt)
{
	unsigned char c,lenH,lenL;
	unsigned int rxlen,i;
	
	dataport_in;
	RpppH(pageport_RxTxData0,c /*pageheader[enetpacketstatusH] */);
	RpppL(pageport_RxTxData0,c /*pageheader[enetpacketstatusL] */);
	RpppH(pageport_RxTxData0,lenH /*pageheader[enetpacketLenH] */);
 	RpppL(pageport_RxTxData0,lenL /*pageheader[enetpacketLenL] */);
    rxlen = (((unsigned int)lenH)<<8)|lenL; //(pageheader[enetpacketLenH],pageheader[enetpacketLenL]);

    if(rxlen>maxLen) rxlen=maxLen;
    for(i=0;i<rxlen;i+=2)
    {
      RpppL(pageport_RxTxData0,pkt[i]);
      RpppH(pageport_RxTxData0,pkt[i+1]);
      ClrWdt();
    }
     return rxlen;
}



void initNIC(const rom unsigned char *mac)
{
	unsigned int i;

   PORTADigitalIO;
   initTRISRegisters;
   
   
   
   	
   clr_reset;
   set_ior;
   set_iow;
   set_aen;
   putrsUSART("Starting CS8900A-CQ Initialization.\r\n");
//******************************************************************
//*	Reset the CS8900
//******************************************************************
   WPP(ppageSelfCTL,SELFCTL_RESET);
   do
   {
      Delay1KTCYx(1);
      RPP(ppageSelfStatus,&i);
      ClrWdt();
   }while(!(i&SELFSTAT_INIT_DONE));
   putrsUSART("CS8900A-CQ is RESET.\r\n");
//******************************************************************
//*	Load the CS8900 Basic Parameters
//*	10BaseT/Full Duplex/accept broadcast /individual addresses
//******************************************************************
         WPP(ppageLineCTL,LINECTL_10BASET);
         WPP(ppageTestCTL,TESTCTL_FDX);
         WPP(ppageRxCTL,RXCTL_SETUP);
         WPP(ppageRxCFG,RXCFG_NOBUF_CRC);
	putrsUSART("CS8900A-CQ Basic Parameters SET.\r\n");
//******************************************************************
//*	Load the CS8900 IA
//*
//*	INDIVIDUAL ADDRESS LAYOUT IN CS8900
//* MYMAC     5     4     3     2     1     0
//* CS REG |0X15D|0X15C|0X15B|0X15A|0X159|0X158|
//*        |  P  |  T  |  D  |  E  |  0  |  0  |
//******************************************************************
	 	 i = (((unsigned int)mac[1])<<8)|mac[0];
         WPP(ppageIA,i);
         i = (((unsigned int)mac[3])<<8)|mac[2];
         WPP(ppageIA+2,i);
         i = (((unsigned int)mac[5])<<8)|mac[4];
         WPP(ppageIA+4,i);

//uncomment this code to see the MAC address as it has been entered
         //putrsUSART("MAC address is ");
	     //RPP(ppageIA,&i);
	     //printByte(make8(i,1));
	     //putcUSART(':');
	     //printByte(make8(i,0));
         //putcUSART(':');
         //RPP(ppageIA+2,&i);
	     //printByte(make8(i,1));
	     //putcUSART(':');
	     //printByte(make8(i,0));
         //putcUSART(':');
	     //RPP(ppageIA+4,&i);
	     //printByte(make8(i,1));
	     //putcUSART(':');
	     //printByte(make8(i,0));
         //putrsUSART("\r\n");
//end commented code
    putrsUSART("CS8900A-CQ MAC Address LOADED.\r\n");
//******************************************************************
//*	Enable CS8900 TRANSMITTER AND RECEIVER
//******************************************************************
         RPP(ppageLineCTL,&i);
         i|=LINECTL_RX_ON|LINECTL_TX_ON;
         WPP(ppageLineCTL,i);
   putrsUSART("CS8900A-CQ Ethernet Transceiver ENABLED.\r\n");
   putrsUSART("Easy Ethernet CS8900A For PIC18FXXXX Version 03.08.19\r\n");
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -