如何解决microSDHC 在 ACMD41 后停止响应
我正在尝试初始化 SDHC(高容量)microSD 卡。我从 CMD0 和 CMD8 得到逻辑响应。 CMD8 正确回应了我的论点 (0x1AA)。
当我发送 ACMD41 时,我期待 R3 响应设置了一个忙位(根据物理层简化规范,版本 8.00)。相反,我反复从 CMD55 和 ACMD41 收到 0x01 的 R1 响应,直到卡完全停止响应任何命令。
我在面包板上使用 Arduino Nano 33 IoT,microSD 卡插入 Maxmoral SPI microSD card adapter。我的 Arduino 的 3.3V 正极端子上有一个 10 欧姆的电阻器。读卡器的 SPI 输入和输出进入 arduino 上的数字引脚。
这是一张 Sandisk 16 GB microSDHC 卡。
我假设这不是硬件或时间问题,因为像 CMD8 和 CMD58 这样的命令似乎可以工作(直到我发出 ACMD41)。我在任何命令之前发送 0xFF,没有它我没有收到任何命令的响应。我在执行任何命令之前将 CS 引脚设置为低电平,并在接收到数据后将其设置为高电平。
可能是什么问题?我对 ACMD41 的论点不正确吗?在我看来,该卡出于某种原因拒绝了主机。
这些是我为 ACMD41 测试的参数:
0x00 0x00 0x00 0x00 // All bits off
0x40 0x00 0x00 0x00 // HCS bit on,everything else off
0x40 0xFF 0x80 0x00 // HCS bit on,voltages that are echoed back by CMD58
0x40 0x10 0x00 0x00 // HCS bit on,voltage 3.2-3.3 V
0x40 0x20 0x00 0x00 // HCS bit on,voltage 3.3-3.4 V
0x40 0x30 0x00 0x00 // HCS bit on,voltage 3.2-3.4 V
这是用于初始化卡的代码:
pinMode(MISO,INPUT);
pinMode(CS,OUTPUT);
pinMode(SCLK,OUTPUT);
pinMode(MOSI,OUTPUT);
digitalWrite(CS,HIGH);
unsigned char dummy = 0xFF;
frame_commander.clock_manager.CLOCK_TIME = FAST_CLOCK; // #define FAST_CLOCK 1.0 / 200000.0 * 1000.0
frame_commander.r_type = 1;
frame_commander.cmd = CMD0; // unsigned const char CMD0 = 0x40;
frame_commander.arg1 = 0x00;
frame_commander.arg2 = 0x00;
frame_commander.arg3 = 0x00;
frame_commander.arg4 = 0x00;
frame_commander.crc = INIT_CRC; // unsigned const char INIT_CRC = 0x95;
/*
*A binary number of 80 1's is too large to store in an unsigned char.
*/
for (int i = 0; i < 10; i++) {
frame_commander.send_data(dummy,8);
}
/*
*Sets to SPI mode
*/
frame_commander.send_command_frame(); // Card responds 0x01 (in idle state)
Serial.println(frame_commander.recieved_data,HEX);
frame_commander.r_type = 3;
frame_commander.cmd = CMD8; // unsigned const char CMD8 = 0x48;
frame_commander.arg1 = 0x00;
frame_commander.arg2 = 0x00;
frame_commander.arg3 = 0x01;
frame_commander.arg4 = 0xAA;
frame_commander.crc = CMD8_CRC;
frame_commander.send_command_frame();
Serial.println(frame_commander.recieved_data,HEX); // Card responds 0x01
Serial.println(frame_commander.recieved_byte2,HEX);
Serial.println(frame_commander.recieved_byte3,HEX);
Serial.println(frame_commander.recieved_byte4,HEX); // Card echoes 0x01
Serial.println(frame_commander.recieved_byte5,HEX); // Card echoes 0xAA
/*
*Initializes card
*/
frame_commander.r_type = 1;
frame_commander.arg1 = 0x00;
frame_commander.arg2 = 0x00;
frame_commander.arg3 = 0x00;
frame_commander.arg4 = 0x00;
while (frame_commander.recieved_data != 0) {
frame_commander.cmd = CMD55; // unsigned const char CMD55 = 0x77;
frame_commander.r_type = 1;
frame_commander.arg1 = 0x00;
frame_commander.arg2 = 0x00;
frame_commander.arg3 = 0x00;
frame_commander.arg4 = 0x00;
frame_commander.send_command_frame();
frame_commander.cmd = ACMD41; // unsigned const char ACMD41 = 0x69;
frame_commander.r_type = 3;
frame_commander.arg1 = 0x40;
frame_commander.arg2 = 0x00;
frame_commander.arg3 = 0x00;
frame_commander.arg4 = 0x00;
frame_commander.send_command_frame();
Serial.print("Did recieve data: ");
Serial.println(frame_commander.did_recieve_data); // Card responds 0x01
Serial.println(frame_commander.recieved_data,BIN); // Card responds 0xFF
Serial.println(frame_commander.recieved_byte2,BIN); // Card responds 0xFF
Serial.println(frame_commander.recieved_byte3,BIN); // Card responds 0xFF
Serial.println(frame_commander.recieved_byte4,BIN); // Card responds 0xFF
Serial.println(frame_commander.recieved_byte5,BIN); // Card responds 0xFF
}
// Is never reached
Serial.println("Completed initialization.");
Serial.println(frame_commander.recieved_data,BIN);
Serial.println(frame_commander.recieved_byte2,BIN);
Serial.println(frame_commander.recieved_byte3,BIN);
Serial.println(frame_commander.recieved_byte4,BIN);
Serial.println(frame_commander.recieved_byte5,BIN);
frame_commander.arg1 = 0x00;
frame_commander.arg2 = 0x00;
frame_commander.arg3 = 0x00;
frame_commander.arg4 = 0x00;
frame_commander.cmd = CMD58;
frame_commander.crc = CMD58_CRC;
frame_commander.r_type = 3;
frame_commander.send_command_frame();
Serial.println("CMD58 sent");
Serial.println(frame_commander.recieved_data,BIN);
这是发送单个命令的代码:
digitalWrite(CS,LOW);
send_data(0xFF,8);
send_data(cmd,8);
send_data(arg1,8);
send_data(arg2,8);
send_data(arg3,8);
send_data(arg4,8);
send_data(crc,8);
recieve_data();
digitalWrite(CS,HIGH);
这是发送单个位的代码:
digitalWrite(MOSI,HIGH * bit);
digitalWrite(SCLK,HIGH);
delay(CLOCK_TIME / 2.0);
digitalWrite(SCLK,LOW);
delay(CLOCK_TIME / 2.0);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。