无法通过SPI从SD卡读取数据

时间:2018-08-12 06:49:09

标签: arduino sd-card

我有一个项目,我正在使用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)

Full SPI bus transaction

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线路上的任何信号?

感谢您抽出宝贵的时间阅读本文!

0 个答案:

没有答案