【问题标题】:Arduino ACI lib breaks SPIArduino ACI 库破坏了 SPI
【发布时间】:2015-02-08 05:31:32
【问题描述】:

我有一个需要蓝牙芯片 (nrf8001) 和 SPI 闪存模块的项目。

在调用 lib_aci_init 之前,我可以读写闪存。初始化后,我不能。 ACI 库是否有任何原因会禁用其他设备的 SPI?

【问题讨论】:

  • aci_lib_init 是什么,你从哪里得到的?对该词的 Google 搜索只能找到这个问题。
  • 我知道,这很令人沮丧。它带有 Adafruit 示例代码,您可以在此处获取:github.com/adafruit/Adafruit_nRF8001/blob/master/utility/…。它处理与蓝牙设备的通信,我告诉它使用哪个从设备选择、准备和重置引脚,并管理设备。
  • 在那个代码文件中,我看到了lib_aci_init,这可能就是您在这个问题中要输入的内容。
  • 你说得对,我会修复
  • @DavidGrayson 我感觉是这些行导致了问题:SPI.setBitOrder(LSBFIRST); SPI.setClockDivider(SPI_CLOCK_DIV8); SPI.setDataMode(SPI_MODE0);

标签: arduino spi


【解决方案1】:

问题在于 SD 卡和 nrf8001 都是 SPI 设备,而您使用的两个库都使用 AVR 的硬件 SPI 模块与它们通信。

函数lib_aci_init 调用hal_aci_tl_init 来设置与nrf8001 通信的SPI,这些设置很可能与SD 卡的设置冲突。即使它们没有冲突,您也必须使用从选择引脚或类似的东西来避免硬件冲突。

【讨论】:

  • 好猜测,但我正在使用从机选择 - 据我了解,SPI 协议专门设置为允许与多个设备进行通信。似乎导致问题的行是SPI.setBitOrder(LSBFIRST); 删除它会破坏蓝牙,保持它会破坏闪光灯
  • 好的,这是一个很好的发现。如果在任何函数调用 aci 库之前调用SPI.setBitOrder(LSBFIRST);,您可能可以使其工作,然后在调用 SD 卡库之前将其更改回所需的任何设置。
  • 遗憾的是,它还涉及一个 SPI.begin 和配对的 SPI.end 调用,并且有些东西正在使用我看不到的 SPI,因为当我开始在代码块周围添加开始/结束时调用 SPI,它崩溃(没有错误,只是冻结)。我让它为闪存模块工作。但是BT没有运气,我现在正在努力使闪存模块首先与LSB兼容。
猜你喜欢
  • 2016-02-02
  • 1970-01-01
  • 2016-10-01
  • 2019-03-09
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多