Forum: Mikrocontroller und Digitale Elektronik SPI zwischen STM32 und ESP8266


von Peter M. (pbm)


Lesenswert?

Ich versuche gerade, eine Verbindung zwischen einem STM32 als SPI Master 
und einem ESP8266 als SPI Slave herzustellen.

Für den ESP verwende ich die Arduino SPISlave-Library, die leider 
vollkommen undokumentiert ist. Im Code habe ich die Größe der 
Datenwörter von 32 Bit auf 16 Bit reduziert, da der STM32 nur mit 16 Bit 
umgehen kann.

Mit dieser Änderung kann ich Daten senden, allerdings kommt beim ESP 
etwas völlig anderes an.

Auf der STM32-Seite gibt es die Parameter CPOL, CPHA, NSS Pulse und 
MSB/LSB, aber keine Kombination scheint zu funktionieren.

Weiß jemand, was die SPISlave-Library erwartet? Da ich mich weder mit 
Arduino noch mit dem ESP so richtig auskenne, verstehe ich den 
Library-Code auch nicht wirklich.

Eigentlich würde ich auch lieber das Hardware-SPI über das Espressif SDK 
verwenden, aber in der Beschreibung habe ich keine HSPI-Funktionen 
gefunden.

von Stefan F. (Gast)


Lesenswert?

Hast du dir den Beispiel-Code angesehen?
https://github.com/esp8266/Arduino/tree/master/libraries/SPISlave/examples

Zu deinem Problem schreibt jemand "Unfortunately the 
"Examples->SPISlave->SPISlave_Test" did not work for me. The Slave could 
read the master but its reply seems corrupted. Luckily I found a working 
version in the ESP8266 Community Forum"

https://cmheong.blogspot.com/2018/03/spi-master-slave-programs-with-esp8266.html

Vielleicht kann der Typ Dir helfen.

von Peter M. (pbm)


Lesenswert?

Stefanus F. schrieb:
> Hast du dir den Beispiel-Code angesehen?

Ja, habe ich, aber der hilft nur beschränkt, da ich ja die HAL-Funktion 
des STM32 verwende.

> Vielleicht kann der Typ Dir helfen.

So wie ich das verstehe, war bei ihm nur ein Zeichen korrupt. Bei mir 
sind aber alle Zeichen betroffen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Peter M. schrieb:
> kann ich Daten senden, allerdings kommt beim ESP etwas völlig anderes
> an.
Und was ist tatsächlich auf dem Bus los? Hast du das, was da überhaupt 
übertragen wird, mal mit einem Speicheroszi oder Logikanalyzer 
kontrolliert?
Eine serielle Schnitte ohne solche Messgeräte in Betrieb zu nehmen ist 
wie "Autofahren nach Gehör".

: Bearbeitet durch Moderator
von Peter M. (pbm)


Lesenswert?

Lothar M. schrieb:
> Und was ist tatsächlich auf dem Bus los?

Guter Punkt, und sehr überraschend. Wie man sieht, passiert auf CLK rein 
gar nichts, was mich dann doch am Master zweifeln läßt.

Hier dessen Initialisierung:
1
  hspi4.Instance = SPI4;
2
  hspi4.Init.Mode = SPI_MODE_MASTER;
3
  hspi4.Init.Direction = SPI_DIRECTION_2LINES;
4
  hspi4.Init.DataSize = SPI_DATASIZE_8BIT;
5
  hspi4.Init.CLKPolarity = SPI_POLARITY_LOW;
6
  hspi4.Init.CLKPhase = SPI_PHASE_1EDGE;
7
  hspi4.Init.NSS = SPI_NSS_SOFT;
8
  hspi4.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
9
  hspi4.Init.FirstBit = SPI_FIRSTBIT_MSB;
10
  hspi4.Init.TIMode = SPI_TIMODE_DISABLE;
11
  hspi4.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
12
  hspi4.Init.CRCPolynomial = 7;
13
  hspi4.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
14
  hspi4.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
15
  if (HAL_SPI_Init(&hspi4) != HAL_OK)
16
  {
17
    Error_Handler();
18
  }
19
20
  // ...
21
22
  GPIO_InitTypeDef GPIO_InitStruct = {0};
23
  if(spiHandle->Instance==SPI4)
24
  {
25
    /* SPI4 clock enable */
26
    __HAL_RCC_SPI4_CLK_ENABLE();
27
  
28
    __HAL_RCC_GPIOE_CLK_ENABLE();
29
    /**SPI4 GPIO Configuration    
30
    PE2     ------> SPI4_SCK
31
    PE5     ------> SPI4_MISO
32
    PE6     ------> SPI4_MOSI 
33
    */
34
    GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_5|GPIO_PIN_6;
35
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
36
    GPIO_InitStruct.Pull = GPIO_NOPULL;
37
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
38
    GPIO_InitStruct.Alternate = GPIO_AF5_SPI4;
39
    HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
40
  }

Und dann ist der Aufruf einfach
1
  NSS_LO;
2
  rc = HAL_SPI_TransmitReceive(&hspi4, txbuf, rxbuf, SIZE, TIMEOUT);
3
  NSS_HI;

Wieso wird kein Takt erzeugt? Wartet der Master auf irgendein Signal vom 
Slave?

von Peter M. (pbm)


Angehängte Dateien:

Lesenswert?

Hier der Mitschnitt vom Logik Analyzer.

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.