天嵌 ARM开发社区

 找回密码
 注册
查看: 2025|回复: 3

求高手提供一个SD卡写入和读出变长字符串的函数

[复制链接]
dainter 发表于 2011-4-1 20:49:35 | 显示全部楼层 |阅读模式
SD_MMC.c中测试SD卡模块有一块和多块读出的函数使用,但是写入呢?
求指教
 楼主| dainter 发表于 2011-4-16 15:45:20 | 显示全部楼层
有人会吗?自己顶
qq371833846 发表于 2012-5-12 13:21:00 | 显示全部楼层
/**********************************************************************************
功  能:该函数用于向SD卡的一个数据块写入数据
参  数:
U32  Addr  被写块的起始地址
U32* TxBuffer 用于发送数据的缓冲区
返回值:
0 数据写入操作失败
1 数据写入操作成功
举  例:
在主调函数中定义一个数组作为发送缓冲区,如U32 Tx_buffer[BlockSize];
然后开始调用Write_One_Block(addr,Tx_buffer);
**********************************************************************************/
U8 Write_One_Block(U32 Addr,U32* TxBuffer)
{
        U16 i=0;
        U32 status = 0;
        U16 BlockSize; //定义块大小
       
        BlockSize = (1<<(SDCard_BlockSize-2)); //以Word为单位

        rSDIDTIMER=0x7fffff;                // Set timeout count
        rSDIBSIZE=0x200;                        // 512byte(128word)
        rSDIFSTA = rSDIFSTA|(1<<16); // FIFO reset
        rSDIDCON = (1<<SDCard_BlockSize)|(3<<12)|(1<<14)|(1<<16)|(1<<17)|(1<<20)|(2<<22);
        rSDIDCON = (1<<SDCard_BlockSize)|(3<<12)|(1<<14)|(1<<16)|(1<<17)|(1<<20)|(2<<22);
       
        if(CMD24(Addr)!=1) //发送写单块操作指令
                return 0;
       
        while(i<BlockSize)
        { //开始传递数据到缓冲区
                status=rSDIFSTA;
                if((status&0x2000)==0x2000)
                { //如果发送FIFO可用,即FIFO未满
                        rSDIDAT=*TxBuffer;
                        TxBuffer++;
                        i++;
                }
        }
        rSDIDCON = rSDIDCON&~(7<<12);

        do
        { //等待数据发送结束
                status=rSDIDSTA;
        }while((status&0x2)==0x2);
        rSDIDSTA = status;

        if((status&0xFC)!=0x00)
        {
                  return 0;
        }
        else
        {
                  return 1;
        }
}


/**********************************************************************************
功 能:该函数用于向 SD 卡的多个数据块写入数据
参 数:
        U32 Addr 被写块的起始地址
        U32 DatSize 期待被写入数据的数目,以 Word 为单位
        U32* TxBuffer 待发送数据的缓冲区
返回值:
        0 数据写入操作失败
        1 数据写入操作成功
举 例:
在主调函数中定义一个数组作为发送缓冲区,如 U32 Tx_buffer[BlockSize];
然后开始调用 Write_Mult_Block(addr,DatSize,Tx_buffer);
**********************************************************************************/
U8 Write_Mult_Block(U32 Addr,U32 DatSize,const S8* TxBuffer)
{
        U16 i = 0;
        U32 status = 0;

        rSDIDTIMER=0x7fffff;                // Set timeout count
        rSDIBSIZE=0x200;                        // 512byte(128word)
        rSDIFSTA = rSDIFSTA|(1<<16); // FIFO reset
        rSDIDCON = (1<<SDCard_BlockSize)|(3<<12)|(1<<14)|(1<<16)|(1<<17)|(1<<20)|(2<<22);
        while((rSDIDCON&0x4000)!=0x4000)
        {
                rSDIDCON = rSDIDCON| 0x4000;
        }
       
        if(CMD25(Addr)!=1)//发送写多块操作指令
                return 0;

        while(i<DatSize)
        {//开始传递数据到缓冲区
                status = rSDIFSTA;
                if((status&0x2000)==0x2000)
                {//如果发送 FIFO 可用,即 FIFO 未满
                        rSDIDAT = *TxBuffer;
                        TxBuffer++;
                        i++;
                }
        }
        rSDIDCON = rSDIDCON&~(7<<12);
       
        while(CMD12()!=1);//发送结束指令
       
        do
        {//等待数据发送结束
                status = rSDIDSTA;
        }while((status&0x2)==0x2);
       
        rSDIDSTA = status;
       
        if((status&0x89)!=0x00)
        {

                return 0;
        }
        else
        {
                return 1;
        }
}
芸纤&飘羽-- 发表于 2012-10-22 21:31:29 | 显示全部楼层
好贴怎么没有人顶
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2024-6-4 17:38 , Processed in 1.046875 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表