STM32 SPI-Bus Probleme mit Prescaler und delay() Realisierung

OP #2226230
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.
Angehängte Dateien:
#2226233
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.
#2226254
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.
#2226736
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)?
OP #2226921
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
#2227019
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.
OP #2228180
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
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren