Forum: Mikrocontroller und Digitale Elektronik STM32 SPI Half-Duplex Problem


von Bert S. (kautschuck)


Angehängte Dateien:

Lesenswert?

Hi,

Ich versuche einen Sensor mit dem SPI im Half-Duplex Mode auszulesen, 
jedoch ist das Verhalten nicht wie erwünscht. Wenn ich im Full-Duplex 
bin, MISO und MOSI kurzgeschlossen, dann sendet er mir richtig, jedoch 
kann er natürlich nicht empfangen, aber ich kann das empfangene mit dem 
Oszi hinter dem seriellen Widerstand auf der Leitung (470Ohm) messen. Im 
Half-Duplex Mode (initialisiert mit CubeMX) scheint das ganze aber nicht 
mehr zu funktionieren, es ist fast so, als würde irgendwas die Leitungen 
extrem Hochohmig machen. Der uC ist ein STM32F410. Jemand eine Idee, was 
da los ist? Der ungebrauchte MISO Pin im Half-Duplex wird übrigens als 
Default belassen, aber auch eine Konfiguration als Input hat leider 
nichts gebracht.

Kommunikation:
1
  HAL_GPIO_WritePin(SPI_CS_PORT, SPI_CS, LOW);
2
  spi_pos->Instance->CR1 |= (1<<SPI_CR1_BIDIOE);
3
  HAL_SPI_Transmit(spi_pos,&command,1,10);
4
  spi_pos->Instance->CR1 &= ~(1<<SPI_CR1_BIDIOE);
5
  asm("nop");
6
  HAL_SPI_Receive(spi_pos,data,size,10);
7
  HAL_GPIO_WritePin(SPI_CS_PORT, SPI_CS, HIGH);

SPI initialisierung:
1
  /* SPI2 parameter configuration*/
2
  hspi2.Instance = SPI2;
3
  hspi2.Init.Mode = SPI_MODE_MASTER;
4
  hspi2.Init.Direction = SPI_DIRECTION_1LINE;
5
  hspi2.Init.DataSize = SPI_DATASIZE_16BIT;
6
  hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;
7
  hspi2.Init.CLKPhase = SPI_PHASE_2EDGE;
8
  hspi2.Init.NSS = SPI_NSS_SOFT;
9
  hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32;
10
  hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
11
  hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
12
  hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
13
  hspi2.Init.CRCPolynomial = 15;

: Bearbeitet durch User
von Lutz (Gast)


Lesenswert?

Ohne die Gegenstelle (Sensor) zu kennen wird es schwierig.

von Jim M. (turboj)


Lesenswert?

Bert S. schrieb:
> es ist fast so, als würde irgendwas die Leitungen
> extrem Hochohmig machen.

Hattest Du etwas anderes erwartet? Im Halbduplex Mode treibt der STM 
seine Datenleitung nur genau dann wenn er auch was sendet, sonst nicht.


Einzig die Clock sieht merkwürdig aus, als würde die GPIO 
Initialisierung nicht so ganz stimmen. Aus Versehen auf Eingang 
gestellt? Selbst dann müsste es eigentlich ausreichen die Pulldowns in 
der GOIO Config einzuschalten, da Dein SCK Idle Pegel ja offensichtlich 
"Low" ist.

von Bert S. (kautschuck)


Lesenswert?

Ok, ich habe es hinbekommen, ich musste BIDIOE mit SPI_1LINE_TX(&spi) 
und SPI_1LINE_RX(&spi) setzten, irgendwie hat das mit der 
Registermanipulation nicht geklappt.

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.