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.
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();
}
Chris Stratton
brhans
Laut88