打印
[DemoCode下载]

SD】【显示容量】

[复制链接]
490|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yiyigirl2014|  楼主 | 2016-10-26 18:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
sd, AC
【SD】【显示容量】.zip (74.64 KB)



沙发
玛尼玛尼哄| | 2016-10-26 22:41 | 只看该作者
#include "SmartM_M0.h"

#define SD_TEST_SECTOR  0x10000


/****************************************
*函数名称:main
*输    入:无
*输    出:无
*功    能:函数主体
******************************************/
INT32 main(VOID)
{
          UINT32 i=0;
          UINT8  buf[512]={0};
          /*1.MCU频率初始化,频率为50MHz*/
          McuInit(MCU_FREQUENCY);
          /*2.串口初始化,波特率为115200bps*/
                UartInit(115200);
                                               
          printf("\r\n================================================ \r\n");
          printf("\r\n                  SD Card Test                   \r\n");
          printf("\r\n                SD Card Show Size                \r\n");
          printf("\r\n================================================ \r\n");
               
          /*3.SD Card 初始化 */
          while(SD_Initialize())
    {
                            Delayms(500);
                            printf("Please insert SD Card\r\n");
                       
                }                       
               
                i=SD_GetSectorCount();

                printf("SD Card Size is %dMB\r\n",(UINT32)((FP32)i/1024/1024*512));
               
          while(1);

}


使用特权

评论回复
板凳
玛尼玛尼哄| | 2016-10-26 22:41 | 只看该作者
看来关键函数都在那个头文件里。

使用特权

评论回复
地板
yiyigirl2014|  楼主 | 2016-10-28 09:21 | 只看该作者
#ifndef __SD_H__
#define __SD_H__

#include "Typedef.h"

#define SD_CS(x)       {if(x)P1_DOUT|= (1<<4);\
                        else P1_DOUT&=~(1<<4);}






// SD卡类型定义  
#define SD_TYPE_ERR     0X00
#define SD_TYPE_MMC     0X01
#define SD_TYPE_V1      0X02
#define SD_TYPE_V2      0X04
#define SD_TYPE_V2HC    0X06          
// SD卡指令表            
#define CMD0    0       //卡复位
#define CMD1    1
#define CMD8    8       //命令8 ,SEND_IF_COND
#define CMD9    9       //命令9 ,读CSD数据
#define CMD10   10      //命令10,读CID数据
#define CMD12   12      //命令12,停止数据传输
#define CMD16   16      //命令16,设置SectorSize 应返回0x00
#define CMD17   17      //命令17,读sector
#define CMD18   18      //命令18,读Multi sector
#define CMD23   23      //命令23,设置多sector写入前预先擦除N个block
#define CMD24   24      //命令24,写sector
#define CMD25   25      //命令25,写Multi sector
#define CMD41   41      //命令41,应返回0x00
#define CMD55   55      //命令55,应返回0x01
#define CMD58   58      //命令58,读OCR信息
#define CMD59   59      //命令59,使能/禁止CRC,应返回0x00
//数据写入回应字意义
#define MSD_DATA_OK                0x05
#define MSD_DATA_CRC_ERROR         0x0B
#define MSD_DATA_WRITE_ERROR       0x0D
#define MSD_DATA_OTHER_ERROR       0xFF
//SD卡回应标记字
#define MSD_RESPONSE_NO_ERROR      0x00
#define MSD_IN_IDLE_STATE          0x01
#define MSD_ERASE_RESET            0x02
#define MSD_ILLEGAL_COMMAND        0x04
#define MSD_COM_CRC_ERROR          0x08
#define MSD_ERASE_SEQUENCE_ERROR   0x10
#define MSD_ADDRESS_ERROR          0x20
#define MSD_PARAMETER_ERROR        0x40
#define MSD_RESPONSE_FAILURE       0xFF
                                                                                                                     
                                              

EXTERN_C  UINT8  SD_Type;//SD卡的类型
//函数申明区
EXTERN_C  UINT8 SD_SPI_ReadWriteByte(UINT8 data);
EXTERN_C  VOID SD_SPI_SpeedLow(VOID);
EXTERN_C  VOID SD_SPI_SpeedHigh(VOID);
EXTERN_C  UINT8 SD_WaitReady(VOID);                                                        //等待SD卡准备
EXTERN_C  UINT8 SD_GetResponse(UINT8 Response);                                        //获得相应
EXTERN_C  UINT8 SD_Initialize(VOID);                                                        //初始化
EXTERN_C  UINT8 SD_ReadDisk(UINT8*buf,UINT32 sector,UINT8 cnt);                //读块
EXTERN_C  UINT8 SD_WriteDisk(UINT8*buf,UINT32 sector,UINT8 cnt);                //写块
EXTERN_C  UINT32 SD_GetSectorCount(VOID);                                           //读扇区数
EXTERN_C  UINT8  SD_GetCID(UINT8 *cid_data);                     //读SD卡CID
EXTERN_C  UINT8  SD_GetCSD(UINT8 *csd_data);                     //读SD卡CSD





#endif


使用特权

评论回复
5
yiyigirl2014|  楼主 | 2016-10-28 09:21 | 只看该作者
#include "SmartM_M0.h"
/****************************************
*函数名称:Spi0Length
*输    入:ucLength 数据长度
*输    出:无
*功    能:设置SPI0数据长度
******************************************/
STATIC VOID Spi0Length(UINT8 ucLength)
{
    if(ucLength <= 0x20)
    {
        if((ucLength & 0x01) == 0)
            SPI0_CNTRL &= ~(1<<3);
        else
            SPI0_CNTRL |= (1<<3);
        if((ucLength & 0x02) == 0)
            SPI0_CNTRL &= ~(1<<4);
        else
            SPI0_CNTRL |= (1<<4);

        if((ucLength & 0x04) == 0)
            SPI0_CNTRL &= ~(1<<5);
        else
            SPI0_CNTRL |= (1<<5);

        if((ucLength & 0x08) == 0)
            SPI0_CNTRL &= ~(1<<6);
        else
            SPI0_CNTRL |= (1<<6);

        if((ucLength & 0x10) == 0)
            SPI0_CNTRL &= ~(1<<7);
        else
            SPI0_CNTRL |= (1<<7);
    }
}
/****************************************
*函数名称:Spi0MasterInit
*输    入:无
*输    出:无
*功    能:SPI0初始化为主机模式
******************************************/
VOID Spi0MasterInit(VOID)
{
    P1_MFP &= ~(
                                P15_AIN5_SPI0MOSI |
                                P16_AIN6_SPI0MISO |
                                P17_AIN7_SPI0CLK) ;  
       
                P1_MFP |= (
                                                SPI0MOSI |
                                         SPI0MISO |
                                         SPI0CLK) ;           //使能SPI0相关引脚


                APBCLK |= SPI0_CLKEN;       //SPI0时钟使能

                                                              
    SPI0_SSR &= ~LVL_H;                   //从机选择选择信号通过低电平激活

    SPI0_CNTRL &= ~LSB_FIRST;   //优先发送/接收最高有效位
    SPI0_CNTRL &= ~CLKP_IDLE_H; //SCLK空闲时为低电平
    SPI0_CNTRL |= TX_NEG_F;     //SDO 信号在SPICLK的下降沿改变
    SPI0_CNTRL &= ~RX_NEG_F;    //SDI 信号在SPICLK上升沿锁存
    SPI0_CNTRL &= TX_NUM_ONE;   
    Spi0Length(0x08);

    SPI0_DIVIDER &= 0xFFFF0000;   //DIVIDER = 0x0000, SPIclk = Pclk/((HCLK_N+1)*2)
    SPI0_DIVIDER |= 2;                              //(50Mhz/6)=8.25MHz

    SPI0_CNTRL &= ~SPI_MODE_SLAVE;    //SPI0工作在主机模式
    SPI0_SSR   &= ~ASS_AUTO;                 //Slave Select non-auto
}

/****************************************
*函数名称:Spi0WriteRead
*输    入:ucData 要发送的数据
*输    出:返回字节数据
*功    能:SPI0读写数据
******************************************/
UINT8 Spi0WriteRead(UINT8 ucData)
{
    SPI0_SSR |= SSR_ACT;

    SPI0_TX0 = ucData;

    SPI0_CNTRL |= GO_BUSY;      

                while((SPI0_CNTRL & GO_BUSY)!=0);

                SPI0_SSR &= ~SSR_ACT;

                return (UINT8)SPI0_RX0;
}


VOID Spi0SetSpeedHigh(VOID)
{
    SPI0_DIVIDER &= 0xFFFF0000; //DIVIDER = 0x0000, SPIclk = Pclk/((HCLK_N+1)*2)
    SPI0_DIVIDER |= 2;       
       
}

VOID Spi0SetSpeedLow(VOID)
{
    SPI0_DIVIDER &= 0xFFFF0000; //DIVIDER = 0x0000, SPIclk = Pclk/((HCLK_N+1)*2)
    SPI0_DIVIDER |= 0xFF;               
       
}






使用特权

评论回复
6
戈卫东| | 2016-10-28 21:07 | 只看该作者
多谢分享

使用特权

评论回复
7
598330983| | 2016-10-29 14:51 | 只看该作者
SD卡这个用的很多的,手机上不用了,物联网上开始用了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

213

主题

3538

帖子

10

粉丝