- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
私は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
解決済! 解決策の投稿を見る。
- ラベル:
-
PSOC5 LP MCU
- タグ:
- emfile
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
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;
}
}
}
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
emFile自体にはStart/StopのAPIはありませんが、外部メモリのSDカードに対してSPIを接続しているため、SPIはsleep modeがはじまる前にStop APIをWake-up後にStart APIを呼び出す必要があります。
Infineon Technologies
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
テスト的に実行しているためスリープモードには入らずただ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;
}
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
電源を入れなおした後は、常時FS_Initで初期化をしなおす処理に変えてみてください。
FS_Initの内部ではSD/MMCのSPIドライバーも構築しています。
電源を切ることで、ドライバーの再設定が必要となる場合があります。
FSのAPIについて詳細はthe emFile User Guideを参照してください。
以上ご確認お願いします。
Infineon Technologies
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
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;
}
}
}
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
FS.hで対応できなかった件については更に調査が必要ですが、
本件で問い合わせいただいた内容については、ご提示いただいたライブラリにより解決したということで宜しいでしょうか?
コードを共有していただきありがとうございました。
Infineon Technologies
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
はい。
FS.hで対応できなかった件については腑に落ちないですが…
お付き合いいただきありがとうございました。m(_ _"m)
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
Hello.
SD card and voltage regulators cannot turn ON in microseconds.
Add a delay after turning regulator ON of 50ms to try.
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
Thanks
レギュレータのpowerをONした後に50msのDelayを入れましたが結果は変わりませんでした。😭
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
本件、オリジナル問題は解決されているようなのでスレッド自体は一旦ロックさせて頂きます。
もしまたお問い合わせがある場合、新たにスレッドを起票して頂ければと思います。