使用TivaC MCU tm4c129xnczad微控制器将数据写入同一SD卡中的2个不同的胖卷

omjgkv6w  于 2023-06-05  发布在  其他
关注(0)|答案(1)|浏览(146)

我有一个tm4c129xnczad微控制器与SD卡连接到它通过SPI3
1Gb大小的SD卡有2个卷,每个卷大约500Mb
我想将数据写入文件到每个卷我可以访问第一个但第二个卷是无法通过代码访问我所以我做的步骤是
1.首先,我开始挂载2个卷,以便

EIO_vmturnSDCardPowerON();
    UTIL_vNonOSDelayMiliSeconds(200);/* this delay is guarantee the proper rest for the SD card */
    /* Mount and register the FSHELL Card */
    SDSPI_Params_init(&objstrsdspiParameters);
    objsdspiHandle = SDSPI_open(Board_SDSPI0, DRIVE_NUM, &objstrsdspiParameters);
    if(objsdspiHandle == STD_NULL)
    {
        FSHELL_vmLogError0(&objstrFSHELLModuleInfoType, "Can't mount SD card");
    }
    else
    {
        FSHELL_vmLogActivity1(&objstrFSHELLModuleInfoType, "SD card is mounted Drive:%u", DRIVE_NUM);
        bSdMountState = STD_TRUE;
    }
    objsdspiHandle = SDSPI_open(1, 1, &objstrsdspiParameters);
    if(objsdspiHandle == STD_NULL)
    {
        FSHELL_vmLogError0(&objstrFSHELLModuleInfoType, "Can't mount SD card");
    }
    else
    {
        FSHELL_vmLogActivity1(&objstrFSHELLModuleInfoType, "SD card is mounted Drive:%u", 1);
        bSdMountState = STD_TRUE;
    }

1.然后我使用studio.h(fopen,fclose,fwrite)函数中的标准文件API

#include <stdio.h>

function (){
...
INT8S *ps8ProgFilePath = "fat:0:/ProgBlocks/Blocks.txt";
INT8S *ps8ProgFilePath_1 = "fat:1:/ProgBlocks/Blocks.txt";
FRESULT objFRESULT = FR_DISK_ERR;
FILE *pSourceFile;
...

objFRESULT = f_mkdir("/ProgBlocks");
if((objFRESULT == FR_OK)||(objFRESULT == FR_EXIST)) /* if folder is created or alredy existed */
{
pSourceFile = fopen((const INT8S*)ps8ProgFilePath, "a");
if(pSourceFile == STD_NULL)
{
SCFGM_vmLogError1(&objstrSCFGMModuleInfoType, "\"%s\" could not be created", (INT32U)ps8ProgFilePath);
}
else
{
u32NumBytesWritten = fwrite((INT8S*)ps8Data,1,(MAX_BLOCK_ID_STRING+(u32BlockLen*3)),pSourceFile);
if (u32NumBytesWritten != (MAX_BLOCK_ID_STRING+(u32BlockLen*3)))
{
SCFGM_vmLogError1(&objstrSCFGMModuleInfoType, "\"%s\"Err wrt Blk", (INT32U)ps8ProgFilePath);
}
}
if(fclose(pSourceFile) != 0)
{
SCFGM_vmLogError1(&objstrSCFGMModuleInfoType, "\"%s\" could not be Close", (INT32U)ps8ProgFilePath);
}
}
....
}

因此,我可以访问第一个卷“fat:0:”,但不能以同样的方式写入甚至访问第二个卷“fat:1:”
因此,问题是我甚至可以访问同一SD卡内的2卷,以及如何访问?

fhity93d

fhity93d1#

我想访问我的SD卡上的两个卷,因为我认为这将解决SD卡上负责阅读写内存段的小MCU单元的一个问题。有时,这个单元在从卡中阅读时失败,并在很短的时间后变得可访问。我没有过多地研究这个问题,因为它会涉及到FatFS chan版本内部的大量调试,其中有很多我不感兴趣的小细节。CMD 7在读取功能时出现问题,响应不符合预期,因此读取功能在一定时间内失败,通常为7-9 ms,我尝试了3或5次。我更改了代码,反复打开文件,直到它变得可访问,然后继续阅读数据。然而,这对我的情况是不够的,因为我正在播放一个需要运行时数据才能播放的VLSI芯片上的消息。使用这种方法,在播放消息时,9毫秒的延迟并不明显
下面是Trials方法的代码片段

INT64U  start,end;
start = UTI_u64GetMilliSeconds();
do {
    objstrAllDeviceInfo[objenumVLSIChipIDType].pAudioFile = \
                               fopen((constINT8S*)ps8FileName, "rb");
    if(objstrAllDeviceInfo[objenumVLSIChipIDType].pAudioFile != STD_NULL)
    {
        break;
    }
    else
    {
        u32OpenTrials++;
    }
}while(u32OpenTrials < 15);
end = UTI_u64GetMilliSeconds();
VLSI_vmLogTA2(&objstrVLSIModuleInfoType, "opened file in %d ms with %d trials", (end - start), u32OpenTrials);

相关问题