Definiciones | |
#define | ENC28J60_H |
#define | ADDR_MASK 0x1F |
#define | BANK_MASK 0x60 |
#define | SPRD_MASK 0x80 |
#define | CSACTIVE PORTB &= ~_BV(PB4) |
#define | CSPASSIVE PORTB |= _BV(PB4) |
#define | waitspi() while(!(SPSR&(1<<SPIF))) |
#define | MAX_TX_BUFFER 1500 |
#define | MAX_RX_BUFFER 1500 |
#define | RXSTART_INIT 0x0000 |
#define | RXSTOP_INIT (8192-1500-1) |
#define | TXSTART_INIT (8192-1500) |
#define | TXSTOP_INIT 8192 |
#define | MAX_FRAMELEN (1500+sizeof(ETH_HEADER)+4) |
All-bank registers | |
#define | EIE 0x1B |
#define | EIR 0x1C |
#define | ESTAT 0x1D |
#define | ECON2 0x1E |
#define | ECON1 0x1F |
Bank 0 registers | |
#define | ERDPTL (0x00|0x00) |
#define | ERDPTH (0x01|0x00) |
#define | EWRPTL (0x02|0x00) |
#define | EWRPTH (0x03|0x00) |
#define | ETXSTL (0x04|0x00) |
#define | ETXSTH (0x05|0x00) |
#define | ETXNDL (0x06|0x00) |
#define | ETXNDH (0x07|0x00) |
#define | ERXSTL (0x08|0x00) |
#define | ERXSTH (0x09|0x00) |
#define | ERXNDL (0x0A|0x00) |
#define | ERXNDH (0x0B|0x00) |
#define | ERXRDPTL (0x0C|0x00) |
#define | ERXRDPTH (0x0D|0x00) |
#define | ERXWRPTL (0x0E|0x00) |
#define | ERXWRPTH (0x0F|0x00) |
#define | EDMASTL (0x10|0x00) |
#define | EDMASTH (0x11|0x00) |
#define | EDMANDL (0x12|0x00) |
#define | EDMANDH (0x13|0x00) |
#define | EDMADSTL (0x14|0x00) |
#define | EDMADSTH (0x15|0x00) |
#define | EDMACSL (0x16|0x00) |
#define | EDMACSH (0x17|0x00) |
Bank 1 registers | |
#define | EHT0 (0x00|0x20) |
#define | EHT1 (0x01|0x20) |
#define | EHT2 (0x02|0x20) |
#define | EHT3 (0x03|0x20) |
#define | EHT4 (0x04|0x20) |
#define | EHT5 (0x05|0x20) |
#define | EHT6 (0x06|0x20) |
#define | EHT7 (0x07|0x20) |
#define | EPMM0 (0x08|0x20) |
#define | EPMM1 (0x09|0x20) |
#define | EPMM2 (0x0A|0x20) |
#define | EPMM3 (0x0B|0x20) |
#define | EPMM4 (0x0C|0x20) |
#define | EPMM5 (0x0D|0x20) |
#define | EPMM6 (0x0E|0x20) |
#define | EPMM7 (0x0F|0x20) |
#define | EPMCSL (0x10|0x20) |
#define | EPMCSH (0x11|0x20) |
#define | EPMOL (0x14|0x20) |
#define | EPMOH (0x15|0x20) |
#define | EWOLIE (0x16|0x20) |
#define | EWOLIR (0x17|0x20) |
#define | ERXFCON (0x18|0x20) |
#define | EPKTCNT (0x19|0x20) |
Bank 2 registers | |
#define | MACON1 (0x00|0x40|0x80) |
#define | MACON2 (0x01|0x40|0x80) |
#define | MACON3 (0x02|0x40|0x80) |
#define | MACON4 (0x03|0x40|0x80) |
#define | MABBIPG (0x04|0x40|0x80) |
#define | MAIPGL (0x06|0x40|0x80) |
#define | MAIPGH (0x07|0x40|0x80) |
#define | MACLCON1 (0x08|0x40|0x80) |
#define | MACLCON2 (0x09|0x40|0x80) |
#define | MAMXFLL (0x0A|0x40|0x80) |
#define | MAMXFLH (0x0B|0x40|0x80) |
#define | MAPHSUP (0x0D|0x40|0x80) |
#define | MICON (0x11|0x40|0x80) |
#define | MICMD (0x12|0x40|0x80) |
#define | MIREGADR (0x14|0x40|0x80) |
#define | MIWRL (0x16|0x40|0x80) |
#define | MIWRH (0x17|0x40|0x80) |
#define | MIRDL (0x18|0x40|0x80) |
#define | MIRDH (0x19|0x40|0x80) |
Bank 3 registers | |
#define | MAADR1 (0x00|0x60|0x80) |
#define | MAADR0 (0x01|0x60|0x80) |
#define | MAADR3 (0x02|0x60|0x80) |
#define | MAADR2 (0x03|0x60|0x80) |
#define | MAADR5 (0x04|0x60|0x80) |
#define | MAADR4 (0x05|0x60|0x80) |
#define | EBSTSD (0x06|0x60) |
#define | EBSTCON (0x07|0x60) |
#define | EBSTCSL (0x08|0x60) |
#define | EBSTCSH (0x09|0x60) |
#define | MISTAT (0x0A|0x60|0x80) |
#define | EREVID (0x12|0x60) |
#define | ECOCON (0x15|0x60) |
#define | EFLOCON (0x17|0x60) |
#define | EPAUSL (0x18|0x60) |
#define | EPAUSH (0x19|0x60) |
PHY registers | |
#define | PHCON1 0x00 |
#define | PHSTAT1 0x01 |
#define | PHHID1 0x02 |
#define | PHHID2 0x03 |
#define | PHCON2 0x10 |
#define | PHSTAT2 0x11 |
#define | PHIE 0x12 |
#define | PHIR 0x13 |
#define | PHLCON 0x14 |
ENC28J60 ERXFCON Register Bit Definitions | |
#define | ERXFCON_UCEN 0x80 |
#define | ERXFCON_ANDOR 0x40 |
#define | ERXFCON_CRCEN 0x20 |
#define | ERXFCON_PMEN 0x10 |
#define | ERXFCON_MPEN 0x08 |
#define | ERXFCON_HTEN 0x04 |
#define | ERXFCON_MCEN 0x02 |
#define | ERXFCON_BCEN 0x01 |
ENC28J60 EIE Register Bit Definitions | |
#define | EIE_INTIE 0x80 |
#define | EIE_PKTIE 0x40 |
#define | EIE_DMAIE 0x20 |
#define | EIE_LINKIE 0x10 |
#define | EIE_TXIE 0x08 |
#define | EIE_WOLIE 0x04 |
#define | EIE_TXERIE 0x02 |
#define | EIE_RXERIE 0x01 |
ENC28J60 EIR Register Bit Definitions | |
#define | EIR_PKTIF 0x40 |
#define | EIR_DMAIF 0x20 |
#define | EIR_LINKIF 0x10 |
#define | EIR_TXIF 0x08 |
#define | EIR_WOLIF 0x04 |
#define | EIR_TXERIF 0x02 |
#define | EIR_RXERIF 0x01 |
ENC28J60 ESTAT Register Bit Definitions | |
#define | ESTAT_INT 0x80 |
#define | ESTAT_LATECOL 0x10 |
#define | ESTAT_RXBUSY 0x04 |
#define | ESTAT_TXABRT 0x02 |
#define | ESTAT_CLKRDY 0x01 |
ENC28J60 ECON2 Register Bit Definitions | |
#define | ECON2_AUTOINC 0x80 |
#define | ECON2_PKTDEC 0x40 |
#define | ECON2_PWRSV 0x20 |
#define | ECON2_VRPS 0x08 |
ENC28J60 ECON1 Register Bit Definitions | |
#define | ECON1_TXRST 0x80 |
#define | ECON1_RXRST 0x40 |
#define | ECON1_DMAST 0x20 |
#define | ECON1_CSUMEN 0x10 |
#define | ECON1_TXRTS 0x08 |
#define | ECON1_RXEN 0x04 |
#define | ECON1_BSEL1 0x02 |
#define | ECON1_BSEL0 0x01 |
ENC28J60 MACON1 Register Bit Definitions | |
#define | MACON1_LOOPBK 0x10 |
#define | MACON1_TXPAUS 0x08 |
#define | MACON1_RXPAUS 0x04 |
#define | MACON1_PASSALL 0x02 |
#define | MACON1_MARXEN 0x01 |
ENC28J60 MACON2 Register Bit Definitions | |
#define | MACON2_MARST 0x80 |
#define | MACON2_RNDRST 0x40 |
#define | MACON2_MARXRST 0x08 |
#define | MACON2_RFUNRST 0x04 |
#define | MACON2_MATXRST 0x02 |
#define | MACON2_TFUNRST 0x01 |
ENC28J60 MACON3 Register Bit Definitions | |
#define | MACON3_PADCFG2 0x80 |
#define | MACON3_PADCFG1 0x40 |
#define | MACON3_PADCFG0 0x20 |
#define | MACON3_TXCRCEN 0x10 |
#define | MACON3_PHDRLEN 0x08 |
#define | MACON3_HFRMLEN 0x04 |
#define | MACON3_FRMLNEN 0x02 |
#define | MACON3_FULDPX 0x01 |
ENC28J60 MACON4 Register Bit Definitions | |
#define | MACON4_DEFER (1<<6) |
#define | MACON4_BPEN (1<<5) |
#define | MACON4_NOBKOFF (1<<4) |
ENC28J60 MICMD Register Bit Definitions | |
#define | MICMD_MIISCAN 0x02 |
#define | MICMD_MIIRD 0x01 |
ENC28J60 MISTAT Register Bit Definitions | |
#define | MISTAT_NVALID 0x04 |
#define | MISTAT_SCAN 0x02 |
#define | MISTAT_BUSY 0x01 |
ENC28J60 PHY PHCON1 Register Bit Definitions | |
#define | PHCON1_PRST 0x8000 |
#define | PHCON1_PLOOPBK 0x4000 |
#define | PHCON1_PPWRSV 0x0800 |
#define | PHCON1_PDPXMD 0x0100 |
ENC28J60 PHY PHSTAT1 Register Bit Definitions | |
#define | PHSTAT1_PFDPX 0x1000 |
#define | PHSTAT1_PHDPX 0x0800 |
#define | PHSTAT1_LLSTAT 0x0004 |
#define | PHSTAT1_JBSTAT 0x0002 |
ENC28J60 PHY PHCON2 Register Bit Definitions | |
#define | PHCON2_FRCLINK 0x4000 |
#define | PHCON2_TXDIS 0x2000 |
#define | PHCON2_JABBER 0x0400 |
#define | PHCON2_HDLDIS 0x0100 |
ENC28J60 Packet Control Byte Bit Definitions | |
#define | PKTCTRL_PHUGEEN 0x08 |
#define | PKTCTRL_PPADEN 0x04 |
#define | PKTCTRL_PCRCEN 0x02 |
#define | PKTCTRL_POVERRIDE 0x01 |
SPI operation codes | |
#define | ENC28J60_READ_CTRL_REG 0x00 |
#define | ENC28J60_READ_BUF_MEM 0x3A |
#define | ENC28J60_WRITE_CTRL_REG 0x40 |
#define | ENC28J60_WRITE_BUF_MEM 0x7A |
#define | ENC28J60_BIT_FIELD_SET 0x80 |
#define | ENC28J60_BIT_FIELD_CLR 0xA0 |
#define | ENC28J60_SOFT_RESET 0xFF |
ENC28J60 SPI port PIN names | |
#define | ENC28J60_RESET_PIN_DDR DDD3 |
#define | ENC28J60_INT_PIN_DDR DDD2 |
#define | ENC28J60_RESET_PIN PD3 |
#define | ENC28J60_INT_PIN PD2 |
#define | ENC28J60_PORT PORTD |
#define | ENC28J60_DDR DDRD |
Funciones | |
BYTE | enc28j60ReadOp (BYTE op, BYTE address) |
Implementa operaciones del tipo lectura Enmascara OPCODE y address para generar el comando: O0 O1 O2 A0 A1 A2 A3 A4 espera a que llegue el dato y lo devuelve. | |
void | enc28j60WriteOp (BYTE op, BYTE address, BYTE data) |
Implementa operaciones del tipo escritura Enmascara OPCODE y address para generar el comando: O0 O1 O2 A0 A1 A2 A3 A4 Escribe el dato. | |
void | enc28j60SetBank (BYTE address) |
Setea el banco con el que se esta trabajando. | |
BYTE | enc28j60Read (BYTE address) |
Implementa lectura de un registro setea el banco usando la primer parte de la direccion llama a ReadOp usando OPCODE de lectura de registro y address. | |
void | enc28j60Write (BYTE address, BYTE data) |
Implementa escritura de un registro setea el banco usando la primer parte de la direccion llama a WriteOp usando OPCODE de escritura de registro y address. | |
WORD | enc28j60_read_phyreg (BYTE address) |
Implementa lectura de un registro del tipo PHY ver datasheet por diferencias con lectura comun. | |
void | enc28j60PhyWrite (BYTE address, WORD_BYTES data) |
Implementa escritura de un registro PHY ver datasheet por diferencias con lectura comun. | |
void | enc28j60_init (BYTE *avr_mac) |
Inicializa el puerto SPI y el chip ENC28J60 La inicializacion se hace en base a las recomendaciones del datasheet inicializa buffers Tx y Rx inicializa capa MAC inicializa capa PHY. | |
BYTE | enc28j60getrev (void) |
lee "Silicon Revision Level" (no es muy necesario) | |
void | enc28j60_packet_send (BYTE *buffer, WORD length) |
Envia un paquete Escribe un bloque de memoria en el buffer Tx del ENC y lo envia a la red. Agrega el byte de control necesario para el ENC previo a cada paquete a ser transmitido. El ENC se encarga de agregar el preambulo, CRC y padding necesarios. | |
BYTE | enc28j60_mac_is_linked (void) |
WORD | enc28j60_tx_checksum (WORD offset, WORD len) |
WORD | enc28j60_packet_receive (BYTE *rxtx_buffer, WORD max_length) |
Lee un paquete que llega al ENC Escribe el paquete recibido a RAM. Devuelve el largo del paquete. |
Se definen los comandos del ENC, las direcciones de registros, los pines del puerto SPI y constantes como el tamaño del paquete y de inicializacion. La direccion de un registro se define como un byte que contiene:
#define ADDR_MASK 0x1F |
#define BANK_MASK 0x60 |
#define CSACTIVE PORTB &= ~_BV(PB4) |
#define CSPASSIVE PORTB |= _BV(PB4) |
#define EBSTCON (0x07|0x60) |
#define EBSTCSH (0x09|0x60) |
#define EBSTCSL (0x08|0x60) |
#define EBSTSD (0x06|0x60) |
#define ECOCON (0x15|0x60) |
#define ECON1 0x1F |
#define ECON1_BSEL0 0x01 |
#define ECON1_BSEL1 0x02 |
#define ECON1_CSUMEN 0x10 |
#define ECON1_DMAST 0x20 |
#define ECON1_RXEN 0x04 |
#define ECON1_RXRST 0x40 |
#define ECON1_TXRST 0x80 |
#define ECON1_TXRTS 0x08 |
#define ECON2 0x1E |
#define ECON2_AUTOINC 0x80 |
#define ECON2_PKTDEC 0x40 |
#define ECON2_PWRSV 0x20 |
#define ECON2_VRPS 0x08 |
#define EDMACSH (0x17|0x00) |
#define EDMACSL (0x16|0x00) |
#define EDMADSTH (0x15|0x00) |
#define EDMADSTL (0x14|0x00) |
#define EDMANDH (0x13|0x00) |
#define EDMANDL (0x12|0x00) |
#define EDMASTH (0x11|0x00) |
#define EDMASTL (0x10|0x00) |
#define EFLOCON (0x17|0x60) |
#define EHT0 (0x00|0x20) |
#define EHT1 (0x01|0x20) |
#define EHT2 (0x02|0x20) |
#define EHT3 (0x03|0x20) |
#define EHT4 (0x04|0x20) |
#define EHT5 (0x05|0x20) |
#define EHT6 (0x06|0x20) |
#define EHT7 (0x07|0x20) |
#define EIE 0x1B |
#define EIE_DMAIE 0x20 |
#define EIE_INTIE 0x80 |
#define EIE_LINKIE 0x10 |
#define EIE_PKTIE 0x40 |
#define EIE_RXERIE 0x01 |
#define EIE_TXERIE 0x02 |
#define EIE_TXIE 0x08 |
#define EIE_WOLIE 0x04 |
#define EIR 0x1C |
#define EIR_DMAIF 0x20 |
#define EIR_LINKIF 0x10 |
#define EIR_PKTIF 0x40 |
#define EIR_RXERIF 0x01 |
#define EIR_TXERIF 0x02 |
#define EIR_TXIF 0x08 |
#define EIR_WOLIF 0x04 |
#define ENC28J60_BIT_FIELD_CLR 0xA0 |
#define ENC28J60_BIT_FIELD_SET 0x80 |
#define ENC28J60_DDR DDRD |
#define ENC28J60_H |
#define ENC28J60_INT_PIN PD2 |
#define ENC28J60_INT_PIN_DDR DDD2 |
#define ENC28J60_PORT PORTD |
#define ENC28J60_READ_BUF_MEM 0x3A |
#define ENC28J60_READ_CTRL_REG 0x00 |
#define ENC28J60_RESET_PIN PD3 |
#define ENC28J60_RESET_PIN_DDR DDD3 |
#define ENC28J60_SOFT_RESET 0xFF |
#define ENC28J60_WRITE_BUF_MEM 0x7A |
#define ENC28J60_WRITE_CTRL_REG 0x40 |
#define EPAUSH (0x19|0x60) |
#define EPAUSL (0x18|0x60) |
#define EPKTCNT (0x19|0x20) |
#define EPMCSH (0x11|0x20) |
#define EPMCSL (0x10|0x20) |
#define EPMM0 (0x08|0x20) |
#define EPMM1 (0x09|0x20) |
#define EPMM2 (0x0A|0x20) |
#define EPMM3 (0x0B|0x20) |
#define EPMM4 (0x0C|0x20) |
#define EPMM5 (0x0D|0x20) |
#define EPMM6 (0x0E|0x20) |
#define EPMM7 (0x0F|0x20) |
#define EPMOH (0x15|0x20) |
#define EPMOL (0x14|0x20) |
#define ERDPTH (0x01|0x00) |
#define ERDPTL (0x00|0x00) |
#define EREVID (0x12|0x60) |
#define ERXFCON (0x18|0x20) |
#define ERXFCON_ANDOR 0x40 |
#define ERXFCON_BCEN 0x01 |
#define ERXFCON_CRCEN 0x20 |
#define ERXFCON_HTEN 0x04 |
#define ERXFCON_MCEN 0x02 |
#define ERXFCON_MPEN 0x08 |
#define ERXFCON_PMEN 0x10 |
#define ERXFCON_UCEN 0x80 |
#define ERXNDH (0x0B|0x00) |
#define ERXNDL (0x0A|0x00) |
#define ERXRDPTH (0x0D|0x00) |
#define ERXRDPTL (0x0C|0x00) |
#define ERXSTH (0x09|0x00) |
#define ERXSTL (0x08|0x00) |
#define ERXWRPTH (0x0F|0x00) |
#define ERXWRPTL (0x0E|0x00) |
#define ESTAT 0x1D |
#define ESTAT_CLKRDY 0x01 |
#define ESTAT_INT 0x80 |
#define ESTAT_LATECOL 0x10 |
#define ESTAT_RXBUSY 0x04 |
#define ESTAT_TXABRT 0x02 |
#define ETXNDH (0x07|0x00) |
#define ETXNDL (0x06|0x00) |
#define ETXSTH (0x05|0x00) |
#define ETXSTL (0x04|0x00) |
#define EWOLIE (0x16|0x20) |
#define EWOLIR (0x17|0x20) |
#define EWRPTH (0x03|0x00) |
#define EWRPTL (0x02|0x00) |
#define MAADR0 (0x01|0x60|0x80) |
#define MAADR1 (0x00|0x60|0x80) |
#define MAADR2 (0x03|0x60|0x80) |
#define MAADR3 (0x02|0x60|0x80) |
#define MAADR4 (0x05|0x60|0x80) |
#define MAADR5 (0x04|0x60|0x80) |
#define MABBIPG (0x04|0x40|0x80) |
#define MACLCON1 (0x08|0x40|0x80) |
#define MACLCON2 (0x09|0x40|0x80) |
#define MACON1 (0x00|0x40|0x80) |
#define MACON1_LOOPBK 0x10 |
#define MACON1_MARXEN 0x01 |
#define MACON1_PASSALL 0x02 |
#define MACON1_RXPAUS 0x04 |
#define MACON1_TXPAUS 0x08 |
#define MACON2 (0x01|0x40|0x80) |
#define MACON2_MARST 0x80 |
#define MACON2_MARXRST 0x08 |
#define MACON2_MATXRST 0x02 |
#define MACON2_RFUNRST 0x04 |
#define MACON2_RNDRST 0x40 |
#define MACON2_TFUNRST 0x01 |
#define MACON3 (0x02|0x40|0x80) |
#define MACON3_FRMLNEN 0x02 |
#define MACON3_FULDPX 0x01 |
#define MACON3_HFRMLEN 0x04 |
#define MACON3_PADCFG0 0x20 |
#define MACON3_PADCFG1 0x40 |
#define MACON3_PADCFG2 0x80 |
#define MACON3_PHDRLEN 0x08 |
#define MACON3_TXCRCEN 0x10 |
#define MACON4 (0x03|0x40|0x80) |
#define MACON4_BPEN (1<<5) |
#define MACON4_DEFER (1<<6) |
#define MACON4_NOBKOFF (1<<4) |
#define MAIPGH (0x07|0x40|0x80) |
#define MAIPGL (0x06|0x40|0x80) |
#define MAMXFLH (0x0B|0x40|0x80) |
#define MAMXFLL (0x0A|0x40|0x80) |
#define MAPHSUP (0x0D|0x40|0x80) |
#define MAX_FRAMELEN (1500+sizeof(ETH_HEADER)+4) |
#define MAX_RX_BUFFER 1500 |
#define MAX_TX_BUFFER 1500 |
#define MICMD (0x12|0x40|0x80) |
#define MICMD_MIIRD 0x01 |
#define MICMD_MIISCAN 0x02 |
#define MICON (0x11|0x40|0x80) |
#define MIRDH (0x19|0x40|0x80) |
#define MIRDL (0x18|0x40|0x80) |
#define MIREGADR (0x14|0x40|0x80) |
#define MISTAT (0x0A|0x60|0x80) |
#define MISTAT_BUSY 0x01 |
#define MISTAT_NVALID 0x04 |
#define MISTAT_SCAN 0x02 |
#define MIWRH (0x17|0x40|0x80) |
#define MIWRL (0x16|0x40|0x80) |
#define PHCON1 0x00 |
#define PHCON1_PDPXMD 0x0100 |
#define PHCON1_PLOOPBK 0x4000 |
#define PHCON1_PPWRSV 0x0800 |
#define PHCON1_PRST 0x8000 |
#define PHCON2 0x10 |
#define PHCON2_FRCLINK 0x4000 |
#define PHCON2_HDLDIS 0x0100 |
#define PHCON2_JABBER 0x0400 |
#define PHCON2_TXDIS 0x2000 |
#define PHHID1 0x02 |
#define PHHID2 0x03 |
#define PHIE 0x12 |
#define PHIR 0x13 |
#define PHLCON 0x14 |
#define PHSTAT1 0x01 |
#define PHSTAT1_JBSTAT 0x0002 |
#define PHSTAT1_LLSTAT 0x0004 |
#define PHSTAT1_PFDPX 0x1000 |
#define PHSTAT1_PHDPX 0x0800 |
#define PHSTAT2 0x11 |
#define PKTCTRL_PCRCEN 0x02 |
#define PKTCTRL_PHUGEEN 0x08 |
#define PKTCTRL_POVERRIDE 0x01 |
#define PKTCTRL_PPADEN 0x04 |
#define RXSTART_INIT 0x0000 |
#define RXSTOP_INIT (8192-1500-1) |
#define SPRD_MASK 0x80 |
#define TXSTART_INIT (8192-1500) |
#define TXSTOP_INIT 8192 |
#define waitspi | ( | ) | while(!(SPSR&(1<<SPIF))) |
void enc28j60_init | ( | BYTE * | avr_mac | ) |
Inicializa el puerto SPI y el chip ENC28J60
La inicializacion se hace en base a las recomendaciones del datasheet
inicializa buffers Tx y Rx
inicializa capa MAC
inicializa capa PHY.
avr_mac | puntero a la direccion MAC |
enable PD3, reset as output
INICIALIZACION DE ETHERNET
puntero al siguiente paquete= dir rx inicial
ERXST= RXSTART_INIT (ETHERNET RECEIVE BUFFER START POINTER)
ERXRDPT= RXSTART_INIT (ETHERNET RECEIVE BUFFER READ POINTER)
ERXND= RXSTOP_INIT (ETHERNET RECEIVE BUFFER END POINTER)
ETXST= TXSTART_INIT posicion del paquete a trasmitir (inicial)
ETXND= TXSTOP_INIT
INICIALIZACION DE LA MAC
MARXEN: ENEBLE MAC TO RECEIVE FRAMES
TXPAUS Y RXPAUS: SE SETEAN SI USO FULL DUPLEX XA CONTROL DE FLUJO
bring MAC out of reset
enable automatic padding to 60bytes and CRC operations
LA MAC ESPERA INDEFINIDAMENTE A QUE SE LIBERE EL MEDIO PARA TRANSMITIR
SE ANULA EL TIMEOUT PARA TRANSMISION
Set non-back-to-back inter-packet gap to 9.6us. The back-to-back inter-packet gap (MABBIPG) is set by MACSetDuplex() which is called later.
Set the maximum packet size which the controller will accept.
Do not send packets longer than MAX_FRAMELEN:
write MAC address
NOTE: MAC address in ENC28J60 is byte-backward ENC28J60 is big-endian avr gcc is little-endian
no loopback of transmitted frames
do bank 1 stuff, packet filter:
For broadcast packets we allow only ARP packtets
All other packets should be unicast only for our mac (MAADR)
The pattern to match on is therefore
Type ETH.DST
ARP BROADCAST
06 08 -- ff ff ff ff ff ff -> ip checksum for theses bytes=f7f9
in binary these poitions are:11 0000 0011 1111
This is hex 303F->EPMM0=0x3f,EPMM1=0x30
PMEN=PATTERN MATCH
CRCEN = POST FILTER CRC ENABLE
UCEN= UNICAST ENABLE
EPMM0= 0x3f,EPMM1= 0x30
SETEA DONDE ESTA EL PATRON ADENTRO DEL MENSAJE
EPMCSL= 0xf9, EPMCSH= 0xf7
PATERN MATCH CHECKSUM
set inter-frame gap (back-to-back)
switch to bank 0
enable interrutps
enable packet reception
BYTE enc28j60_mac_is_linked | ( | void | ) |
Lee un paquete que llega al ENC
Escribe el paquete recibido a RAM.
Devuelve el largo del paquete.
rxtx_buffer | espacio de memoria donde se colocaran los datos recibidos | |
max_length | largo maximo de datos a leer |
check if a packet has been received and buffered
Set the read pointer to the start of the received packet
read the next packet pointer
read the packet length (see datasheet page 43)
read the receive status (see datasheet page 43)
check CRC and symbol errors (see datasheet page 44, table 7-3): The ERXFCON.CRCEN is set by default. Normally we should not need to check this.
read data from rx buffer and save to rxtx_buffer
Move the RX read pointer to the start of the next received packet
decrement the packet counter indicate we are done with this packet
Envia un paquete
Escribe un bloque de memoria en el buffer Tx del ENC y lo envia a la red.
Agrega el byte de control necesario para el ENC previo a cada paquete a ser transmitido.
El ENC se encarga de agregar el preambulo, CRC y padding necesarios.
buffer | espacio de memoria donde estan los datos a enviar | |
length | largo de datos |
Set the write pointer to start of transmit buffer area
Set the TXND pointer to correspond to the packet size given
write per-packet control byte (0x00 means use macon3 settings)
issue write command
write data
send the contents of the transmit buffer onto the network
Reset the transmit logic problem. See Rev. B4 Silicon Errata point 12.
Implementa lectura de un registro del tipo PHY ver datasheet por diferencias con lectura comun.
address | un registro |
set the PHY register address
Loop to wait until the PHY register has been read through the MII This requires 10.24us
Stop reading
Obtain results and return
BYTE enc28j60getrev | ( | void | ) |
lee "Silicon Revision Level" (no es muy necesario)
void enc28j60PhyWrite | ( | BYTE | address, | |
WORD_BYTES | data | |||
) |
Implementa escritura de un registro PHY
ver datasheet por diferencias con lectura comun.
address | un registro | |
data | dato a escribir |
set the PHY register address
write the PHY data
wait until the PHY write completes
Implementa lectura de un registro
setea el banco usando la primer parte de la direccion
llama a ReadOp usando OPCODE de lectura de registro y address.
address | un registro |
selecciona banco a leer.
lee utilizando ReadOp
Implementa operaciones del tipo lectura
Enmascara OPCODE y address para generar el comando:
O0 O1 O2 A0 A1 A2 A3 A4
espera a que llegue el dato y lo devuelve.
op | un opcode. | |
address | un registro |
pongo activo el CS indicando inicio de Tx
envio comando de lectura
espero que el comando sea enviado
escribir el SPDR hace q se inicie una transmision de 1 byte
espero a que llegue el dato que queda guardado en SPDR
si necesito doble lectura(la anterior fue dummy y debo hacer otra)(for mac and mii, see datasheet page 29)
void enc28j60SetBank | ( | BYTE | address | ) |
Setea el banco con el que se esta trabajando.
address | nombre del banco |
LA MEMORIA SE DIVIDE EN 4 BANCOS SELECCIONABLES POR MEDIO DE BSEL0,1 (VER PAG 14)
setea el banco solo si es diferente del actual
LIMPIA LOS 2 MEDIANTE AND CON 11111100
HACE UN OR ENMASCARADO: 000000XX
GUARDA REGISTRO DE EN Q BANCO ESTOY
Implementa escritura de un registro
setea el banco usando la primer parte de la direccion
llama a WriteOp usando OPCODE de escritura de registro y address.
address | un registro | |
data | dato a escribir |
selecciona el banco en q va a escribir
escribe el registro utilizando WriteOp
Implementa operaciones del tipo escritura
Enmascara OPCODE y address para generar el comando:
O0 O1 O2 A0 A1 A2 A3 A4
Escribe el dato.
EJECUCION DE COMANDOS DE ESCRITURA
LOS 7 COMANDOS SON UN OPCODE DE 3 BITS + UN ARGUMENTO DE 5 BITS(ADDRESS) Y EL SIGUIENTE BYTE ES EL DATO
OP ES EL COMANDO: (VER INSTRUCTION SET)
ADDRESS INDICA EL ARGUMENTO
DATA ES EL DATO Q SE ESCRIBE
op | un opcode. | |
address | un registro | |
data | el dato a escribir |
indica comando escribir y a que direccion
espera a que se active flag de interrupcion de spi (o sea que haya llegado el comando)
escribe el dato en SPDR (es SPI I/O data register)