STM32 SD-Karte und Cube

Gast #6291719
Lesenswert?

/* USER CODE BEGIN Header */
/**
  ************************************************************************ 
******
  * @file           : main.c
  * @brief          : Main program body
  ************************************************************************ 
******
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under Ultimate Liberty 
license
  * SLA0044, the "License"; You may not use this file except in 
compliance with
  * the License. You may obtain a copy of the License at:
  *                             www.st.com/SLA0044
  *
  ************************************************************************ 
******
  */
/* USER CODE END Header */

/* Includes 
------------------------------------------------------------------*/
#include "main.h"
#include "fatfs.h"
#include "usb_device.h"

/* Private includes 
----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private typedef 
-----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define 
------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro 
-------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables 
---------------------------------------------------------*/
SD_HandleTypeDef hsd;

SPI_HandleTypeDef hspi1;

UART_HandleTypeDef huart1;
UART_HandleTypeDef huart2;

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes 
-----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_SPI1_Init(void);
static void MX_SDIO_SD_Init(void);
static void MX_USART1_UART_Init(void);
static void MX_USART2_UART_Init(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code 
---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */


  /* MCU 
Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the 
Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_SPI1_Init();
  MX_SDIO_SD_Init();
  MX_USART1_UART_Init();
  MX_USART2_UART_Init();
  MX_FATFS_Init();
  MX_USB_DEVICE_Init();
  /* USER CODE BEGIN 2 */

  FATFS sdFatFs;  // File system object for SD disk logical drive
  char sdPath[4];  // SD disk logical drive path
  FIL myFile;  // File object

  FRESULT res = FR_OK;      // FatFs function common result code
    uint8_t wtext[] = "Hello world";  // File write buffer
    uint8_t rtext[100];      // File read buffer
    uint32_t byteswritten, bytesread;  // File write/read counts


    res = f_mount(&sdFatFs, (TCHAR const*) sdPath, 0);
    if (res != FR_OK) {
      // Fehler beim Mounten
      return -1;
    }

    res = f_open(&myFile, "TEST.TXT", FA_CREATE_ALWAYS | FA_WRITE);
    if (res != FR_OK) {
      // Fehler beim Erstellen oder Öffnen der Datei
      return -1;
    }

    res = f_write(&myFile, wtext, sizeof(wtext),(void *) &byteswritten);
    if (res != FR_OK) {
      // Fehler beim Beschreiben der Datei
      return -1;
    }

    f_close(&myFile);  // Schliessen der Datei

    res = f_open(&myFile, "TEST.TXT", FA_READ);
    if (res != FR_OK) {
      // Fehler beim Öffnen der Datei
      return -1;
    }

    res = f_read(&myFile, rtext, sizeof(rtext),(UINT*) &bytesread);
    if ((bytesread == 0) || (res != FR_OK)) {
      // Fehler beim Lesen aus der Datei
      return -1;
    }

    f_close(&myFile);    // Schliessen der Datei
    FATFS_UnLinkDriver(sdPath);  // Trennen des SDIO-Treibers von der 
Middleware-Komponente


  /* USER CODE END 2 */



  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}
Gast #6291720
Lesenswert?

Hier noch der SDIO init:

  * @brief SDIO Initialization Function
  * @param None
  * @retval None
  */
static void MX_SDIO_SD_Init(void)
{

  /* USER CODE BEGIN SDIO_Init 0 */

  /* USER CODE END SDIO_Init 0 */

  /* USER CODE BEGIN SDIO_Init 1 */

  /* USER CODE END SDIO_Init 1 */
  hsd.Instance = SDIO;
  hsd.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING;
  hsd.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE;
  hsd.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE;
  hsd.Init.BusWide = SDIO_BUS_WIDE_1B;
  hsd.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;
  hsd.Init.ClockDiv = 3;
  /* USER CODE BEGIN SDIO_Init 2 */

  /* USER CODE END SDIO_Init 2 */

}
Gast #6291830
Lesenswert?

Bin ein Stück weiter.

Hängt sich wohl hiermit auf:
FR_DISK_ERR,      /* (1) A hard error occurred in the low level disk I/O 
layer */

Mit nem oszi kann ich kurz Datenverkehr auf den Datenleitungen sehen.
CLK kommt mit 9,6Mhz wenn SD-Karte drin. Ohne mit 400KHz. Daher vermute 
ich dass die Initalisierung der Karte selber wahrscheinlich hinhaut?
Gast #6291877
Lesenswert?

Gibt es Warnungen beim kompilieren? Was sagt der Stack Trace, wenn Du im 
Hardfault hängen bleibst (sollte anzeigen, wo der Fehler passiert ist)?

Kann es sein, dass man als zweites Argument bei f_mount nicht einen Pfad 
übergeben sollte (notfalls "")?

Ich habe das Gefühl, das die Übergabe eines nach const char* gecasteten 
uninitialisierten Strings keinen Sinn ergibt. Casten nur, wenn man weiß, 
was man tut!
#6291966
Lesenswert?

Selbstloser Helfer schrieb:
> Ich habe das Gefühl, das die Übergabe eines nach const char* gecasteten
> uninitialisierten Strings keinen Sinn ergibt.

Das wird er nur übernommen haben und ich nutze das ja auch so wenn ich 
Strings übergebe.


Bevor man sich an die Software her macht und dort irgend etwas versucht 
zu optimieren, sollte man sich die Hardware anschauen um zu sehen ob es 
nicht schon hieran scheitert.

Er wird schlichtweg vergessen haben einen Kondensator zwischen Vcc und 
GND nahe am SD-Karten-Adapter zu plazieren.

@TO
Zeig uns mal deinen Aufbau/Schaltung.
Gast #6292184
Lesenswert?

Mike J. schrieb:
> @TO
> Zeig uns mal deinen Aufbau/Schaltung.

hab hier ein Fertiges DM-STF4BB Board. Und ja das ist Kacke designt. Mit 
CLK noch weiter runteretzn gehts...

MLCC ist an der SD Karte, aber Leitungsführung usw... Wenn man sich mal 
wieder blind auf Evalkits verlässt...
Gast #6292192
Lesenswert?

Das ist oftmals auch die SD-Karte und nicht zwingend die 
Leitungsführung. Da solltest du mal verschiedene probieren. Und auch die 
internen Pull-Ups sind eigentlich zu groß da sollten externe sein, falls 
das nicht der Fall ist kann auch das ein Problem sein.
#6292354
Lesenswert?

Anderl schrieb:
> Bin ein Stück weiter.
>
> Hängt sich wohl hiermit auf:
> FR_DISK_ERR,      /* (1) A hard error occurred in the low level disk I/O
> layer */
>
> Mit nem oszi kann ich kurz Datenverkehr auf den Datenleitungen sehen.
> CLK kommt mit 9,6Mhz wenn SD-Karte drin. Ohne mit 400KHz. Daher vermute
> ich dass die Initalisierung der Karte selber wahrscheinlich hinhaut?

Anderl schrieb:
> Mit CLK noch weiter runteretzn gehts...

Du hast die clock-Geschwindigkeit verringert und es geht jetzt ?

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