问题描述:之前用的是2GByte的拔插式TF卡,现在换成128MB的SDNAND,主控是STM32F407,SDNAND焊在转接板上再用读卡器插在电脑上正常识别出SDNAND盘符,容量信息,但把SDNAND贴在自己的主板上,容量却显示为32MB!
原因分析:TF卡高容量换到低容量程序代码是不同的,这是程序出现了BUG,需要注意下。
解决方法:需要去检查自己写的代码,检查SDNAD块调试出来的数量对不对,SDNAND每个块的大小是512MByte。以下是一个使用STM32与SDNAND芯片通信的示例代码:
C
#include "stm32f10x.h"
#include "sdio.h"
#include "sd.h"
#define BLOCK_SIZE 512 // 每个块的字节数
void SD_Init(void)
{
SDIO_InitTypeDef SDIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SDIO, ENABLE); // 使能 SDIO 时钟
SDIO_InitStructure.SDIO_ClockDiv = SDIO_ClockDiv_2; // SDIO 时钟频率为 25MHz
SDIO_InitStructure.SDIO_BusWide = SDIO_BusWide_4Bit; // SDIO 总线宽度为 4bit
SDIO_InitStructure.SDIO_HardwareFlowControl = SDIO_HardwareFlowControl_Disabled; // SDIO 硬件流控制禁用
SDIO_InitStructure.SDIO_ClockPowerManagement = SDIO_ClockPowerManagement_Enabled; // SDIO 时钟电源管理启用
SDIO_InitStructure.SDIO_Mode = SDIO_Mode_SD; // SDIO 模式为 SD 卡模式
SDIO_InitStructure.SDIO_DataTimeOut = SDIO_DataTimeOut_512; // SDIO 数据超时时间为 512 个时序
SDIO_InitStructure.SDIO_CLKWakeUp = SDIO_CLKWakeUp_Disabled; // SDIO 启用 CLKWakeUp 禁用
SDIO_InitStructure.SDIO_PowerUpAfterHS = SDIO_PowerUpAfterHS_Disabled; // SDIO 启用 PowerUpAfterHS 禁用
SDIO_InitStructure.SDIO_DriverStrength = SDIO_DriverStrength_Strong; // SDIO 启用 DriverStrength 禁用
SDIO_InitStructure.SDIO_pwrControl = SDIO_pwrControl_Enabled; // SDIO 启用 pwrControl 禁用
SDIO_Init(&SDIO_InitStructure); // 初始化 SDIO 控制器
}
void SD_CardDetect(void)
{
if (sdio. CardInfo.RCA == 0) { // 如果 RCA 为 0,则说明没有插入 SD 卡
return;
}
// 初始化 SD 卡驱动器并检查 SD 卡是否存在
if (sdio.SDCardState == CardState_NotInserted) { // 如果卡未插入,则返回错误状态码
return;
} else if (sdio.SDCardState == CardState_Inserted) { // 如果卡已插入,则初始化 SD 卡驱动器并准备进行通信
sdio.PowerState = PowerState_ON; // 使能 SD 卡控制器电源
sdio.CardType = SDIO_MemoryMappedCard; // 设置为内存映射模式
sdio.DriveMode = SDIO_DriveMode_High; // 使能高速模式
sdio.CSize = SDIO_DataBlockSize512; // 设置块大小为 512 字节
sdio.ReadWaitTimeout = SDIO_ReadWaitTimeout_2; // 设置读取超时时间为 2 个时序
sdio.WriteProtection = SDIO_WriteProtection_Disable; // 关闭写保护功能
sdio.BlockSize = BLOCK_SIZE; // 设置块大小为 512 字节(因为每个块的大小是固定的,所以需要设置)
sdio.TransferDirection = SDIO_TransferDirection_MemoryToCard; // 设置传输方向为从内存到卡
sdio.SendCmd(SDMMC_CmdSel明确的卡类型 | SDIO_SendCommand, CmdSend); // 发送命令到卡
上一篇:sd nand stm32
下一篇:SDNAND有那些品牌