Forum: Mikrocontroller und Digitale Elektronik enc28j60 LanController initialisieren auf ARM7


von Torti R. (squardy)


Lesenswert?

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";

von holger (Gast)


Lesenswert?

>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.

von Torti R. (squardy)


Angehängte Dateien:

Lesenswert?

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...

von Stephan W. (sir_wedeck)


Lesenswert?

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

von Torti R. (squardy)


Angehängte Dateien:

Lesenswert?

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...

von holger (Gast)


Lesenswert?

>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?

von Torti R. (squardy)


Angehängte Dateien:

Lesenswert?

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.

von holger (Gast)


Lesenswert?

>    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.

von Torti R. (squardy)


Lesenswert?

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.

von Stephan W. (sir_wedeck)


Lesenswert?

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

von Torti R. (squardy)


Lesenswert?

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.
1
void spi_init(void){
2
     
3
   //--SPI0-----------------------------------------------------------------
4
  
5
   //SPI0 Pins konfigurieren
6
   BSPI_BSPI0Conf(ENABLE);
7
8
   //BSPI0 Clock einstellen (Systemclock von 12MHz auf 2MHz runterteilen 
9
   BSPI_ClockDividerConfig (BSPI0, 6);
10
   
11
   //BSPI0 initialisieren
12
   BSPI_Init(BSPI0);
13
   
14
   //BSPI0 in Master-Mode schalten
15
   BSPI_MasterEnable(BSPI0, ENABLE);
16
   
17
   //BSPI0 Clock auf active high
18
   BSPI_ClkActiveHigh(BSPI0, ENABLE);
19
   
20
   //BSPI0 Datenwandlung mit erster Taktflanke beginnen
21
   BSPI_ClkFEdge(BSPI0, ENABLE);
22
   
23
   //BSPI0 auf 8Bit Wortlaenge stellen
24
   BSPI_8bLEn(BSPI0, ENABLE);
25
   
26
   //BSPI0 FiFo abschalten
27
   BSPI_FifoDisable(BSPI0);
28
   
29
   //BSPI0 einschalten
30
   BSPI_Enable(BSPI0, ENABLE);
31
   
32
   
33
   //--SPI1-----------------------------------------------------------------
34
   //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 ?

von Stephan W. (sir_wedeck)


Lesenswert?

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
The ENC28J60 is designed to interface directly with the
2
Serial Peripheral Interface (SPI) port available on many
3
microcontrollers. The implementation used on this
4
device supports SPI mode 0,0 only. In addition, the SPI
5
port requires that SCK be at Idle in a low state;
6
selectable clock polarity is not supported.

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

von Torti R. (squardy)


Angehängte Dateien:

Lesenswert?

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 !?

von Stephan W. (sir_wedeck)


Lesenswert?

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

von Stephan W. (sir_wedeck)


Lesenswert?

so hab noch mal Google beschäftigt und das gefunden:
im Reg. BSPI control/status register 1 (BSPIn_CSR1)
gibs die beiden Punkte:
1
Bit 9
2
CPHA: Clock Phase Select.
3
Used with the CPOL bit to define the master-slave clock relationship. When
4
CPHA=0, as soon as the SS goes low the first data sample is captured on the
5
first edge of SCLK. When CPHA=1, the data is captured on the second edge.
6
7
Bit 8
8
CPOL: Clock Polarity Select.
9
When this bit is cleared and data is not being transferred, a stable low value is present on the SCLK pin. If the bit is set the SCLK pin will idle high. This bit is
10
used with the CPHA bit to define the master-slave clock relationship.
11
0: Active high clocks selected; SCLK idles low.
12
1: Active low clocks selected; SCLK idles high.

da solltest du mal schauen!

Link: 
http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/REFERENCE_MANUAL/CD00164787.pdf

Seite 193, und S. 189

Stephan

von Torti R. (squardy)


Lesenswert?

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!
1
/*******************************************************************************
2
* Function Name  : BSPI_BSPI0Conf
3
* Description    : Configure BSPI0 to be available on GPIO0.0 to GPIO0.3 pins.
4
* Input          : - NewState: specifies the status of the BSPI0.
5
*                    it can be ENABLE or DISABLE.
6
* Output         : None.
7
* Return         : None.
8
*******************************************************************************/
9
void BSPI_BSPI0Conf(FunctionalState NewState)
10
{
11
  if (NewState == ENABLE)
12
  {
13
    PCU->BOOTCR |= 0x04;
14
  }
15
  else
16
  {
17
    PCU->BOOTCR &= ~0x04;
18
  }
19
}

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.

von Torti R. (squardy)


Lesenswert?

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 ?

von Stephan W. (sir_wedeck)


Lesenswert?

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

von Torti R. (squardy)


Angehängte Dateien:

Lesenswert?

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:
1
// useful structures
2
typedef union {
3
  u8_t v[7];
4
  struct {
5
    u16_t  ByteCount;
6
    u8_t  CollisionCount:4;
7
    u8_t  CRCError:1;
8
    u8_t  LengthCheckError:1;
9
    u8_t  LengthOutOfRange:1;
10
    u8_t  Done:1;
11
    u8_t  Multicast:1;
12
    u8_t  Broadcast:1;
13
    u8_t  PacketDefer:1;
14
    u8_t  ExcessiveDefer:1;
15
    u8_t  MaximumCollisions:1;
16
    u8_t  LateCollision:1;
17
    u8_t  Giant:1;
18
    u8_t  Underrun:1;
19
    u16_t  BytesTransmittedOnWire;
20
    u8_t  ControlFrame:1;
21
    u8_t  PAUSEControlFrame:1;
22
    u8_t  BackpressureApplied:1;
23
    u8_t  VLANTaggedFrame:1;
24
    u8_t  Zeros:4;
25
  } bits;
26
} TXSTATUS;
27
28
typedef union {
29
  u8_t v[6];
30
  struct {
31
    u16_t   NextPacket;
32
        u16_t  ByteCount;
33
    u8_t  LongEvent:1;
34
    u8_t  Reserved:1;
35
    u8_t  CarrierEvent:1;
36
    u8_t  Reserved2:1;
37
    u8_t  CRCError:1;
38
    u8_t  LenChkError:1;
39
    u8_t  LenOutofRange:1;
40
    u8_t  RxOk:1;
41
    u8_t  RxMultiCast:1;
42
    u8_t  RxBroadCast:1;
43
    u8_t  DribbleNibble:1;
44
    u8_t  RxCntrlFrame:1;
45
    u8_t  RxPauseFrame:1;
46
    u8_t  RxUkwnOpcode:1;
47
        u8_t    RxVlan:1;
48
    u8_t  Zeros:1;
49
  } bits;
50
} RXSTATUS;

von Stephan W. (sir_wedeck)


Lesenswert?

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 --------------*/
2
typedef struct
3
{
4
  vu16 RXR;
5
  u16  EMPTY1;
6
  vu16 TXR;
7
  u16  EMPTY2;
8
  vu16 CSR1;
9
  u16  EMPTY3;
10
  vu16 CSR2;
11
  u16  EMPTY4;
12
  vu16 CLK;
13
  u16  EMPTY5;
14
} BSPI_TypeDef;
15
16
17
#ifdef _BSPI1
18
  #define BSPI1               ((BSPI_TypeDef *)BSPI1_BASE)
19
#endif /*BSPI1*/

passt doch!

also lautet die Zeile:
1
BSPI1->CSR1= 0xA981;

Stephan

von Torti R. (squardy)


Lesenswert?

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!

von Stephan W. (sir_wedeck)


Lesenswert?

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

von Torti R. (squardy)


Lesenswert?

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.
1
/***********************************************************************/
2
/** \brief SPiWrite 
3
 *
4
 * Description: Writes bytes from buffer to SPI tx reg
5
6
 * \author Iain Derrington
7
 * \param ptrBuffer Pointer to buffer containing data.
8
 * \param ui_Len number of bytes to transmit.
9
 * \return uint Number of bytes transmitted.
10
 */
11
/**********************************************************************/
12
u16_t SPIWrite(u8_t * PtrToBuffer, u16_t NbOfWords)
13
{
14
  vu8 SendWord = 0;
15
  
16
  while (SendWord < NbOfWords)
17
  {
18
    BSPI_WordSend(BSPI1, *(PtrToBuffer + SendWord));
19
    SendWord++;
20
  }
21
   return SendWord;
22
}
1
void BSPI_WordSend(BSPI_TypeDef *BSPIx, u16 Data)
2
{
3
  /* 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!

von eProfi (Gast)


Lesenswert?

> 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?

von Torti R. (squardy)


Lesenswert?

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

von eProfi (Gast)


Lesenswert?

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.

von Torti R. (squardy)


Lesenswert?

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)
12
13
#define UART0_Rx_Pin    0x0100  //P0.8
14
#define UART0_Tx_Pin    0x0200  //P0.9
15
#define ADC_CS2_Pin     0x0400  //P0.10
16
#define ADC_CS3_Pin     0x0800  //P0.11
17
18
#define ADC_CS4_Pin     0x1000  //P0.12
19
#define ADC_CS1_Pin     0x2000  //P0.13
20
#define SD_CS_Pin       0x4000  //P0.14
21
#define WAKE_UP_Pin     0x8000  //P0.15
22
23
24
25
//Port1
26
#define LCD_CS_Pin      0x0001  //P1.0
27
#define AIN1_Pin        0x0002  //P1.1
28
#define ADC_CNV_Pin     0x0004  //P1.2
29
#define EXT_CS_Pin      0x0008  //P1.3
30
31
#define ADC12_EN_Pin    0x0010  //P1.4
32
#define CHG_Pin         0x0020  //P1.5
33
#define CEN_Pin         0x0040  //P1.6
34
#define OSC_EN_Pin      0x0080  //P1.7
35
36
#define LAN_CS_Pin      0x0100  //P1.8               LAN
37
#define I2C1_SCL    0x0200  //P1.9
38
#define I2C1_SDA    0x0400  //P1.10
39
#define PLACE_111_u16  0x0800  //P1.11
40
41
#define PLACE_112_u16  0x1000  //P1.12
42
#define  PLACE_113_u16  0x2000  //P1.13
43
#define EXT_INT_Pin     0x4000  //P1.14
44
#define SD_DETECT_Pin   0x8000  //P1.15
45
46
47
48
49
//Definition der Board Pins - 8 Bit 
50
//Port0
51
#define BUT_1      0x00    //Pin0.0
52
#define BUT_2      0x01    //Pin0.1
53
#define I2C0_SCL_u8    0x02  //Pin0.2
54
#define I2C0_SDA_u8    0x03  //Pin0.3
55
56
#define BSPI1_MISO_u8  0x04  //Pin0.4
57
#define BSPI1_MOSI_u8  0x05  //Pin0.5
58
#define BSPI1_SCLK_u8  0x06  //Pin0.6
59
#define SPI1_CS      0x07    //Pin0.7
60
61
#define UART0_Rx_u8    0x08  //Pin0.8
62
#define UART0_Tx_u8    0x09  //Pin0.9
63
#define CS2_Pin      0x0a    //Pin0.10
64
#define CS3_Pin      0x0b    //Pin0.11
65
66
#define CS4_Pin      0x0c    //Pin0.12
67
#define CS1_Pin      0x0d    //Pin0.13
68
#define SD_CS      0x0e    //Pin0.14
69
#define WAKE_UP      0x0f    //Pin0.15
70
71
72
73
//Port1
74
#define LCD_CS      0x00    //Pin1.0
75
#define AIN1_Pin_u8    0x01  //Pin1.1
76
#define CNV_Pin      0x02    //Pin1.2
77
#define EXT_CS      0x03    //Pin1.3
78
79
#define ADC_EN      0x04    //Pin1.4
80
#define CHG        0x05  //Pin1.5
81
#define CEN        0x06  //Pin1.6
82
#define OSC_EN      0x07  //Pin1.7
83
84
#define LAN_CS      0x08    //Pin1.8
85
#define I2C1_SCL_u8    0x09    //Pin1.9
86
#define I2C1_SDA_u8    0x0a    //Pin1.10
87
#define PLACE_111_u8  0x0b    //Pin1.11
88
89
#define PLACE_112_u8  0x0c  //Pin1.12
90
#define PLACE_113_u8  0x0d  //Pin1.13
91
#define EXT_INT_u8    0x0e  //Pin1.14
92
#define SD_DET      0x0f    //Pin1.15

Das meintest du doch oder ?

von eProfi (Gast)


Lesenswert?

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.

von Torti R. (squardy)


Lesenswert?

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.

von Stephan W. (sir_wedeck)


Lesenswert?

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

von Torti R. (squardy)


Lesenswert?

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 
4
    GPIO_Config (GPIO0, LAN_MISO_Pin, GPIO_AF_PP);
5
    GPIO_Config (GPIO0, LAN_MOSI_Pin, GPIO_AF_PP);
6
    GPIO_Config (GPIO0, LAN_SCLK_Pin, GPIO_AF_PP);
7
8
  //Chipselect des LAN-Controllers
9
  GPIO_Config (GPIO1, LAN_CS_Pin, GPIO_OUT_PP);

init.c
1
void spi_init(void){
2
     
3
   //--SPI0-----------------------------------------------------------------
4
  
5
   //SPI0 Pins konfigurieren
6
   BSPI_BSPI0Conf(ENABLE);
7
8
   //BSPI0 Clock einstellen (Systemclock von 12MHz auf 2MHz runterteilen 
9
   BSPI_ClockDividerConfig (BSPI0, 6);
10
   
11
   //BSPI0 initialisieren
12
   BSPI_Init(BSPI0);
13
   
14
   //BSPI0 in Master-Mode schalten
15
   BSPI_MasterEnable(BSPI0, ENABLE);
16
   
17
   //BSPI0 Clock auf active high
18
   BSPI_ClkActiveHigh(BSPI0, ENABLE);
19
   
20
   //BSPI0 Datenwandlung mit erster Taktflanke beginnen
21
   BSPI_ClkFEdge(BSPI0, ENABLE);
22
   
23
   //BSPI0 auf 8Bit Wortlaenge stellen
24
   BSPI_8bLEn(BSPI0, ENABLE);
25
   
26
   //BSPI0 FiFo abschalten
27
   BSPI_FifoDisable(BSPI0);
28
   
29
   //BSPI0 einschalten
30
   BSPI_Enable(BSPI0, ENABLE);              // SPI 0  = Lan + SD-Karte
31
   
32
   //BSPI1 control/status register 1 --> S.192 auf D:\FH\6. Semester\Projektarbeit\Datenlogger V2.x\Dokumentation\Datasheets\µ - Controller\STR71xF_ref_manual.pdf
33
   BSPI1->CSR1 = 0xA001;
34
35
   
36
   
37
   //--SPI1-----------------------------------------------------------------
38
   //BSPI1 Clock einstellen (Systemclock von 12MHz auf 400kHz runterteilen 
39
   BSPI_ClockDividerConfig (BSPI1, 30);
40
   
41
   //BSPI1 initialisieren
42
   BSPI_Init(BSPI1);
43
   
44
   //BSPI1 in Master-Mode schalten
45
   BSPI_MasterEnable(BSPI1, ENABLE);
46
   
47
   //BSPI1 Clock auf active high
48
   BSPI_ClkActiveHigh(BSPI1, ENABLE);
49
   
50
   //BSPI1 Datenwandlung mit erster Taktflanke beginnen
51
   BSPI_ClkFEdge(BSPI1, ENABLE);
52
   
53
   //BSPI1 auf 8Bit Wortlaenge stellen
54
   BSPI_8bLEn(BSPI1, ENABLE);
55
   
56
   //BSPI1 FiFo abschalten
57
   BSPI_FifoDisable(BSPI1);
58
   
59
   //BSPI1 einschalten
60
   BSPI_Enable(BSPI1, ENABLE);    // SPI 1  = LCD + ??
61
}

in enc28j60.c
1
void initMAC(void)
2
{
3
  u16_t test;
4
  //spi_init();        // initialise the SPI    initSPI() in Datei init.c --> ruft spi_init() auf | wird schon in main.c aufgerufen
5
6
  ResetMac();          // erm. Resets the MAC.
7
  
8
  // setup memory by defining ERXST and ERXND
9
  BankSel(0);                       // select bank 0
10
  WriteCtrReg(ERXSTL,(u8_t)( RXSTART & 0x00ff));    
11
  WriteCtrReg(ERXSTH,(u8_t)((RXSTART & 0xff00)>> 8));
12
  WriteCtrReg(ERXNDL,(u8_t)( RXEND   & 0x00ff));
13
  WriteCtrReg(ERXNDH,(u8_t)((RXEND   & 0xff00)>>8));
14
15
  // Make sure Rx Read ptr is at the start of Rx segment
16
  WriteCtrReg(ERXRDPTL, (u8_t)( RXSTART & 0x00ff));
17
  WriteCtrReg(ERXRDPTH, (u8_t)((RXSTART & 0xff00)>> 8));
18
19
  BankSel(1);                             // select bank 1
20
  WriteCtrReg(ERXFCON,( ERXFCON_UCEN + ERXFCON_CRCEN + ERXFCON_BCEN));
21
22
23
  //Initialise the MAC registers
24
  BankSel(2);                             // select bank 2
25
  SetBitField(MACON1, MACON1_MARXEN);     // Enable reception of frames
26
  WriteCtrReg(MACLCON2, 63);
27
  WriteCtrReg(MACON3, MACON3_FRMLNEN +    // Type / len field will be checked
28
                      MACON3_TXCRCEN +    // MAC will append valid CRC
29
                      MACON3_PADCFG0);    // All small packets will be padded
30
                      
31
32
  SetBitField(MACON4, MACON4_DEFER);      
33
  WriteCtrReg(MAMXFLL, (u8_t)( MAXFRAMELEN & 0x00ff));     // set max frame len
34
  WriteCtrReg(MAMXFLH, (u8_t)((MAXFRAMELEN & 0xff00)>>8));
35
  WriteCtrReg(MABBIPG, 0x12);             // back to back interpacket gap. set as per data sheet
36
  WriteCtrReg(MAIPGL , 0x12);             // non back to back interpacket gap. set as per data sheet
37
  WriteCtrReg(MAIPGH , 0x0C);
38
39
40
  //Program our MAC address
41
  BankSel(3);              
42
  WriteCtrReg(MAADR1,bytMacAddress[0]);   
43
  WriteCtrReg(MAADR2,bytMacAddress[1]);  
44
  WriteCtrReg(MAADR3,bytMacAddress[2]);
45
  WriteCtrReg(MAADR4,bytMacAddress[3]);
46
  WriteCtrReg(MAADR5,bytMacAddress[4]);
47
  WriteCtrReg(MAADR6,bytMacAddress[5]);
48
49
  //Initialise the PHY registes
50
  WritePhyReg(PHCON1, 0x000);
51
  test =ReadPhyReg(PHCON1);
52
  WriteCtrReg(ECON1,  ECON1_RXEN);     //Enable the chip for reception of packets
53
 while(1){
54
  BSPI_WordSend(BSPI1,0xffff);
55
 }
56
}

von Stephan W. (sir_wedeck)


Lesenswert?

Hi,

musste gerade etwas schmunzeln:
1
   //BSPI0 einschalten
2
   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?

von Torti R. (squardy)


Lesenswert?

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
 int i;
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

von Stephan W. (sir_wedeck)


Lesenswert?

Hi,

>Woran könnte das denn liegen ?
das setzen bzw löschen des CS-Pins geschieht ja hier drüber:
alter code von oben! (LAN_CS_PIN)
1
// Diese Funktion setzt bzw. entfernt das CS-Signal 1 = setzen
2
void SEL_MAC(bool x){
3
4
   if (x==1){
5
      GPIO_BitWrite(GPIO1, LAN_CS, 0);    // GPIO_BitWrite(GPIO"PORT", Pin, Value);
6
      
7
   } else if (x==0){
8
      GPIO_BitWrite(GPIO1, LAN_CS, 1);    // CS low
9
   }
10
}

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

von Torti R. (squardy)


Lesenswert?

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.

von Torti R. (squardy)


Lesenswert?

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
void SEL_MAC(bool x){
2
3
   if (x==1){
4
      GPIO_BitWrite(GPIO1, LAN_CS, 0);    
5
      
6
   } else if (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.

von Stephan W. (sir_wedeck)


Lesenswert?

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

von Torti R. (squardy)


Lesenswert?

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...

von holger (Gast)


Lesenswert?

Nur so als Idee: Vieleicht mal an der Bitreihenfolge rumfummeln.
LSB First und MSB First versuchen.

von Stephan W. (sir_wedeck)


Lesenswert?

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

von Torti R. (squardy)


Lesenswert?

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:
1
/*******************************************************************************
2
* Function Name  : BSPI_ByteBufferSend
3
* Description    : Transmits 8 bit format data from a buffer.
4
* Input          : - BSPIx: selects BSPI peripheral to be used where
5
*                    x can be 0 or 1.
6
*                  - PtrToBuffer: is an 'u8' pointer to the first byte of the
7
*                    buffer to be transmitted.
8
*                  - NbOfWords: the number of words saved in the buffer 
9
*                    to be sent.
10
* Output         : None.
11
* Return         : None.
12
*******************************************************************************/
13
void BSPI_ByteBufferSend(BSPI_TypeDef *BSPIx, u8 *PtrToBuffer, u8 NbOfWords)
14
{
15
  vu8 SendWord = 0;
16
  
17
  while (SendWord < NbOfWords)
18
  {
19
    BSPI_WordSend(BSPIx, *(PtrToBuffer + SendWord));
20
    SendWord++;
21
  }
22
}


P.S Ich bin leider über das Wochenende nicht erreichbar. Komme erster am 
Dienstag wieder. Aber dann werde ich mich sofort wieder dran machen!

von Stephan W. (sir_wedeck)


Lesenswert?

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?

von squardy (Gast)


Lesenswert?

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!

von Stephan W. (sir_wedeck)


Lesenswert?

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

von squardy (Gast)


Lesenswert?

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
int i=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.

von Stephan W. (sir_wedeck)


Lesenswert?

Hi

>habe ich mir angeschaut.
und was gesehen? und warum das jetzt nicht mehr so ist?
Vielleicht_ _kann_ _einer_ _hier_ _aus_ _dem_ _Forum_ _sagen_ _warum 
das_ _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

von squardy (Gast)


Lesenswert?

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:
1
vu8 pBuffer[] = "H";
2
BSPI_ByteBufferSend (BSPI1, pBuffer, 1);

getestet, dann das "H" in Binär umgerechnet. Das passt auch.
http://www.home.hs-karlsruhe.de/~ruto0011/pics/H.JPG

von Stephan W. (sir_wedeck)


Lesenswert?

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

von squardy (Gast)


Lesenswert?

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.

von Stephan W. (sir_wedeck)


Lesenswert?

Hi squardy,
ich dachte es läuft schon längst!
Was außer Zeit fehlt dir denn noch?

Stephan

von squardy (Gast)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.