2

私は ZedBoard を使用しており、SD カードに書き込もうとしています。私は組み込みシステムに取り組んでおり、OS を持っていません。ベアメタルを実行しています。

SD カードから問題なく読み取ることができます。問題ありません。

しかし、読み込もうとすると、奇妙な動作が発生します。

  • f_write は FR_OK を返します
  • bw (書き込まれたバイト数) 変数が正しい
  • ファイルが作成されます(PCからSDカードを読み込むとわかります)

しかし、ファイルを読み取ると、空です。

これが私のコードです:

void WriteFile(char const* fileName, char* buffer, size_t size)
{
    FIL file;
    FATFS fs;
    UINT bw;
    FRESULT fr;

    f_mount(&fs, "", 0);
    f_open(&file, fileName, FA_WRITE | FA_CREATE_ALWAYS);
    fr = f_write(&file, buffer, size, &bw);
    if (size != bw || fr != FR_OK)
        PRINT(("Error in writing !\n"));
    f_close(&file);
    f_mount(NULL, "", 0);
}

そして、私はこのようにメソッドを呼び出します:

 WriteFile("Hello.txt", "Hello World !", 13);

私が間違っていることは何ですか?

4

6 に答える 6

2

バッファをフラッシュするだけです (f_sync):

        FRESULT result;
        FATFS fs;
        FIL file;

        const char string[] = "Hallo world\0";
        uint16_t written = 0;
        FILINFO fno;

        /* Open or create a log file and ready to append */
        printf("mount:%d",f_mount(&fs, "", 1));
        printf("open: %d", f_open(&file, "log.txt", FA_WRITE  | FA_OPEN_ALWAYS ));
        printf("stat: %d", f_stat("log3.txt", &fno));
        printf("write: %d wr: %d", f_write(&file, string, 11, &written), written);
        printf("flush: %d", f_sync(&file));
        printf("close: %d", f_close(&file)); /* close performs sync before close */
于 2016-06-01T12:11:09.817 に答える
0

私は同じ問題を抱えていましたが、fatfs がファイルを作成しましたが、データを書き込みませんでした。fatfs 関数によってエラーが発生しなかったため、2 日間立ち往生した後、I/O レイヤーで 512 バイト ブロックを送信した後にブレーク ポイントを配置すると、コードで関数 send_datablock(buff, 0xFE ))それはうまくいくでしょう。

データ ブロックを書き込んだ後、SD が実際にこのブロックを内部フラッシュに書き込むには時間が必要であることがわかりました。

http://elm-chan.org/docs/mmc/mmc_e.html

セクション Single Block Write ビジー期間 DO ラインで、他のコマンド (つまり、別の CMD24 シングル ブロック書き込み) を送信する前に、この期間が終了するまで待機する必要があります。

このように send_datablock 関数の最後に待機ループを配置します

    /* if not accepted, return with error */
    if((data & 0x1F) != 0x05)
    {
        return 0;
    }
    else
    {
        /* wait for SD to finish writing data */
        tmr = 5000;
        do
        {
            data = get_response(SDEXIChannel);
            if(data != 0x00)
            {
                break;
            }
            udelay(100);
            tmr--;
        } while(0 != tmr);

        /* did we time out ? if so return with error */
        if(tmr == 0)
        {
            return 0;
        }

これで問題が解決したようで、SD カードのファイルに書き込めるようになりました。

于 2016-12-14T23:31:50.160 に答える
0

これが古い投稿であることは知っていますが、誰かがこの問題を抱えている場合に備えて、 f_sync(&myFile); を追加することで修正できました。

            char myData[] = "Hello from STM32";
            if(f_write(&myFile, myData, strlen(myData), &myBytes) == FR_OK)
            {
                if(f_sync(&myFile) == FR_OK){
                    HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, GPIO_PIN_RESET);
                    HAL_Delay(500);
                    HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, GPIO_PIN_SET);
                }
            }
于 2020-04-04T21:47:08.983 に答える