00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "avr/io.h"
00021
00022 #include "global.h"
00023 #include "timer.h"
00024 #include "rprintf.h"
00025
00026 #include "enc28j60.h"
00027
00028 #ifdef SPDR0
00029 #define SPDR SPDR0
00030 #define SPCR SPCR0
00031 #define SPSR SPSR0
00032
00033 #define SPIF SPIF0
00034 #define MSTR MSTR0
00035 #define CPOL CPOL0
00036 #define DORD DORD0
00037 #define SPR0 SPR00
00038 #define SPR1 SPR01
00039 #define SPI2X SPI2X0
00040 #define SPE SPE0
00041 #endif
00042
00043
00044 #include "enc28j60conf.h"
00045
00046 u08 Enc28j60Bank;
00047 u16 NextPacketPtr;
00048
00049 void nicInit(void)
00050 {
00051 enc28j60Init();
00052 }
00053
00054 void nicSend(unsigned int len, unsigned char* packet)
00055 {
00056 enc28j60PacketSend(len, packet);
00057 }
00058
00059 unsigned int nicPoll(unsigned int maxlen, unsigned char* packet)
00060 {
00061 return enc28j60PacketReceive(maxlen, packet);
00062 }
00063
00064 void nicGetMacAddress(u08* macaddr)
00065 {
00066
00067
00068 *macaddr++ = enc28j60Read(MAADR5);
00069 *macaddr++ = enc28j60Read(MAADR4);
00070 *macaddr++ = enc28j60Read(MAADR3);
00071 *macaddr++ = enc28j60Read(MAADR2);
00072 *macaddr++ = enc28j60Read(MAADR1);
00073 *macaddr++ = enc28j60Read(MAADR0);
00074 }
00075
00076 void nicSetMacAddress(u08* macaddr)
00077 {
00078
00079
00080 enc28j60Write(MAADR5, *macaddr++);
00081 enc28j60Write(MAADR4, *macaddr++);
00082 enc28j60Write(MAADR3, *macaddr++);
00083 enc28j60Write(MAADR2, *macaddr++);
00084 enc28j60Write(MAADR1, *macaddr++);
00085 enc28j60Write(MAADR0, *macaddr++);
00086 }
00087
00088 void nicRegDump(void)
00089 {
00090 enc28j60RegDump();
00091 }
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123 u08 enc28j60ReadOp(u08 op, u08 address)
00124 {
00125 u08 data;
00126
00127
00128 ENC28J60_CONTROL_PORT &= ~(1<<ENC28J60_CONTROL_CS);
00129
00130
00131 SPDR = op | (address & ADDR_MASK);
00132 while(!(SPSR & (1<<SPIF)));
00133
00134 SPDR = 0x00;
00135 while(!(SPSR & (1<<SPIF)));
00136
00137 if(address & 0x80)
00138 {
00139 SPDR = 0x00;
00140 while(!(inb(SPSR) & (1<<SPIF)));
00141 }
00142 data = SPDR;
00143
00144
00145 ENC28J60_CONTROL_PORT |= (1<<ENC28J60_CONTROL_CS);
00146
00147 return data;
00148 }
00149
00150 void enc28j60WriteOp(u08 op, u08 address, u08 data)
00151 {
00152
00153 ENC28J60_CONTROL_PORT &= ~(1<<ENC28J60_CONTROL_CS);
00154
00155
00156 SPDR = op | (address & ADDR_MASK);
00157 while(!(SPSR & (1<<SPIF)));
00158
00159 SPDR = data;
00160 while(!(SPSR & (1<<SPIF)));
00161
00162
00163 ENC28J60_CONTROL_PORT |= (1<<ENC28J60_CONTROL_CS);
00164 }
00165
00166 void enc28j60ReadBuffer(u16 len, u08* data)
00167 {
00168
00169 ENC28J60_CONTROL_PORT &= ~(1<<ENC28J60_CONTROL_CS);
00170
00171
00172 SPDR = ENC28J60_READ_BUF_MEM;
00173 while(!(SPSR & (1<<SPIF)));
00174 while(len--)
00175 {
00176
00177 SPDR = 0x00;
00178 while(!(SPSR & (1<<SPIF)));
00179 *data++ = SPDR;
00180 }
00181
00182 ENC28J60_CONTROL_PORT |= (1<<ENC28J60_CONTROL_CS);
00183 }
00184
00185 void enc28j60WriteBuffer(u16 len, u08* data)
00186 {
00187
00188 ENC28J60_CONTROL_PORT &= ~(1<<ENC28J60_CONTROL_CS);
00189
00190
00191 SPDR = ENC28J60_WRITE_BUF_MEM;
00192 while(!(SPSR & (1<<SPIF)));
00193 while(len--)
00194 {
00195
00196 SPDR = *data++;
00197 while(!(SPSR & (1<<SPIF)));
00198 }
00199
00200 ENC28J60_CONTROL_PORT |= (1<<ENC28J60_CONTROL_CS);
00201 }
00202
00203 void enc28j60SetBank(u08 address)
00204 {
00205
00206 if((address & BANK_MASK) != Enc28j60Bank)
00207 {
00208
00209 enc28j60WriteOp(ENC28J60_BIT_FIELD_CLR, ECON1, (ECON1_BSEL1|ECON1_BSEL0));
00210 enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, ECON1, (address & BANK_MASK)>>5);
00211 Enc28j60Bank = (address & BANK_MASK);
00212 }
00213 }
00214
00215 u08 enc28j60Read(u08 address)
00216 {
00217
00218 enc28j60SetBank(address);
00219
00220 return enc28j60ReadOp(ENC28J60_READ_CTRL_REG, address);
00221 }
00222
00223 void enc28j60Write(u08 address, u08 data)
00224 {
00225
00226 enc28j60SetBank(address);
00227
00228 enc28j60WriteOp(ENC28J60_WRITE_CTRL_REG, address, data);
00229 }
00230
00231 u16 enc28j60PhyRead(u08 address)
00232 {
00233 u16 data;
00234
00235
00236 enc28j60Write(MIREGADR, address);
00237 enc28j60Write(MICMD, MICMD_MIIRD);
00238
00239
00240 while(enc28j60Read(MISTAT) & MISTAT_BUSY);
00241
00242
00243 enc28j60Write(MICMD, 0x00);
00244
00245
00246 data = enc28j60Read(MIRDL);
00247 data |= enc28j60Read(MIRDH);
00248
00249 return data;
00250 }
00251
00252 void enc28j60PhyWrite(u08 address, u16 data)
00253 {
00254
00255 enc28j60Write(MIREGADR, address);
00256
00257
00258 enc28j60Write(MIWRL, data);
00259 enc28j60Write(MIWRH, data>>8);
00260
00261
00262 while(enc28j60Read(MISTAT) & MISTAT_BUSY);
00263 }
00264
00265 void enc28j60Init(void)
00266 {
00267
00268 sbi(ENC28J60_CONTROL_DDR, ENC28J60_CONTROL_CS);
00269 sbi(ENC28J60_CONTROL_PORT, ENC28J60_CONTROL_CS);
00270
00271
00272 sbi(ENC28J60_SPI_PORT, ENC28J60_SPI_SCK);
00273 sbi(ENC28J60_SPI_DDR, ENC28J60_SPI_SCK);
00274 cbi(ENC28J60_SPI_DDR, ENC28J60_SPI_MISO);
00275 sbi(ENC28J60_SPI_DDR, ENC28J60_SPI_MOSI);
00276 sbi(ENC28J60_SPI_DDR, ENC28J60_SPI_SS);
00277
00278
00279 sbi(SPCR, MSTR);
00280
00281 cbi(SPCR, CPOL);
00282
00283 cbi(SPCR,DORD);
00284
00285 cbi(SPCR, SPR0);
00286 cbi(SPCR, SPR1);
00287 sbi(SPSR, SPI2X);
00288
00289 sbi(SPCR, SPE);
00290
00291
00292 enc28j60WriteOp(ENC28J60_SOFT_RESET, 0, ENC28J60_SOFT_RESET);
00293
00294 delay_us(50);
00295 while(!(enc28j60Read(ESTAT) & ESTAT_CLKRDY));
00296
00297
00298
00299
00300
00301 NextPacketPtr = RXSTART_INIT;
00302 enc28j60Write(ERXSTL, RXSTART_INIT&0xFF);
00303 enc28j60Write(ERXSTH, RXSTART_INIT>>8);
00304
00305 enc28j60Write(ERXRDPTL, RXSTART_INIT&0xFF);
00306 enc28j60Write(ERXRDPTH, RXSTART_INIT>>8);
00307
00308
00309 enc28j60Write(ERXNDL, RXSTOP_INIT&0xFF);
00310 enc28j60Write(ERXNDH, RXSTOP_INIT>>8);
00311
00312
00313 enc28j60Write(ETXSTL, TXSTART_INIT&0xFF);
00314 enc28j60Write(ETXSTH, TXSTART_INIT>>8);
00315
00316
00317
00318 enc28j60Write(MACON1, MACON1_MARXEN|MACON1_TXPAUS|MACON1_RXPAUS);
00319
00320 enc28j60Write(MACON2, 0x00);
00321
00322 enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, MACON3, MACON3_PADCFG0|MACON3_TXCRCEN|MACON3_FRMLNEN);
00323
00324
00325 enc28j60Write(MAIPGL, 0x12);
00326 enc28j60Write(MAIPGH, 0x0C);
00327
00328 enc28j60Write(MABBIPG, 0x12);
00329
00330 enc28j60Write(MAMXFLL, MAX_FRAMELEN&0xFF);
00331 enc28j60Write(MAMXFLH, MAX_FRAMELEN>>8);
00332
00333
00334
00335
00336 enc28j60Write(MAADR5, ENC28J60_MAC0);
00337 enc28j60Write(MAADR4, ENC28J60_MAC1);
00338 enc28j60Write(MAADR3, ENC28J60_MAC2);
00339 enc28j60Write(MAADR2, ENC28J60_MAC3);
00340 enc28j60Write(MAADR1, ENC28J60_MAC4);
00341 enc28j60Write(MAADR0, ENC28J60_MAC5);
00342
00343
00344 enc28j60PhyWrite(PHCON2, PHCON2_HDLDIS);
00345
00346
00347 enc28j60SetBank(ECON1);
00348
00349 enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, EIE, EIE_INTIE|EIE_PKTIE);
00350
00351 enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, ECON1, ECON1_RXEN);
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383 }
00384
00385 void enc28j60PacketSend(unsigned int len, unsigned char* packet)
00386 {
00387
00388 enc28j60Write(EWRPTL, TXSTART_INIT);
00389 enc28j60Write(EWRPTH, TXSTART_INIT>>8);
00390
00391 enc28j60Write(ETXNDL, (TXSTART_INIT+len));
00392 enc28j60Write(ETXNDH, (TXSTART_INIT+len)>>8);
00393
00394
00395 enc28j60WriteOp(ENC28J60_WRITE_BUF_MEM, 0, 0x00);
00396
00397
00398 enc28j60WriteBuffer(len, packet);
00399
00400
00401 enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, ECON1, ECON1_TXRTS);
00402 }
00403
00404 unsigned int enc28j60PacketReceive(unsigned int maxlen, unsigned char* packet)
00405 {
00406 u16 rxstat;
00407 u16 len;
00408
00409
00410
00411 if( !enc28j60Read(EPKTCNT) )
00412 return 0;
00413
00414
00415
00416
00417
00418
00419 enc28j60Write(ERDPTL, (NextPacketPtr));
00420 enc28j60Write(ERDPTH, (NextPacketPtr)>>8);
00421
00422 NextPacketPtr = enc28j60ReadOp(ENC28J60_READ_BUF_MEM, 0);
00423 NextPacketPtr |= enc28j60ReadOp(ENC28J60_READ_BUF_MEM, 0)<<8;
00424
00425 len = enc28j60ReadOp(ENC28J60_READ_BUF_MEM, 0);
00426 len |= enc28j60ReadOp(ENC28J60_READ_BUF_MEM, 0)<<8;
00427
00428 rxstat = enc28j60ReadOp(ENC28J60_READ_BUF_MEM, 0);
00429 rxstat |= enc28j60ReadOp(ENC28J60_READ_BUF_MEM, 0)<<8;
00430
00431
00432
00433 len = MIN(len, maxlen);
00434
00435
00436 enc28j60ReadBuffer(len, packet);
00437
00438
00439
00440 enc28j60Write(ERXRDPTL, (NextPacketPtr));
00441 enc28j60Write(ERXRDPTH, (NextPacketPtr)>>8);
00442
00443
00444 enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, ECON2, ECON2_PKTDEC);
00445
00446 return len;
00447 }
00448
00449 void enc28j60ReceiveOverflowRecover(void)
00450 {
00451
00452
00453
00454 }
00455
00456 void enc28j60RegDump(void)
00457 {
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471 rprintf("RevID: 0x%x\r\n", enc28j60Read(EREVID));
00472
00473 rprintfProgStrM("Cntrl: ECON1 ECON2 ESTAT EIR EIE\r\n");
00474 rprintfProgStrM(" ");
00475 rprintfu08(enc28j60Read(ECON1));
00476 rprintfProgStrM(" ");
00477 rprintfu08(enc28j60Read(ECON2));
00478 rprintfProgStrM(" ");
00479 rprintfu08(enc28j60Read(ESTAT));
00480 rprintfProgStrM(" ");
00481 rprintfu08(enc28j60Read(EIR));
00482 rprintfProgStrM(" ");
00483 rprintfu08(enc28j60Read(EIE));
00484 rprintfCRLF();
00485
00486 rprintfProgStrM("MAC : MACON1 MACON2 MACON3 MACON4 MAC-Address\r\n");
00487 rprintfProgStrM(" 0x");
00488 rprintfu08(enc28j60Read(MACON1));
00489 rprintfProgStrM(" 0x");
00490 rprintfu08(enc28j60Read(MACON2));
00491 rprintfProgStrM(" 0x");
00492 rprintfu08(enc28j60Read(MACON3));
00493 rprintfProgStrM(" 0x");
00494 rprintfu08(enc28j60Read(MACON4));
00495 rprintfProgStrM(" ");
00496 rprintfu08(enc28j60Read(MAADR5));
00497 rprintfu08(enc28j60Read(MAADR4));
00498 rprintfu08(enc28j60Read(MAADR3));
00499 rprintfu08(enc28j60Read(MAADR2));
00500 rprintfu08(enc28j60Read(MAADR1));
00501 rprintfu08(enc28j60Read(MAADR0));
00502 rprintfCRLF();
00503
00504 rprintfProgStrM("Rx : ERXST ERXND ERXWRPT ERXRDPT ERXFCON EPKTCNT MAMXFL\r\n");
00505 rprintfProgStrM(" 0x");
00506 rprintfu08(enc28j60Read(ERXSTH));
00507 rprintfu08(enc28j60Read(ERXSTL));
00508 rprintfProgStrM(" 0x");
00509 rprintfu08(enc28j60Read(ERXNDH));
00510 rprintfu08(enc28j60Read(ERXNDL));
00511 rprintfProgStrM(" 0x");
00512 rprintfu08(enc28j60Read(ERXWRPTH));
00513 rprintfu08(enc28j60Read(ERXWRPTL));
00514 rprintfProgStrM(" 0x");
00515 rprintfu08(enc28j60Read(ERXRDPTH));
00516 rprintfu08(enc28j60Read(ERXRDPTL));
00517 rprintfProgStrM(" 0x");
00518 rprintfu08(enc28j60Read(ERXFCON));
00519 rprintfProgStrM(" 0x");
00520 rprintfu08(enc28j60Read(EPKTCNT));
00521 rprintfProgStrM(" 0x");
00522 rprintfu08(enc28j60Read(MAMXFLH));
00523 rprintfu08(enc28j60Read(MAMXFLL));
00524 rprintfCRLF();
00525
00526 rprintfProgStrM("Tx : ETXST ETXND MACLCON1 MACLCON2 MAPHSUP\r\n");
00527 rprintfProgStrM(" 0x");
00528 rprintfu08(enc28j60Read(ETXSTH));
00529 rprintfu08(enc28j60Read(ETXSTL));
00530 rprintfProgStrM(" 0x");
00531 rprintfu08(enc28j60Read(ETXNDH));
00532 rprintfu08(enc28j60Read(ETXNDL));
00533 rprintfProgStrM(" 0x");
00534 rprintfu08(enc28j60Read(MACLCON1));
00535 rprintfProgStrM(" 0x");
00536 rprintfu08(enc28j60Read(MACLCON2));
00537 rprintfProgStrM(" 0x");
00538 rprintfu08(enc28j60Read(MAPHSUP));
00539 rprintfCRLF();
00540
00541 delay_ms(25);
00542 }
00543
00544
00545