网上有人说 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 |
* +-----------------------------+---------------+-------------+
*