STM32F427 寫入SD卡返回成功實際沒寫入

芯片:STM32F427

芯片配置軟件:STM32CubeMx 5.6.0

配置了FATFS

卡時鐘(SDIO_CK ):每個時鐘週期在命令和數據線上傳輸 1 位命令或數據。對於多媒體卡 V3.31 協議,時鐘頻率可以在 0MHz 至 20MHz 間變化;對於多媒體卡 V4.0/4.2 協議,時鐘頻率可以在 0MHz 至 48MHz 間變化;對於 SD 或 SD I/O 卡,時鐘頻率可以在 0MHz 至 25MHz間變化。
SDIO適配器時鐘( SDIOCLK ):該時鐘用於驅動 SDIO 適配器,其頻率等於 AHB 總線頻率( HCLK ),並用於產生 SDIO_CK 時鐘。
AHB 總線接口時鐘( HCLK/2 ):該時鐘用於驅動 SDIO 的 AHB 總線接口,其頻率爲HCLK/2 。
前面提到,我們的SD 卡時鐘( SDIO_CK ),根據卡的不同,可能有好幾個區間,這就涉及到時鐘頻率的設置, SDIO_CK 與 SDIOCLK 的關係爲:
SDIO_CK=SDIOCLK/(2+CLKDIV)
其中,SDIOCLK 爲 HCLK ,一般是 72Mhz(F103系列),而 CLKDIV 則是分配係數,可以通過 SDIO
的 SDIO_CLKCR 寄存器進行設置(確保 SDIO_CK 不超過卡的最大操作頻率)。
這裏要提醒大家,在SD 卡剛剛初始化的時候,其時鐘頻率( SDIO_CK )是不能超過 400Khz的,
否則可能無法完成初始化。在初始化以後,就可以設置時鐘頻率到最大了(但不可超過 SD卡的最大操作時鐘頻率)。

按上面的公式配置了SD:

測試代碼:

    // mount SD卡
    retSD = f_mount(&SDFatFS, SDPath, 1);
    if(retSD)
    {
        printf("mount error : %d \r\n",retSD);
        return -1;
    }
    else
    {
        printf("mount sucess!!! \r\n");
    }
int8_t SDWrite_test()
{
    static char testFileName[] = "test.txt";
    int32_t testVal = 123456;
    // 創建並寫入文件
    FIL fl;
    retSD = f_open(&fl, testFileName, FA_CREATE_ALWAYS | FA_WRITE);
    if(FR_OK == retSD)
    {
        UINT bw = 0;
        if(FR_OK != f_write(&fl, (void*)&testVal , sizeof(int32_t ), &bw))
        {
            f_close(&fl);
            printf("f_write file(%s) error : %d\r\n", testFileName, retSD);
            return -1;
        }
        retSD = f_close(&fl);
        if(retSD)
        {
            printf("close(%s) error!!! %d\r\n", testFileName, retSD);
        }
        else
        {
            //printf("close(%s) sucess!!! \r\n", testFileName);
        }
        return 0;
    }
    else
    {
        printf("w open file(%s) error : %d\r\n", testFileName, retSD);
        return -1;
    }
}
// 讀取文件測試
int8_t SDRead_test()
{
    static char testFileName[] = "test.txt";
    int32_t testVal = 0;
    FIL fl;
    // 打開文件
    retSD = f_open(&fl, testFileName, FA_READ);
    if(retSD)
    {
        printf("open file(%s) error : %d\r\n", testFileName, retSD);
        return -1;
    }
    else
    {
        //printf("open file(%s) sucess\r\n", testFileName);
    }
    if(f_size(&fl) != sizeof(int32_t))
    {
        f_close(&fl);
        printf("file(%s) len(%d) err\r\n", testFileName, (uint32_t)f_size(&fl));
        return -1;
    }
    uint32_t bytesread = 0;       // 讀文件計數
    // 讀取文件
    retSD = f_read(&fl, &testVal , sizeof(int32_t), (UINT*)&bytesread);
    if(retSD)
    {
        f_close(&fl);
        printf("read(%s) error!!! %d\r\n", testFileName, retSD);
        return -1;
    }
    else
    {
        //printf("read(%s) sucess!!! \r\n", testFileName);
    }
    // 關閉文件
    retSD = f_close(&fl);
    if(retSD)
    {
        printf("close(%s) error!!! %d\r\n", testFileName, retSD);
    }
    else
    {
        //printf("close(%s) sucess!!! \r\n", testFileName);
    }
    
    printf("testVal :%d \r\n", testVal);

    return 0;
}

寫入SD卡返回了成功,但是當我執行SD卡讀取代碼時發現,文件不存在,讀取失敗了,取了SD卡放到電腦也發現文件沒創建

如果寫入文件後立刻讀取失敗則重寫文件,一般寫第二次就會成功,查看了SD卡的優先級,基本已經都是最高的

之後嘗試調整SDIOCLK clock devide factor的值,基本上SD有問題都是這個問題,嘗試了加大和減小這個值,發現設置爲0-2都可以一次寫入文件成功

按公式,如果設置SDIOCLK clock devide factor爲0,SD卡的時鐘頻率就應該會超了纔對,然而發現SD卡是能正常的,還是說是高速模式,沒搞清楚

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章