我目前正在使用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);
这里我正在等待“X5”(十六进制值)类型的响应,其中X未定义。
但是大多数情况下响应是0x00(十六进制值)并且我没有退出循环。响应为0xFF(十六进制值)的情况很少。
我无法弄清问题是什么。
任何人都可以帮助我吗?谢谢!
答案 0 :(得分:0)
4GB SDHC
我们需要查看更多更多代码。许多μCSPI代码库仅支持SD卡<= 2 GB,因此使用较小的卡可能有效。
您可以自己检查:SDHC在CMD 0(GO_IDLE_STATE)命令之后需要CMD 8和ACMD 41,否则您无法读取或写入数据。
答案 1 :(得分:0)
感谢您的回答,但我解决了我的问题。这是一个时间问题。我不得不在特定点上拖延。