enc28j60 stm32f429

Gast #3749752
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
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
>> 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
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
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
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

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.