提问人:tarm 提问时间:11/18/2023 更新时间:11/18/2023 访问量:24
使用 stm32L552ZET6 托管 SD 卡时出现问题
Problem hosting SD card with stm32L552ZET6
问:
我已经在带有 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时,这些引脚没有响应。时钟不存在。
我相信与软件有关。
L552ZET6具有 TrustZone 模式。我没有使用它。会不会是问题所在?我也尝试过使用 TrustZone,但没有成功。但我以前从未使用过它。
L552ZET6具有“带目录电压转换器的 SD x 位”,而 L496ZG 没有。我只使用标准的 1/4 位。
L5 有“外部收发器存在”标志,而 L4 没有。我已经尝试了所有配置,但没有成功。
STMCubeMX 为 L4 生成 #include“fatfs.h”。对于 L5,库 #include“app_fatfs.h”。会不会与此有关?此库报告了任何问题吗?
我对 MCU 架构或编码没有深入的了解。任何提示将不胜感激。这不是我第一次尝试使用L552ZET6托管 SD 卡但没有成功。过去我只是放弃了几次,让它发挥作用,但现在我真的致力于它。
答: 暂无答案
评论
HAL_SD_GetCardInfo()