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.
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.
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.
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
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.