PSOC5LPにてSDカードを再起動させるとファイルが開けない

Tip / ログイン to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
lock attach
Attachments are accessible only for community members.
ogyoc_4074066
Level 2
Level 2
5 replies posted 5 sign-ins First solution authored

私はPSOC5LPにてSDカードを使用したプログラムを書いています。

emfileとFS.hを使用しています。

できる限り省電力にしたいため、SDカードの電源も制御しようとしています。

そのため4端子の3.3Vレギュレータを用いてsleep前にSDカードの電源を切っています。

また、SPIのCS端子もLOWに設定するようにプログラムを書きました。

 

 

 

 

 

#include <project.h>
#include <FS.h>
#include "stdio.h"

FS_FILE * pFile;

int main()
{
    CyGlobalIntEnable; /* Enable global interrupts. */
    CONS_Start();
    FS_Init();
    while(1){
        SD_Power_Write(1);
        emFile_SPI0_CS_Write(1);
        pFile = FS_FOpen("\\data\\4.csv", "a");
        if(pFile)
        {
            if(0 == FS_FClose(pFile))
            {
                CONS_PutString("File was closed\r\n");
            }else
            {
                CONS_PutString("Failed to close\r\n");
            }
        }else{
            CONS_PutString("Failed to write file\n");
        }
        SD_Power_Write(0);
        emFile_SPI0_CS_Write(0);
        CyDelay(5000);
    }
    return 0;
}

 

 

 

 

 

 こちらのプログラム実行結果が下記の内容です。

 

 

 

 

 

Start
File was closed
Failed to write file
Failed to write file
Failed to write file
Failed to write file
Failed to write file
Failed to write file

 

 

 

 

 

 電源を一度切るとその後はファイルを開くことができません。

電源を切る前に実行すべきメソッドがあるのでしょうか?

それともそもそも電源を切ってはならないのでしょうか?

 

追記:

回路図と使用部品を記します。

microSDソケット:https://akizukidenshi.com/catalog/g/gK-05488/

SD電源用4端子レギュレータ:https://akizukidenshi.com/catalog/g/gI-09261/

主電源DCDC(3.3V出力):https://strawberry-linux.com/catalog/items?code=12060

0 件の賞賛
1 解決策

while文の中のはじめにFS_Initを入れて毎回初期化するように変更を加えましたが結果は変わりませんでした。

 

今回の標題にある問題については別のライブラリを使用することで解決いたしました。

emfileとFS.hを使用した場合は未だに解決しておりません。

https://github.com/hackingchips/PSoC_FatFs 

#include <project.h>
#include <stdlib.h>

#include "..\..\..\PSoC_FatFs_Library\diskio.h"
#include "..\..\..\PSoC_FatFs_Library\ff.h"

char uartInputBuffer[255];
uint8 uartIBufferPtr = 0;

void Test_B();

int main()
{
    char uartchar;

    /* Start serial port. */
    UART_Start();
    
    /* Start SPI bus. */
    SPI_Start();
    SPI_SS_Write(1);

    for(;;)
    {
        Test_B();
        SD_Power_Write(0);
        SPI_SS_Write(0);
        CyDelay(5000);
        SD_Power_Write(1);
        SPI_SS_Write(1);
    }
}

void Test_B()
{
    FATFS fatFs;
    FIL fileO;
    DIR directoryO;
    FILINFO fileInfo;
    uint8 resultF;
    UINT		written;
    
    char str[100];
    uint32 freeclusters, freesectors, totalsectors;

    /* Mount sdcard. */
    resultF = f_mount(&fatFs, "", 1);
    
    if (resultF == RES_OK)
    {   
        UART_PutString("\n...Creating file 'testtxt.txt' inside 'testb2' directory.");
        resultF = f_open(&fileO, "testtxt.txt", FA_OPEN_ALWAYS | FA_READ | FA_WRITE);
        
        if (resultF == FR_OK)
        {
            UART_PutString("...writing\n");
            f_lseek(&fileO, f_size(&fileO));
            f_write(&fileO,"write test23\n",11,&written);
            
    		resultF = f_close(&fileO);
            
            UART_PutString("...end writing\n");

    	} 
        else 
        {
            return;
        }
    }  
}

 

元の投稿で解決策を見る

0 件の賞賛
9 返答(返信)
AikoO_51
Moderator
Moderator
Moderator
100 sign-ins First question asked 50 solutions authored

emFile自体にはStart/StopAPIはありませんが、外部メモリのSDカードに対してSPIを接続しているため、SPIはsleep modeがはじまる前にStop APIWake-up後にStart APIを呼び出す必要があります。

Aiko Ohtaka
Infineon Technologies
0 件の賞賛

テスト的に実行しているためスリープモードには入らずただdelayしています。

念のためDelayの前後にSPIのStop,Startを入れてみましたが相変わらず再起動後はファイルが開けません。

信号を見ると再起動後はMISOがHIGHから変化が無いためSDカードからの返答がない?

#include <project.h>
#include <FS.h>
#include "stdio.h"

FS_FILE * pFile;

int main()
{
    CyGlobalIntEnable; /* Enable global interrupts. */
    CONS_Start();
    FS_Init();
    while(1){
        RF_Power_Write(1);
        emFile_SPI0_CS_Write(1);
        pFile = FS_FOpen("\\data\\4.csv", "a");
        if(pFile)
        {
            if(0 == FS_FClose(pFile))
            {
                CONS_PutString("File was closed\r\n");
            }else
            {
                CONS_PutString("Failed to close\r\n");
            }
        }else{
            CONS_PutString("Failed to write file\n");
        }
        RF_Power_Write(0);
        emFile_SPI0_CS_Write(0);
        emFile_SPI0_Stop();
        CyDelay(5000);
        emFile_SPI0_Start();
    }
    return 0;
}

 

0 件の賞賛

電源を入れなおした後は、常時FS_Initで初期化をしなおす処理に変えてみてください。

FS_Initの内部ではSD/MMCSPIドライバーも構築しています。

電源を切ることで、ドライバーの再設定が必要となる場合があります。

FSのAPIについて詳細はthe emFile User Guideを参照してください。

以上ご確認お願いします。

Aiko Ohtaka
Infineon Technologies
0 件の賞賛

while文の中のはじめにFS_Initを入れて毎回初期化するように変更を加えましたが結果は変わりませんでした。

 

今回の標題にある問題については別のライブラリを使用することで解決いたしました。

emfileとFS.hを使用した場合は未だに解決しておりません。

https://github.com/hackingchips/PSoC_FatFs 

#include <project.h>
#include <stdlib.h>

#include "..\..\..\PSoC_FatFs_Library\diskio.h"
#include "..\..\..\PSoC_FatFs_Library\ff.h"

char uartInputBuffer[255];
uint8 uartIBufferPtr = 0;

void Test_B();

int main()
{
    char uartchar;

    /* Start serial port. */
    UART_Start();
    
    /* Start SPI bus. */
    SPI_Start();
    SPI_SS_Write(1);

    for(;;)
    {
        Test_B();
        SD_Power_Write(0);
        SPI_SS_Write(0);
        CyDelay(5000);
        SD_Power_Write(1);
        SPI_SS_Write(1);
    }
}

void Test_B()
{
    FATFS fatFs;
    FIL fileO;
    DIR directoryO;
    FILINFO fileInfo;
    uint8 resultF;
    UINT		written;
    
    char str[100];
    uint32 freeclusters, freesectors, totalsectors;

    /* Mount sdcard. */
    resultF = f_mount(&fatFs, "", 1);
    
    if (resultF == RES_OK)
    {   
        UART_PutString("\n...Creating file 'testtxt.txt' inside 'testb2' directory.");
        resultF = f_open(&fileO, "testtxt.txt", FA_OPEN_ALWAYS | FA_READ | FA_WRITE);
        
        if (resultF == FR_OK)
        {
            UART_PutString("...writing\n");
            f_lseek(&fileO, f_size(&fileO));
            f_write(&fileO,"write test23\n",11,&written);
            
    		resultF = f_close(&fileO);
            
            UART_PutString("...end writing\n");

    	} 
        else 
        {
            return;
        }
    }  
}

 

0 件の賞賛

FS.hで対応できなかった件については更に調査が必要ですが、

本件で問い合わせいただいた内容については、ご提示いただいたライブラリにより解決したということで宜しいでしょうか?

コードを共有していただきありがとうございました。

Aiko Ohtaka
Infineon Technologies
0 件の賞賛

はい。

FS.hで対応できなかった件については腑に落ちないですが…

お付き合いいただきありがとうございました。m(_ _"m)

0 件の賞賛
BiBi_1928986
Level 7
Level 7
First comment on blog 500 replies posted 250 replies posted

Hello.

SD card and voltage regulators cannot turn ON in microseconds.
Add a delay after turning regulator ON of 50ms to try.

 

0 件の賞賛

Thanks

レギュレータのpowerをONした後に50msのDelayを入れましたが結果は変わりませんでした。😭

0 件の賞賛

本件、オリジナル問題は解決されているようなのでスレッド自体は一旦ロックさせて頂きます。

もしまたお問い合わせがある場合、新たにスレッドを起票して頂ければと思います。

 

0 件の賞賛