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;
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 BIDIOE
Bit (1 = Ausgang, 0 = Eingang) auch in verwenden SPI_CR1
.
Um also Daten zu senden, setzen Sie BIDIOE
auf 1 und übertragen alle Daten mit Schreiben, SPI_DR
danach setzen Sie BIDIOE
auf 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.
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.
Chris Stratton