|
||
| Pubblicato il: 19.01.2007 | A cura di: Paolo Conte |
L’inizializzazione del modulo SPI avviene con queste due semplici istruzioni:
void encInit(){
TRISB = 0xFF; // configurazione I/O di PORTB
TRISC = 0xD1; // configurazione I/O di PORTC
PORTC = 0x00;
SSPSTAT = 0x40;
SSPCON1 = 0x20;
In particolare il modulo MSSP viene abilitato e configurato in modalità "0,0", con clock pari a Fosc/4.
L’inizializzazione del controller prevede la configurazione di diversi registri, nonchè l’abilitazione alla ricezione.
#define RX_BUF_START 0 #define RX_BUF_END 6499 #define TX_BUF_START 6500 .... setBank(0); writeReg(ERXSTL, LOW(RX_BUF_START)); // writeReg(ERXSTH, HIGH(RX_BUF_START)); // inizio buffer di lettura writeReg(ERXRDPTL, LOW(RX_BUF_END)); // writeReg(ERXRDPTH, HIGH(RX_BUF_END)); // puntatore del buffer di lettura writeReg(ERXNDL, LOW(RX_BUF_END)); // writeReg(ERXNDH, HIGH(RX_BUF_END)); // fine buffer di lettura writeReg(ETXSTL, LOW(TX_BUF_START)); // writeReg(ETXSTH, HIGH(TX_BUF_START)); // inizio buffer di scrittura
Come già detto in precedenza, il buffer dell’ENC28J60 può essere diviso a piacere tra memoria di trasmissione e di ricezione. Per fare ciò si configurano i puntatori del buffer di ricezione; la memoria rimanente sarà il buffer di trasmissione.
I registri ERXST contengono l’indirizzo del primo byte del buffer di ricezione, mentre i registri ERXND l’ultimo byte.
In ERXRDPT, invece, risiede il puntatore di lettura della memoria RX, ovvero contrassegna una zona (insieme a ERXWRPT) che deve ancora essere elaborata dal PIC e quindi non può essere scritta; inizialmente il valore di questo indirizzo è uguale a ERXND (deve essere dispari secondo un problema descritto nell’Errata). Il registro ERXWRPT vale zero al reset ed è aggiornato automaticamente alla ricezione di un pacchetto.
setBank(2); writeReg(MACON1, 0b01101); // MARXEN, TXPAUS, RXPAUS writeReg(MACON3, 0b00110000); // Half Duplex, Padding 60byte, CRC writeReg(MAIPGL, 0x12); // writeReg(MAIPGH, 0x0C); // writeReg(MABBIPG,0x12); // Inter-Packet Gap
Questi registri configurano il modulo MAC. Attraverso il registro MACON1 si abilitano il modulo MAC e la ricezione/trasmissione di trame di pausa.
Con il registro MACON3 si sceglie la modalità Duplex (Half o Full) del modulo MAC che deve essere impostata nello stesso modo anche nel modulo PHY; inoltre in questo registro sono presenti alcune configurazioni sul Padding automatico ed il calcolo del CRC.
I registri MAIPG e MABBIPG contengono i valori delle pause tra pacchetti; quelli presenti nel codice sono i valori standard.
writeReg(MAMXFLL, LOW(1500)); writeReg(MAMXFLH, HIGH(1500));
Nei registri MAXFL (Max Frame Length) viene salvata la massima dimensione consentita per un pacchetto; il controller può essere configurato in modo tale che si rifiuti di inviare un pacchetto che supera questo limite.
#define MY_MAC1 0x00 #define MY_MAC2 0x04 #define MY_MAC3 0xA3 #define MY_MAC4 0x00 #define MY_MAC5 0x00 #define MY_MAC6 0x00 .... setBank(3); writeReg(MAADR1, MY_MAC1); writeReg(MAADR2, MY_MAC2); writeReg(MAADR3, MY_MAC3); writeReg(MAADR4, MY_MAC4); writeReg(MAADR5, MY_MAC5); writeReg(MAADR6, MY_MAC6);
L’indirizzo MAC del nostro dispositivo viene salvato nei registri MACADR; quest’ultimi vengono solamente utilizzati dal filtro per respingere pacchetti non destinati al controller, quindi l’indirizzo non viene inserito automaticamente nei pacchetti da inviare.
writePHY(PHCON2, 0b0000000100000000); // disabilita il loopback writePHY(PHCON1, 0); // abilita il PHY setBank(1); writeReg(ERXFCON, 0b10100001); // imposta i filtri di ricezione BFSReg(ECON1, 0b100); // abilita la ricezione
Con quest’ultimo spezzone termina l’inizializzazione del controller. Il modulo PHY non ha molte opzioni da configurare, le uniche operazioni che vngono effettuate sono la disabilitazione del LoopBack (usato per fare test) e l’abilitazione del modulo.
I filtri sono settati in modo tale da accettare solo pacchetti destinati all’indirizzo MAC configurato e pacchetti di broadcast.