@ -28,6 +28,8 @@
# include "programStrings.h"
# include "programStrings.h"
// include configuration
// include configuration
# include "nic.h"
# include "net.h"
# include "enc28j60conf.h"
# include "enc28j60conf.h"
# include "enc28j60.h"
# include "enc28j60.h"
@ -88,10 +90,12 @@ void nicSetMacAddress(uint8_t* macaddr)
enc28j60Write ( MAADR0 , * macaddr + + ) ;
enc28j60Write ( MAADR0 , * macaddr + + ) ;
}
}
# ifdef NET_DEBUG || NIC_DEBUG
void nicRegDump ( void )
void nicRegDump ( void )
{
{
enc28j60RegDump ( ) ;
enc28j60RegDump ( ) ;
}
}
# endif
void nicHardReset ( void )
void nicHardReset ( void )
{
{
@ -333,33 +337,33 @@ void enc28j60Init(void)
delay ( 1 ) ;
delay ( 1 ) ;
# ifdef DEBUG_ENC_INIT
# ifdef DEBUG_ENC_INIT
SPrintln _P( PSTR ( " SPI Enabled " ) ) ;
SPrintln ( " SPI Enabled " ) ;
# endif
# endif
// Reboot the ENC28J60
// Reboot the ENC28J60
enc28j60Reboot ( ) ;
enc28j60Reboot ( ) ;
# ifdef DEBUG_ENC_INIT
# ifdef DEBUG_ENC_INIT
SPrintln _P( PSTR ( " PHY reboot done " ) ) ;
SPrintln ( " PHY reboot done " ) ;
# endif
# endif
# ifdef ENC28J60_LAMPS_MODE
# ifdef ENC28J60_LAMPS_MODE
SPrintln _P( PSTR ( " Custom lamps " ) ) ;
SPrintln ( " Custom lamps " ) ;
enc28j60PhyWrite ( PHLCON , ENC28J60_LAMPS_MODE ) ;
enc28j60PhyWrite ( PHLCON , ENC28J60_LAMPS_MODE ) ;
# else
# else
// Errata #9 correction
// Errata #9 correction
if ( enc28j60Read ( MACON3 ) & MACON3_FULDPX )
if ( enc28j60Read ( MACON3 ) & MACON3_FULDPX )
{
{
SPrintln _P( PSTR ( " Full duplex lamps " ) ) ;
SPrintln ( " Full duplex lamps " ) ;
enc28j60PhyWrite ( PHLCON , PHLCON_DEFAULT ) ;
enc28j60PhyWrite ( PHLCON , PHLCON_DEFAULT ) ;
} else {
} else {
SPrintln _P( PSTR ( " Half duplex lamps " ) ) ;
SPrintln ( " Half duplex lamps " ) ;
enc28j60PhyWrite ( PHLCON , PHLCON_DEFAULT_HD ) ;
enc28j60PhyWrite ( PHLCON , PHLCON_DEFAULT_HD ) ;
}
}
# endif
# endif
# ifdef DEBUG_ENC_INIT
# ifdef DEBUG_ENC_INIT
SPrintln _P( PSTR ( " Lamps set " ) ) ;
SPrintln ( " Lamps set " ) ;
# endif
# endif
// do bank 0 stuff
// do bank 0 stuff
// initialize receive buffer
// initialize receive buffer
@ -443,7 +447,7 @@ void enc28j60Init(void)
enc28j60WriteOp ( ENC28J60_BIT_FIELD_SET , ECON1 , ECON1_RXEN ) ;
enc28j60WriteOp ( ENC28J60_BIT_FIELD_SET , ECON1 , ECON1_RXEN ) ;
# ifdef DEBUG_ENC_INIT
# ifdef DEBUG_ENC_INIT
SPrintln _P( PSTR ( " Banks robbed " ) ) ;
SPrintln ( " Banks robbed " ) ;
# endif
# endif
/*
/*
enc28j60PhyWrite ( PHLCON , 0x0AA2 ) ;
enc28j60PhyWrite ( PHLCON , 0x0AA2 ) ;
@ -539,12 +543,20 @@ void enc28j60PacketSend(uint16_t len, uint8_t* packet)
// send the contents of the transmit buffer onto the network
// send the contents of the transmit buffer onto the network
enc28j60WriteOp ( ENC28J60_BIT_FIELD_SET , ECON1 , ECON1_TXRTS ) ;
enc28j60WriteOp ( ENC28J60_BIT_FIELD_SET , ECON1 , ECON1_TXRTS ) ;
// From errata Rev B.4
// if( (enc28j60Read(EIR) & EIR_TXERIF) ){
// if( (enc28j60Read(EIR) & EIR_TXERIF) ){
// enc28j60WriteOp(ENC28J60_BIT_FIELD_CLR, ECON1, ECON1_TXRTS);
// enc28j60WriteOp(ENC28J60_BIT_FIELD_CLR, ECON1, ECON1_TXRTS);
// }
// }
}
}
# ifndef enc28j60ReadNextPtr
# define enc28j60ReadNextPtr(ptr) do { ptr = enc28j60ReadOp(ENC28J60_READ_BUF_MEM, 0); \
ptr | = enc28j60ReadOp ( ENC28J60_READ_BUF_MEM , 0 ) < < 8 ; \
} while ( 0 )
# endif
uint16_t enc28j60PacketReceive ( uint16_t maxlen , uint8_t * packet )
uint16_t enc28j60PacketReceive ( uint16_t maxlen , uint8_t * packet )
{
{
uint16_t rxstat ;
uint16_t rxstat ;
@ -564,16 +576,13 @@ uint16_t enc28j60PacketReceive(uint16_t maxlen, uint8_t* packet)
enc28j60Write ( ERDPTH , ( NextPacketPtr ) > > 8 ) ;
enc28j60Write ( ERDPTH , ( NextPacketPtr ) > > 8 ) ;
// read the next packet pointer
// read the next packet pointer
NextPacketPtr = enc28j60ReadOp ( ENC28J60_READ_BUF_MEM , 0 ) ;
enc28j60ReadNextPtr ( NextPacketPtr ) ;
NextPacketPtr | = enc28j60ReadOp ( ENC28J60_READ_BUF_MEM , 0 ) < < 8 ;
// read the packet length
// read the packet length
len = enc28j60ReadOp ( ENC28J60_READ_BUF_MEM , 0 ) ;
enc28j60ReadNextPtr ( len ) ;
len | = enc28j60ReadOp ( ENC28J60_READ_BUF_MEM , 0 ) < < 8 ;
// read the receive status
// read the receive status
rxstat = enc28j60ReadOp ( ENC28J60_READ_BUF_MEM , 0 ) ;
enc28j60ReadNextPtr ( rxstat ) ;
rxstat | = enc28j60ReadOp ( ENC28J60_READ_BUF_MEM , 0 ) < < 8 ;
// limit retrieve length
// limit retrieve length
// (we reduce the MAC-reported length by 4 to remove the CRC)
// (we reduce the MAC-reported length by 4 to remove the CRC)
@ -619,95 +628,98 @@ void enc28j60ReceiveOverflowRecover(void)
// recovery completed
// recovery completed
}
}
# ifdef NET_DEBUG || NIC_DEBUG
# define SPrint_D(str) SPrint(str); delayMicroseconds(100);
void enc28j60RegDump ( void )
void enc28j60RegDump ( void )
{
{
// unsigned char macaddr[6];
// unsigned char macaddr[6];
// result = ax88796Read(TR);
// result = ax88796Read(TR);
// SPrint _P(PSTR ("Media State: ") );
// SPrint ("Media State: ");
// if(!(result & AUTOD))
// if(!(result & AUTOD))
// SPrint _P(PSTR ("Autonegotiation\r\n") );
// SPrint ("Autonegotiation\r\n");
// else if(result & RST_B)
// else if(result & RST_B)
// SPrint _P(PSTR ("PHY in Reset \r\n") );
// SPrint ("PHY in Reset \r\n");
// else if(!(result & RST_10B))
// else if(!(result & RST_10B))
// SPrint _P(PSTR ("10BASE-T \r\n") );
// SPrint ("10BASE-T \r\n");
// else if(!(result & RST_TXB))
// else if(!(result & RST_TXB))
// SPrint_P(PSTR("100BASE-T \r\n"));
// SPrint("100BASE-T \r\n");
SPrint_P ( PSTR ( " RevID: " ) ) ; delay ( 5 ) ;
SPrint_D ( " RevID: " ) ;
Serial . println ( enc28j60Read ( EREVID ) , HEX ) ; delay ( 5 ) ;
Serial . println ( enc28j60Read ( EREVID ) , HEX ) ;
SPrint_P ( PSTR ( " Cntrl: ECON1 ECON2 ESTAT EIR EIE \r \n " ) ) ; delay ( 5 ) ;
SPrint_D ( " Cntrl: ECON1 ECON2 ESTAT EIR EIE \r \n " ) ;
SPrint_P ( PSTR ( " " ) ) ; delay ( 5 ) ;
SPrint_D ( " " ) ;
Serial . print ( enc28j60Read ( ECON1 ) , HEX ) ; delay ( 5 ) ;
Serial . print ( enc28j60Read ( ECON1 ) , HEX ) ;
SPrint_P ( PSTR ( " " ) ) ; delay ( 5 ) ;
SPrint_D ( " " ) ;
Serial . print ( enc28j60Read ( ECON2 ) , HEX ) ; delay ( 5 ) ;
Serial . print ( enc28j60Read ( ECON2 ) , HEX ) ;
SPrint_P ( PSTR ( " " ) ) ; delay ( 5 ) ;
SPrint_D ( " " ) ;
Serial . print ( enc28j60Read ( ESTAT ) , HEX ) ; delay ( 5 ) ;
Serial . print ( enc28j60Read ( ESTAT ) , HEX ) ;
SPrint_P ( PSTR ( " " ) ) ; delay ( 5 ) ;
SPrint_D ( " " ) ;
Serial . print ( enc28j60Read ( EIR ) , HEX ) ; delay ( 5 ) ;
Serial . print ( enc28j60Read ( EIR ) , HEX ) ;
SPrint_P ( PSTR ( " " ) ) ; delay ( 5 ) ;
SPrint_D ( " " ) ;
Serial . print ( enc28j60Read ( EIE ) , HEX ) ; delay ( 5 ) ;
Serial . print ( enc28j60Read ( EIE ) , HEX ) ;
Serial . println ( ) ; delay ( 5 ) ;
Serial . println ( ) ;
SPrint_P ( PSTR ( " MAC : MACON1 MACON2 MACON3 MACON4 MAC-Address \r \n " ) ) ; delay ( 5 ) ;
SPrint_D ( " MAC : MACON1 MACON2 MACON3 MACON4 MAC-Address \r \n " ) ;
SPrint_P ( PSTR ( " " ) ) ; delay ( 5 ) ;
SPrint_D ( " " ) ;
Serial . print ( enc28j60Read ( MACON1 ) , HEX ) ; delay ( 5 ) ;
Serial . print ( enc28j60Read ( MACON1 ) , HEX ) ;
SPrint_P ( PSTR ( " " ) ) ; delay ( 5 ) ;
SPrint_D ( " " ) ;
Serial . print ( enc28j60Read ( MACON2 ) , HEX ) ; delay ( 5 ) ;
Serial . print ( enc28j60Read ( MACON2 ) , HEX ) ;
SPrint_P ( PSTR ( " " ) ) ; delay ( 5 ) ;
SPrint_D ( " " ) ;
Serial . print ( enc28j60Read ( MACON3 ) , HEX ) ; delay ( 5 ) ;
Serial . print ( enc28j60Read ( MACON3 ) , HEX ) ;
SPrint_P ( PSTR ( " " ) ) ; delay ( 5 ) ;
SPrint_D ( " " ) ;
Serial . print ( enc28j60Read ( MACON4 ) , HEX ) ; delay ( 5 ) ;
Serial . print ( enc28j60Read ( MACON4 ) , HEX ) ;
SPrint_P ( PSTR ( " " ) ) ; delay ( 5 ) ;
SPrint_D ( " " ) ;
Serial . print ( enc28j60Read ( MAADR5 ) , HEX ) ; delay ( 5 ) ;
Serial . print ( enc28j60Read ( MAADR5 ) , HEX ) ;
Serial . print ( enc28j60Read ( MAADR4 ) , HEX ) ; delay ( 5 ) ;
Serial . print ( enc28j60Read ( MAADR4 ) , HEX ) ;
Serial . print ( enc28j60Read ( MAADR3 ) , HEX ) ; delay ( 5 ) ;
Serial . print ( enc28j60Read ( MAADR3 ) , HEX ) ;
Serial . print ( enc28j60Read ( MAADR2 ) , HEX ) ; delay ( 5 ) ;
Serial . print ( enc28j60Read ( MAADR2 ) , HEX ) ;
Serial . print ( enc28j60Read ( MAADR1 ) , HEX ) ; delay ( 5 ) ;
Serial . print ( enc28j60Read ( MAADR1 ) , HEX ) ;
Serial . print ( enc28j60Read ( MAADR0 ) , HEX ) ; delay ( 5 ) ;
Serial . print ( enc28j60Read ( MAADR0 ) , HEX ) ;
Serial . println ( ) ; delay ( 5 ) ;
Serial . println ( ) ;
SPrint_P ( PSTR ( " Rx : ERXST ERXND ERXWRPT ERXRDPT ERXFCON EPKTCNT MAMXFL \r \n " ) ) ; delay ( 5 ) ;
SPrint_D ( " Rx : ERXST ERXND ERXWRPT ERXRDPT ERXFCON EPKTCNT MAMXFL \r \n " ) ;
SPrint_P ( PSTR ( " " ) ) ; delay ( 5 ) ;
SPrint_D ( " " ) ;
Serial . print ( enc28j60Read ( ERXSTH ) , HEX ) ; delay ( 5 ) ;
Serial . print ( enc28j60Read ( ERXSTH ) , HEX ) ;
Serial . print ( enc28j60Read ( ERXSTL ) , HEX ) ; delay ( 5 ) ;
Serial . print ( enc28j60Read ( ERXSTL ) , HEX ) ;
SPrint_P ( PSTR ( " " ) ) ; delay ( 5 ) ;
SPrint_D ( " " ) ;
Serial . print ( enc28j60Read ( ERXNDH ) , HEX ) ; delay ( 5 ) ;
Serial . print ( enc28j60Read ( ERXNDH ) , HEX ) ;
Serial . print ( enc28j60Read ( ERXNDL ) , HEX ) ; delay ( 5 ) ;
Serial . print ( enc28j60Read ( ERXNDL ) , HEX ) ;
SPrint_P ( PSTR ( " " ) ) ; delay ( 5 ) ;
SPrint_D ( " " ) ;
Serial . print ( enc28j60Read ( ERXWRPTH ) , HEX ) ; delay ( 5 ) ;
Serial . print ( enc28j60Read ( ERXWRPTH ) , HEX ) ;
Serial . print ( enc28j60Read ( ERXWRPTL ) , HEX ) ; delay ( 5 ) ;
Serial . print ( enc28j60Read ( ERXWRPTL ) , HEX ) ;
SPrint_P ( PSTR ( " " ) ) ; delay ( 5 ) ;
SPrint_D ( " " ) ;
Serial . print ( enc28j60Read ( ERXRDPTH ) , HEX ) ; delay ( 5 ) ;
Serial . print ( enc28j60Read ( ERXRDPTH ) , HEX ) ;
Serial . print ( enc28j60Read ( ERXRDPTL ) , HEX ) ; delay ( 5 ) ;
Serial . print ( enc28j60Read ( ERXRDPTL ) , HEX ) ;
SPrint_P ( PSTR ( " " ) ) ; delay ( 5 ) ;
SPrint_D ( " " ) ;
Serial . print ( enc28j60Read ( ERXFCON ) , HEX ) ; delay ( 5 ) ;
Serial . print ( enc28j60Read ( ERXFCON ) , HEX ) ;
SPrint_P ( PSTR ( " " ) ) ; delay ( 5 ) ;
SPrint_D ( " " ) ;
Serial . print ( enc28j60Read ( EPKTCNT ) , HEX ) ; delay ( 5 ) ;
Serial . print ( enc28j60Read ( EPKTCNT ) , HEX ) ;
SPrint_P ( PSTR ( " " ) ) ; delay ( 5 ) ;
SPrint_D ( " " ) ;
Serial . print ( enc28j60Read ( MAMXFLH ) , HEX ) ; delay ( 5 ) ;
Serial . print ( enc28j60Read ( MAMXFLH ) , HEX ) ;
Serial . print ( enc28j60Read ( MAMXFLL ) , HEX ) ; delay ( 5 ) ;
Serial . print ( enc28j60Read ( MAMXFLL ) , HEX ) ;
Serial . println ( ) ; delay ( 5 ) ;
Serial . println ( ) ;
SPrint_P ( PSTR ( " Tx : ETXST ETXND MACLCON1 MACLCON2 MAPHSUP \r \n " ) ) ; delay ( 5 ) ;
SPrint_D ( " Tx : ETXST ETXND MACLCON1 MACLCON2 MAPHSUP \r \n " ) ;
SPrint_P ( PSTR ( " " ) ) ; delay ( 5 ) ;
SPrint_D ( " " ) ;
Serial . print ( enc28j60Read ( ETXSTH ) , HEX ) ; delay ( 5 ) ;
Serial . print ( enc28j60Read ( ETXSTH ) , HEX ) ;
Serial . print ( enc28j60Read ( ETXSTL ) , HEX ) ; delay ( 5 ) ;
Serial . print ( enc28j60Read ( ETXSTL ) , HEX ) ;
SPrint_P ( PSTR ( " " ) ) ; delay ( 5 ) ;
SPrint_D ( " " ) ;
Serial . print ( enc28j60Read ( ETXNDH ) , HEX ) ; delay ( 5 ) ;
Serial . print ( enc28j60Read ( ETXNDH ) , HEX ) ;
Serial . print ( enc28j60Read ( ETXNDL ) , HEX ) ; delay ( 5 ) ;
Serial . print ( enc28j60Read ( ETXNDL ) , HEX ) ;
SPrint_P ( PSTR ( " " ) ) ; delay ( 5 ) ;
SPrint_D ( " " ) ;
Serial . print ( enc28j60Read ( MACLCON1 ) , HEX ) ; delay ( 5 ) ;
Serial . print ( enc28j60Read ( MACLCON1 ) , HEX ) ;
SPrint_P ( PSTR ( " " ) ) ; delay ( 5 ) ;
SPrint_D ( " " ) ;
Serial . print ( enc28j60Read ( MACLCON2 ) , HEX ) ; delay ( 5 ) ;
Serial . print ( enc28j60Read ( MACLCON2 ) , HEX ) ;
SPrint_P ( PSTR ( " " ) ) ; delay ( 5 ) ;
SPrint_D ( " " ) ;
Serial . print ( enc28j60Read ( MAPHSUP ) , HEX ) ; delay ( 5 ) ;
Serial . print ( enc28j60Read ( MAPHSUP ) , HEX ) ;
Serial . println ( ) ; delay ( 5 ) ;
Serial . println ( ) ;
//delay_ms(25); delay(5);
SPrint_D ( " PHLCON: 00 " ) ;
delay ( 25 ) ;
Serial . println ( ( long int ) ( enc28j60PhyRead ( PHLCON ) ) , BIN ) ;
delay ( 1 ) ;
}
}
# endif