V-USB 如何搞砸 ATmega328p 的内置 SPI?

电器工程 avr 大气压 spi USB设备 sd
2022-01-26 11:47:52

我正在开发一个使用 ATmega328p 显示为键盘的 V-USB 项目。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 的。

1个回答

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