Hey,
ich bin gerade dabei eine enc28j60 Schnittstelle an einen Datenlogger zu
koppeln. Allerdings ist für den verwendeten Mikrocontroller "STR711FR2"
keine Ethernetschnittstelle vorgesehen. Im Internet gibt es einige
enc28j60.c und enc28j60.h- Dateien wie er initialisiert wird. Allerdings
bekomme ich leider nicht hin den Controller zu initialisieren. Da ich
die Register nicht angepasst bekomme. Habe auch versucht das Register:
EREVID auszulesen in der die Version steht. Aber leider bekomme ich
immer nur 0xfb ausgelesen. Das liegt aber denk ich mal daran, das der
Controller nicht initialisiert ist.
Hat jemand eine Idee oder kann mir weiter helfen, wie ich den Controller
richtig initialisiere ? Auf muss ich achten ?
Gruß Tim
Datenblatt enc28j60 Controller:
"www.tech-software.net/39662b.pdf"
Datasheet STR711FR2:
"http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATASHEET/CD00015447.pdf"
>Hat jemand eine Idee oder kann mir weiter helfen, wie ich den Controller>richtig initialisiere ? Auf muss ich achten ?
Als erstes sollte die SPI Schnittstelle laufen;)
Ich kenne deinen Controller nicht, aber wenn der einen
SPI FIFO hat musst du nach jedem Schreibbefehl auch
ein Byte lesen. Egal ob du das brauchst oder nicht.
Also die SPI Schnittstelle läuft.
Zumindest, kann ich sie mittels Befehl ein und aus schalten. Das heisst
das CS Signal ist dauerhaft high bzw. low.
Aber jetzt weiss ich leider nicht weiter...
Hi,
kannst du mal die SW zeigen die du benutzen möchtest?
Schalte den FIFO komplett aus, dein MC sollte sich erst mal so verhalten
wie es deine SW vorschreibt. (ich schätze 1Byte senden und eins
empfangen)
Hast du noch andere Devices am SPI-Bus, mit der man die Schnittstelle
testen kann?
Nutzt du die SW vom MC Hersteller?
Kannst du die mit anhängen?!?
Fragen über Fragen!?! ;-)
Stephan
Hey,
die Software bzw. die zwei Dateien habe ich hochgeladen.
Ich habe mich jetzt einfach mal für diese entschieden,
da es wie gesagt einige Versionen der Software gibt
und ich ja irgendwo anfangen muss diese anzupassen.
Vom MC Hersteller gibt es keine Software für die enc28j60 Schnittstelle.
Das ja leider das Probem.
Ich habe noch eine SD-Karte am SPI1 Bus hängen. Dieses funktioniert
auch.
Aber gut das du fragst, so kommt vielleicht etwas raus, an das ich
bisher nicht gedacht habe...
>die Software bzw. die zwei Dateien habe ich hochgeladen.
Naja, was soll man dazu sagen? Unvollständiger
Scheiß den du dir an Tapete nageln kannst. Die wirklich
interessanten Dateien fehlen wie üblich wieder mal.
Wie wärs mit spi.c und spi.h?
So, habe jetzt die spi.c + spi.h die dabei waren hochgeladen.
Allerdings habe ich noch die init.c und init.h angehängt,
da ich dort die Port Pins initialisiere.
> BSPI_WordSend(BSPI0, *(PtrToBuffer + SendWord));
Könnte es evtl sein das deine SPI Routinen nur WORDs senden?
Das wären dann zwei Bytes. Vieleicht liegt das Problem ja dort.
holger schrieb:>> BSPI_WordSend(BSPI0, *(PtrToBuffer + SendWord));>> Könnte es evtl sein das deine SPI Routinen nur WORDs senden?
Ich glaube das passt schon!
Was mir aber aufgefallen ist, dass ich nicht auf BSPI0 sondern auf BSPI1
senden muss.
Hi
in deine spi.c wird wieder eine andere spi_init() aufgerufen, was
kannste darüber sagen?
Wie sieht den deine initSPI() Funktion für die SD-Karte aus?
Kannst du mal beide vergleichen, ob die die gleichen Settings benutzen?
In welcher Reihenfolge machst du die Init für die SD-Karte und den ENC
???
Kann sein das einer dir die Init für den anderen verändert! ( ich glaube
du rufst erst die von ENC und dann die von der SD-Karte auf)
Bitte beider vergleichen bzw nur eine von beiden Devices aktivieren.
Sollte sich was tun sag bescheid.
und das mit dem CS vergessen wir wieder, das wird nicht vom
SPI-Interface gemacht sondern, es wird nur an einem Port gewackelt.
Stephan
Stephan W. schrieb:> in deine spi.c wird wieder eine andere spi_init() aufgerufen, was> kannste darüber sagen?
Ich habe das Programm von einer anderen Gruppe übernommen. Die spi_init
hat die SPI_xx aufgerufen und die hat das SPI in der init.c aufgerufen.
//BSPI1 Clock einstellen (Systemclock von 12MHz auf 400kHz runterteilen
35
BSPI_ClockDividerConfig(BSPI1,30);
36
37
//BSPI1 initialisieren
38
BSPI_Init(BSPI1);
39
40
//BSPI1 in Master-Mode schalten
41
BSPI_MasterEnable(BSPI1,ENABLE);
42
43
//BSPI1 Clock auf active high
44
BSPI_ClkActiveHigh(BSPI1,ENABLE);
45
46
//BSPI1 Datenwandlung mit erster Taktflanke beginnen
47
BSPI_ClkFEdge(BSPI1,ENABLE);
48
49
//BSPI1 auf 8Bit Wortlaenge stellen
50
BSPI_8bLEn(BSPI1,ENABLE);
51
52
//BSPI1 FiFo abschalten
53
BSPI_FifoDisable(BSPI1);
54
55
//BSPI1 einschalten
56
BSPI_Enable(BSPI1,ENABLE);
57
}
Absofort wird diese Funktion nur einmal in der Main.c aufgerufen.
Stephan W. schrieb:> Wie sieht den deine initSPI() Funktion für die SD-Karte aus?> Kannst du mal beide vergleichen, ob die die gleichen Settings benutzen?
Die initSPI der SD-Karte ist nur in dem C-Code vom oben.
WIe kann ich denn jetzt das SD-Karten device deaktivieren ?
Hi
so....
FIFO ist aus gut!
du überträgst nur 8 Bit auch gut!
aber dies verunsichert mich, da ich den MC nicht kenne:
>//BSPI1 Clock auf active high>BSPI_ClkActiveHigh(BSPI1, ENABLE);
was macht das bei dir?
Du solltest folgendes haben: (bitte prüfen)
1
TheENC28J60isdesignedtointerfacedirectlywiththe
2
SerialPeripheralInterface(SPI)portavailableonmany
3
microcontrollers.Theimplementationusedonthis
4
devicesupportsSPImode0,0only.Inaddition,theSPI
5
portrequiresthatSCKbeatIdleinalowstate;
6
selectableclockpolarityisnotsupported.
Noch eine dumme Frage von mir:
Kann es sein das die SD-Karte an dem anderen SPI-Interface hängt?
Denn beide Einstellungen sind gleich bis auf den Takt!
>WIe kann ich denn jetzt das SD-Karten device deaktivieren ?
Da ich davon ausging, das beide an einem Bus hängen und du noch am
Anfang bist, dachte ich du könntest das einfach deaktivieren. Du hast ja
scheinbar schon ein Filesystem da drauf, so wird das deaktivieren nicht
so einfach möglich sein.
Stephan
Guten Morgen,
ich habe gerade etwas getestet, da es mir keine ruhe gelassen hat und
zwar, habe ich einzeln mal die "BSPI_Enable(BSPI0, ENABLE);" bzw.
BSPI_Enable(BSPI1, ENABLE); auskommentiert und mal geschaut was
funktioniert und was nicht. Dabei habe ich festgestellt, wenn ich BSP1
ausschalte, das dann das Display ausbleibt. Wenn ich BSPI_Enable(BSPI0,
ENABLE); auskommentiere komme ich nicht mehr in das Menü der LAN Karte,
da dieses die Version auslesen soll und die SD-Karte wird auch nicht
mehr erkannt.
Das heisst, somit das der Lan Corntroller auf SPI0 liegt und nicht wie
in meiner Dokumentation auf SPI1.
Stephan W. schrieb:>>//BSPI1 Clock auf active high>>BSPI_ClkActiveHigh(BSPI1, ENABLE);>> was macht das bei dir?
Diese Funktion vom µ-Controller schaltet ausschließlich das CLK Signal
auf high, bzw. low. (siehe Anhang)
Stephan W. schrieb:> Du solltest folgendes haben: (bitte prüfen)The ENC28J60 is designed to interface
directly with the
> Serial Peripheral Interface (SPI) port available on many> microcontrollers. The implementation used on this> device supports SPI mode 0,0 only. In addition, the SPI> port requires that SCK be at Idle in a low state;> selectable clock polarity is not supported.
Habe mal nachgelesen, was das SPI mode 0,0 überhaupt macht. Aber leider
weiss ich nicht wie ich das einstellen kann. Hast du eine Idee, habe es
auch mal als Anhang angehängt.
Habe eben grad noch schnell was gefunden und zwar folgendes:
//Chipselect des LAN-Controllers
//GPIO_Config (GPIO1, LAN_CS_Pin, GPIO_OUT_PP);
GPIO_Config (GPIO1, LAN_CS_Pin, GPIO_IN_TRI_CMOS);
//Chipselect des LCD-Displays
GPIO_Config (GPIO1, LCD_CS_Pin, GPIO_OUT_PP);
//Chipselect der SD-Karte
GPIO_Config (GPIO0, SD_CS_Pin, GPIO_OUT_PP);
Das steht bei mir in der init.c drin. Überschreibe ich ich hier mit dem
LCD Display das LAN CS Signal ? Zudem habe ich im Datenblatt des
Mikrocontrollers folgendes gefunden:
The MISO/MOSI/SCLK pins must be configured as Alternate Function
push-pull and the SS
Slave Select pin must be configured as Input tristate CMOS for the
duration of BSPI
operation. Refer to Table 14 on page 57.
Darum habe ich meine meine Einstellungen bei dem LAN-CS Signal von
"GPIO_OUT_PP" auf "GPIO_IN_TRI_CMOS" geändert. Bei diesen Angaben sollte
man doch immer nach den Einstellungen des Datenblattes gehen !?
Hi,
>Überschreibe ich ich hier mit dem LCD Display das LAN CS Signal ?
Nein, denn in der init.h steht ja folgendes:
1
#define LCD_CS_Pin 0x0001 //P1.0
2
#define LAN_CS_Pin 0x0100 //P1.8 LAN
das ist also ok. Wenn es stimmt!?!
1
GPIO_Config(GPIO1,LAN_CS_Pin,GPIO_IN_TRI_CMOS);
dies macht mir sorgen. wieso als Input?
das vorher sieht aus der ferne richtiger aus.
1
GPIO_Config(GPIO1,LAN_CS_Pin,GPIO_OUT_PP);
>Darum habe ich meine meine Einstellungen bei dem LAN-CS Signal von>"GPIO_OUT_PP" auf "GPIO_IN_TRI_CMOS" geändert.
ahhh, jetzt seh ich es.
Ok, da bringst du was durch einander! der SS Pin ist nicht dein
LAN_CS_Pin!!
Der SS Pin ist der Pin der benutzt wird, wenn dein MC als SPI-Slave
arbeiten soll. Der Master würde dir hiermit signalisieren das er mit dir
Daten austauschen will. Aber die Konfig für den SS Pin scheint zu
fehlen.
ABER!
In deiner spi_init() Funktion wird für SPI0 die Funktion:
1
//SPI0 Pins konfigurieren
2
BSPI_BSPI0Conf(ENABLE);
aufgerufen. Schau mal ob sie die Pins nochmal konfiguriert!
Bitte beachte das für SPI1 die Funktion nicht aufgerufen wird!!
Auch in der init.h finde ich keinen Hinweis auf SPI1 <- ist aber nicht
dein Problem / nur ein Hinweis.
Zu dem SPI Modes kann ich dir im Moment nichts sagen, vielleicht kennt
ein anderer deinen MC besser und kann dir dazu weiter helfen.
Stephan
Stephan W. schrieb:>>Überschreibe ich ich hier mit dem LCD Display das LAN CS Signal ?> Nein, denn in der init.h steht ja folgendes:#define LCD_CS_Pin 0x0001
//P1.0
> #define LAN_CS_Pin 0x0100 //P1.8 LAN> das ist also ok. Wenn es stimmt!?!
Ja, das sollte stimmen! Habe es zwei mal überprüft.
Stephan W. schrieb:>>Darum habe ich meine meine Einstellungen bei dem LAN-CS Signal von>>"GPIO_OUT_PP" auf "GPIO_IN_TRI_CMOS" geändert.>> ahhh, jetzt seh ich es.> Ok, da bringst du was durch einander! der SS Pin ist nicht dein> LAN_CS_Pin!!> Der SS Pin ist der Pin der benutzt wird, wenn dein MC als SPI-Slave> arbeiten soll. Der Master würde dir hiermit signalisieren das er mit dir> Daten austauschen will. Aber die Konfig für den SS Pin scheint zu> fehlen.
Ah, okay! Danke erster mal für die Erkentniss!
Habe es jetzt wieder korigiert zu:
1
//Chipselect des LAN-Controllers
2
GPIO_Config(GPIO1,LAN_CS_Pin,GPIO_OUT_PP);
3
4
//Chipselect des LCD-Displays
5
GPIO_Config(GPIO1,LCD_CS_Pin,GPIO_OUT_PP);
6
7
//Chipselect der SD-Karte
8
GPIO_Config(GPIO0,SD_CS_Pin,GPIO_OUT_PP);
Stephan W. schrieb:> In deiner spi_init() Funktion wird für SPI0 die Funktion://SPI0 Pins
konfigurieren
> BSPI_BSPI0Conf(ENABLE);> aufgerufen. Schau mal ob sie die Pins nochmal konfiguriert!
Hier ist die Funktion in der 71x_bspi.c
Sehe aber nichts von wegen anderen Pins.
Habe auch noch alle anderen Dateien nach:
BSPI_BSPI1Conf(ENABLE); durchsucht, da ich erster dachte habe die
vergessen einzubinden. Aber in keiner Datei auf meinem PC gibt es diese
Funktion. Was mich jetzt auch wieder stutzig macht.
Vielen Dank für den Link!
Die PDF Datei hatte ich auch auf meinem PC, nur die Revesion 1 und das
ja die Revesion 2.
Auf jedenfall habe ich es jetzt mal angeschaut und zusammengestellt, was
für mich richtig wäre (meiner Ansicht), verbessert mich, wenn ich falsch
liege:
Bit 0 = 1 BSPI system is enabled
Bit 1 = 0 BSPI is configured as a slave
Bit 2 = 0 These bits are interrupt enable bits which configure when
the processor will be
Bit 3 = 0 interrupted on received data. The following configurations
are possible --> 0 = disabled
Bit 4 = 0 Receive Error Interrupt Enable.
Bit 5 = 0 Reserved, must be kept at reset value (0).
Bit 6 = 0 Reserved, must be kept at reset value (0).
Bit 7 = 1 Bus Error Interrupt Enable.
Bit 8 = 0 CPOL: Clock Polarity Select.
Bit 9 = 0 CPHA: Clock Phase Select.
Bit 10 = 0 These two bits configure the word length operation of the
Receive FIFO and transmit data registers as shown below:
Bit 11 = 0 00: 8-bit word length Word Length
Bit 12 = 0 |
Bit 13 = 1 |} Receive FIFO Enable --> 1010: Default: 1st word enabled
Bit 14 = 0 |
Bit 15 = 1 |
Zusammengefasst ergbt das "1010000010000001" und das wieder rum ist:
0x41089 + Address Offset: 08h => 0x41097
Mein problem ist mit welchem Befehl schreibe ich diese Adresse jetzt in
das Register ?
Hi,
normaler weise arbeitet man an dieser Stelle mit Strukturen.
Du hast zum Beispiel die Struktur 'BSPI0' und ein Element davon sollte
dieses Register 'BSPIn_CSR1' sein.
1
BSPI0->BSPI0_CSR1=0xA981;
oder so wie du es machen wolltest:
1
*(0x41089+0x08)=0xA981;
Du siehst das die erste Methode besser zu lesen ist.
>Bit 7 = 1 Bus Error Interrupt Enable.
Brauchst du den Int im Moment?
Stephan
den INT brauche ich nicht! Der ist bei der enc28j60 Schnittstelle auch
gar nicht angeschlossen.
Habe mal nach den Strukturen geschaut. Hab ne headerdatei in der einige
Strukturen drin sind. Hab die Datei mal angehängt. Aber leider keine die
ich bräuchte.
In der enc28j60.h sind auch zwei Strukturen, allerdings eine fürs lesen
und eine fürs schreiben:
Hi
>den INT brauche ich nicht! Der ist bei der enc28j60 Schnittstelle auch>gar nicht angeschlossen.
Den Int meinte ich nicht, sondern vom BIT 7 Bus Error, da du diesen
aktivieren willst.
1
/*------------------------ Buffered Serial Peripheral Interface --------------*/
Stephan W. schrieb:> Hi>>den INT brauche ich nicht! Der ist bei der enc28j60 Schnittstelle auch>>gar nicht angeschlossen.> Den Int meinte ich nicht, sondern vom BIT 7 Bus Error, da du diesen> aktivieren willst.
Achso! Ne, den brauche ich nicht. Habe gedacht, kann nicht schaden den
mal zu aktivieren.
Aber mal eine Frage und zwar haben wir doch festgestellt, das das SPI
mode auf 0,0 stehen muss. Bei deinem Wert von 0xA981 = 1010100110000001
hast du das 8te Bit (Bit 8 = 0 CPOL: Clock Polarity Select.) auf "1"
gesetzt. Es sollten doch aber grad die beiden Bits 7+8 gleich "0" sein!
Habe deine Zeile: BSPI1->CSR1= 0xA981;
aber trotzdem mal in die init.c eingebunden und kompiliert. Hat sogar
funktioniert!
Hi
du hast recht war irgendwie FALSCH, sorry!
ich hatte mich scheinbar beim abschreiben deiner Bin Zahl vertippt.
0xA081 wäre deine Zahl von oben.
Wenn du einen INT aktivierst MUßT du auch einen Handler haben der sich
drum kümmert, sonst gehts in die Hose.
Berechne nochmal den Wert für das Reg., nur mit den nötigsten Sachen.
(nur ein Vorschlag)
>Habe deine Zeile: BSPI1->CSR1= 0xA981;>aber trotzdem mal in die init.c eingebunden und kompiliert. Hat sogar>funktioniert!
warum sollte es nicht? Du verstehst was da passiert?
Wenn du dann soweit bist, dann schau dir nochmal die SPIWrite() und die
SPIRead() Funktionen an!
Die Funktionen rufen ja BSPI_WordSend() und BSPI_WordReceive() auf, das
Wort 'Word' irritiert mich. Sendet das Ding 16 Bit oder 8 Bit?
Dein MC kann beides, aber bei 8 Bit ist das Align etwas anders.
Stephan
Stephan W. schrieb:>>Habe deine Zeile: BSPI1->CSR1= 0xA981;>>aber trotzdem mal in die init.c eingebunden und kompiliert. Hat sogar>>funktioniert!> warum sollte es nicht? Du verstehst was da passiert?
Ich denke schon! Ich übergebe der Struktur den Wert 0xA081 diese wird
binär aufgeschlüsselt und zu den verschiedenen Werten in der Struktur
zugewiesen. Ingesammt sind es ja 10 Parameter die verschieden größen
haben. So werden die entsprechenden Werte zugewiesen. Korrigiere mich,
wenn ich dir was falsches geschrieben habe.
Stephan W. schrieb:> Berechne nochmal den Wert für das Reg., nur mit den nötigsten Sachen.> (nur ein Vorschlag)
Ich weiss nur nicht genau was ich brauche und was nicht. Hab mal die
Wortlänge auf 8 Bit gestellt! Somit ändert sich der Code zu:
1010000000000001 == 0xA001 + offset von 0x08 = 0xA009
Stephan W. schrieb:> Wenn du dann soweit bist, dann schau dir nochmal die SPIWrite() und die> SPIRead() Funktionen an!> Die Funktionen rufen ja BSPI_WordSend() und BSPI_WordReceive() auf, das> Wort 'Word' irritiert mich. Sendet das Ding 16 Bit oder 8 Bit?> Dein MC kann beides, aber bei 8 Bit ist das Align etwas anders.
/* If the word length has been configured as 8-bits word length */
4
if((BSPIx->CSR1&0x0400)==0)
5
{
6
Data<<=8;
7
}
8
9
BSPIx->TXR=Data;
10
}
Ich habe grad mal nach u16_t gesucht, also was für ein Datentyp das ist,
aber irgendwie wird der nirgends deklariert! Das echt merkwürdig. Aber
der kompiler mekkert auch nicht!
> 1010000000000001 == 0xA001 + offset von 0x08 = 0xA009
Warum addierst Du den Offset zum Wert?
Du musst ihn zur Adresse addieren, und das geschieht bereits mit dem
BSPI0->BSPI0_CSR1 = 0xA001; was gleichbedeutend ist mit
*( 0x41089 + 0x08) = 0xA001;
u16_t ist ein unsigned int Typ mit 16 Bits.
> void BSPI_WordSend(BSPI_TypeDef *BSPIx, u16 Data)
warum das funktioniert? muss es nicht auch u16_t statt u16 heißen?
eProfi schrieb:> Du musst ihn zur Adresse addieren, und das geschieht bereits mit dem> BSPI0->BSPI0_CSR1 = 0xA001; was gleichbedeutend ist mit> *( 0x41089 + 0x08) = 0xA001;
Okay, hoffe das ich es jetzt richtig habe.
eProfi schrieb:> u16_t ist ein unsigned int Typ mit 16 Bits.>>> void BSPI_WordSend(BSPI_TypeDef *BSPIx, u16 Data)> warum das funktioniert? muss es nicht auch u16_t statt u16 heißen?
typedef unsigned short u16_t;
Hab jetzt mal noch bei anderen Dateien geschaut und die sagen bei der
gleichen Funktion auch u16 und nicht u16_t
Und wie ist u16 definiert?
Was ich noch sagen wollte:
Hast Du als Grundlage eine 8-bit- oder eine 16-bit-Implementierung?
Wenn 8-bit, dann ist das natürlich ein ewiges Hin- und Herrechnen
zwischen 16 und 8 bit. Zum Testen ok, aber "fur Gut" sollten die
16-Bit-Möglichkeiten auch genutzt werden.
eProfi schrieb:> Und wie ist u16 definiert?>>> Was ich noch sagen wollte:> Hast Du als Grundlage eine 8-bit- oder eine 16-bit-Implementierung?>> Wenn 8-bit, dann ist das natürlich ein ewiges Hin- und Herrechnen> zwischen 16 und 8 bit. Zum Testen ok, aber "fur Gut" sollten die> 16-Bit-Möglichkeiten auch genutzt werden.
Habe gestern ja gesucht und nichts gefunden. War wahrscheins einfach
etwas zu spät! Eben habe ich es dann gleich gefunden.
typedef unsigned short u16;
eProfi schrieb:> Hast Du als Grundlage eine 8-bit- oder eine 16-bit-Implementierung?
Ich habe beides...
1
//Definition der Board Pins - 16Bit
2
//Port0
3
#define BUT_1_Pin 0x0001 //P0.0
4
#define BUT_2_Pin 0x0002 //P0.1
5
#define I2C0_SCL 0x0004 //P0.2
6
#define I2C0_SDA 0x0008 //P0.3
7
8
#define LAN_MISO_Pin 0x0010 //P0.4 LAN
9
#define LAN_MOSI_Pin 0x0020 //P0.5 LAN
10
#define LAN_SCLK_Pin 0x0040 //P0.6 LAN
11
#define BSPI1_CS_Pin 0x0080 //P0.7 (nicht belegt, beeinflusst andere Bus-Teilnehmer)
Nein, ich meinte, ob die SW, die Du zu implementieren versuchst, für
einen 8- oder 16-bit-Prozessor geschrieben ist.
Wenn 8-bit, dann nutzt Du die Fähigkeiten Deines 16-bitters nicht aus,
sondern verschwendest viel Zeit mit sinnlosem 8-Bit-Geschiebe.
Bei einfachen Anwendungen egal, aber wenn es auf Durchsatz ankommt,
wichtig.
eProfi schrieb:> Nein, ich meinte, ob die SW, die Du zu implementieren versuchst, für> einen 8- oder 16-bit-Prozessor geschrieben ist.
Achso! Das eine 16 bit SW. Wobei die Registerbänke als 8bit Werte
definiert sind.
Morgen,
schau dir nochmal in der ENC28j60.c File an.
Dort wird als PIN in der Funktion SEL_MAC() LAN_CS (8 Bit) verwendet und
nicht wie du vorher geschrieben hast LAN_CS_Pin (16 Bit).
Was mir noch aufgefallen ist, ist das deine BSPI_WordSend() Funktion ja
keine Flags überprüft. Wenn du 2x BSPI_WordSend() schreibst, wie weiß
der MC das das erste Byte schon raus ist? (bzw: SPIWrite() mit einer
Anzahl größer 1 Byte)
Welchen Staus hat dein Programm jetzt?
Kommen die Daten richtig am SPI-Bus raus? Ossi?
Stephan
Hi
Stephan W. schrieb:> schau dir nochmal in der ENC28j60.c File an.> Dort wird als PIN in der Funktion SEL_MAC() LAN_CS (8 Bit) verwendet und> nicht wie du vorher geschrieben hast LAN_CS_Pin (16 Bit).
Also hab die Pins angepasst!
CH 1: SCK
CH 2: MOSI
CH 3: MISO
CH 4: CS
So, da ich gerade keine Bilder hochladen kann, muss ich euch leider
einen link geben. Ich polle gerade in der initialisierungsroutine:
http://www.home.hs-karlsruhe.de/~ruto0011/pics/22112010009.jpg
Wobei ich festgestellt habe das ich ein CLK Signal von 400 KHz habe.
1
while(1){
2
BSPI_WordSend(BSPI1,0xffff);
3
}
Ich wolle nochmal kurz zusammengefasst euch die Daten geben:
init.c
1
//BSPI0 GPIOs konfigurieren LAN
2
// The MISO/MOSI/SCLK pins must be configured as Alternate Function push-pull and the SS
3
//Slave Select pin must be configured as Input tristate CMOS for the duration of BSPI
BSPI_Enable(BSPI0,ENABLE);// SPI 0 = Lan + SD-Karte
3
//BSPI1 control/status register 1
4
BSPI1->CSR1=0xA001;
fällt dir was auf?
Sollte bestimmt BSPI0 heißen!
Tolles Bild aber nicht wirklich aussagefähig.
Kannst du ein Bild einer kompletten Sequenz aufnehmen, ich hoffe man
erkennt was. Von CS von High to Low bis CS von Low to High! und
natürlich die passende Codezeile dazu nennen.
Stephan
PS: Wie steht denn das Reg. CSR1 wenn du es nach der Enable Funktion
liest?
Stephan W. schrieb:> musste gerade etwas schmunzeln:> //BSPI0 einschalten> BSPI_Enable(BSPI0, ENABLE); // SPI 0 = Lan + SD-Karte> //BSPI1 control/status register 1> BSPI1->CSR1 = 0xA001;>> fällt dir was auf?> Sollte bestimmt BSPI0 heißen!
Sodala! Hab es auf "BSPI0->CSR1 = 0xA001;" geändert.
Hab wahrscheins gestern auf das > //BSPI1 control/status register 1
geachtet! WObei das ja auch > //BSPI0 control/status register 1
heissen müsste.
Also hab mal noch ein Bild gemacht, allerdings fällt mir auf, dass das
CS Signal dauerhaft auf high ist und nicht, wenn was gesendet wird auf
low geht.
Woran könnte das denn liegen ?
http://www.home.hs-karlsruhe.de/~ruto0011/pics/22112010011.jpg
Ach den Code den ich schreibe ist:
1
inti;
2
for(i=0;i<100;i++){
3
BSPI_WordSend(BSPI1,0xffff);
4
}
Stephan W. schrieb:> PS: Wie steht denn das Reg. CSR1 wenn du es nach der Enable Funktion> liest?
Direkt nach der Enable Funktion steht 0x03 drin, das heisst:
0011 --> der Rest ist 0.
Bit 1
MSTR: Master/Slave Select.
0: BSPI is configured as a slave
1: BSPI is configured as a master
Bit 0
BSPE: BSPI System Enable.
0: BSPI system is disabled
1: BSPI system is enabled
aus der enc28j60.c Datei. s.o.
>Bit 1>MSTR: Master/Slave Select.>0: BSPI is configured as a slave>1: BSPI is configured as a master
warum ist es bei dir nicht gesetzt?
Du brauchst den Masterbetrieb!
Das bringt mich zur nächsten Frage:
Das Bild zeigt nicht den Code!!!!! Kann ja auch nicht, s.o.!
Im Bild sind die letzten Bits 010 gut zu erkennen.
Noch zu meiner früheren Frage zurück, wie erkennt dein MC das das zu
sendende Byte raus ist?? Beim AVR muss gewartet werden bis man das
nächste Byte senden darf! (bzw Flag abfragen)
Außerdem sendest du an BSPI1 das ist die andere Schnittstelle!
>Bit 12 = 0 |>Bit 13 = 1 |} Receive FIFO Enable --> 1010: Default: 1st word enabled>Bit 14 = 0 |>Bit 15 = 1 |
kannst du das nochmal prüfen bitte.
Wenn es auch mit 0000 geht wäre deine Init der SPI0 ja richtig und du
bräuchtest den Ausdruck gar nicht ("BSPI0->CSR1 = 0xA001;")
Stephan
Stephan W. schrieb:>>Bit 1>>MSTR: Master/Slave Select.>>0: BSPI is configured as a slave>>1: BSPI is configured as a master> warum ist es bei dir nicht gesetzt?> Du brauchst den Masterbetrieb!
Hab es geändert wurde jetzt zur "BSPI0->CSR1 = 0xA003;"
Stephan W. schrieb:> Noch zu meiner früheren Frage zurück, wie erkennt dein MC das das zu> sendende Byte raus ist?? Beim AVR muss gewartet werden bis man das> nächste Byte senden darf! (bzw Flag abfragen)
Ich habe gerade gesucht, woran man erkennt, das das Byte gesendet wurde,
aber gerade nichts gefunden. Werde mich jetzt aber nochmal dran machen,
das genauer durch zu schauen. Ich schreib dann, wenn ich was gefunden
habe..
Stephan W. schrieb:>>Bit 12 = 0 |>>Bit 13 = 1 |} Receive FIFO Enable --> 1010: Default: 1st word enabled>>Bit 14 = 0 |>>Bit 15 = 1 |>> kannst du das nochmal prüfen bitte.> Wenn es auch mit 0000 geht wäre deine Init der SPI0 ja richtig und du> bräuchtest den Ausdruck gar nicht ("BSPI0->CSR1 = 0xA001;")
du meinst das ich folgendes in das Register schreiben soll ?
0000000000000011 --> 0x03 ?
Ich habe gerade nur ein Problem, habe den Controller in der FH gelassen.
Kann es leider heute nicht mehr testen! Aber sag es dir morgen Abend,
was dabei raus kam.
Hey,
da bin ich wieder. Also folgende.
Hab gerade etwas rumgespielt und einfach mal das CS Signal ein und
ausgeschaltet. Das geht aber nur wenn ich das mit den 8 Bit Werten
mache.
Mit dem LAN_CS_Pin funktioniert das nicht.
1
voidSEL_MAC(boolx){
2
3
if(x==1){
4
GPIO_BitWrite(GPIO1,LAN_CS,0);
5
6
}elseif(x==0){
7
GPIO_BitWrite(GPIO1,LAN_CS,1);// CS low
8
}
9
}
http://www.home.hs-karlsruhe.de/~ruto0011/pics/enable_cs-signal.jpg
2.
Wenn ich jetzt Daten mittels der Funktion Word_send verschicke, sehe ich
diese auch:
http://www.home.hs-karlsruhe.de/~ruto0011/pics/send_word.jpg
CH 1: SCK
CH 2: MOSI
CH 4: CS
Stephan W. schrieb:> kannst du das nochmal prüfen bitte.> Wenn es auch mit 0000 geht wäre deine Init der SPI0 ja richtig und du> bräuchtest den Ausdruck gar nicht ("BSPI0->CSR1 = 0xA001;")
Die Funktion "BSPI0->CSR1 = 0xA003;" ändert nichts. Habe es mit 0xA003
sowie 0x003 versucht. Habe da keinen Unterschied gesehen.
Stephan W. schrieb:> Noch zu meiner früheren Frage zurück, wie erkennt dein MC das das zu> sendende Byte raus ist?? Beim AVR muss gewartet werden bis man das> nächste Byte senden darf! (bzw Flag abfragen)
Nochmal zu deiner Frage. Habe jetzt noch einige Zeit damit verbracht, zu
suchen, woran man das erkennen kann. Aber ich habe leider nichts
gefunden.
Weiss auch nicht nach was ich expliziet suchen soll.
Hi,
die Bilder sehen doch gut aus.
Was hast du im 2. Bild geschickt?
0x60 oder 0x06 wäre noch interessant zu wissen? oder was anderes???
Den ENC antwortet dir immer noch nicht???
(Versions Nummer auslesen oder so)
Schau dir noch mal die Funktion BSPI_BufferSend() an, da wird ein Flag
abgefragt. Aber solche Sachen sollte dir Leute erklären die den MC
besser kennen, hast du keinen Kumpel oder Kollegen an der Uni der mehr
weiß als ich?
Hier im Forum scheint ja keiner weiter helfen zu können oder wollen?!?
Stephan
Stephan W. schrieb:> Was hast du im 2. Bild geschickt?
Im zweiten Bild habe ich "BSPI_WordSend(BSPI0,0xffff);" aufgerufen.
Stephan W. schrieb:> 0x60 oder 0x06 wäre noch interessant zu wissen? oder was anderes???
Was meinst du denn damit ? Meinst du die BSPI0->CSR1 = ???
Stephan W. schrieb:> Den ENC antwortet dir immer noch nicht???> (Versions Nummer auslesen oder so)
Ne, der antwortet leider immer noch nicht! Kann das Register EREVID gar
nicht ansprechen, indem die Versionsnummer hinterlegt ist.
Muss ja auf das Register des ENC zugreifen. Aber bekomm es leider nicht
hin. Muss für heute leider auch aufhören.
Stephan W. schrieb:> Schau dir noch mal die Funktion BSPI_BufferSend() an, da wird ein Flag> abgefragt. Aber solche Sachen sollte dir Leute erklären die den MC> besser kennen, hast du keinen Kumpel oder Kollegen an der Uni der mehr> weiß als ich?
Ne, leider nicht, das ja das Problem! Habe schon rumgefragt, aber es
kennt sich leider keiner mit dem Controller aus.
Stephan W. schrieb:> Hier im Forum scheint ja keiner weiter helfen zu können oder wollen?!?
Ne, das echt schade! Bin grad mal froh das du mich so unterstützt! Was
auch nicht selbstverständlich ist...
Hi,
>Im zweiten Bild habe ich "BSPI_WordSend(BSPI0,0xffff);" aufgerufen.
Das kann nicht sein.
Schau dir das Bild an:
1: Takt -> haben wir 8 Stück
2: mosi ->
1 Takt -> Datel Leitung Low
2 Takt -> Datel Leitung High
3 Takt -> Datel Leitung Low
4 Takt -> Datel Leitung High
5 Takt -> Datel Leitung Low
6 Takt -> Datel Leitung Low
7 Takt -> Datel Leitung Low
8 Takt -> Datel Leitung Low
das ergibt: 01010000 -> 0x50 hab mich vorhin verzählt.
So, es kann auch sein das es mit LSB First gesendet wird.
Schau dir bitte morgen noch mal die Funktion BSPI_BufferSend() an.
>Nur so als Idee: Vielleicht mal an der Bitreihenfolge rumfummeln.>LSB First und MSB First versuchen.
Ja das will ich noch wissen, aber dafür muss er wissen was er sendet!
Stephan
Hey,
da bin ich wieder sorry, das ich gestern nicht geantwortet habe, aber es
war ein stressiger Tag!
Ich habe mal ein paar tests gemacht und zwar verschicke ich pro
Tastendruck,
folgenden Code:
BSPI_WordSend(BSPI0,0xF9);
Dabei kam dieses Bild heraus.
http://www.home.hs-karlsruhe.de/~ruto0011/pics/f9.JPG
Anschließend habe ich:
BSPI_WordSend(BSPI0,0x60); gesendet um bekam folgende:
http://www.home.hs-karlsruhe.de/~ruto0011/pics/60.JPG
Was mich wundert, das das Signal von Kanal 2 (MOSI) dauerhaft high
ist... also der Ground liegt ja ca. 2 div´s unterhalb.
Wenn ich jetzt bei Bild f9 nachzähle komme ich auf: 01101111 was wieder
f9 entspricht. aber wenn ich 60h verschicke stimmt das Bitmuster
nicht...
Kann es sein, das die Bitreihenfolge nicht wie ich denke 1,2,3,4,... ist
?
Stephan W. schrieb:> Schau dir bitte morgen noch mal die Funktion BSPI_BufferSend() an.
Die Funktion habe ich mir angeschaut, aber sehe nirgends das da ein Flag
abgefragt wird.
Hier mal die Funktion:
Hi,
für die BufferSend Funktion hatte ich diese Datei gefunden:
http://wenku.baidu.com/view/871c2e1dc281e53a5802ff4b.html#
ziemlich weit unten. ist aber schon älter.
Kannst ja nochmal in die ERRATA Seiten deines MC schauen, warum das
jetzt anders ist.
Auf den Bildern sehe ich 2 mal das gleiche: 0x90
Du musst bei jeder steigenden Flanke von Clock die MOSI Leitung
vergleichen!
oder ist der Kanal 2 invertiert?
Bei einem 0xF0 bzw 0x0F müssten ja 4 Bits High sein!
Um die Bitreihenfolge geht es jetzt! es kann MSB-First oder LSB-First
gesendet werden, normalerweise jedenfalls. ;-)
Stephan
PS: Noch einige Fragen zum TX-FIFO:
muss der immer an sein? muss der immer vollgeschrieben werden bis
gesendet wird? was passiert wen man ihn nicht voll schreibt, wird nichts
gesendet?
Hi,
bin endlich wieder da.
Stephan W. schrieb:> Auf den Bildern sehe ich 2 mal das gleiche: 0x90> Du musst bei jeder steigenden Flanke von Clock die MOSI Leitung> vergleichen!> oder ist der Kanal 2 invertiert?
Nein, der Kanal war nicht invertiert.
Stephan W. schrieb:> Um die Bitreihenfolge geht es jetzt! es kann MSB-First oder LSB-First> gesendet werden, normalerweise jedenfalls. ;-)
An der bitreihenfolge habe ich auch mal rumgespielt. Aber komme nie auf
den Wert, den ich eingebe!
Hab noch etwas nachgelesen und folgendes gefunden:
http://www.home.hs-karlsruhe.de/~ruto0011/info.pdf
Die ersten beiden Seiten kennt ihr ja schon, aber Seite 3+4 sind
interessant. Hier kann ich das FIFO ein und ausschalten sowie die Bits
beobachten, die gesetzt wurden. Allerdings steh ich gerade vor der
Frage, welche Bits ich setzen soll und welche nicht.
BSPI0->CSR2 = 0x...
Stephan W. schrieb:> Kannst ja nochmal in die ERRATA Seiten deines MC schauen, warum das> jetzt anders ist.
Das ist das Problem. Der Karton des Controllers ist nicht auffindbar :(
und auf dem Controller selber steht nur Rev B aber leider keine Nummer
hinten dran. Somit weiss ich nicht in welchem Dokument ich nachschauen
soll wegen der ERRATA.
Die Version könnte ich ja auslesen, da gibt es extra ein Register in der
die Version steht. DIeses wiederrum kann ich nicht auslesen, da der
enc28j60 nicht initialisiert ist. Das ist echt ein Rattenschwanz!
Hi,
hast du dir die Funktion BufferSend von der HP angesehen???? (s.o.)
Da steht was dazu! und schreiben brauchst du da in diesem Stadium deines
Programms nichts. später vielleicht!
außerdem:
>Die Version könnte ich ja auslesen, da gibt es extra ein Register in der>die Version steht. Dieses wiederum kann ich nicht auslesen, da der>enc28j60 nicht initialisiert ist. Das ist echt ein Rattenschwanz!
reden wir hier an einander vorbei. Ich meinte die ERRATAS deines
"STR711FR2"!!!
>An der bitreihenfolge habe ich auch mal rumgespielt. Aber komme nie auf>den Wert, den ich eingebe!
Hast du ein neues Programm geschrieben ( so einen 5 Zeiler
(printf("Hallo")) oder LED blinken oder so) für den ENC oder arbeitest
du noch in dem großen Projekt?
Wenn du noch im großen Projekt arbeitest, würde ich dir vorschlagen,
mach ein neues auf und schreib ein kleines "Hallo Welt" und dann mach
die init für den ENC. So kannst du sicher sein, das nur du die SPI
bedienst und kannst auch sehen was du sendest.
Denn du solltest eigentlich schon was sehen können, da es aber nicht so
ist, glaub ich fast das du an der falschen Schnittstelle misst.
Wenn du dein "Hallo Welt" fertig hast, mach mal ein Bild von 0xF0 und
von 0x0F, dann sollten WIR was sehen können.
Stephan
Hey,
> Stephan W. schrieb:> hast du dir die Funktion BufferSend von der HP angesehen???? (s.o.)> Da steht was dazu! und schreiben brauchst du da in diesem Stadium deines> Programms nichts. später vielleicht!> außerdem:
habe ich mir angeschaut.
Stephan W. schrieb:> Hast du ein neues Programm geschrieben ( so einen 5 Zeiler> (printf("Hallo")) oder LED blinken oder so) für den ENC oder arbeitest> du noch in dem großen Projekt?
Ich werde es am Wochenende mal umschreiben. Das ich echt nur noch die
Dateien drin habe, die ich tatsächlich auch brauche.
1
inti=0;
2
BSPI_WordSend(BSPI1,i++);
funktioniert mitlerweile, hatte vor lauter testen vergessen den Bus von
SPI0 auf SPI1 zu stellen.
Jetzt sieht man auch wie die Bits hochzählen.
Allerdings hab ich auf dem Oszi auch noch andere Signale gesehen, die
ich nicht schicke. Das wird aber wahrscheins am Display liegen.
Muss mir das am Wochenende auf jedenfall nochmal anschauen.
Ich hoffe ich komm am Montag dazu, euch die Bilder hochzuladen.
Hi
>habe ich mir angeschaut.
und was gesehen? und warum das jetzt nicht mehr so ist?
Vielleicht_ _kann_ _einer_ _hier_ _aus_ _dem_ _Forum_ _sagen_ _warumdas_ _nicht_ _mehr_ _so__ist!
>Ich werde es am Wochenende mal umschreiben. Das ich echt nur noch die>Dateien drin habe, die ich tatsächlich auch brauche.
sehr gut
>funktioniert mittlerweile, hatte vor lauter testen vergessen den Bus von>SPI0 auf SPI1 zu stellen.
hab ich vermutet
>Jetzt sieht man auch wie die Bits hoch zählen.
so sollte es sein :-)
>Allerdings hab ich auf dem Oszi auch noch andere Signale gesehen, die>ich nicht schicke.
hab ich befürchtet, deswegen mal das minimal Prog aufsetzen.
Ich glaube das in deinem großen Prog noch Mechanismen sind, die du noch
nicht gesehen hast. Denn einer (Du) muss ja den Zugriff auf den SPI-Bus
koordinieren und das machst du im Moment noch nicht.
>Ich hoffe ich komm am Montag dazu, euch die Bilder hochzuladen.
das wäre gut
Stephan
Stephan W. schrieb:>>Allerdings hab ich auf dem Oszi auch noch andere Signale gesehen, die>>ich nicht schicke.> hab ich befürchtet, deswegen mal das minimal Prog aufsetzen.> Ich glaube das in deinem großen Prog noch Mechanismen sind, die du noch> nicht gesehen hast. Denn einer (Du) muss ja den Zugriff auf den SPI-Bus> koordinieren und das machst du im Moment noch nicht.
Problem gefunden. Und zwar liegt es an der Ausgabe des Displays.
Wenn ich z.B. die Zählvariable ausgeben lasse, gibt er auf dem SPI1 Bus
die Impulse aus. Wenn ich dann das Display deaktiviere für den Moment,
an dem ich hochzähle, funktioniert es. So bringt das Oszi auch nur den
Wert den ich inkrementiere.
Hier mal ein Bild, wie es sein soll.. Nur meine 8 Bit(sieht man nicht,
da es sehr klein ist) aber man erkennt, dass keine anderen Signale
gesendet werden.
http://www.home.hs-karlsruhe.de/~ruto0011/pics/pic_1.JPG
Im zweiten Bild sieht man dann, dass ich bis 9 gezählt habe.
http://www.home.hs-karlsruhe.de/~ruto0011/pics/pic_2.JPG
Gut das ich mir mal die mühe gemacht habe, das Porgramm so abzuspecken,
das nur noch das Display und der Lan Controller eingebunden waren.
Habe auch mal die Funktion:
Hi
sehr gute Arbeit!
Also wir wissen nun das dein MC mit MSB-First sendet, was auch für den
ENC richtig ist.
Ich würde vorschlagen, das DU den Code für den ENC mit deinen
SPI-Funktionen auf vorderman bringst und dann mal die Init-Funktion für
den ENC laufen lässt.
Wenn möglich versuche ein paar Befehle der Init-Sequenz aufzunehmen und
zu kontrollieren. Ist überall der Wechsel der CS-Leitung vor dem Senden
der Daten und so weiter.
viel Erfolg, ich hoffe das es bald läuft!
Stephan
Hey,
wollt mich mal wieder melden. Also ich habe noch lange nicht
aufgegeben. Komm in letzter Zeit aber nicht mehr regelmäßig
zum weitermachen. Bin momentan dabei, den Controller zu initialisieren
aber das macht mir echt Bauchweh.
Hey,
schön wäre es!
Es hängt gerade noch an der Initialisierung. Versuch grad Schritt
für Schritt nachzuvollziehen, was die Initialisierungsroutine genau
macht und schau mir das Bitmuster an.
Am Montag werde ich aller Voraussicht wieder am Projekt weiter machen.
Dann kann ich euch auch mal ein Bild hochladen.