Forum: Mikrocontroller und Digitale Elektronik enc28j60 stm32f429


von Grundschüler (Gast)


Lesenswert?

Problem auf dem Weg ins Netz: Spi-Lesen und Schreiben funktioniert. Beim 
Schreiben der Mac-Adresse kommt es zur Verschiebung um ein Register. 
Korrektur mit
1
  // our mac address
2
  ENC_REG_MAADR5+1, MYMAC_6,
3
  ENC_REG_MAADR4+1, MYMAC_5,
4
  ENC_REG_MAADR3+1, MYMAC_4,
5
  ENC_REG_MAADR2+1, MYMAC_3,
6
  ENC_REG_MAADR1+1, MYMAC_2,
7
  ENC_REG_MAADR0+1, MYMAC_1,
funktioniert dann wieder. Alle anderen Register werden anscheinend 
richtig geschrieben. Woran kann das liegen?

von holger (Gast)


Lesenswert?

>Woran kann das liegen?

An deinem Programm. An was denn sonst?

von Grundschüler (Gast)


Lesenswert?

holger schrieb:
> An deinem Programm.

das ist der Lowlevel-Teil der U.Radig software. Die Umsetzung auf arm 
ist in Ordnung, denn die Register werden richtig gelesen und  - bis auf 
die MACADR-Register - richtig geschrieben.

Gerade bei MAADR1 (=>Register 0) ist ein Fehler im Code nicht plausibel. 
Wieso wird Register0 beschrieben, wenn ich Register1 sende?

von holger (Gast)


Lesenswert?

>> An deinem Programm.

>das ist der Lowlevel-Teil der U.Radig software. Die Umsetzung auf arm
>ist in Ordnung, denn die Register werden richtig gelesen und  - bis auf
>die MACADR-Register - richtig geschrieben.

Hatte ich auch schon mal portiert. Da wurden alle Register
richtig beschrieben. Ohne dein +1.

>Gerade bei MAADR1 (=>Register 0) ist ein Fehler im Code nicht plausibel.

Hältst du das Timing vom ENC28J60 ein?
Hier mal ein kleiner Codeteil von mir.

static inline void enc_deselect(void)
{
  ns250delay(1); //für die MAC und MII register min 210ns hold
  ENC28J60_CS_GPIO->BSRRL = ENC28J60_CS_PIN;  // set cs high
}

von holger (Gast)


Lesenswert?

Oder es ist einfach nur das hier:

If the address specifies one of the MAC or MII registers,
a dummy byte will first be shifted out on the SO pin.
After the dummy byte, the data will be shifted out MSb
first on the SO pin. The RCR operation is terminated by
raising the CS pin. Figure 4-4 shows the read
sequence for MAC and MII registers.

von Grundschüler (Gast)


Lesenswert?

holger schrieb:
> Oder es ist einfach nur das hier:

Danke für diesen konstruktiven Hinweis. Das passt wie Faust auf Auge. 
Das dummy-byte wird in der Radig-Software natürlich berücksichtigt. 
Wahrscheinlich liegt hier aber der Fehler in der Umsetzung. Werde ich 
überprüfen.

von Grundschüler (Gast)


Lesenswert?

problem war, dass die spi-Schreibsequenz avr nicht mit arm 
übereinstimmt:
1
static uint8_t enc_read_reg( uint8_t reg )
2
{
3
  uint8_t value;
4
  uint8_t addr = reg & ENC_REG_ADDR_MASK;
5
6
  if( addr < 0x1A ) {
7
    uint8_t bank = (reg & ENC_REG_BANK_MASK) >> ENC_REG_BANK_SHIFT;
8
    if( bank != enc_cur_bank ) {
9
      // need to switch bank first
10
      enc_clrbits_reg( ENC_REG_ECON1, 0x03 << ENC_BIT_BSEL0 );
11
      if( bank ) {
12
        enc_setbits_reg( ENC_REG_ECON1, bank << ENC_BIT_BSEL0 );
13
      }
14
      enc_cur_bank = bank;
15
    }
16
  }
17
18
  enc_select();
19
  spi_put( ENC_SPI_OP_RCR | addr );
20
//  spi_put( 0x00 );//kk anpassung auf arm
21
  if( reg & ENC_REG_WAIT_MASK ) spi_put( 0x00 );
22
  value = spi_get();
23
  enc_deselect();
24
25
  return value;
26
}
27
28
29
uint16_t txSPI(SPI_TypeDef* SPIx,uint16_t wert){
30
  uint16_t ret_wert=0;
31
  // warte bis senden fertig
32
  while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET);
33
  // byte senden
34
  SPI_I2S_SendData(SPIx, wert);
35
  // warte bis empfang fertig
36
  while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESET);
37
  // Daten einlesen
38
  ret_wert=SPI_I2S_ReceiveData(SPIx);
39
  return(ret_wert);
40
}
41
42
43
Der Umfang der stm-spi-Sendefunktion ist nicht wirklich befriedigend.

von Grundschüler (Gast)


Angehängte Dateien:

Lesenswert?

Der U-Radig-Stack funktioniert jetzt mit dem enc28j60 und dem stm32f429 
- bislang nur icmp getestet.

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.