📄 nic.c
字号:
//******************************************************************
//* 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 + -