Warum sendet stm32 ungültige Daten per Spi?

Zwei Boards: arduino nano und stmvldiscovery. Die Boards sind über die Spi-Schnittstelle verbunden. Arduino ist Master-Gerät. Stm32vldiscovery ist ein Slave-Gerät. Im txBuf (Sendepuffer) haben beide Karten die gleichen Daten - uint8_t-Array (1, 2, 3, 4, 5, 6, 7, 8, 9, 10).

Beide Boards senden die gleichen Daten. Der Logikanalysator hat falsche Daten von stm32vldiscovery erfasst. Ich weiß nicht warum...

Beide Boards haben Spi-Einstellungen: Arduino: msbfirst, freq = 1 MHz, spi_mode_0, 8-Bit-Daten; stm32: msbfirst, cpol = 0, cpha = 0, Motorola-Frame-Format, gleiche Frequenz;

Ich habe versucht, die Hardware-/Software-NSS-Steuerung für stm32 festzulegen. Es hat das gleiche Ergebnis. Dasselbe Ergebnis hatte ich mit zwei Boards - stm32f4-discovery und stm32vldiscovery. stm32vldiscovery war das gleiche Slave-Gerät.

Warum? Was ist falsch?

Gelb ist Arduino. Grün ist stm32.Geben Sie hier die Bildbeschreibung ein

stm32-Code:

#include "main.h"
SPI_HandleTypeDef hspi1;

uint8_t txBuff[10];
uint8_t rxBuff[10];

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_SPI1_Init(void);

int main(void)
{

  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_SPI1_Init();

  for(int i = 0; i < 10; i++)
  {
    txBuff[i] = i+1;
    rxBuff[i] = 0;
  }

  while (1)
  {
    HAL_SPI_TransmitRecieve(&hspi1, txBuff, rxBuff, 10, 10000);
  }

}
...
static void MX_SPI1_Init(void)
{
  hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_SLAVE;
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial = 10;
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
  {
    Error_Handler();
  }
}

Arduino-Code:

#include <SPI.h>


void setup()
{
    SPI.begin();
}

void loop()
{
    delay(5000);
    SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
    byte arr[10];
    for (int i = 0; i < 10; i++)
        arr[i] = i + 1;

    digitalWrite(SS, LOW);

    for (int i = 0; i < 10; i++)
        SPI.transfer(arr[i]);

    digitalWrite(SS, HIGH);
    SPI.endTransaction();
}
Wie bei jeder Debugging-Frage müssen Sie ausreichend Code einfügen, um das Problem zu demonstrieren.
Sieht so aus, als hätten Sie Ihren STM32 für einen anderen SPI-Modus als den Arduino konfiguriert.
brhan, vielleicht, aber warum haben zwei stm32 mit der gleichen Konfiguration die gleichen Probleme?

Antworten (1)

Heute habe ich das stm32vldiscovery-Board durch stm32f4-discovery ersetzt und es funktioniert gut! Ich denke, das Problem lag im stm32vldiscovery-Board. Das Stm32vldiscovery-Board funktioniert in diesem Modus schlecht. Ich kann keine anderen Gründe finden.Geben Sie hier die Bildbeschreibung ein