首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌入式: SDHC SPI写入问题

嵌入式: SDHC SPI写入问题
EN

Stack Overflow用户
提问于 2013-03-20 20:21:42
回答 2查看 1.5K关注 0票数 1

我目前在一个使用MSP430F2618微处理器和SanDisk 4 4GB SDHC卡的记录器工作。

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

问题是我不能在上面写任何数据。我已经检查过它是否被缺口写保护,但它不是。Windows7操作系统对其进行读/写操作没有问题。

尽管如此,我使用了一个叫做"HxD“的工具,并且我试图改变一些扇区(在Windows下)。当我尝试将内容保存到SD卡时,该工具弹出一个窗口,告诉我“访问被拒绝!”

然后,我返回到我的代码来写入SD卡:

代码语言:javascript
复制
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;
}

问题似乎是当我在等待卡片状态时:

代码语言:javascript
复制
do
{
    SdWrite(0xFF);
    dataResp = SdRead();
}
while (dataResp == 0x00);

在这里,我等待一个“X5”(十六进制值)类型的响应,其中X是未定义的。

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

我不知道问题出在哪里。

有谁可以帮我?谢谢!

EN

回答 2

Stack Overflow用户

发布于 2013-03-21 20:30:46

4 4GB

我们需要看到更多你的代码。许多µC SPI代码库仅支持SD卡<= 2 GB,因此使用较小的卡可能有效。

你可以自己检查一下: SDHC在cmd0 (GO_IDLE_STATE)命令后需要一个cmd8和一个acmd41,否则你不能读写数据。

票数 0
EN

Stack Overflow用户

发布于 2013-04-08 17:14:31

谢谢你的回答,但我已经解决了我的问题。这是一个时机问题。我不得不在特定的点上延迟。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15523425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档