精华内容
下载资源
问答
  • 本节介绍SD卡SPI模式基本操作流程,包括初始化、读和写的相关命令和操作流程。 相关命令和响应的描述请见第一节:MSP430 SD卡SPI读写操作(1) —— SD卡命令 一、SPI模式 二、RESET(SD卡复位) 三、SD卡初始化 四、...

    本节介绍SD卡SPI模式基本操作流程,包括初始化、读和写的相关命令和操作流程。

    相关命令和响应的描述请见第一节:MSP430 SD卡SPI读写操作(1) —— SD卡命令

    一、SPI模式
    二、RESET(SD卡复位)
    三、SD卡初始化
    四、SD卡读单块
    五、SD卡读多块
    六、SD卡写单块
    七、SD卡写多块

    一、SPI模式

    SD卡SPI模式需要SD卡作为从机,MCU作为主机进行通信。可以采用三线SPI(SCLK,MISO,MOSI)外加一个片选信号线CS来进行控制和通信。需要注意一下几点:
    1、SD卡的初始化速度不能大于400KHz,即复位和初始化过程SPI的速率要限制在400KHz以下,在实际测试过程中,即使速率小于400KHz,也会出现一定几率的初始化失败,最后在多次尝试后将速率设置在125KHz后比较稳定,不知道是不是和电路有关系。
    2、SPI的极性 = 1 相位 = 0
    3、向SD卡写入命令的过程为
    (1) 拉低CS
    (2) 向SD卡写入指令,然后附加发送8个时钟,使SD卡完成此次操作
    (3) 接收SD卡响应
    (4) 拉高CS,然后附加发送8个时钟
    4、发送 ACMD 指令时,需要首先发送 CMD55 告诉SD卡下一条指令为应用程序特定指令( ACMD 指令)。

    二、RESET(SD卡复位)

    SD卡在上电后是处于SD模式,RESET命令使其进入SPI模式。具体流程为:
    1、拉高CS,发送至少74个时钟周期使SD卡稳定
    2、拉低CS,发送CMD0
    3、由第一节知CMD0返回R1,需要收到回应0x01表示 in idle state
    4、拉高CS,附加发送8个时钟
    后面的操作因为CS的操作没有特殊情况,因此不列出了。

    三、SD卡初始化

    SD卡初始化可以使用CMD1 和 ACMD41 两种方式。官方文档不推荐CMD1方式,原因有两个:一是对于1.4mm厚的标准尺寸SD卡,CMD1是非法的指令;二是因为ACMD41可以很容易的区分SD卡和MMC卡。在这里只介绍ACMD41初始化方式。
    1、发送CMD55,收到0x01表示 in idle state
    2、发送ACMD41,返回R1,在这里R1的in idle state用来表示SD卡是否处于初始化状态,因此需要循环读取直到0x00

    四、SD卡读单块

    1、发送CMD17,收到0x00表示发送成功
    2、连续读取知道读到0xFE
    3、读一个block (通常为512字节)
    4、读两个CRC字节

    五、SD卡读多块

    1、发送CMD18,收到0x00表示发送成功
    2、连续读直到读到0xFE
    3、读一个block (通常为512字节)
    4、读两个CRC字节
    5、如果要读取下一个block,重复步骤2-4
    6、发送CMD12来停止读多块操作

    六、SD卡写单块

    1、发送CMD24,收到0x00表示发送成功
    2、发送若干时钟
    3、发送写开始标志0xFE
    4、发送一个block (通常为512字节)
    5、发送两个CRC字节
    6、连续读直到读到二进制 xxx00101表示数据写入成功
    7、连续读忙检测,直到读到0xFF表示操作完成

    七、SD卡写多块

    1、发送CMD25,收到0x00表示发送成功
    2、发送若干时钟
    3、发送写开始标志0xFC
    4、发送一个block (通常为512字节)
    5、发送两个CRC字节
    6、连续读直到读到二进制 xxx00101表示数据写入成功
    7、如果想写下一个block,则重复步骤2 - 6
    8、发送写停止标志 0xFD 来停止写操作
    7、连续读忙检测,直到读到0xFF表示操作完成
    展开全文
  • SD卡SPISD通信协议协议 SD卡SPISD通信协议协议SD卡SPISD通信协议协议SD卡SPISD通信协议协议
  • sd卡spi协议 移植fats

    2017-08-06 23:02:27
    sd卡spi协议 移植fats
  • SD卡 SPI 读写代码

    2012-11-30 21:56:45
    SD卡 SPI 读写代码
  • SD卡SPI程序

    2012-10-24 00:55:51
    SD卡SPI模式底层驱动代码,包括初始化,读写一个扇区或多个扇区,以及擦写
  • SD卡 SPI 完整代码

    2012-11-30 22:00:59
    SD卡 SPI 完整代码,在单片机中实现
  • 本文主要讲了SD卡SPI模式下与单片机的连接图,希望对你的学习有所帮助。
  • SD卡SPI.zip

    2019-08-05 13:13:43
    SPI方式 SD TF 基于STM32F103VE
  • SD卡SPI读写中文资料

    2011-04-02 15:09:16
    SD卡SPI中文使用手册,里面主要写了SD卡与单片机中SPI口得使用介绍。以及应用。
  • STM32 驱动SD卡 SPI协议

    2016-10-13 17:19:36
    STM32 驱动SD卡 SPI协议
  • dat) 功能:向sd卡写命令 返回: 1- >操作失败 0->成功 ********************************************************************************************************************/ unsigned char mmc_command...

    ba25d2ddfe909f19a2fe94506b62a15e.png

    217867e02c0151133663a0d659ac397b.png

    ad5d9a231107100f7a8052da0f97d866.png (图一)

    9bdd817b9208165571b41379a310871d.png

    (图二)

    /********************************************************************************************************************

    函数名:unsigned char mmc_command(unsigned char *comm,unsigned char retuen_dat)

    功能:向sd卡写命令

    返回: 1- >操作失败 0->成功

    ********************************************************************************************************************/

    unsigned char mmc_command(unsigned char *comm,unsigned char retuen_dat)

    {

    unsigned char n,temp,count,n_count;

    count = 0;

    do

    {

    SSEL_D(0);

    for(n=0;n<6;n++)

    SPI_Send_Dat(*comm++);

    for(n_count=0;n_count<5;n_count++)

    {

    temp = SPI_Receiver_Dat();

    if(temp == retuen_dat)break;

    }

    SSEL_D(1);

    SPI_Send_Dat(0xff);

    if(count>100) return 1;

    }while(temp!=retuen_dat);

    return 0;

    }

    /*******************************************************************************************************

    函数名:void mmc_init(void)

    功能:初始化sd卡

    返回: 无

    *******************************************************************************************************/

    void mmc_init(void)

    {

    unsigned char command_dat[6];

    unsigned char n;

    for(n=0;n<6;n++) command_dat[n] = 0;

    SPI_Init();

    for(n=0;n<16;n++)

    SPI_Send_Dat(0xff);//图一 同步用至少74个周期

    command_dat[0] = 0x40;

    command_dat[5] = 0x95;

    mmc_command(command_dat,0x01);//图二

    command_dat[0] = 0x41;

    command_dat[5] = 0xff;

    mmc_command(command_dat,0x00);//图二

    }

    fde25e04c4ce2336cbc858ed28582601.png

    3fc7053f923e21ed5fd64d49a0210189.png

    /*******************************************************************************************************

    函数名:void write_mmc_dat(unsigned char *comm,unsigned char *dat,unsigned int len)

    功能:向sd写数据(底层)

    返回: 无

    *******************************************************************************************************/

    void write_mmc_dat(unsigned char *comm,unsigned char *dat,unsigned int len)

    {

    unsigned char n,temp,n_count;//,count;

    unsigned int count;

    count = 0;

    for(count=0;count<5;count++)

    {

    SSEL_D(1);

    SPI_Send_Dat(0xff);

    SSEL_D(0);

    for(n=0;n<6;n++)

    SPI_Send_Dat(*comm++);

    for(n_count=0;n_count<5;n_count++)

    {

    temp = SPI_Receiver_Dat();

    if(temp == 0)break;

    }

    if(temp == 0)break;

    }

    SPI_Send_Dat(0xff);

    SPI_Send_Dat(0xff);

    SPI_Send_Dat(0xfE);//开始写

    for(count=0;count

    {

    SPI_Send_Dat(*dat);

    dat++;

    }

    SPI_Send_Dat(0xff);

    SPI_Send_Dat(0xff);

    temp = SPI_Receiver_Dat();

    if( temp&0x1f!=0x05);//写失败

    SSEL_D(1);

    SPI_Send_Dat(0xff);

    }

    /*******************************************************************************************************

    函数名:void write_mmc_dat(unsigned char *comm,unsigned char *dat,unsigned int len)

    功能:向sd写数据

    返回: 无

    *******************************************************************************************************/

    void MMCWdBolckOne(unsigned long addr,unsigned char *buffer)

    {

    unsigned char command_dat[6];

    command_dat[0] = 0x40 + 24; // READ SINGLE BLOCK

    addr <<= 9; // addr*512,取512的整数倍

    command_dat[1] = (addr >> 24);

    command_dat[2] = (addr >> 16);

    command_dat[3] = (addr >> 8);

    command_dat[4] = (addr >> 0);

    command_dat[5] = 0;

    write_mmc_dat(command_dat,buffer,512);

    }

    e496cfeb357b4812a3e8f8131925a8bb.png

    /*******************************************************************************************************

    函数名:void write_mmc_dat(unsigned char *comm,unsigned char *dat,unsigned int len)

    功能:向sd读数据(底层)

    返回: 无

    *******************************************************************************************************/

    void read_mmc_dat(unsigned char *comm,unsigned char *dat,unsigned int len)

    {

    unsigned char n,temp,count,n_count;

    count = 0;

    for(count=0;count<5;count++)

    {

    SSEL_D(1);

    SPI_Send_Dat(0xff);

    SSEL_D(0);

    for(n=0;n<6;n++)

    SPI_Send_Dat(*comm++);

    for(n_count=0;n_count<5;n_count++)

    {

    temp = SPI_Receiver_Dat();

    if(temp == 0)break;

    }

    if(temp == 0)break;

    }

    for(n_count=0;n_count<50;n_count++)

    {

    temp = SPI_Receiver_Dat();

    if(temp == 0xfe)break;

    }

    while(len--)

    {

    *dat = SPI_Receiver_Dat();

    dat++;

    }

    SPI_Send_Dat(0xff);

    SPI_Send_Dat(0xff);

    SSEL_D(1);

    SPI_Send_Dat(0xff);

    }

    /*******************************************************************************************************

    函数名:void write_mmc_dat(unsigned char *comm,unsigned char *dat,unsigned int len)

    功能:读sd写数据

    返回: 无

    *******************************************************************************************************/

    void MMCRdBolckOne(unsigned long addr,unsigned char *buffer,unsigned int len)

    {

    unsigned char command_dat[6];

    command_dat[0] = 0x40 + 17; // READ SINGLE BLOCK

    addr <<= 9; // addr*512,取512的整数倍

    command_dat[1] = (addr >> 24);

    command_dat[2] = (addr >> 16);

    command_dat[3] = (addr >> 8);

    command_dat[4] = (addr >> 0);

    command_dat[5] = 0;

    read_mmc_dat(command_dat,buffer,len);

    }

    #define SCK_IO(x) (x?(P1=0X0f):(P1=0X0f))//1->输出 0->输入

    #define MOSI_IO(x) (x?(P1=0X0f):(P1=0X0f))

    #define MISO_IO(x) (x?(P1=0X0f):(P1=0X0f))

    #define SSEL_IO(x) (x?(P1=0X0f):(P1=0X0f))

    #define SCK_D(x) (x?(P1|=0X01):(P1&=0XFE))

    #define MOSI_D(x) (x?(P1|=0X02):(P1&=0XFD))

    #define SSEL_D(X) (X?(P1|=0X08):(P1&=0XF7))

    #define MISO_I() (P1&0X04)

    /**********************************************

    模式零 spi 写数据

    ***********************************************/

    void SPI_Send_Dat(unsigned char dat)

    {

    unsigned char n;

    for(n=0;n<8;n++)

    {

    SCK_D(0);

    if(dat&0x80)MOSI_D(1);

    else MOSI_D(0);

    dat<<=1;

    SCK_D(1);

    }

    SCK_D(0);

    }

    /*********************************************

    模式零 spi 读数据

    *********************************************/

    unsigned char SPI_Receiver_Dat(void)

    {

    unsigned char n ,dat,bit_t;

    for(n=0;n<8;n++)

    {

    SCK_D(0);

    dat<<=1;

    if(MISO_I())dat|=0x01;

    else dat&=0xfe;

    SCK_D(1);

    }

    SCK_D(0);

    return dat;

    }

    void SPI_Init(void)

    {

    SCK_IO(1) ;

    MOSI_IO(1) ;

    MISO_IO(0) ;

    SSEL_IO(1) ;

    SSEL_D(1);

    MOSI_D(1);

    SCK_D(0);

    }

    1e48a8d211636708c5a5a4f5356e4ee6.png

    上行为写 下行为读

    code unsigned char leab[512] = {0x55,0xaa,2,3,4,5,6,7,8,9};

    unsigned char rmmc[16];

    main()

    {

    unsigned char i;

    Time_Count0_Init(0 ,1); //10ms时基

    start_time0(); //开启定时器0

    Time_Count1_Init(0,2); //用于产生9600串口波特率

    start_time1() ; //开启定时器1

    Uart_Config(1); //配置串口

    interrupt_Open(); //打开中断

    mmc_init();

    MMCWdBolckOne(0,leab);

    for(i=0;i<16;i++)

    Send_Data(leab[i]);

    MMCRdBolckOne(0x00,rmmc,10);

    for(i=0;i<16;i++)

    Send_Data(rmmc[i]);

    while (1);

    }

    展开全文
  • SD卡SPI接口驱动及FATFS的移植(Lu):硬件平台:任何MCU开发板(本笔记以STM32F103RB为平台)。 目的:将ARM 为mbed平台提供的SD卡SPI接口驱动移植到一般的MCU平台。
  • SD卡SPI模式中文资料

    2011-12-30 09:50:05
    本文详细介绍了,SD卡SPI模式下是如何进行数据传输。
  • SD卡spi读写流程

    2018-03-31 14:32:00
    SD卡spi读写流程 1.SD卡的命令格式: SD卡的指令由6字节(Byte)组成,如下: Byte1:0 1 x x x x x x(命令号,由指令标志定义,如CMD39为100111即16进制0x27,那么完整的CMD39第一字节为01100111,即0x27+0x40)...

    SD卡spi读写流程

    1.SD卡的命令格式:

    SD卡的指令由6字节(Byte)组成,如下:

    Byte1:0 1 x x x x x x(命令号,由指令标志定义,如CMD39为100111即16进制0x27,那么完整的CMD39第一字节为01100111,即0x27+0x40)
    Byte2-5:Command Arguments,命令参数,有些命令没有参数
    Byte6:前7位为CRC(Cyclic Redundacy Check,循环冗余校验)校验位,最后一位为停止位0

     

    2.SD卡的命令
    SD卡命令共分为12类,分别为class0到class11,

    不同的SDd卡,主控根据其功能,支持不同的命令集 如下:

    Class0 :(卡的识别、初始化等基本命令集)  

    CMD0 的CRC 是0x95, 
    其余命令的 CRC 无所谓。

    CMD0:复位SD 卡.

    CMD1:读OCR寄存器.

    CMD9:读CSD寄存器.

    CMD10:读CID寄存器.

    CMD12:停止读多块时的数据传输

    CMD13:读 Card_Status 寄存器

    Class2 (读卡命令集):

    CMD16:设置块的长度

    CMD17:读单块.

    CMD18:读多块,直至主机发送CMD12为止 .


    Class4(写卡命令集) :

    CMD24:写单块.

    CMD25:写多块.

    CMD27:写CSD寄存器 .

    Class5 (擦除卡命令集):

    CMD32:设置擦除块的起始地址.

    CMD33:设置擦除块的终止地址.

    CMD38: 擦除所选择的块.

    Class6(写保护命令集):

    CMD28:设置写保护块的地址.

    CMD29:擦除写保护块的地址.

    CMD30: Ask the card for the status of the write protection bits


    class7:卡的锁定,解锁功能命令集

    class8:申请特定命令集 。

    class10 -11 :保留

    其中 class1, class3,class9:SPI模式不支持

     

    SD卡中的响应有许多种,R1为标准响应,最为常用。与R1响应相似的还有R1b、R2和R3。R1响应在除SEND_STATUS外其它命令后发送,也是最高位先发送,共1个字节。R1的格式如图7所示。响应说明如下:

    0x01:空闲状态   //0表示空闲,1表示忙

    0x02:擦除错误

    0x04:命令错误

    0x08:CRC通信错误

    0x10:擦除次序错误

    0x20:地址错误

    0x40:参数错误

    MMC_write_Blocks: 
    1,初始化,进入SPI模式, 
    2,发CMD25命令, 
    3,连读2字节,好象读1字节也可以, 
    4,发start(发一字节0xfc到sd卡), 
    5,发一个数据块到sd卡, 
    6,发2字节0xff到sd卡,当作CRC16, 
    7,读忙信息,直到不忙, 
    8,如果所有数据没有发完,跳到4, 
    9,结束,发end(发一字节0xfb到sd卡), 
    10,发CMD12命令。 

    SMMC_read_Blocks: 
    1,初始化,进入SPI模式, 
    2,发CMD18命令, 
    3,循环读到0xfe字节, 
    4,读1个数据块到sd卡, 
    5,读2字节CRC16, 
    6,如果所有数据没有读完,跳到3, 
    7,结束,发CMD12命令。

    转载于:https://www.cnblogs.com/ransn/p/8682088.html

    展开全文
  • 电子-ALIENTEKMINISTM32SD卡SPIDMA实验.zip,单片机/嵌入式STM32-F0/F1/F2
  • 本文关键词:SD SPI CMD0 CMD55 ACMD41 初始化
  • SD卡 SPI时序

    千次阅读 2020-05-16 15:29:24
    SD卡SD卡指令响应设置为spi模式初始化读取数据写入数据 由于某芯片硬件不支持sd卡,无奈嫖sd卡底层,顺带了解一下sd卡(以前直接搬库)。 SD卡指令 sd卡一般为48位,最左边两位总是01,然后再试cmd,再接着指令参数...


    由于某芯片硬件不支持sd卡,无奈嫖sd卡底层,顺带了解一下sd卡(以前直接搬库)。

    SD卡指令

    sd卡指令形式
    sd卡一般为48位,最左边两位总是01,然后再试cmd,再接着指令参数,最后接上校验码和停止位1。
    下面是常用指令:

    • CMD0 : 卡复位。
    • CMD8 : SEND_IF_COND
    • CMD9 : 读取CSD数据
    • CMD10 : 读取CID数据
    • CMD12 : 停止数据传输
    • CMD16 : 设置处理扇区
    • CMD17 : 读取单个扇区
    • CMD18 : 读取连续扇区
    • CMD23 : 写入多个扇区时需要擦除
    • CMD24 : 写入单个扇区
    • CMD25 : 写入连续扇区

    响应

    每个指令都有他自己的响应,一共有3种形式,下面分别为R1,R2,R3。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    设置为spi模式

    spi模式初始化
    sd卡有两种模式:sd卡模式和spi模式,默认情况下为sd模式。需要软件复位:将spi的速度设置为400k,然后至少延时74个时钟

    初始化

    主要是CMD0, CMD1, CMD8, ACMD41, CMD58 and CMD59这几个指令。下表为指令以及响应。
    在这里插入图片描述
    初始化完成后就可以将spi速度拉高。

    读取数据

    单个扇区读取:

    1. 发送CMD17
    2. 接收数据
    3. 发送CMD12 停止传输

    多个扇区读取:

    1. 发送CMD18
    2. 接收数据
    3. 发送CMD12 停止传输

    写入数据

    流程和读取数据类似,只是变为发送CMD23、CMD24。

    参考资料:

    • http://wiki.seabright.co.nz/wiki/SdCardProtocol.html
    • https://ru.mouser.com/datasheet/2/196/Infineon-TriCore_Family_BR-ProductBrochure-v01_00–1605986.pdf
    展开全文
  • Verilog SD卡SPI模式初始化和读取Verilog代码及相应仿真模型,其中仿真模型仅支持 CMD0 CMD8 CMD55 CMD41完成SD卡初始化 及CMD17读取数据,供各位参考指正。
  • 转载:MSP430 SD卡SPI读写操作(1) —— SD卡命令 本节介绍SD卡常用命令,包括SD卡的初始化、读、写等操作的命令及其响应的介绍。 首先附上SD相关文档下载地址:https://www.sdcard.org快速导航: 一、SD卡...
  • SD卡SPI协议,详细描述了SD卡的读写方式。
  • sd卡有两种接口模式,一种是sd模式,另一种是spi模式。在spi模式下,有六根接口线与主机相连,5V电平 的51单片机通过电平转换可与3.3V电平的sd卡相连接。51单片机没有专门的spi总线,可以用51单片机的IO口来模 拟spi...
  • https://www.cnblogs.com/mr-bike/p/3546228.htmlSD卡为移动设备提供了安全的,大容量...一些廉价,低端的MCU,通过硬件(或软件)SPI就能和SD卡进行通信,实现大容量存储的要求,这也是SD卡的魅力所在。一、引脚定义...
  • SD卡SPI模式读写驱动程序

    热门讨论 2011-04-26 15:14:12
    sd卡工作于spi模式下的驱动程序文件,可以实现sd卡的扇区读写操作。
  • SD卡SPI模式下

    千次阅读 2018-08-04 15:04:02
    SD卡学习(SDIO和SPI模式) * * SD卡的操作模式:SD卡模式(SDIO)、SPI模式(默认为SD模式)。 其中SD卡模式的信号线有:CLK、CMD、DAT0-DAT3,6根线。 SPI模式的信号线有:CS、CLK、MISO(DATAOUT)、MOSI(DATAIN...
  • 自己按照2.0版本的SD卡协议,翻译的一份适用于SPI模式下的SD卡命令手册,包含标准命令CMD和特殊命令ACMD。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,454
精华内容 4,581
关键字:

sd卡spi