我有一个项目,我正在使用SPI从SD卡读取数据,以将图像加载到LCD屏幕上。我正在使用Arduino Zero(ATSAMD21)。直到两天前一切正常,如果没有修改硬件,也没有任何(明显的)代码修改,就不再检测到SD卡。 SPI仍然有效,因为我可以将数据写入屏幕。但是,它不会检测到来自SD卡的任何信号。当我尝试使用Arduino提供的SD库初始化SD卡时,使用SD_CS调用SD.begin(SD_CS);
作为芯片选择引脚。
我继续将SD库中“ begin”类中的以下行从以下位置更改:
return card.init(SPI_HALF_SPEED, csPin) &&
volume.init(card) &&
root.openRoot(volume);
到
if(!card.init(SPI_HALF_SPEED, csPin)){
return -1;
}
if(!volume.init(card)){
return -2;
}
if(!root.openRoot(volume)){
return -3;
}
return 0;
然后,当我运行代码并尝试多次打开SD卡时,我得到:
Open SD: Err = -2 [Error initializing volume]
Open SD: Err = -1 [Error initializing card (timeout)]
Open SD: Err = -2 [Error initializing volume]
请紧记,我的设备设置完全相同,不会产生此错误。 我也将其连接到逻辑分析仪。没有CS混合会导致总线冲突(图1)。而且,我实际上收到了来自SD卡的返回信号! (图片2)
SD Card sends return signal over SPI!
我在分析仪上看到一个不熟悉的异常。参见图3,在CS引脚变为低电平之前,先传输了一些时钟数据。这位于SD库的Sd2Card.cpp部分中
// must supply min of 74 clock cycles with CS high.
#ifdef USE_SPI_LIB
SDCARD_SPI.beginTransaction(settings);
#endif
for (uint8_t i = 0; i < 10; i++) spiSend(0XFF);
#ifdef USE_SPI_LIB
SDCARD_SPI.endTransaction();
#endif
Empty SPI CLK cycles before transaction
我已经检查了片选引脚的导通性。另外,从逻辑分析仪可以看到,MOSI和MISO上都在传输某些东西!
初始化SD卡时,我应该在代码中寻找什么吗?当我一直使用完全相同的SD.begin(SD_CS)函数并使其正常工作后,为什么它无法读取文件?为什么尽管MISO线路正在返回信号,但为什么仍看不到MISO线路上的任何信号?
感谢您抽出宝贵的时间阅读本文!