1

私は現在、MSP430F2618MCUとSanDisk4GBSDHCカードを使用するロガーで働いています。

カードの初期化は期待どおりに機能します。MBRおよびFATテーブルも読み取ることができます。

問題は、データを書き込めないことです。ノッチによって書き込み保護されているかどうかを確認しましたが、そうではありません。Windows 7 OSは、読み取り/書き込みに問題はありません。

ただし、「HxD」というツールを使用して、いくつかのセクターを変更しようとしました(Windowsの場合)。コンテンツをSDカードに保存しようとすると、ツールがウィンドウをポップアップして「アクセスが拒否されました!」と通知します。

次に、SDカードに書き込むためのコードに戻りました。

uint8_t SdWriteBlock(uchar_t *blockData, const uint32_t address)
{
    uint8_t result = OP_ERROR;
    uint16_t count;
    uchar_t dataResp;
    uint8_t idx;

    for (idx = RWTIMEOUT; idx > 0; idx--)
    {
        CS_LOW();
        SdCommand(CMD24, address, 0xFF);

        dataResp = SdResponse();

        if (dataResp == 0x00)
        {
            break;
        }
        else
        {
            CS_HIGH();
            SdWrite(0xFF);
        }
    }

    if (0x00 == dataResp)
    {
        //send command success, now send data starting with DATA TOKEN = 0xFE
        SdWrite(0xFE);
        //send 512 bytes of data
        for (count = 0; count < 512; count++)
        {
            SdWrite(*blockData++);
        }
        //now send tow CRC bytes ,through it is not used in the spi mode
        //but it is still needed in transfer format
        SdWrite(0xFF);
        SdWrite(0xFF);
        //now read in the DATA RESPONSE TOKEN
        do
        {
            SdWrite(0xFF);
            dataResp = SdRead();
        }
        while (dataResp == 0x00);
        //following the DATA RESPONSE TOKEN are a number of BUSY bytes
        //a zero byte indicates the SD/MMC is busy programing, 
        //a non_zero byte indicates SD/MMC is not busy
        dataResp = dataResp & 0x0F;
        if (0x05 == dataResp)
        {
            idx = RWTIMEOUT;
            do
            {
                SdWrite(0xFF);
                dataResp = SdRead();
                if (0x0 == dataResp)
                {
                    result = OP_OK;
                    break;
                }
                idx--;
            }
            while (idx != 0);

            CS_HIGH();
            SdWrite(0xFF);
        }
        else
        {
            CS_HIGH();
            SdWrite(0xFF);
        }
    }

    return result;
}

問題は、カードのステータスを待っているときのようです。

do
{
    SdWrite(0xFF);
    dataResp = SdRead();
}
while (dataResp == 0x00);

ここでは、Xが未定義のタイプ「X5」(16進値)の応答を待っています。

しかし、ほとんどの場合、応答は0x00(16進値)であり、ループから抜け出すことはできません。応答が0xFF(16進値)の場合はほとんどありません。

何が問題なのかわかりません。

誰か助けてもらえますか?ありがとう!

4

2 に答える 2

0

あなたの答えをありがとう、しかし私は私の問題を解決しました。タイミングの問題でした。特定のポイントで遅延を設定する必要がありました。

于 2013-04-08T09:14:30.730 に答える
0

4GBSDHC

あなたのコードをもっと見る必要があります。多くの µC SPI コードベースは 2 GB 以下の SD カードのみをサポートするため、より小さいカードを使用するとうまくいく可能性があります。

ご自分で確認してください: SDHC には、CMD 0 (GO_IDLE_STATE) コマンドの後に CMD 8 と ACMD 41 が必要です。そうしないと、データを読み書きできません。

于 2013-03-21T12:30:46.077 に答える