Embedded 嵌入式:SDHC SPI写入问题

Embedded 嵌入式:SDHC SPI写入问题,embedded,block,msp430,spi,Embedded,Block,Msp430,Spi,我目前在使用MSP430F2618 MCU和SanDisk 4GB SDHC卡的记录器工作 卡初始化工作如预期,我还可以读取MBR和FAT表 问题是我不能在上面写任何数据。我已经检查过它是否受notch写保护,但它不是。Windows 7操作系统读/写它没有问题 不过,我使用了一个名为“HxD”的工具,并尝试更改一些扇区(在Windows下)。当我试图将内容保存到SD卡时,工具弹出一个窗口,告诉我“访问被拒绝!” 然后我回到写SD卡的代码: uint8_t SdWriteBlock(uchar_

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

卡初始化工作如预期,我还可以读取MBR和FAT表

问题是我不能在上面写任何数据。我已经检查过它是否受notch写保护,但它不是。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;
}
这里我正在等待类型为“X5”(十六进制值)的响应,其中X是未定义的

但大多数情况下,响应是0x00(十六进制值),我不会退出循环。少数情况下响应为0xFF(十六进制值)

我想不出是什么问题

有人能帮我吗?谢谢

4GB SDHC


我们需要更多地了解您的代码。许多µC SPI代码库只支持SD卡谢谢您的回答,但我解决了我的问题。这是一个时间问题。我不得不在特定的点上延迟。

(您在代码和问题中使用了幻数,这让人很难理解。)我在SD卡协议规范中找不到任何地方说写和读数据传输中不使用CRC,文档只声称CRC不用于命令。CRC故障使卡无法响应。再次读取规范,一旦卡进入SPI模式,CRC将被禁用。也许您应该在@TurboJ再次读取规范
在CRC关闭模式下,命令的CRC位被定义为“不关心”发射机,并被接收机忽略。SPI接口在默认情况下以CRC关闭模式初始化。
当它说CRC被禁用以执行命令时,文本是清晰的。还有更多内容:
有效数据块的后缀是由标准CCITT多项式x16+x12+x5+1生成的16位CRC。
请仔细阅读第7.2.2章。其目的是完全省略所有CRC检查。当您必须对数据应用更复杂的CRC-16时,仅忽略CRC-7是没有意义的。我的工作代码库证明了这一点——我没有使用任何CRC。
do
{
    SdWrite(0xFF);
    dataResp = SdRead();
}
while (dataResp == 0x00);