私は現在、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進値)の場合はほとんどありません。
何が問題なのかわかりません。
誰か助けてもらえますか?ありがとう!