Forum: Mikrocontroller und Digitale Elektronik STM32 mit AVR/FAT32 Bibliothek


von Nils H. (nilsho)


Angehängte Dateien:

Lesenswert?

Hallo,

Ich möchte mit meinem STM32f103 gerne auf eine Micro SD Karte schreiben, 
die in Fat32 formatiert wurde. Dabei habe ich mich nun für die AVR Fat32 
Bibliothek entschieden (siehe Anhang oder Link).

https://www.mikrocontroller.net/articles/AVR_FAT32

Allerdings benutze ich nicht die main.c aus dem Ordner der Bibliothek, 
sondern das Beispielprogramm, dass auf der Website etwas weiter unten 
steht. (natürlich auch im Anhang befindlich)

Dafür habe ich zunächst in der "mmc_config.h" anstelle der avr/io.h, die 
stm32f1xx.h eingebunden, wie es ja auch direkt angeboten wird, falls man 
mit dem STM32 arbeiten möchte. Außerdem habe ich in der mmc.c/h den 
Hardware abhängigen Teil an meinen STM32 angepasst, genauso wie in der 
uart.c/h.

Es kompiliert auch alles Problemlos und die UART Schnittstelle läuft 
fehlerfrei. Leider hängt er sich immer auf, beim  Versuch die SD-Karte 
zu initialsieren und kommt nicht mehr weiter.

Habe ich irgendwas bei der SPI Schnittstelle vergessen oder falsch 
initialisiert? Oder muss ich generell noch mehr verändern, damit die 
Bibliothek funktioniert?

Hier mal noch mein Hardwareabhängiger Teil zur SPI Schnittstelle aus der 
mmc.c:
1
// beginn -> hardware abhaengiger teil !
2
#define MMC_CS_LOW     GPIOA->ODR &= ~(1<<4)    // Setzt SS auf 0
3
#define MMC_CS_HIGH    GPIOA->ODR |= (1<<4)    // Setzt SS auf 1
4
5
static void       spi_init(void);
6
static void       spi_maxSpeed(void);
7
static void       spi_write_byte(uint8_t byte);
8
static uint8_t       spi_read_byte(void);
9
10
// *****************************************************************************
11
static void spi_init(void){
12
  GPIOA->CRL = 0xB8B44444;  //MOSI(PA7) und SCK(PA5) auf alt. func. out, MISO(PA6) auf input
13
  SPI1->CR1 = 0x0374;      //SSI und SSM, SPE, BR = /128, Master Mode
14
  GPIOA->ODR |= (1<<4);       // Chip Select auf High -> Slave nicht angewählt
15
}
16
17
18
#if (MMC_MAX_SPEED==TRUE)
19
// *****************************************************************************
20
static void spi_maxSpeed(){
21
  SPI1->CR1 &= ~((1 << 3) | (1 << 4) | (1 << 5));  //Löscht alle Bits, die die Baudrate teilen -> /2
22
}
23
#endif
24
// *****************************************************************************
25
static void spi_write_byte(uint8_t byte){
26
    SPI1->DR = byte;          //Schreibt Byte in Datenregister
27
    while((SPI1->SR & (1 << 1))==0){}  //Wartet bis TxE gesetzt wird und dadurch alle Daten übertragen wurden
28
}
29
// *****************************************************************************
30
static uint8_t spi_read_byte(void){
31
    SPI1->DR = 0xFF;          //Sendet nur Einsen
32
    while((SPI1->SR & (1 << 0))==0){}  //Wartet bis RxNE gesetzt wird, also Daten empfangen wurden
33
    return (SPI1->DR);          //Gibt die Daten zurück
34
}
35
// ende <- hardware abhaengiger teil !

von Pieter (Gast)


Lesenswert?

moin,

>>Löscht alle Bits, die die Baudrate teilen -> /2
Bis die SD-Card erkannt wurde, muss die Baudrate < 400kHz sein.
Ist das bedacht?

VG
Peter

von Robert Goldner (Gast)


Lesenswert?

Servus,

ohne jetzt tiefer einsteigen zu wollen, aber warum verwendest Du die 
AVR-Implementierung für die SD-Card bzw. FAT32 für den STM32?
Wenn man mal Tante Google nach STM32 SDCARD FAT32 frägt, dann kommt 
ziemlich viel.
Aus dem Bauch heraus fände ich das einen besseren Start.

Viel Erfolg trotzdem

Robert

von Stefan F. (Gast)


Lesenswert?

Pieter schrieb:
> Bis die SD-Card erkannt wurde, muss die Baudrate < 400kHz sein.
> Ist das bedacht?

spi_init() muss erstmal langsam starten. spi_maxSpeed() wird aufgerufen, 
nachdem die Karte initialisiert wurde.

von Nils H. (nilsho)


Lesenswert?

Ich kann verstehen, dass das sehr komisch wirkt, aber der Hintergrund 
ist der, dass die gleiche Bibliothek auch auf dem Atmega 2560 laufen 
soll. Ich brauchte also eine Bibliothekt die sowohl auf dem STM32, als 
auch auf dem Atmega2560 läuft.

von dummschwaetzer (Gast)


Lesenswert?

el chams fatfs geht doch auf beiden

von Jens G. (jensg)


Lesenswert?

Vielleicht ist das ein guter Start.
http://elm-chan.org/fsw/ff/00index_e.html

von Nils H. (nilsho)


Lesenswert?

Hat denn jemand schon mal mit dem STM32 und FatFS richtig gearbeitet? 
Ich finde leider kein funktionsfähiges Beispiel für meinen STM32f103

von Mike R. (thesealion)


Lesenswert?

@Nils: wie wäre es einfach mit http://elm-chan.org/fsw/ff/ffsample.zip
das STM32F100 Beispiel sollte sich einfach auf den 103er portieren 
lassen.

von Stefan F. (Gast)


Lesenswert?

Nils H. schrieb:
> Auf dem ATmega2560
> läuft das ganze auch ohne Probleme, aber auf dem STM32 läuft leider nur
> das initialisieren der Karte, aber am Ende erscheint weder Datei, noch
> Text. Ich vermute stark, dass "ffopen" fehlschlägt und es dadurch zu
> Problemen kommt.

Du solltest mal den Debugger benutzen, anstatt zu vermuten. Der Debugger 
zeigt dir, wo das Programm hängt (wenn du auf Pause drückst) und dann 
kannst du den Inhalt sämtlicher Variablen und Register kontrollieren.

von Guido L. (guidol1970)


Lesenswert?

Falls es mit der von Dir ausgesuchten Bibliothek nicht klappt schau Dir 
evtl.
mal die SDFat von https://github.com/greiman/SdFat
an.

Gibt es auch als Fork von AdFruit:
https://github.com/adafruit/SdFat

Zitat der Webseite:
======================================================================== 
======
SdFat Version 2 supports FAT16/FAT32 and exFAT SD cards. It is mostly 
backward compatible with SdFat Version 1 for FAT16/FAT32 cards.

exFAT supports files larger than 4GB so files sizes and positions are 
type uint64_t for classes that support exFAT.

exFAT has many features not available in FAT16/FAT32. exFAT has 
excellent support for contiguous files on flash devices and supports 
preallocation.
======================================================================== 
======

Die wird bis jetzt erfolgreich im CP/M-Emulator RunCPM
( https://github.com/MockbaTheBorg/RunCPM )
genutzt mit STM32 und Arduino (Due).

: Bearbeitet durch User
von HALunke (Gast)


Lesenswert?

>http://elm-chan.org/fsw/ff/00index_e.html
Also bei STM32CubeMX ist doch genau diese FAT Library dabei.

/*---------------------------------------------------------------------- 
------/
/  FatFs - Generic FAT file system module  R0.12c 
/
/----------------------------------------------------------------------- 
------/
/
/ Copyright (C) 2017, ChaN, all right reserved.



Häkchen setzten und es geht.
Warum das Rad neu erfinden, wenn es doch die HAL gibt :)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Nils H. schrieb:
> Hat denn jemand schon mal mit dem STM32 und FatFS richtig gearbeitet?

Nicht STM32, aber SAM4E und SAME70. Auf beiden mit Elm Chan FatFS, die 
in diesem Falle allerdingns von Atmel bereits mit einer 
Hardwareanpassung auf deren MMC versehen worden sind. Das wird 
kommerziell genutzt, auch mit größeren Datenmengen (Logging).

Soll heißen: Chans FatFS an sich bereitet dir keine Probleme, du musst 
also nur den "glue layer" zur Hardware in den Griff bekommen.

Kann mir aber nicht vorstellen, dass es dafür nichts im Netz geben 
sollte.

von K. H. (hegy)


Lesenswert?

Nils H. schrieb:
> Hat denn jemand schon mal mit dem STM32 und FatFS richtig gearbeitet?
> Ich finde leider kein funktionsfähiges Beispiel für meinen STM32f103

Mit STM32 und Elm Chans FatFS habe ich mich auch lange mit rumgeschlagen 
aber jetzt auf einem STM32F030 lauffähig und benutze den Treiber zum 
loggen, was ich schon über 10 Tage gemacht habe und es hat einwandfrei 
funktioniert, das Text Log-File war am Ende 72 MB groß.

Allerdings ist das jetzt ein paar Monate her und ich müsste daher 
nochmal tiefer in den Code von mir eintauchen. Ich hatte anfangs z. B. 
das Problem, wie ich das Hardware-Interface (SPI) an den Treiber bekomme 
und dass die SD-Karte erkannt wird und ein paar kleinere 
Verständnisproblemchen. Es gibt da auch nicht wirklich Anleitungen dazu, 
wie ich finde. Deswegen mal meine Frage: Was ist jetzt Stand der Dinge? 
Deine Frage ist ja auch schon 8 Tage alt, vllt. hast du das Problem ja 
schon gelöst.

von Ingo S. (ingo-s)


Lesenswert?

Elm Chans FatFS funktioniert einwandfrei. Ein Beispiel für den STM32F100 
ist auf seiner Seite:
http://elm-chan.org/fsw/ff/00index_e.html
in dem FatFs sample enthalten. Es enthält auch eine Terminal 
Schnittstelle zum "Spielen" mit den Befehlen.

Ich habe es seit über 2 Jahren auf einem STM32F051 (mit der STL) für 
eine Sprachausgabe eines Fernsteuer-Senders per DMA->DAC in Betrieb.

Vor einem Jahr habe ich auf die LL Driver mit einer zusätzlichen 
Portierung auf den STM32L4xx umgestellt und gleichzeitiges Logging in 
Verbindung mit dem CoOS RTOS implementiert. Es funktioniert also auch 
das gleichzeitige Öffnen von zwei Files, eines zum Lesen und eines für 
das Logging.
Dank dem schlanken CoOS passte alles noch in die 8K RAM des F051.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Nils H. schrieb:
> Hat denn jemand schon mal mit dem STM32 und FatFS richtig gearbeitet?

Sischer dat. Der SD Card Support ist in meinem Projekt zwar im Moment 
ausgeschaltet, aber im Host Modus schreibt der F429 mit FatFS auf USB 
Sticks.
Ich habe dazu allerdings eine Lib von Uwe B. benutzt:
https://mikrocontroller.bplaced.net/wordpress/?page_id=519
da mir der SPL Aufbau sehr entgegenkam.

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.