我已经解决了 SDMMC 系统的许多问题,目前无法从 micro SD 可靠地传输。我写了测试代码来反复从外部卡读取文件。在某些情况下,调用 HAL_SD_ErrorCallback 时会出现错误代码 SDMMC_ERROR_CMD_CRC_FAIL。以下是我尝试过的一些事情:1)减慢时钟速度2) 重新设计电路板以提高 micro SD 线的信号完整性3) 使用 SDMMC2 代替 SDMMC14)使用1位模式5) 升级到 Cube 1.36) 打开和关闭引脚上的上拉模式这是代码摘录:SD_HandleTypeDef hsd1;void SDMgr::Init(){memset(&hsd1, 0, sizeof(hsd1));hsd1.Instance = SDMMC1;hsd1.Init.BusWide= SDMMC_BUS_WIDE_4B;hsd1.Init.ClockEdge= SDMMC_CLOCK_EDGE_RISING;hsd1.Init.ClockPowerSave= SDMMC_CLOCK_POWER_SAVE_DISABLE;hsd1.Init.HardwareFlowControl= SDMMC_HARDWARE_FLOW_CONTROL_DISABLE;// This assumes an incoming clock of 400MHz / 16 = 25MHz// Based on measurements, this results in a 50MHz micro SD clock. We get checksum errors//hsd1.Init.ClockDiv= 2;// Based on measurements, this results in a 25MHz micro SD clock. We get checksum errorshsd1.Init.ClockDiv= 4;memset(&m_SDFatFs, 0, sizeof(m_SDFatFs));memset(&m_SDPath, 0, sizeof(m_SDPath));// It is not necessary to cal BSP_SD_Init() here. It is already being called// through FatFS at the appropriate time.Mount();}void SDMgr::Mount(){FATFS_UnLinkDriver(m_SDPath);/*##-1- Link the micro SD disk I/O driver ##################################*/if (FATFS_LinkDriver(&SD_Driver, m_SDPath) != 0){ Logger::Print("Unable to FATFS_LinkDriver\n"); return;}/*##-2- Register the file system object to the FatFs module ##############*/if(f_mount(&m_SDFatFs, (TCHAR const*)m_SDPath, 0) != FR_OK){ /* FatFs Initialization Error */ Logger::Print("Unable to f_mount\n"); Error_Handler();}}void HAL_SD_MspInit(SD_HandleTypeDef* hsd){GPIO_InitTypeDef GPIO_InitStruct;if(hsd->Instance==SDMMC1){ /* Peripheral clock enable */ __HAL_RCC_SDMMC1_CLK_ENABLE(); /**SDMMC1 GPIO Configuration PC10------> SDMMC1_D2 PC11------> SDMMC1_D3 PC12------> SDMMC1_CK PD2------> SDMMC1_CMD PC8------> SDMMC1_D0 PC9------> SDMMC1_D1 */ GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_8 |GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF12_SDIO1; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_12; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF12_SDIO1; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_2; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF12_SDIO1; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); __HAL_RCC_SDMMC1_FORCE_RESET(); __HAL_RCC_SDMMC1_RELEASE_RESET(); /* NVIC configuration for SDIO interrupts */ HAL_NVIC_SetPriority(SDMMC1_IRQn, IRQ_PRIORITY_SD, 0); HAL_NVIC_EnableIRQ(SDMMC1_IRQn);}}有任何想法吗?非常感谢。更新:我正在使用 FreeRTOS 并遵循 FatFs_uSD_DMA_RTOS 示例。
2022-12-16 07:02
SD卡从驱动到应用共分为几层?它们有什么功能?
2021-05-19 06:22
SD卡从驱动到应用可以分为几层?如何去操作它们?
2021-05-17 06:57
有没有关于主流Wifi芯片资料分享?
2021-10-13 07:29