Forum: Mikrocontroller und Digitale Elektronik stm32f429 enc28j60 spi


von Grundschüler (Gast)


Lesenswert?

das Schreiben und Lesen der Enc-Register funktioniert jetzt zuverlässig, 
d.h. die Übertragung einzelner Bytes mit dem Stm-lib-spi-code 
funktioniert.

Mein Stack-code funktioniert nicht. manchmal werden einzelne frames vom 
uc richtig empfangen und gesendet. Aber nicht mehrere frames 
hintereinander.

Ich vermute den Fehler beim verwendeten STM-spi-code / Behandlung des 
Fifo beim Senden mehrerer Bytes:
1
uint8_t txSPI(SPI_TypeDef* SPIx,uint8_t wert){
2
  uint16_t ret_wert=0;
3
  // warte bis senden fertig
4
  while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET);
5
  // byte senden
6
  SPI_I2S_SendData(SPIx, wert);
7
  // warte bis empfang fertig
8
  while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESET);
9
  // Daten einlesen
10
  ret_wert=SPI_I2S_ReceiveData(SPIx);
11
  return(ret_wert);
12
}
13
14
static void enc_write_buf( uint8_t *buf, uint16_t len )
15
{
16
  enc_select();
17
  spi_put( ENC_SPI_OP_WBM );
18
  for(; len > 0; len--, buf++ ) {
19
    spi_put( *buf );
20
  }
21
  enc_deselect();
22
}
23
static void enc_read_buf( uint8_t *buf, uint16_t len )
24
{
25
  enc_select();
26
  spi_put( ENC_SPI_OP_RBM );
27
  for(; len > 0; len--, buf++ ) {
28
//    spi_put( 0x00 );//kk anpassung an arm
29
    *buf = spi_get();
30
  }
31
  enc_deselect();
32
}

spi_put, get verweist auf txSPI. Für mich ist der Stm-lib-code 
hinsichtlich der behandlung des fifo nicht wirklich nachvollziehbar.

Hat jemand brauchbaren Code für die Übertragung mehrerer Bytes oder kann 
mit einer Erklärung weiterhelfen?

von Grundschüler (Gast)


Lesenswert?

mit
1
static void enc_read_buf( uint8_t *buf, uint16_t len )
2
{u32 ret_wert;
3
enc_select();
4
// warte bis senden fertig
5
while (SPI_I2S_GetFlagStatus(spiENC, SPI_I2S_FLAG_TXE) == RESET);
6
SPI_I2S_SendData(spiENC, ENC_SPI_OP_RBM);
7
while (SPI_I2S_GetFlagStatus(spiENC, SPI_I2S_FLAG_TXE) == RESET);
8
9
for(; len > 0; len--, buf++ ) {
10
  SPI_I2S_SendData(spiENC, 0);
11
  // warte bis empfang fertig
12
  while (SPI_I2S_GetFlagStatus(spiENC, SPI_I2S_FLAG_RXNE) == RESET);
13
  // Daten einlesen
14
  *buf=SPI_I2S_ReceiveData(spiENC);
15
 }
16
  enc_deselect();
17
}
18
19
static void enc_write_buf( uint8_t *buf, uint16_t len )
20
{u32 ret_wert;
21
  enc_select();
22
    // warte bis senden fertig
23
24
  while (SPI_I2S_GetFlagStatus(spiENC, SPI_I2S_FLAG_TXE) == RESET);
25
  SPI_I2S_SendData(spiENC, ENC_SPI_OP_WBM);
26
27
  for(; len > 0; len--, buf++ ) {
28
    while (SPI_I2S_GetFlagStatus(spiENC, SPI_I2S_FLAG_TXE) == RESET);
29
    SPI_I2S_SendData(spiENC, *buf);
30
  }
31
32
    // warte bis empfang fertig
33
    while (SPI_I2S_GetFlagStatus(spiENC, SPI_I2S_FLAG_RXNE) == RESET);
34
    // Daten einlesen
35
    ret_wert=SPI_I2S_ReceiveData(spiENC);
36
  enc_deselect();
37
38
}

geht gar nichts. Warum?

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.