Forum: Mikrocontroller und Digitale Elektronik STM32 SPI-Bus Probleme mit Prescaler und delay() Realisierung


von Stephan v. (stephan_v)


Angehängte Dateien:

Lesenswert?

Hallo

Ich versuche mit dem STM32 eine Transeiver Chip anzusprechen, um eine
RFID-Karte abzufragen. Als verbindung zwischen beiden Geräten wird SPI
verwendet der mit 5Mhz getaktet werden sollte.

Nutze ich 8 als Prescaler sieht mein SPI Signal aus wie es aussehen
sollte:
Der Takt liegt nur an wenn ich Daten Sende/Empfange.
Chipselect wird vor der Übertragung auf Low und nach der Übertragung
wieder auf High gesetzt.

Nutze ich 16 als Prescaler liegt der Takt dauerhaft an und Chipselect
wird auch nicht mehr richtig geschaltet.

Mein zweites Problem ist das ich eine delay_ms(); Funktion brauche um
nötige Pausen in der Datenübertragung einzubauen.
Da es eine ensprechende Funktion nicht zu geben scheint muss ich diese
wohl selber realisierung und bin mir nicht sicher bin wie ich diese am
besten realisieren soll.

von (prx) A. K. (prx)


Lesenswert?

Stephan van den Boom schrieb im Beitrag #2226217:

> Da es eine ensprechende Funktion nicht zu geben scheint muss ich diese
> wohl selber realisierung und bin mir nicht sicher bin wie ich diese am
> besten realisieren soll.

Nicht empfehlenswert für Delays: Einfache abgezählte Schleifen, wie man 
das bei PIC oder AVR gern macht. Zu viel Variablen drin, bin hin zu 
Adresslage und Speicherart.

Ideal: Timer. Beispielsweise Systick. Ist die Wartezeit kleiner als 
dessen Periode, dann einfach so lange warten bis der Zielwert erreicht 
ist. Andernfalls den Systick-Interrupt verwenden.

Alternative: Beim Start des Programms die Laufzeit einer bestimmten 
Funktion mit nur einer Programmschleife drin per Systick einmessen und 
einen Multiplikator ausrechnen, der von nun an aus den Mikrosekunden die 
Anzahl Durchläufe berechnet. Aufpassen dass diese Funktion vom Compiler 
nicht inlined wird.

von Stephan v. (stephan_v)


Lesenswert?

Also ich habe bis jetzt nur mit PIC und AVR gearbeitet und ich muss 
zugeben das mir ist der Umgang mit Systick völlig schleierhaft ist.

von (prx) A. K. (prx)


Lesenswert?

Ist der einfachste aller Timer eines STM32. Der gehört nicht zur 
Peripherie von ST sondern zum Cortex-Core, ist folglich wie der 
Interrupt Controller beim Core dokumentiert, und arbeitet ungefähr so 
wie ein AVR-Timer im CTC-Modus. Gedacht als Quelle regelmässiger 
Interrupts (daher der Name), beispielsweise alle 1ms.

von Stephan v. (stephan_v)


Angehängte Dateien:

Lesenswert?

Ich hab mir ein bisschen was zusammen gebaut, ich bekomme aber beim 
Kompilieren Fehler.

von Matthias K. (matthiask)


Lesenswert?

Deine ganzen Includes am Anfang sind nicht konform, wenn Du die STM FW 
Lib benutzt. Sieh Dir erstmal paar Beispiele, sind innerhalb der LIB, 
an.

Aktuelle Version ist übrigens 3.5.0

Folgendes reicht normalerweise aus:

#include <stddef.h>
#include "stm32f10x.h"

Wenn nicht, hast Du irgedwelche Einstellungen der IDE nicht richtig 
gemacht.

Wo ist die SystemInit() und die Interruptfunktion für den Systick, meist 
heist die SysTick_Handler(void)?

von Stephan v. (stephan_v)


Lesenswert?

Mit den Includes hab ich mich am Template orientiert, und die unnötigen 
raus geworfen.
Die systemInit() ist oben in der main() und war vorher in der SPIInit().

Die Interruptfunktion für den Systick? Ich hab gerade echt keinen 
Durchblick ich hab noch nie mit Interrupts gearbeitet. Die Hilfe der LIB 
hat mir auch nicht wirklich weiter geholfen.

Ich werde mir morgen mal das SysTick Beispiel ansehen ich hoffe ich 
kapier es dann.

MFG Stephan

von Matthias K. (matthiask)


Lesenswert?

Welche IDE, welchen Debugger hast Du?

Deine Aufgabenstellung ist nicht gerade ein Einsteigerthema. Für den 
Umstieg auf ARM sollten schon paar Erfahrungen AVR oder ähnlich 
vorliegen. Interrupts sind das A und O, sollte man unbedingt können.

>Mit den Includes hab ich mich am Template orientiert, und die unnötigen
>raus geworfen.

Brauchst Du nicht machen, der Linker sollte so klug sein, alle nicht 
benötigten wegzulassen. Oder Du hast noch eine Uralt FW-Lib, da musste 
man das so machen.

von Stephan v. (stephan_v)


Angehängte Dateien:

Lesenswert?

Guten  Abend

Ich habe Heute wieder viel gebastelt und bin ein gutes Stück weiter.
Ich nutze KEIL uVision als IDE und einen Segger J-Link Adapter/Debugger.
Ich habe mir das auch alles etwas einfacher vorgestellt und auch 
eigentlich gedacht das mir jemand beim Einstieg helfen könnte, naja was 
Solls.

Die Library hab ich auf Version 3.5 umgestellt.

Der Controller ist momentan mit 24 Mhz getaktet da komm ich besser auf 
meinen SPI Clock von 6 Mhz (Hab nochmal geschaut was ich brauche).

Mit den Delays das klappt soweit auch allerdings müsste ich mit meinem 
Delay us genau arbeiten können.
Das maximum was ich bis jetzt hinbekommen habe ist:
SystemCoreClock /100000 das müssten 10us sein.
wenn ich mit dem Teiler weiter hoch gehe gibt es keine Ausgabe mehr auf 
dem SPI Bus.

Hat jemand da nen Tipp wie ich auf us komme?

MFG Stephan

von Matthias K. (matthiask)


Lesenswert?

Delay über die Befehlszyklen zu machen, wie vom AVR bekannt, klappt bei 
µC dieser Liga nicht. Die Zykluszeit ist bedingt durch die mehrstufige 
Pipeline nicht konstant vorhersagbar.

Mit einem Timer sollten 10us kein Problem sein.

von Stephan v. (stephan_v)


Lesenswert?

Ich mache das doch jetzt mit einem Timer (siehe 
http://www.mikrocontroller.net/attachment/highlight/112946)

10us schaffe ich auch ich möchte aber 1us genau verzögern können.

von Noob (Gast)


Lesenswert?

Dann nimm einen Extra-Timer dafür. Den läßt Du im Interrupt ein Flag 
setzten. Je nach Vorteiler kannst Du Dir dann auf den Takt genau eine 
Verzögerung basteln.

Grüße
Noob

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.