cancel
Showing results for 
Search instead for 
Did you mean: 

PSoC 5, 3 & 1 MCU

ogyoc_4074066
New Contributor II

私は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 Likes
1 Solution
ogyoc_4074066
New Contributor II

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;
        }
    }  
}

 

View solution in original post

0 Likes
9 Replies
AikoO_51
Employee

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

Aiko Ohtaka
Infineon Technologies
0 Likes
ogyoc_4074066
New Contributor II

テスト的に実行しているためスリープモードには入らずただ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 Likes
AikoO_51
Employee

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

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

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

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

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

Aiko Ohtaka
Infineon Technologies
0 Likes
ogyoc_4074066
New Contributor II

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;
        }
    }  
}

 

View solution in original post

0 Likes
AikoO_51
Employee

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

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

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

Aiko Ohtaka
Infineon Technologies
0 Likes
ogyoc_4074066
New Contributor II

はい。

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

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

0 Likes
BiBi_1928986
Valued Contributor

Hello.

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

 

0 Likes
ogyoc_4074066
New Contributor II

Thanks

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

0 Likes
TakashiM_61
Moderator
Moderator

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

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

 

0 Likes