dainter 发表于 2011-4-1 20:49:35

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

SD_MMC.c中测试SD卡模块有一块和多块读出的函数使用,但是写入呢?
求指教

dainter 发表于 2011-4-16 15:45:20

有人会吗?自己顶

qq371833846 发表于 2012-5-12 13:21:00

/**********************************************************************************
功能:该函数用于向SD卡的一个数据块写入数据
参数:
U32Addr被写块的起始地址
U32* TxBuffer 用于发送数据的缓冲区
返回值:
0 数据写入操作失败
1 数据写入操作成功
举例:
在主调函数中定义一个数组作为发送缓冲区,如U32 Tx_buffer;
然后开始调用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;
然后开始调用 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

好贴怎么没有人顶
页: [1]
查看完整版本: 求高手提供一个SD卡写入和读出变长字符串的函数