Main Page | Modules | Class Hierarchy | Alphabetical List | Data Structures | File List | Data Fields | Globals | Related Pages

SD - Code example
[SD - Secure Digital Library]

 #include <otMalloc.h>
 #include <otSD.h>
 #include <otSerial.h>
 #include <otTimer.h>
 #include <otPrintf.h>
 
 void setup()
 {
        // Setup the UART0 used by printf
        UartEnableSignals(UART0);
        UartSetBaud(UART0, 115200);
        // Init printf
        setStdout(4096, UART0); // printf output is now directed on UART0
        _initMalloc();
 }
 
 void loop()
 {
        U32     * buff, n = 16384, size = n * 4, st, et, sectors = size / 512;
        int     ci, i, ii;
        bool    verbose = true, multiBlock = true;
        U32     rwMaxBlocks;
        int     busWidth = 4;
 
        DelayMs(2000);  // Wait terminal start
        
        rwMaxBlocks = 0;
        ci = SdOpen(TIMER0);
        if(ci >= SD_MMC_CARD_TYPE_SD_V1X && ci < UNUSABLE_CARD)
        {
                // Check single write block ********************************************
                if(!SdSetMaxBusWidth(busWidth))
                {
                        buff = (U32 *) _malloc(size);    // 512 sectors of 512 bytes
                        // Init the buffer
                        for(i = 0; i < n; i++)
                                buff[i] = i;
                        // Write the buffer
                        st = TimerGetCounts(TIMER0);
                        for(i = 0; i < sectors; i++)
                                if(SdWriteBlock(i, &buff[i * 128])) break;
                        et = TimerGetCounts(TIMER0);
                        if(sectors == i)
                        {
                                if(verbose)
                                {
                                        et = ElapsedTimeUs(st, et) / 1000;
                                        printf("Elapsed write time: %5d ms, %4d Kbyte/s\n", et, size / et);
                                        printf("SD read begin ...\n");
                                }
                                // Read the buffer
                                st = TimerGetCounts(TIMER0);
                                for(i = 0; i < sectors; i++)
                                        if(SdReadBlock(i, &buff[i * 128])) break;
                                et = TimerGetCounts(TIMER0);
                                if(sectors == i)
                                {
                                        if(verbose)
                                        {
                                                et = ElapsedTimeUs(st, et) / 1000;
                                                printf("Elapsed read  time: %5d ms, %4d Kbyte/s\n", et, size / et);
                                                printf("SD compare begin ... ");
                                        }
                                        // Compare the buffer
                                        for(i = 0; i < n; i++)
                                                if(buff[i] != i)
                                                        break;
                                        if(i < n)
                                        {
                                                if(verbose) printf("\nR/W error found %04x instead of %04x\n", buff[i], i);
                                                ci = -1;
                                        }
                                        else
                                                if(verbose) printf("Single write block OK\n");
                                }
                                else
                                {
                                        if(verbose) printf("Fail on reading [%d].\n", i);
                                        ci = -1;
                                }
                        }
                        else 
                        {
                                if(verbose) printf("Fail on writing [%d].\n", i);
                                ci = -1;
                        }
                        _free(buff);
                        // Check multi write block *****************************************
                        if(ci >= 0 && multiBlock)
                        {
                                multiBlock = false;
                                buff = (U32 *) _malloc(65536);
                                for(i = 512; i < 65536; i += 512)
                                {
                                        size = i;
                                        n = size / 4;
                                        sectors = size / 512;
                                        
                                        // Init the buffer
                                        for(ii = 0; ii < n; ii++)
                                                buff[ii] = ii;
                                        if(verbose) printf("Perform multiple block R/W test ... [%6u bytes]\n", i);
                                        st = TimerGetCounts(TIMER0);
                                        if(!SdWriteMultipleBlocks(0, buff, sectors))
                                        {
                                                et = TimerGetCounts(TIMER0);
                                                et = ElapsedTimeUs(st, et) / 1000;
                                                if(verbose) printf("Elapsed write time: %5d ms, %4d Kbyte/s [%6u bytes]\n", et, size / et, i);
                                                st = TimerGetCounts(TIMER0);
                                                if(!SdReadMultipleBlocks(0, buff, sectors))
                                                {
                                                        et = TimerGetCounts(TIMER0);
                                                        et = ElapsedTimeUs(st, et) / 1000;
                                                        if(verbose)
                                                        {
                                                                printf("Elapsed read  time: %5d ms, %4d Kbyte/s [%6u bytes]\n", et, size / et, i);
                                                                printf("SD compare begin ... ");
                                                        }
                                                        // Compare the buffer
                                                        for(ii = 0; ii < n; ii++)
                                                                if(buff[ii] != ii)
                                                                        break;
                                                        if(ii < n)
                                                        {
                                                                if(verbose) printf("\nR/W error found %04x instead of %04x\n", buff[ii], ii);
                                                                break;
                                                        }
                                                        else 
                                                        {
                                                                if(verbose) printf("OK\nSD check done.\n");
                                                                rwMaxBlocks = i;
                                                                multiBlock = true;
                                                        }
                                                }
                                                else
                                                {
                                                        if(verbose) printf("Fail in multiple read block\n");
                                                        break;
                                                }
                                        }
                                        else
                                        {
                                                if(verbose) printf("Fail in multiple write block\n");
                                                break;
                                        }
                                        DelayMs(100);
                                }
                                _free(buff);
                                buff = 0;
                        }
                }
                else 
                {
                        ci = -1;
                        printf("Error setting bus width\n");
                }
        }
        else printf("SD not identified\n");
        DelayMs(500);
        SdClose();
        HIBE;
 }
footer
otStudio - Library Reference - (C) 2020-23 Officina Turini, All Rights Reserved
Document built with Doxygen 1.4.0