Besten mensen,
pas geleden heb ik dit http://www.olimex.com/dev/enc28j60-h.html bordje gekocht.
nu heb ik op mijn steekbordje een pic zitten en deze chip. voor de pic heb ik een gestabiliseerde 5v voeding(IC-7805-TO220) en achter die 5 v voeding ook een gestabiliseerde 3v voeding voor het enc28j60 bordje.
nu staat er in de datasheet van het bordje dat de plus 3v op pin 10 zit en de gnd op pin 9. maar als ik dit zo aansluit dan word mijn 5 volt regeling erg heet net als of het bordje kortsluiting maakt.
zie ik wat over het hoofd? of neem dat chipje zoveel stroom op??
met vriendelijk groet,
gerben
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Indien actief trekt de ENC28J60 tegen de 200mA, dus als je geen goede koeling (en ook misschien nog een hoge ingangsspanning) hebt, kan de boel behoorlijk warm worden.
Is dat boardje eigenlijk wel geschikt om aan een 5v PIC te hangen? Ik zie n.l. nergens level-shifters, zoals bijv. op dit boardje. (Zit een 74LVC1T45 op voor 3.3 <-> 5.0v translation)
oke me ingangspanning is 18 volt gelijk op me 5 v regelaar. ik heb net een stroom gemeten van 130mA dus dat kan wel kloppen.
verder heb ik hem nog niet aangesloten op me PIC maar in deze datasheet http://ww1.microchip.com/downloads/en/DeviceDoc/39662c.pdf staat 5V Tolerant Inputs maar heb ik dan toch zoon levelshifter nodig?
PS misschien maargoed dat ik hem dat nog niet een me pic heb aangeloten hahah
[Bericht gewijzigd door Henry S. op (38%)]
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Het zou kunnen werken, maar ook niet. (zonder extra aanpassing)
VIH van een PIC SSP (S/T input) is 0.8*Vdd = 4v (5v PIC)
VOH van de ENC28J60 is Vdd-0.7 = 2.6v
Is natuurlijk wel worst-case, maar toch...
maar kan ik het risco lopen dat ik mijn enc28j60 chip stuk maak zonder shifter?
dus ik kan beter zoon lever shifter er tussen zetten, maar waar kan ik zoon levershifter kopen? ik heb al bij Voti en conrad gekeken maar die hadden beide niet.
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Als de inputs 5v tolerant zijn, is er geen gevaar voor beschadigingen. Enige gevaar is dat de communicatie niet goed gaat, omdat de logische levels niet overeen stemmen...
Farnell heeft ze trouwens wel: http://nl.farnell.com/texas-instruments/sn74lvc1t45dckt/bus-transceive…
[Bericht gewijzigd door Arco op (30%)]
oke top! ik ga het gewoon even testen en werkt het niet koop ik van die levelshifters.
dan heb ik nog een heel klein vraagje hahahah met wat voor programmatje kan ik zien of er data van mijn enc28j60 binnen komt op mijn pc?
groetjes
Om te kijken of de data die je enc28j60 verstuurt op de pc binnen komt kun je wireshark gebruiken. Maar ik denk dat het verstandiger is om eerst de communicatie tussen pic en de enc28j60 te testen.
Ik ben zelf ook met het olimex bordje aan het spelen, en kwam er na 5 uur achter dat mijn SPI clock niet goed was.
Als je wilt heb ik een leuk stukje code om de leds te laten knipperen zodat je kunt zien dat je communicatie tussen ENC en PIC goed werkt.
[Bericht gewijzigd door Archer op (23%)]
oke dat zou heel mooi zijn als je die code wilt geven. dan weet ik zeker dat de hardware enzo goed is. maar heb jij tussen je pic en je enc28j60 level shifters zitten?
groetjes gerben
Ik had zoals je zelf ook aangaf in de datasheet gezien dat de enc28j60 5v tolerant is, dus ik heb er niets tussen zitten. Ik heb 3 olimex bordjes en op alle 3 werkt de "knipper code" zonder level shifting, dus ik denk dat het gewoon moet werken.
Hier is een deel van mijn driver in BoostC
void enc28j60_CTRL_W(char address, char data) {
SPI_CS = 0;
spi_transfer(WRITE_CONTROL_REGISTER | address);
spi_transfer(data);
SPI_CS = 1;
}
void enc28j60_bank2() {enc28j60_CTRL_W(ECON1,11010010b);} //Go to bank 2
void enc28j60_PHY_W(char address, char data1,char data0) {
enc28j60_CTRL_W(MIREGADR,address);
enc28j60_CTRL_W(MIWRL,data0);
enc28j60_CTRL_W(MIWRH,data1);
delay_us(12);
}
void enc28j60_flash_leds()
{
enc28j60_bank2();
enc28j60_PHY_W(PHLCON,10010000b,00111000b);
delay_ms(100);
enc28j60_PHY_W(PHLCON,10000000b,00111001b);
delay_ms(100);
}
maak een while(1) loop en roep de flash_leds functie aan in de loop. Als het werkt gaan de leds knipperen.
succes
oke heren hartelijk dank voor de tijd en uitleg. dan ga ik eens verder proberen of ik het aan de gang krijg.
Met vriendelijke groet,
Gerben
sorry gerben, ik heb de code aangepast nadat ik de leds had laten knipperen waardoor de code niet meer werkt.
Je moet de binaire waardes omdraaien, zoals hier:
void enc28j60_flash_leds()
{
enc28j60_bank2();
enc28j60_PHY_W(PHLCON,00111000b,10010000b);
delay_ms(100);
enc28j60_PHY_W(PHLCON,00111001b,10000000b);
delay_ms(100);
}
Ik heb dit gedaan om de 16bits waarde makkelijker te lezen.
oke geeft niet hoor.ik programeer met proton maar als ik die bits wegstuur dan knipperd mijn groene led netjes dus. maar wat geven de 2 leds normaal gesproken aan? dat er data word verstuurd en ontvangen??
[Bericht gewijzigd door gerben_1988 op (32%)]
met mijn code zouden beide leds afwisselend moeten knipperen, maar als het werkt is het goed. Je kunt zelf instellen wat de leds moeten weergeven, maar standaard is groen de link status en oranje ontvangen data. (zie pagina 11 in de datasheet)
!!! YES !!!
Ik heb net mijn eerste pakketje verstuurt en ontvangen met wireshark. Het is wel een zeer minimaal pakketje, broadcast MAC en source MAC en daarna de text "HELLO WORLD ON ETHERNET". Wireshark zegt wel dat het pakket beschadigd is, maar de data komt aan.
oke dan denk ik dat er wat fout gaat bij mijn. die groen knipperd alleen.(als die verbonden zit met me pc) en die orane doet niks.
ik heb hem volgens dit schema aan gesloten http://members.home.nl/hobbycorner/images/schema_ds.gif
maargoed er zal miss nog wel ergens een foutje zitten in me code zitten vrees ik.
oke kijk dat is beter!!!
ik ben zelf bijna 5 uur bezig geweest om die leds te laten knipperen.
Het is normaal dat groen aangaat als je de kabel erin stopt. Het leuke van mijn code is juist dat het werkt zonder aangesloten kabel, dus ik denk inderdaad dat je code nog niet helemaal werkt.
een paar tips:
Ik weet niet welke PIC je gebruikt maar op de 16F72 gebruik ik deze instellingen voor hardware SPI:
sspstat = 01000000b;
sspcon = 00100000b;probeer ook eerst 0x55 naar een control register te schrijven en die uit te lezen, en gebruik een led om aan te geven of de uit gelezen waarde klopt. zet de led kort aan en lang uit als het niet klopt, en drie keer snel aan/uit als het wel klopt. Ik was echt zeer blij toen ik die led 3 keer zag knipperen 
succes
ahaa ik zal die instellingen is proberen en me iets meer verdiepen is SPI want ik heb daar nog niet zo heel veel mee gewerkt dus.
maar ik gebruikt een pic 18f452.
maar als je daar lang mee bezig bent dan is het een hele opluchting ja als je de leds kunt laten knipperen.haha
dank voor de tips en uitleg
ben de hele middag al bezig geweest maar ik krijg die leds niet knipperend.
ik heb nu deze code.
DEVICE 18F452
XTAL = 20
CONFIG_START
OSC = HS ; HS Oscillator
PWRT = ON ; Enabled
BOR = OFF ; Enabled
;BORV = 42 ; 4.2V
WDT = OFF ; Disabled
LVP = OFF ; Disabled
DEBUG = OFF ; Disabled
CONFIG_END
ALL_DIGITAL = TRUE
;76543210
PORTA = %000000 ; hier..
PORTB = %00000000 ; .....alle..
PORTC = %00000000 ; ..........poorten..
PORTD = %00000000 ; ..................eerst..
PORTE = %000 ; ........................laag maken.
;poorten 76543210
TRISA = %000000 ;hier..
TRISB = %11111111 ;.....alle..
TRISC = %10010000 ;..........poorten..
TRISD = %00000011 ;..................instellen.
TRISE = %000
;REGISTERS VOOR SPI
SSPSTAT = %01000000 ; Status register voor SPI instellen.
SSPCON1 = %00100000 ; Controlregister 1 voor SPI instellen.
;variabelen
SYMBOL CS PORTE.2 'CS chip select
SYMBOL Mosi PORTC.5 'SPI uit naar ENCJ60
SYMBOL Miso PORTC.4 'SPI in van ENC26J60
SYMBOL SCLK PORTC.3 'SPI clock
CLEAR
DELAYMS 2000 ; alles tot rust laten komen.
WHILE 1=1
CS = 0
SHOUT Mosi,SCLK,0,[00111000b,10010000b]
DELAYMS 300
SHOUT Mosi,SCLK,0,[00111001b,10000000b]
DELAYMS 300
CS = 1
WEND
END
ENDmiss dat kan iemand vertellen of ik dat SPI gebeuren goed ingesteld heb?
alvast bedankt
Gerben
Ik denk dat je iets te snel wilt. Je moet eerst een functie/subroutine/gosub constructie maken die 1 command register beschrijft en een andere die het weer uitleest. zoals dit.
void enc28j60_CTRL_W(char address, char data) {
SPI_CS = 0;
spi_transfer(WRITE_CONTROL_REGISTER | address);
spi_transfer(data);
SPI_CS = 1;
}
char enc28j60_CTRL_R(char address) {
char value = 0;
SPI_CS = 0;
spi_transfer(READ_CONTROL_REGISTER | address);
value = spi_transfer(0x00);
SPI_CS = 1;
return value;
}je kunt (zover ik weet) niet twee control registers beschrijven zonder opnieuw een chip select te doen.
De SPI instellingen die ik je gaf zijn voor de hardware SPI port, maar je gebruikt SHOUT en dat is een software SPI routine. Ik weet niet welke functie in Proton basic de Hardware port gebruikt, maar ik doet het zo:
char spi_transfer(char data)
{
char SPI_IN;
sspbuf = data;
while (sspstat.0 == 0);
SPI_IN = sspbuf;
return SPI_IN;
}Je zult deze voorbeelden moeten vertalen naar Proton Basic maar dan zal het een stuk makkelijker zijn denk ik.
dan vergeet ik nog te zeggen dat dit zo niet nooit zal gaan werken:
CS = 0 SHOUT Mosi,SCLK,0,[00111000b,10010000b] DELAYMS 300 SHOUT Mosi,SCLK,0,[00111001b,10000000b] DELAYMS 300 CS = 1
Ik denk dat je de datasheet (en mijn code) nog eens moet gaan bestuderen.
ja ik heb nu net het groene lampje knipperd met een voorbeeld code van iemand op het picbasic forum. ik moet nu alleen eerst die code eens goed bestuderen zodat ik het wel ga snappen. want ik heb SPI eigelijk nog nooit echt toegepast eigelijk.
in een standaard basic programma word er een file include gedaan en word er dit stukje programma aangeroepen. (helaas wel in ASM)
;******************************************************************************
;* INITIALIZE ENC28J60 - Macro
;******************************************************************************
INIT_ENC28J60 MACRO
GOSUB INIT_ENC28J60_SUB
ENDM
INIT_ENC28J60_SUB:
BSF ETH_CS ; start with SPI disabled
BCF ESTAT_CLKRDY ; clear ESTAT_CLKRDY bit so we can test it's value
WHILE ESTAT_CLKRDY = 0 ; Loop until ESTAT_CLKRDY = 1
ESTAT = READ_ETH_REGISTER ADR_ESTAT ; so we know that the PHY module is ready
WEND ;
NIC_SOFT_RESET ; ENC28J60 need a Software Reset here
DELAYMS 10 ; 10ms delay after Software Reset as per datasheet
CLRF ECON1 ; Clear the ECON1 register (variable .. copy)
BSF ECON1_RXEN ; as we need to clear RXEN, TXRST, BSEL0 and BSEL1 bits,
BSF ECON1_TXRST ; we need to pass them as "set" to CLEAR_REGISTER_BIT Macro
BSF ECON1_BSEL0 ;
BSF ECON1_BSEL1 ;
CLEAR_REGISTER_BIT ADR_ECON1, ECON1 ; All Packets Rx'ed ignored and Tx Logic is Idle for now
NEXT_PACKET_POINTER = RX_BUF_START ; Init next Rx Packet Buf Pointer to Rx Buffer Start Location
; RX Buffer Init
WRITE_ETH_REGISTER ADR_ERDPTL,RX_BUF_START ; Init Hardware Rx Buffer Pointer to the start of
WRITE_ETH_REGISTER ADR_ERDPTH,RX_BUF_STARTH ; declared Rx Buffer value
WRITE_ETH_REGISTER ADR_ERXSTL,RX_BUF_START ; Init Hardware RX Buffer START Location as per declares
WRITE_ETH_REGISTER ADR_ERXSTH,RX_BUF_STARTH ;
WRITE_ETH_REGISTER ADR_ERXRDPTL,RX_BUF_START ; see section 7.2.4 "Freeing Receive buffer Space"
WRITE_ETH_REGISTER ADR_ERXRDPTH,RX_BUF_STARTH ;
WRITE_ETH_REGISTER ADR_ERXNDL,RX_BUF_STOP ; Init Hardware Rx Buffer END Location as per declares
WRITE_ETH_REGISTER ADR_ERXNDH,RX_BUF_STOPH ;
; TX Buffer Init
WRITE_ETH_REGISTER ADR_ETXSTL,TX_BUF_START ; Init Hardware TX Buffer START Location as per declares
WRITE_ETH_REGISTER ADR_ETXSTH,TX_BUF_STARTH ;
; MAC Init
CLRF MACON1 ; start with a clear MACON1 as we need to set some bits
BSF MACON1_MARXEN ; Enable packets to be received by the MAC
BSF MACON1_RXPAUS ; Inhibit transmissions when pause control frames are received
BSF MACON1_TXPAUS ; Allow the MAC to transmit pause control frames
WRITE_ETH_REGISTER ADR_MACON1,MACON1 ; Init MACON1 register
;WRITE_ETH_REGISTER ADR_MACON2,0 ; Init MACON2 -- no more in new datasheet
CLRF MACON3 ; start with a Clear MACON3 As we need To Set some bits
BSF MACON3_FRMLNEN ; Frame Length Checking Enable
BSF MACON3_TXCRCEN ; Transmit CRC Enable
BSF MACON3_PADCFG0 ; All short frames zero padded to 60 bytes, andvalid CRC appended
;bsf MACON3_PADCFG1 ; change to suit your application need
;bsf MACON3_PADCFG2 ;
WRITE_ETH_REGISTER ADR_MACON3,MACON3 ; Init MACON3 register
;clrf MACON4 ; start with a clear MACON4 as we need to set some bits
;bsf MACON4_NOBKOFF ; No Backoff Enable bit (applies to half duplex only)
;bsf MACON4_DEFER ; Defer Transmission Enable bit (applies to half duplex only)
;WRITE_ETH_REGISTER ADR_MACON4,MACON4 ; Init MACON4 register
WRITE_ETH_REGISTER ADR_MAIPGL, $12 ; Configure the Non-Back-to-Back Inter-Packet GAP register
WRITE_ETH_REGISTER ADR_MAIPGH, $0C ; For half duplex usage
WRITE_ETH_REGISTER ADR_MAMXFLL,MAXFRAME ; Init the maximum permited frame lentgh for RX or TX
WRITE_ETH_REGISTER ADR_MAMXFLH,MAXFRAMEH ;
WRITE_ETH_REGISTER ADR_MABBIPG, $12 ; Init MABBIPG with $15 for full-duplex
; MY MAC ADDRESS
WRITE_ETH_REGISTER ADR_MAADR1, MYMAC_5 ; Init ENC28J60 board MAC Address
WRITE_ETH_REGISTER ADR_MAADR2, MYMAC_4 ;
WRITE_ETH_REGISTER ADR_MAADR3, MYMAC_3 ;
WRITE_ETH_REGISTER ADR_MAADR4, MYMAC_2 ;
WRITE_ETH_REGISTER ADR_MAADR5, MYMAC_1 ;
WRITE_ETH_REGISTER ADR_MAADR6, MYMAC_0 ;
; PHY Init See section 6.6 on half or full-duplex. Also see sections 9.1 And 9.2
CLRF PHCON2 ; start with a Clear PHCON2 As we need To Set some bits
CLRF PHCON2H ;
BSF PHCON2_HDLDIS ; PHY Half-Duplex Loopback Disable
WRITE_PHY_REGISTER ADR_PHCON2, PHCON2 ; Init PHCON2 register
CLRF PHCON1 ; start with a Clear PHCON1 As we need To Set some bits
CLRF PHCON1H ; see section 6.6 On half Or full-duplex
WRITE_PHY_REGISTER ADR_PHCON1, PHCON1 ; and section 11.5 PHY Subsystem Reset.
; PHLCON - LED Status Init
CLRF PHLCON ; start with a Clear PHLCON As we need To Set some bits
CLRF PHLCONH ;
; LED Settings
; Blink fast LEDA
BSF PHLCON_LACFG3 ;
BCF PHLCON_LACFG2 ;
BSF PHLCON_LACFG1 ;
BCF PHLCON_LACFG0 ;
; Display Rx/Tx activity on Link
BSF PHLCON_LBCFG3 ; display Link Status + Tx and Rx activity On LED B
BSF PHLCON_LBCFG2 ;
BCF PHLCON_LBCFG1 ; - " -
BSF PHLCON_LBCFG0 ; - " -
;
BSF PHLCON_STRCH ; LED Pulse Stretching Enable
WRITE_PHY_REGISTER ADR_PHLCON, PHLCON ; Init PHLCON register
; Enable Packet reception
CLRF ECON1 ; Clear the ECON1 register (variable .. copy)
BSF ECON1_RXEN ; Normal reception enabled
SET_REGISTER_BIT ADR_ECON1, ECON1 ; Packet Reception Enabled from here on
BSF ETH_CS ; disable SPI
RETURN
;******************************************************************************
als ik dit laad in me PIC dan knipperd netjes het groene lampje dus de harware zit igg goed aangsloten.
Dit heb ik net gevonden, iets makkelijker t elezen voor mijn:P. en hier word ook hardware SPI gebruikt en dat is indd een heel anders als dat ik heb hahah.
http://www.picbasic.org/forum/showthread.php?p=32821#post32821
gelukkig veel commentaar erachter, dus ik kan het wel volgen
Als ik deze code even snel bekijk worden er een aantal MACRO's gebruikt die je kunnen helpen met je project. dan hoef je mijn functies niet te vertalen.
Wat je even kunt proberen om zeker te weten dat je hardware goed is:
Pas in de ASM code het volgende aan:
; LED Settings
; Blink fast LEDA
BSF PHLCON_LACFG3 ;
BCF PHLCON_LACFG2 ;
BSF PHLCON_LACFG1 ;
BCF PHLCON_LACFG0 naar deze code:
; LED Settings
; Blink fast LEDA
BSF PHLCON_LACFG3 ;
BCF PHLCON_LACFG2 ;
BSF PHLCON_LACFG1 ;
BSF PHLCON_LACFG0 Let op de laatste instructie. Opnieuw compileren en dan in je pic programmeren.
Want als het goed is knippert je groene led nu snel. Met de bovenstaande aanpassing zou hij langzaam moeten knipperen.
Ik heb nog een leuk youtube filmpje gevonden.
succes