我正在使用Arduino SD库,并且对某些SD卡模块的响应不一致:尽管具有相同的硬件(相同的模块,相同的SD),但某些SD卡未能初始化(使用SD.begin()
)卡)。我正在使用SanDisk UHS-1卡,根据OEM产品手册,该卡支持2.7-3.3V电压范围。
当我将其连接到示波器和逻辑分析仪时,我发现SPI MISO线的输出电压变化非常非常小,足以不会触发我的MCU,有时甚至低至1.58V。这里的问题是SD卡以1.8V模式输出。因此,我想将这些卡设置为更高电压模式,以便它们输出3.3V电压,但是我在SD库中设置此卡时遇到了麻烦。
SD协议显示了我在此处附加的CMD8的初始化。它说[19:16]位是发出的命令中提供的电压设置。但是,当我尝试发出0x101AA而不是0x1AA时,初始化失败。 R7响应仍显示“电压接受”的不确定值。甚至进一步读取OCR寄存器仍会继续为电压模式返回一个不确定的值。
好,所以CMD8仅向您显示卡的状态。显然,可以在ACMD41期间设置模式。该协议说:
(1)如果参数中的电压窗口字段(位23-0)设置为零,则称为“查询CMD41”,它不启动初始化并用于获取OCR。查询ACMD41将忽略参数中的另一个字段(位31-24)。 (2)如果第一次将参数中的电压窗口字段(位23-0)设置为非零,则将其称为“第一ACMD41”,它开始初始化。参数中的另一个字段(位31-24)有效。
我正在使用的卡被标识为SD2类型。
arg = type() == SD_CARD_TYPE_SD2 ? 0X40000000 : 0;
while ((status_ = cardAcmd(ACMD41, arg)) != R1_READY_STATE) {...}
但是根据协议,如果低位23-0仍设置为0,这会产生任何影响吗?
此外,cardCommand()
函数发送32位参数,但是位在这里正确吗?应该发送什么来确保卡不切换到1.8V而是保持在电流信号电压模式?