V-USB如何固定ATmega328p的内置SPI?


14

我正在研究一个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_rawRoland Riegel提供的。


2
据我了解,V-USB占用大量CPU,并且可能会在SPI例程中引入不可接受的延迟。通常,SPI操作对时序不敏感,但是对SPI FLASH的写和擦除操作肯定是时序敏感的。
戴夫·特威德

问题在于,即使在大多数情况下,读取操作也无法正常工作,而且正如我所阅读的那样,一旦运行代码设置了数据和控制寄存器,SPI通讯就会独立完成。
dnet 2012年

@DaveTweed-需要等待卡是对时间敏感的,但是就不能让卡等待您的程序而言?
克里斯·斯特拉顿

2
您可能正在等待无法发生或无法检测到的事情;例如,I / O引脚可能已被重新配置并且不再是输入,或者可能已经向卡发送了虚假数据/时钟,从而使其处于不希望的状态。还要确保SD库完成所需延迟的机制没有被破坏或加速。
克里斯·斯特拉顿

3
您可能也有噪音或电源问题。用示波器检查导轨,并用逻辑分析仪检查SD线,看看发生了什么。
吉姆·巴黎

Answers:


1

我在USART中遇到类似问题,并通过更改看门狗设置解决了该问题。如您所知,V-USB使用看门狗,如果您在一次操作中投入额外的时间,看门狗将被激活。尝试停用看门狗,如果一切正常,则可以更改看门狗时间,也可以将干扰代码(您的情况下为SD卡代码)分成较小的部分,然后在它们之间“重置”看门狗。但是不要忘了在调试后重新激活看门狗,因为不建议您不使用它而使用V-USB。


注意,该问题提到将wdt_reset()调用插入到SD代码中。当然,可能并非所有地方都这样做。
克里斯·斯特拉顿

1
是的,但是确实值得通过禁用看门狗来尝试代码。有时,尤其是当在中断例程中处理返回的数据时,代码会卡在那里,看门狗会在复位之前被激活
8
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.