1

我目前正在使用 MSP430F2618 MCU 和 SanDisk 4GB SDHC 卡的记录器工作。

卡初始化按预期工作,我也可以读取 MBR 和 FAT 表。

问题是我不能在上面写任何数据。我检查了它是否受缺口写保护,但事实并非如此。Windows 7 操作系统读取/写入它没有问题。

不过,我使用了一个名为“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”(十六进制值)类型的响应。

但大多数情况下,响应是 0x00(十六进制值),我没有跳出循环。很少有响应为 0xFF(十六进制值)的情况。

我不知道是什么问题。

谁能帮我?谢谢!

4

2 回答 2

0

4GB SDHC

我们需要查看更多您的代码。许多 µC SPI 代码库仅支持 <= 2 GB 的 SD 卡,因此使用较小的卡可能会起作用。

您可以自己检查一下:SDHC 在 CMD 0 (GO_IDLE_STATE) 命令之后需要一个 CMD 8 和一个 ACMD 41,否则您无法对其进行读取或写入数据。

于 2013-03-21T12:30:46.077 回答
0

谢谢你的回答,但我解决了我的问题。这是时间问题。我不得不在特定的时间点延迟。

于 2013-04-08T09:14:30.730 回答