STM32 3-Draht-SPI-MOSI mit hoher Impedanz

Ich habe einen Sensor mit einer 3-Draht-SSC-Schnittstelle, die SPI-kompatibel ist, aber nur eine bidirektionale Datenleitung hat. Jetzt versuche ich diesen Sensor ( https://www.infineon.com/dgdl/Infineon-Angle_Sensor_TLE5012B-UM-v01_02-en-UM-v01_02-EN.pdf?fileId=5546d46146d18cb40146ec2eeae4633b ) auszulesen und er schickt mir Daten zurück, Da MISO und MOSI jedoch kurzgeschlossen sind (wie vom Chiphersteller empfohlen), werden die Daten nach dem 470-Ohm-Datenleitungswiderstand blockiert, da MOSI nach dem Senden des Befehls hochohmig werden muss.

Wie kann ich also einen hochohmigen MOSI-Pin an einem STM32F410CBU6 erreichen? Ich könnte es als Eingang definieren, aber dann muss ich die SPI-Schnittstelle neu initialisieren. Gibt es eine einfachere Lösung mit weniger Overhead?

Edit: Ich habe jetzt versucht, den SPI im Halbduplex-Modus zu konfigurieren. Da ich CubeMX verwende, war die Konfiguration hierfür einfach, aber ich habe noch keinen Erfolg. Wenn sich der SPI im Halbduplex-Modus befindet, scheint der SCK einen kleinen Offset zu haben (vielleicht etwa 0,4 V), und die MOSI-Leitung hat auch ein seltsames Verhalten. Wenn ich in den Vollduplex-Modus schalte, ist dieses Verhalten weg. Was könnte das verursachen? Ich lese den Sensor, der uns gefällt:

HAL_GPIO_WritePin(SPI_CS_PORT, SPI_CS, LOW);
spi_pos->Instance->CR1 |= (1<<BIDIOE);
HAL_SPI_Transmit(spi_pos,&command,1,1);
spi_pos->Instance->CR1 &= ~(1<<BIDIOE);
asm("nop"); // Since sensor needs some ns to switch to sender mode
HAL_SPI_Receive(spi_pos,data,size,1);
HAL_GPIO_WritePin(SPI_CS_PORT, SPI_CS, HIGH);

Das SPI ist wie folgt konfiguriert:

  /* SPI2 parameter configuration*/
  hspi2.Instance = SPI2;
  hspi2.Init.Mode = SPI_MODE_MASTER;
  hspi2.Init.Direction = SPI_DIRECTION_2LINES;
  hspi2.Init.DataSize = SPI_DATASIZE_16BIT;
  hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi2.Init.CLKPhase = SPI_PHASE_2EDGE;
  hspi2.Init.NSS = SPI_NSS_SOFT;
  hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32;
  hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi2.Init.CRCPolynomial = 15;

MOSI Vollduplex:D_VOLL

SCK-Vollduplex:C_FULL

MOSI Halbduplex:D_HALB

SCK Halbduplex:S_HALB

Bearbeiten 2: Hier sind die Einstellungen in CubeMX:Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Ich glaube, dass Sie für die STM32 nicht MISO mit MOSI kurzschließen sollten, sondern die STM32-SPI-Engine in einem Modus betreiben sollten, der einen der Pins bidirektional verwendet. Bitte lesen Sie das Programmierhandbuch für Ihren spezifischen STM32.

Antworten (2)

Das SPI-Peripheriegerät des STM32F4 ist für eine bidirektionale Halbduplex-Übertragung über einen Draht konfigurierbar. In diesem Modus wird der MOSI-Pin als Master oder der MISO als Slave verwendet, es ist nicht erforderlich, die Pins auf der STM32-Seite kurzzuschließen, da nur einer verwendet wird.

Dazu müssen Sie das BIDIMODE(=1) Bit in verwenden SPI_CR1. Um die Datenrichtung einzustellen, müssen Sie das BIDIOEBit (1 = Ausgang, 0 = Eingang) auch in verwenden SPI_CR1.

Um also Daten zu senden, setzen Sie BIDIOEauf 1 und übertragen alle Daten mit Schreiben, SPI_DRdanach setzen Sie BIDIOEauf 0 zurück und empfangen Daten mit Dummy-Schreiben SPI_DR(um die Uhr zu generieren, die dem Slave mitteilt, dass er die Daten senden soll) und Lesen die empfangenen Daten von SPI_DR.

Ich habe diese Funktion noch nicht verwendet, und ich verwende die von ST bereitgestellten Peripheriebibliotheken nicht, daher kann ich ihre Fähigkeit zur Verwendung dieser Funktion nicht kommentieren.

Im Halbduplex-Modus funktioniert es immer noch nicht. Ich habe mir die in den HAL-Bibliotheken bereitgestellten Funktionen send () und receive () angesehen, und sie setzen das BIDIOE-Flag korrekt, wenn sie verwendet werden. Was könnte dieses halbschwebende Verhalten im Halbduplex-Modus verursachen? Ich habe bereits versucht, den MISO-Pin, der kurzgeschlossen, aber nicht für Halbduplex verwendet wird, als Eingang zu definieren oder ihn im Standardzustand zu belassen. Beide sollten dann High-Z sein und das Verhalten nicht beeinflussen, oder?
@HansPeterLoft Nun, wenn ein Pin auf High-Z geschaltet wird, schwebt die Leitung auf einen Wert, der durch Leckströme bestimmt wird, daher bin ich nicht überrascht, dieses Verhalten zu sehen. Es scheint, als ob Ihr Sensor nicht antwortet. Haben Sie überprüft, ob Sie den SPI auf den richtigen Modus eingestellt haben (die Daten werden vom Sensor an der fallenden Flanke des SCK abgetastet)? Auf den von Ihnen bereitgestellten Diagrammen kann ich das nicht erkennen.
Ich habe genau die gleichen Einstellungen wie beim Full-Duplex Modus mit Clock Polarity Low. Soll ich den unbenutzten MISO-Pin als Pulldown-Eingang konfigurieren, damit die Leitung nicht mehr erdfrei ist? Der Sensor antwortet nicht, da beim Start die Datenleitung high ist.
Was ich auch sehe ist, dass ich das Register irgendwie nicht mit dem Befehl "spi_pos->Instance->CR1 |= (1<<SPI_CR1_BIDIOE);" setzen kann. Die Umschaltung funktioniert nur in der Funktion send() und Receive() aus den HAL-Bibliotheken. Andernfalls könnte ich es als Ausgang lassen und so würde dies die Leitung herunterziehen.
@HansPeterLoft ah, ja, wenn der Sensor erwartet, dass ein niedriger Pegel korrekt funktioniert, ist es wahrscheinlich eine gute Idee, die Leitungen herunterzuziehen. Ich habe die Pins auch in Vollduplex-Konfiguration schwebend gesehen, daher würde ich mich nicht darauf verlassen, den Pin auf die Ausgabe mit dem SPI-Peripheriegerät einzustellen.

Sie könnten versuchen, einen Widerstand zwischen den MOSI- und den MISO-Pins auf dem uC (Mikrocontroller) zu verwenden. Verbinden Sie dann den MISO-Pin am uC mit dem bidirektionalen Daten-Pin am Sensor. Wenn alle Ausgänge vom Push-Pull-Typ sind, ohne Pull-up- oder Pull-down-Widerstände, funktioniert es möglicherweise gut mit Ihrem Arbeitscode.

Eine kurze Analyse: Wenn der Sensor einen Befehl lesen muss, ermöglicht der Widerstand dem uC, den Befehl zu senden und gleichzeitig zu lesen, was gesendet wurde; Wenn der Sensor Daten senden muss, schaltet er vom Eingang zum Ausgang und treibt die Leitung. Selbst wenn der MOSI-Pin auch die Leitung ansteuert, entweder einen HIGH- oder einen LOW-Pegel, führt dies nur zu einer Widerstandslast und ändert nicht den vom Sensor angesteuerten Pegel.

Der Widerstandswert muss so gewählt werden, dass der aufgenommene Strom sowohl unter den uC- als auch den Sensorgrenzen liegt.

Bitte lassen Sie mich wissen, ob Sie diesen Ansatz ausprobiert haben und es funktioniert hat.

Diagramm für SPI-Verbindung