2017-02-10 8 views
1

Ich habe versucht, etwas von meinem AVR Code zu portieren, um ein einfaches SPI LCD zu ARM als eine Lernübung zu fahren (ich bin sehr neu zu ARM im Allgemeinen). Dazu muss ich nur SPI im Master-Modus verwenden.STM32F1 - Verwendung von Master SPI auf Bare Metal

Ich sah in der datasheet für mein Gerät (STM32F103C8) und festgestellt, dass die SPI1 Pins, die ich brauche, SCK und MOSI sind als alternative Funktionen von PA5 und PA7 bzw. zusammen mit anderen Peripheriegeräten zugeordnet (S. 29). Mein Verständnis ist, dass, um die SPI-Funktion auf diesen Pins zu verwenden, ich sicherstellen muss, dass alles andere auf den gleichen Pin zugeordnet deaktiviert ist. Wenn man jedoch die Voreinstellungen für das periphere Taktsteuerregister betrachtet, sieht es so aus, als ob die anderen Merkmale bereits deaktiviert sind.

Ich schaute auf die SPI-Abschnitt in der reference manual, einschließlich Abschnitt 25.3.3 - Konfigurieren der SPI im Master-Modus. Zuerst habe ich die SP1-Master-Uhr in APB2ENR aktiviert und die Schritte in diesem Abschnitt befolgt, um SPI1 nach meinen Bedürfnissen zu konfigurieren. Ich habe auch die Einstellungen für PA5/7 geändert, um ihren Modus auf "Alternate Function Output Push-Pull" (9.1.4) zu setzen. Schließlich habe ich SPI1 aktiviert, indem ich CR1_SPE gesetzt habe.

Von meinem Lesen hatte ich gedacht, dass durch das Laden eines Wertes in das SPI1-Datenregister nach der Konfiguration von SPI wie oben, die Daten herausgeschoben werden würden. Nach dem Schreiben der Daten wird das TXE-Flag im SPI-Statusregister jedoch nie gesetzt, was darauf hinweist, dass die Daten, die ich in das SPI-Statusregister geschrieben habe, nur dort abgelegt wurden.

An dieser Stelle nehme ich an, dass es etwas anderes gibt, das ich nicht richtig konfigurieren konnte. Zum Beispiel bin ich mir nicht 100% sicher, was ich mit den PA5/7-Pins machen soll. Ich habe versucht, aus den Datenblättern zu verstehen, was ich kann, aber ich komme nirgendwohin. Gibt es noch etwas, das getan werden muss, bevor es funktioniert?

+0

Ich glaube nicht, dass die SPI versucht, die Daten zu übertragen, wenn die Pins falsch konfiguriert sind. Es würde nirgendwohin gehen, aber das Peripheriegerät würde es immer noch tun. Ich würde vorschlagen, dass das Peripheriegerät falsch konfiguriert ist. Hast du die Uhr auf dem SPI aktiviert? Hast du den SPI aktiviert? –

+0

posten Sie Ihren Code, sonst können wir nur raten ... –

Antwort

4

Ich bin fast sicher, dass Sie SSM und SSI Bits in SPIx->CR1 Register nicht festgelegt haben. SPI in diesen Chips ist ziemlich einfach, für die befragten Transfers müssen Sie SSM, SSI, SPE, MSTR, richtiges Format (LSBFIRST, CPOL, CPHA) und die richtige Baudrate (BR) in SPIx->CR1 und du gut seid setzen zu gehen.

+0

Sie haben recht, ich habe die SSM/SSI-Einstellungen nicht berührt, da ich dachte, sie würden den Master-Modus nicht beeinflussen. Ich werde meinen Beitrag mit Code aktualisieren, danke – Triforcer

+0

@Triforcer - diese Bit beeinflussen Master-Modus, wenn Sie nicht Hardware-CS-Pin verwenden. STM32 sollte den Multi-Master-Modus unterstützen, so dass sie KEINE Daten übertragen, wenn der CS im Master-Modus zu schwach ist. SSM und SSI dienen als "Software-Slave-Auswahl" und es gilt die gleiche Regel - wenn sie "0" sind, sehen Sie keine Übertragung. –

+0

Das Setzen der SSI/SSM-Bits löste mein Problem, danke. Die Mikrocontroller, die ich in der Vergangenheit verwendet habe, hatten keine Vorkehrungen für Multimaster, also war das Konzept mir fremd. Ich bin mir nicht sicher, warum Ihre Antwort abgelehnt wurde. Es scheint nicht konstruktiv für die Menschen, dies zu tun, ohne einen Grund zu geben. – Triforcer

Verwandte Themen