使用 stm32L552ZET6 托管 SD 卡时出现问题

Problem hosting SD card with stm32L552ZET6

提问人:tarm 提问时间:11/18/2023 更新时间:11/18/2023 访问量:24

问:

我已经在带有 uSD 卡模块的定制 PCB 中使用了 stm32L496ZGT6 很长时间了。连接卡从来没有任何问题。由于疫情期间供应短缺,我买了几台与stm32L496引脚相同的stm32L552ZET6。

印刷电路板

现在的问题是我无法将 SD 卡与 stm32L552 一起使用。我使用的是与 stm32L4 相同的 SDMCC 配置,但由于某种原因,它不适用于 stm32L5。SD 卡从未成功挂载。STMCubeMX SDMCC STMCubeMX 时钟

/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "app_fatfs.h"
#include "sdmmc.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "stdio.h"
#include "string.h"
/* 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 ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(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_USART2_UART_Init();
  MX_SDMMC1_SD_Init();
  if (MX_FATFS_Init() != APP_OK) {
    Error_Handler();
  }
  /* USER CODE BEGIN 2 */
    
    FATFS myFATFAS;
    FIL myFile;
    UINT testByte;
    
    HAL_UART_Transmit(&huart2,(uint8_t*)"Start\n",6,200);

  /* USER CODE END 2 */

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

    /* USER CODE BEGIN 3 */
        if(f_mount(&myFATFAS,SDPath,1) == FR_OK){   
                if(f_open(&myFile,"my_file.TXT", FA_WRITE | FA_OPEN_ALWAYS)==FR_OK){
                    f_lseek(&myFile, f_size(&myFile));
                    f_write(&myFile,"test\n",strlen("test\n"),&testByte);
                    f_close(&myFile);
                    HAL_UART_Transmit(&huart2,(uint8_t*)"All good!\n",strlen("All good!\n"),200);
                } else HAL_UART_Transmit(&huart2,(uint8_t*)"error opening\n",strlen("error opening\n"),200);
            }   
        else HAL_UART_Transmit(&huart2,(uint8_t*)"error mount\n",strlen("error mount\n"),200);

        
        HAL_Delay(1000);
            
  }
  /* USER CODE END 3 */
}

我正在使用 STM32CubeMX 6.0.1 和 Keil uVision5。

我尝试了 1 位和 4 位模式、不同的时钟分频因子和外部收发器存在模式(L4 中不存在),但似乎没有任何效果。我使用示波器进行了检查,但未生成时钟(SDMCC1_CK)。我不知道我在这里错过了什么。

我确信硬件一切正常。我什至将 CMD、CK 和 D0 引脚设置为输出,并看到它们与示波器一起切换。但是,当定义为SDMMC时,这些引脚没有响应。时钟不存在。

我相信与软件有关。

  1. L552ZET6具有 TrustZone 模式。我没有使用它。会不会是问题所在?我也尝试过使用 TrustZone,但没有成功。但我以前从未使用过它。

  2. L552ZET6具有“带目录电压转换器的 SD x 位”,而 L496ZG 没有。我只使用标准的 1/4 位。

  3. L5 有“外部收发器存在”标志,而 L4 没有。我已经尝试了所有配置,但没有成功。

  4. STMCubeMX 为 L4 生成 #include“fatfs.h”。对于 L5,库 #include“app_fatfs.h”。会不会与此有关?此库报告了任何问题吗?

我对 MCU 架构或编码没有深入的了解。任何提示将不胜感激。这不是我第一次尝试使用L552ZET6托管 SD 卡但没有成功。过去我只是放弃了几次,让它发挥作用,但现在我真的致力于它。

STM32 SD卡 FATFS

评论

0赞 Ilya 11/18/2023
我开了RM0438(...stm32l552xx-and-stm32l562xx-advanced-arm-based-32-bit-mcus-stmicroelectronics.pdf) 第 1858 页,我打开了 RM0351 (rm0351-stm32l47xxx-stm32l48xxx-stm32l49xxx-and-stm32l4axxx-...pdf) 第 1609 页,它们的外围设备也不相同。第一个寄存器已经不同了,L5 有更多的电源配置。接下来,SDMMC时钟配置寄存器直接不兼容(同一位具有完全不同的功能)。它可能需要对新 MCU 进行额外的配置。确保包含正确的SD_MMC驱动程序。
0赞 Ilya 11/18/2023
一般来说,这里有太多的变量在起作用。隔离变量。另一种方法是尝试在新的 MCU 上创建一个 hello world fatfs 项目,尝试创建 hello world sdmmc 项目(毕竟,您已经知道所有重要的配置,所以应该不会花很长时间)。也许你也可以从中学到一些东西。
0赞 tarm 11/18/2023
我不确定我应该如何配置寄存器。我在 STMCubeMX 中进行配置。生成代码时,它不应该对不同的微处理器具有正确的依赖关系吗?我应该能够像以前一样调用 HAL 函数。库的低级编码和寄存器必须满足每个处理器的需求,对吧?
0赞 tarm 11/18/2023
“hello world smmc project”是否意味着在 txt 中写一些东西?如果是这样,这就是我正在努力做的事情。在我的代码中,我只启用了 SDMCC、FATF 和 UART(用于控制提议)。我尝试做 fmout 和 fopen 并在 txt 上写。卸载失败。未生成 SD CLK 行。
0赞 pmacfarlane 11/18/2023
我建议采用比 Ilya 更基本的方法 - 完全摆脱 FATFS 的东西,看看你是否可以从 SD 卡中读取一个块。或者看看是否有效。然后从那里开始构建。HAL_SD_GetCardInfo()

答: 暂无答案