stm32_eval_sdio_sd.c版本4.5的文件头

来源:互联网 发布:唐门正太捏脸数据 编辑:程序博客网 时间:2024/06/07 06:54

网上有人说  stm32_eval_sdio_sd.c 的4.5版加库3.5版在移植FatFS时开不了4bit模式,不知真的假的

ourdev上有人讨论过了,野火说是4.5版的stm32_eval_sdio_sd.c 有bug,这个我不懂,先翻译个4.5版的文件头出来先。

这几天用stm32_eval_sdio_sd.c的4.4版加外设库3.5版移植了FatFS开了SDIO的DMA四位模式,很稳定,但是速度不快(USB Mass Storge),也就是读330KB/s,写100多KB/s的速度,看网上的人说是没开好缓冲器,后面再试试看。

这里顺便说说,那就是stm32_eval_sdio_sd.c的4.4版和4.3版完全是一样的,就是里面有一句注释改了而已,而4.5版改了好几个函数,而且注释得很混乱,建议还是用4.4的安全点。


******************************************************************************

  * @file    stm32_eval_sdio_sd.c
  * @author  MCD Application Team
  * @version V4.5.0
  * @date    07-March-2011
  * @brief   This file provides a set of functions needed to manage the SDIO SD
  *          Card memory mounted on STM32xx-EVAL board (refer to stm32_eval.h
  *          to know about the boards supporting this memory).
SD_LowLevel_Init() in stm32xx_eval.c
==========================================================================================
        如何使用这驱动
==========================================================================================
该文件执行SD卡读写的高通信协议层,需要STM32具有以下以下硬件资源(SDIO和GPIO),并在
stm32xx_eval.h文件中做了定义。而SD的初始化操作在stm32xx_eval.c文件中的SD_LowLevel_Init()
函数执行
可通过改变define来适应开发板硬件和SD_LowLevel_Init()函数

A -初始化和配置SD卡
===========================================================================================
初始化函数SD_Init()
SD_Init()包含两个操作
    1,初始化为400kHz,并检查SD卡类型,(可通过SDIO_INIT_CLK_DIV改变SDIO_CK,在eval.h中)
        不要超过400kHz
  *                     +---------------------------------------------+    
  *                     | SDIO_CK = SDIOCLK / (SDIO_INIT_CLK_DIV + 2) |
  *                     +---------------------------------------------+  
    2,得到SD卡的CID和CSD数据,CID和CSD数据由结构体SDCardInfo管理(卡容量,块大小)
    3,配置SD卡数据传输频率为24MHz。可通过在eval.h中的SDIO_TRANSFER_CLK_DIV设置改变
  *                     +---------------------------------------------+    
  *                     | SDIO_CK = SDIOCLK / (SDIO_INIT_CLK_DIV + 2) |
  *                     +---------------------------------------------+     
    SDIO_CK不要在high speed模式下进行25MHz和50MHz切换
    4,估计步骤2中的得到的数据选择相应的SD卡
    5,配置SD卡为4bit模式

B -SD卡读操作
============================================================================================
    -可用2个函数读SD卡:SD_ReadBlock()和SD_ReadMultiBlocks
                        只支持512byte块长度
    -SD_ReadBlock()只读一个块(512Byte),可采用DMA或polling模式。
         在stm32_eval_sdio_sd.h中通过SD_POLLING_MODE和SD_DMA_MODE进行开关
    -SD_ReadMultiBlocks()只读多个块(512byte块)
    -任何读操作必须following两个函数来确定DMA和SD卡的姿态
        -SD_ReadWaitOperation():确定DMA完成全部数据传输
        -SD_GetStatus():确定SD卡已经完成数据传输并且准备好读数据
    -DMA传输完成通过SDIO数据结束中断确定。User必须在SDIO_IRQHandler()中调用SD_ProcessIRQ()
     不要忘记通过NVIC使能SDIO_IRQ中断
C -SD卡写操作
======================================================================================
    -可用2个函数写SD卡:SD_WriteBlock()和SD_WriteMultiBlocks
                        只支持512byte块长度
    -SD_ReadBlock()只写一个块(512Byte),可采用DMA或polling模式。
         在stm32_eval_sdio_sd.h中通过SD_POLLING_MODE和SD_DMA_MODE进行开关
     默认使用DMA方式
    -SD_ReadMultiBlocks()只写多个块(512byte块)
    -任何写操作必须following两个函数来确定DMA和SD卡的姿态
        -SD_ReadWaitOperation():确定DMA完成全部数据传输
        -SD_GetStatus():确定SD卡已经完成数据传输并且准备好读数据
    -DMA传输完成通过SDIO数据结束中断确定。User必须在SDIO_IRQHandler()中调用SD_ProcessIRQ()
     不要忘记通过NVIC使能SDIO_IRQ中断
D -SD卡状态
=======================================================================================
    -在如何时候,你可以使用SD_GetStatus()函数来检查和获取SD卡状态
     该函数first检查SD卡是否连接然后得到SD卡的内部传输状态
    -你可以通过SD_SendSDStatus()函数得到SD卡的状态寄存器值

E -编程模型
=======================================================================================
  *             Status = SD_Init(); // Initialization Step as described in section A
  *               
  *             // SDIO Interrupt ENABLE
  *             NVIC_InitStructure.NVIC_IRQChannel = SDIO_IRQn;
  *             NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  *             NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  *             NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  *             NVIC_Init(&NVIC_InitStructure);
  *             
  *             // Write operation as described in Section C
  *             Status = SD_WriteBlock(buffer, address, 512);
  *             Status = SD_WaitWriteOperation();
  *             while(SD_GetStatus() != SD_TRANSFER_OK);
  *             
  *             Status = SD_WriteMultiBlocks(buffer, address, 512, NUMBEROFBLOCKS);
  *             Status = SD_WaitWriteOperation();
  *             while(SD_GetStatus() != SD_TRANSFER_OK);     
  *             
  *             // Read operation as described in Section B
  *             Status = SD_ReadBlock(buffer, address, 512);
  *             Status = SD_WaitReadOperation();
  *             while(SD_GetStatus() != SD_TRANSFER_OK);
  *             
  *             Status = SD_ReadMultiBlocks(buffer, address, 512, NUMBEROFBLOCKS);
  *             Status = SD_WaitReadOperation();
  *             while(SD_GetStatus() != SD_TRANSFER_OK);            
  *               
  *                                     
  *          STM32 SDIO Pin assignment
  *          =========================    
  *          +-----------------------------------------------------------+
  *          |                     Pin assignment                        |
  *          +-----------------------------+---------------+-------------+
  *          |  STM32 SDIO Pins            |     SD        |    Pin      |
  *          +-----------------------------+---------------+-------------+
  *          |      SDIO D2                |   D2          |    1        |
  *          |      SDIO D3                |   D3          |    2        |
  *          |      SDIO CMD               |   CMD         |    3        |
  *          |                             |   VCC         |    4 (3.3 V)|
  *          |      SDIO CLK               |   CLK         |    5        |
  *          |                             |   GND         |    6 (0 V)  |
  *          |      SDIO D0                |   D0          |    7        |
  *          |      SDIO D1                |   D1          |    8        |  
  *          +-----------------------------+---------------+-------------+  
  *