STM32 SD卡_没有加文件系统

发布者:科技先锋最新更新时间:2016-08-21 来源: eefocus关键字:STM32  SD卡  文件系统 手机看文章 扫描二维码
随时随地手机看文章
  STM32  SD卡_没有加文件系统 - liuyunqian@yeah - 嵌入式学习

下图是万利板子的SD卡部分

  STM32  SD卡_没有加文件系统 - liuyunqian@yeah - 嵌入式学习

其中SD_PWR连接到了 PD10   通过一个控制

  STM32  SD卡_没有加文件系统 - liuyunqian@yeah - 嵌入式学习
 

 

P-Channel 2.5-V (G-S) MOSFET 控制SD卡的电源

=====================================================================

SPI模式 读写SD卡

 

SD卡初始化过程:

1. 初始化STM32的SPI接口 使用低速模式
2. 延时至少74clock
3. 发送CMD0,需要返回0x01,进入Idle状态
4. 循环发送CMD55+ACMD41,直到返回0x00,进入Ready状态
5. 设置读写block大小为512byte 
5. 把STM32的SPI设置为高速模式



读一个block块的过程

1. 发送CMD17(单块)或CMD18(多块)读命令,返回0x00
2. 接收数据开始令牌0xfe + 正式数据512Bytes + CRC 校验2Bytes

写一个block块的过程

1. 发送CMD24(单块)或CMD25(多块)写命令,返回0x00
2. 发送数据开始令牌0xfe + 正式数据512Bytes + CRC校验2Bytes

/*******************************************************************************
* Function Name : SD_MMC_SPI_Init
* Description    : SD_MMC_SPI_Init
* Input          : None
* Output         : None
* Return         : zero init success, non-zero init error
*******************************************************************************/
u8 SD_MMC_SPI_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

/* Enable SPI1 and GPIO clocks */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 | RCC_APB2Periph_GPIOA |
RCC_APB2Periph_SD_MMC_SPI_CS, ENABLE);

/* Configure SPI1 pins: SCK, MISO and MOSI */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* Configure SD_MMC_SPI_CS */
GPIO_InitStructure.GPIO_Pin = SD_MMC_SPI_CS_Pin_CS;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(SD_MMC_SPI_CS, &GPIO_InitStructure);

//////////////////////////////////////////////////////////////////////////////
/* initialize SPI with lowest frequency */
SD_MMC_Low_Speed();

/* card needs 74 cycles minimum to start up */
for(u8 i = 0; i < 10; ++i)
{
/* wait 8 clock cycles */
SD_MMC_ReadWrite_Byte(0x00);
}

    /* address card */
SD_MMC_SPI_SELECT();

    /* reset card */
u8 response;
for(u16 i = 0; ; ++i)
{
response = SD_MMC_Send_Command(CMD_GO_IDLE_STATE , 0 );
if( response == 0x01 )
break;

        if(i == 0x1ff)
{
SD_MMC_SPI_DESELECT();
return 1;
}
}

/* wait for card to get ready */
for(u16 i = 0; ; ++i)
{
response = SD_MMC_Send_Command(CMD_SEND_OP_COND, 0);
if(!(response & (1 << R1_IDLE_STATE)))
break;

        if(i == 0x7fff)
{
SD_MMC_SPI_DESELECT();
return 1;
}
}

    /* set block size to 512 bytes */
if(SD_MMC_Send_Command(CMD_SET_BLOCKLEN, 512))
{
SD_MMC_SPI_DESELECT();
return 1;
}

    /* deaddress card */
SD_MMC_SPI_DESELECT();

    /* switch to highest SPI frequency possible */
SD_MMC_High_Speed();

return 0;
//////////////////////////////////////////////////////////////////////////////
}
 

/*******************************************************************************
* Function Name : SD_MMC_Read_Single_Block
* Description    : SD_MMC_Read_Single_Block
* Input          : sector number and buffer data point
* Output         : None
* Return         : zero success, non-zero error
*******************************************************************************/
u8 SD_MMC_Read_Single_Block(u32 sector, u8* buffer)
{
u8 Response;
u16 i;
u16 Retry = 0;

         //读命令 send read command
Response = SD_MMC_Send_Command(CMD_READ_SINGLE_BLOCK, sector<<9);

        if(Response != 0x00)
return Response;

        SD_MMC_SPI_SELECT();

        // start byte 0xfe
while(SD_MMC_ReadWrite_Byte(0xff) != 0xfe)
{
if(++Retry > 0xfffe)
{
SD_MMC_SPI_DESELECT();
return 1; //timeout
}
}

        for(i = 0; i < 512; ++i)
{
//读512个数据
*buffer++ = SD_MMC_ReadWrite_Byte(0xff);
}

        SD_MMC_ReadWrite_Byte(0xff); //伪crc
SD_MMC_ReadWrite_Byte(0xff); //伪crc

        SD_MMC_SPI_DESELECT();
SD_MMC_ReadWrite_Byte(0xff); // extra 8 CLK

        return 0;
}


/*******************************************************************************
* Function Name : SD_MMC_Write_Single_Block
* Description    : SD_MMC_Write_Single_Block
* Input          : sector number and buffer data point
* Output         : None
* Return         : zero success, non-zero error.
*******************************************************************************/
u8 SD_MMC_Write_Single_Block(u32 sector, u8* buffer)
{
u8 Response;
u16 i;
u16 retry=0;

//写命令 send write command
Response = SD_MMC_Send_Command(CMD_WRITE_SINGLE_BLOCK, sector<<9);
if(Response != 0x00)
return Response;

SD_MMC_SPI_SELECT();

SD_MMC_ReadWrite_Byte(0xff);
SD_MMC_ReadWrite_Byte(0xff);
SD_MMC_ReadWrite_Byte(0xff);

        //发开始符 start byte 0xfe
SD_MMC_ReadWrite_Byte(0xfe);

//送512字节数据 send 512 bytes data
for(i=0; i<512; i++)
{
SD_MMC_ReadWrite_Byte(*buffer++);
}

SD_MMC_ReadWrite_Byte(0xff); //dummy crc
SD_MMC_ReadWrite_Byte(0xff); //dummy crc

Response = SD_MMC_ReadWrite_Byte(0xff);

//等待是否成功 judge if it successful
if( (Response&0x1f) != 0x05)
{
SD_MMC_SPI_DESELECT();
return Response;
}
//等待操作完 wait no busy
while(SD_MMC_ReadWrite_Byte(0xff) != 0x00)
{
if(retry++ > 0xfffe)
{
SD_MMC_SPI_DESELECT();
return 1;
}
}
SD_MMC_SPI_DESELECT();
SD_MMC_ReadWrite_Byte(0xff);// extra 8 CLK

return 0;
}

 

if( SD_MMC_SPI_Init() ==1)
printf("  _SD_MMC Initialization ERROR\r\n");
else
{
printf("  _SD_MMC Initialization OK\r\n");
//memset(buffer,0,512);
//读取一个扇区的内容 这里读的是0扇区
SD_MMC_Read_Single_Block( 0 , buffer );
Uart1_PutString( buffer , 512 );
}

  STM32  SD卡_没有加文件系统 - liuyunqian@yeah - 嵌入式学习

关键字:STM32  SD卡  文件系统 引用地址:STM32 SD卡_没有加文件系统

上一篇:6步教你在STM32程序中添加 printf函数
下一篇:STM32 DMA学习

推荐阅读最新更新时间:2024-03-16 15:06

【STM库应用】stm32 之 USART
STM库是官方提供的,其已经做好了底层驱动的配置,用起来是相当简单的;我们只需要了解其每个函数的功能,已经每个函数所使用流程即可! 整个框架就是下面这幅图,我们只需在顶层做调用即可,跟现在做app的差不多! 注:摘自野火,希望大哥不要说我盗版 刚刚开始拿道库,一看这么多函数,感觉有点棘手,无从下手;多亏stm官方也针对该库提供了一个应用手册,画了两天时间进行了探索和实践,发现了一点比较方便的诀窍。 在此给大家分享分享,我们就拿今天的USART来说吧! 至于建工程,网上以及教程里面是非常多的,我也就不多说了! 任意一个外设都对应一个ppp.c和ppp.h文件,所以我们其实也不是无章可循的!同时,stm库他有一
[单片机]
【STM库应用】<font color='red'>stm32</font> 之 USART
基于STM32完成FATFS文件系统移植与运用
一、环境介绍 主控MCU: STM32F103ZET6 STM32程序开发IDE: keil5 STM32程序风格: 采用寄存器方式开发,注释齐全,执行效率高,方便移植 硬件包含: 一块STM32F103ZET6系统板、一个SPI接口的SD卡卡槽模块、一张SD卡 工程完整源码下载地址: https://download.csdn.net/download/xiaolong1126626497/19687693 这篇文章主要演示FATFS文件系统如何移植到自己的工程,并完成文件的读写。 因为SD卡采用的是SPI模拟时序,所以,其他单片机一样可以照着移植,代码都可以复制粘贴的。 二、FATFS文件系统介绍
[单片机]
基于<font color='red'>STM32</font>完成FATFS<font color='red'>文件系统</font>移植与运用
基于STM32步进电机多细分控制的设计
本文主要介绍了一种基于STM32的混合式步进电机控制方案,STM32产生PWM(脉宽调制信号),利用PWM完成DAC转换,通过PWMDAC的输出电压实现对步进电机的多细分控制。该设计相比利用DAC数模转换芯片的设计方案具有电路简单,费效比高的优点,而且可实现步进电机十六分之一步的驱动控制,精度较高。 1、硬件设计 硬件设计框图如图1所示,主要由PC上位机给STM32F103发送控制命令,通过STM32F103控制A3988,从而驱动两个步进电机转动。其中,STM32F103是意法半导体公司生产的基于ARMCortex—M3内核的微控制器,内核架构先进,性能优越,主频可达72MHz,执行效率高,具有较高的运算能力及数据处理功能,
[单片机]
基于<font color='red'>STM32</font>步进电机多细分控制的设计
初学STM32芯片的必备技能
STM32的核心Cortex-M3处理器是一个标准化的微控制器结构,希望思考一下,何为标准化?简言之,Cortex-M3处理器拥有32位CPU,并行总线结构,嵌套中断向量控制单元,调试系统以及标准的存储映射。 嵌套中断向量控制器(NestedVectorInterruptController,简称NVIC)是Cortex-M3处理器中一个比较关键的组件,它为基于Cortex-M3的微控制器提供了标准的中断架构和优秀的中断响应能力,为超过240个中断源提供专门的中断入口,而且可以赋予每个中断源单独的优先级。利用NVIC从可以达到极快的中断响应速度,从收到中断请求到执行中断服务的第一条指令仅需12个周期。这种极快的响应速度一方面得
[单片机]
stm32 I2C自收发测试例程
define BufferSize 4 define I2C2_SLAVE_ADDRESS7 0x30 /* Private macro ————————————————————-*/ /* Private variables ———————————————————*/ vu8 I2C1_Buffer_Tx = {1, 2, 3, 4}; /* I2C1待发送字节数组 */ vu8 I2C2_Buffer_Rx = {0, 0, 0, 0}; /* I2C2待接收字节缓冲 */ vu8 Tx_Idx = 0; /* I2C1数据发送计数变量 */ vu8 Rx_Idx = 0; /* I2C2数据接收计数变量 */
[单片机]
<font color='red'>stm32</font> I2C自收发测试例程
ucOS学习笔记(5)——一步一步移植ucOS到STM32
这两天看了下keil的编译连接相关文档得到以下一些信息: 1.关于AREA--AREA是arm汇编中的段标志,它代表一个段的开始。所谓段是指一个独立的,被命名的,不可分割一组代码或者数据,一个单独的代码段是一个应用功能的最小单元。原文如下 sections are independent, named, indivisible seqnces of code or data. A single code section is the minimum required to prod? an application 。 2.关于ENTRY--ENDTRY英文原意是入口的意思,在汇编语言中它代表了一个代码段中被执行的第一条指令的位置。如
[单片机]
STM32PWM实现呼吸灯-库函数
最让我头大的是初始化函数的各个参数的设置,在这里给出pwm_init的模板 pwm.h: #include pwm.h void TIM14_PWM_init(u32 arr, u32 psc) //arr为定时器的自动装载值(决定周期),cnt达到arr时io要置0,psc为预分频系数 { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_AP
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved