查看: 1182|回复: 0

基于SPI读写SD卡的标准sdcard_spi组件

[复制链接]
  • TA的每日心情
    奋斗
    2018-10-29 22:48
  • 签到天数: 731 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2014-12-24 09:01:18 | 显示全部楼层 |阅读模式
    分享到:


    sdcard_spi是一个基于SPI通信接口操作SD卡的单片机软件。用户只需要在自己使用的平台上实现基本的SPI驱动,并注册到sdcard_spi组件中,即可通过sdcard_spi提供的API对SD卡进行读写操作。对于基于SPI总线操作SD卡的协议已经在sdcard_spi组件内部实现,用户不需要再考虑。基于sdcard_spi组件,可以非常容易地同fatfs、znFAT等嵌入式文件系统对接,在应用程序中使用文件系统方便地管理海量的SD卡存储空间。
    sdcard_spi组件使用纯C编写,遵循MISRA 2004标准,具有非常好的可移植性。该组件已在Freescale KL25、Freescale K64、Freescale K60,ST STM32F103RBT6等平台上测试通过,工作稳定。
    这里预览一下sdcard_spi的头文件:
    sdcard_spi.h
    /* sdcard_spi.h */#ifndef __SDCARD_SPI_H__#define __SDCARD_SPI_H__#include <stdint.h>#include <stdbool.h>#define SDC_BLOCK_SIZE_BYTE     (512U)typedef struct{    void    (*SPI_InitFunc)(void);    uint8_t (*SPI_SwapByteFunc)(uint8_t txData);    void    (*SPI_SetBaudrateFunc)(uint32_t baudrate);    void    (*SPI_AssertCsFunc)(bool enable);    uint32_t Baudrate;} SDC_SPICallback_T;typedef enum{    eSDCCardUnknown    = 0U,    eSDCCardTypeOfSDv2 = 1U,    eSDCCardTypeOfSDHC = 2U} SDC_CardType_T;typedef struct{    SDC_CardType_T CardType;    uint32_t CardBlkCnt;} SDC_Info_T;bool SDC_Install(const SDC_SPICallback_T *ioPtr);bool SDC_InitCard(SDC_Info_T *infoPtr);bool SDC_WriteBlock(uint32_t blkIdx, uint8_t *txPtr);bool SDC_ReadBlock(uint32_t blkIdx, uint8_t *rxPtr);uint32_t SDC_WriteBlocks(uint32_t blkIdx, uint32_t blkCnt, uint8_t *txPtr);uint32_t SDC_ReadBlocks(uint32_t blkIdx, uint32_t blkCnt, uint8_t *rxPtr);#endif /* __SDCARD_SPI_H__ */目前,sdcard_spi还处于完善阶段。除了sdcard_spi实现部分的内容暂时以库的方式开放,其它包括demo程序的源代码全部开放,以提供给广大电子工程师和单片机爱好者进行测试。
    使用简要说明及目录介绍:
          

    • lib目录下存放了sdcard_spi的库文件,目前提供使用keil创建的库文件,分别支持ARM Cortex-M0+\M3\M4内核的设备。在使用时,直接把"*.lib"文件当成"*.c"源文件添加到工程中编译链接即可。注意,在应用中一定要包含头文件"sdcard_spi.h"才能调用sdcard_spi的API。
    • app目录下存放了demo的源文件,在自己的平台上移植sdcard_spi成功之后,直接使用这里的源文件作为应用程序即可编译运行,作为测试功能。这个demo覆盖了sdcard_spi的所有API,也可以作为样例程序作为使用参考。
        测试工程组织示意如下:



        测试程序运行开始界面如下:

                   

    • port目录下存放了移植相关的代码,用户可以借鉴这里的写法进行移植。
    特别提醒:

    • 单块操作API的返回是布尔类型,表示操作成功与否。
    • 多块操作API的返回值是没有成功读写的块数,返回0说明操作成功,非0则表示还剩下这些块没有读写成功。
    时间仓促,所以相关的文档还在完善过程总,说明写得比较简单,但是通过阅读样例代码也很容易理解API的功能。
    附加保存在论坛的帖子中提供下载:
    https://www.eeboard.com/bbs/thread-40127-1-1.html
    欢迎广大电子工程师和单片机爱好者在使用后提供宝贵意见和建议。
    suyong_yq@126.com
    2014年11月
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-4-20 17:00 , Processed in 0.113650 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.