Unter Verwendung des STM32F103RBT6-Chips (speziell Olimex STM32-H103-Board), Keil u5. Kommunikation mit dem Magnetsensor AS5311
Das SPI-Peripheriegerät wird nur im Master-Modus für unidirektionalen Empfang eingerichtet. CPHA = 1 und CPOL = 1. Der Clock-Pin ist als Push-Pull-Wechselfunktion eingestellt. Initialisierung von SPI ist unten:
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES_RXONLY;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;
hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLED;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED;
hspi1.Init.CRCPolynomial = 10;
HAL_SPI_Init(&hspi1);
Ich gebe dann eine Schleife mit folgendem Code einfach auf einen konstanten Empfangsmodus
while (1)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
HAL_SPI_Receive(&hspi1, (uint8_t *)Rx_Buffer, 3, HAL_MAX_DELAY);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
HAL_Delay(1);
}
Ich habe die Polarität und Phase im Perihperhal Viewer überprüft und kann sehen, dass die Register sowohl für CPOL als auch für CPHA auf 1 gesetzt sind. Wenn ich jedoch einen Saleae-Logikanalysator verwende, kann ich sehen, dass die Uhr nach der Übertragung von Daten nicht hoch im Leerlauf ist.
In Bezug auf die Hardware ist die Uhr direkt ohne Pull-Up/Down-Widerstände verbunden.
Irgendwelche Ideen, warum die Uhr nicht hoch läuft?
Ich war auf ein ähnliches Problem gestoßen und nach Tagen der Recherche und Fehlerbehebung bemerkte ich einen Trend, dass jeder, der dieses Problem hatte, sein SPI nur als RX konfigurierte. Als ich mein SPI in den TX RX-Modus änderte, wurde das Problem auf magische Weise gelöst. Ich bin mir nicht sicher, was dies verursachen könnte, aber es scheint ein Fehler auf der Seite von ST zu sein, entweder als Teil der HAL-Bibliothek oder als Teil des Geräts selbst. So oder so, jetzt habe ich nur einen unbenutzten MOSI-Pin konfiguriert, aber das SCK-Leerlaufproblem wurde gelöst. Hoffe, das hilft jemandem etwas Zeit und Kopfschmerzen zu ersparen!
Pin geht nach N Taktimpulsen in den Floating-Zustand (hohe Impedanz, hi-Z). Das Problem wurde durch die Konfiguration des Clock-Pins auf internen Pull-up behoben.
Ich hatte das gleiche Problem. Meine Lösung bestand darin, direkt nach der Konfiguration der SPI-Schnittstelle ein Dummy-Byte (ohne CS) zu senden (zu übertragen).
Eugen Sch.
Pop24
Eugen Sch.
Pop24
Eugen Sch.
GPIOA, GPIO_PIN_1
?Pop24
Eugen Sch.
0___________
Arsenal
Pop24