我正在研究一个V-USB项目,该项目使用ATmega328p显示为键盘。USB部分运行良好(这不是我的第一个V-USB项目),但是当我使用来启动V-USB堆栈后usbInit()
,对SD卡库的所有调用都会失败。如果我之前调用过相同的函数usbInit()
,那么一切都将完美运行。
我使用了一个名为Diavolino的Arduino克隆,但没有Arduino /接线框架。我将USB连接到数字I / O 2和3,将SD卡连接到10-13(内置SPI线)。
我浏览了SD卡库,发现除了之外没有使用任何中断或寄存器的迹象SPxx
。我也grep
想过V-USB代码,但它甚至没有触及SPxx
寄存器。
问题的第一个迹象是当设备应该访问SD卡时断开连接时。然后,我将usbPoll()
其wdt_reset()
调用到所有SD卡处理循环中,发现在写入的情况下,卡发送完最后两个字节(CRC-16)后将永远等待卡的确认。
我使用的SD卡库是sd_raw
Roland Riegel提供的。
2
据我了解,V-USB占用大量CPU,并且可能会在SPI例程中引入不可接受的延迟。通常,SPI操作对时序不敏感,但是对SPI FLASH的写和擦除操作肯定是时序敏感的。
—
戴夫·特威德
问题在于,即使在大多数情况下,读取操作也无法正常工作,而且正如我所阅读的那样,一旦运行代码设置了数据和控制寄存器,SPI通讯就会独立完成。
—
dnet 2012年
@DaveTweed-需要等待卡是对时间敏感的,但是就不能让卡等待您的程序而言?
—
克里斯·斯特拉顿
您可能正在等待无法发生或无法检测到的事情;例如,I / O引脚可能已被重新配置并且不再是输入,或者可能已经向卡发送了虚假数据/时钟,从而使其处于不希望的状态。还要确保SD库完成所需延迟的机制没有被破坏或加速。
—
克里斯·斯特拉顿
您可能也有噪音或电源问题。用示波器检查导轨,并用逻辑分析仪检查SD线,看看发生了什么。
—
吉姆·巴黎