Ich möchte ein SPI-Slave-Gerät auslesen. So habe ich mir den Ablauf vorgestellt:
CS_LOW
CS_HIGH
Dies funktioniert jedoch nicht. Damit es funktioniert, muss ich Folgendes befolgen:
CS_LOW
CS_HIGH
Warum muss ich die Daten auf der MISO-Leitung lesen, auch wenn ich weiß, dass nichts wünschenswert ist?
PS: Die SPI-Funktionen Read() und Write() sind nur meine eigenen Implementierungen, nichts Besonderes für eine einzelne MCU.
Bearbeiten: Wie gewünscht, liefere ich einige Details zu den MCUs.
Ich verwende zwei MCUs - STM32F303VCT und TI TIVA123GH6PM . Beide MCUs verlangen, dass ich das genannte Verfahren befolge.
Hier ist meine Implementierung der SPI-Sende- und Empfangsfunktion auf STM32
uint8_t SPI_rdwr(uint8_t data)
{
*(__IO uint8_t *)&SPI1->DR = data; //send data
while(!(SPI1->SR & SPI_SR_TXE)); // wait till TX buffer is empty
while(SPI1->SR & SPI_SR_BSY); // wait if SPI line is busy
while(!(SPI1->SR & SPI_SR_RXNE)); //wait till RX buffe is NOT empty
return *(__IO uint8_t *)&SPI1->DR; //return data if data received on MISO line
}
Warum muss ich beim 4-Draht-SPI-Lesevorgang bei jedem Sendevorgang die MISO-Leitung lesen?
Weil:
Aus Leistungsgründen haben die HAL-Implementierer SPI_Write ohne die eingebaute Schleife "Warten auf leeres Senderegister" geschrieben, SPI_Read
haben aber eine solche Schleife. In diesem Fall würde das Ausgeben von Schreibvorgängen ohne Lesevorgänge den Puffer überlaufen lassen. Ihre Implementierung verschwendet auch Zeit in dieser Schleife - sobald Sie lesen können, können Sie auch schreiben; oder
Die von Ihnen verwendete Hardware-Abstraktionsbibliothek (HAL) konfiguriert das Silizium so, dass es so funktioniert, wenn das Silizium dies nicht erfordert.
und vielleicht konfigurieren Sie die HAL nicht so, wie Sie es möchten, falls die HAL dies unterstützt (und notwendigerweise auch das Silizium); oder
Vielleicht konfigurieren Sie das Silizium nicht, um das "Richtige" zu tun, wenn das Silizium dies zulässt. oder
Das Silizium ist so konzipiert, dass es so funktioniert und nicht anders.
Ich erinnere mich nicht an die Details der SPI-Implementierung auf den von Ihnen verwendeten Chips, aber:
Bei einigen SPI-Implementierungen kann der Empfänger abgeschaltet werden, sodass Lesevorgänge nicht erforderlich sind, da diese Funktion deaktiviert wird.
SPI kann wahrscheinlich mit DMA verwendet werden, sodass Sie sich nicht zu sehr um den Overhead kümmern, der durch das Lesen entsteht.
Selbst wenn Sie es in Software tun, können die Lesevorgänge billig sein. Die Verwendung der HAL würde wahrscheinlich auch dabei helfen, obwohl Sie den Code in einer optimierten Versionskonfiguration kompilieren und die Assembly prüfen, um zu bestätigen, dass sie nichts Unnötiges tut. Sogar Ihr handgeschriebener Code macht unnötige Dinge.
Annie
Nur ich
user_1818839
Nur ich
Benutzer253751
Ruffy
Ruffy
Benutzer253751
Nur ich
Ruffy
Nur ich
Kuba hat Monica nicht vergessen