enc28j60 stm32f429

Gast #3749752
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?
Gast #3749932
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?
Gast #3749940
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
}
Gast #3749953
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.
Gast #3750365
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.
Gast #3750514
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren