2015-02-08 55 views
0

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

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

+0

什么是'aci_lib_init',你从哪里得到它的?谷歌搜索这个词只能找到这个问题。 – 2015-02-08 05:32:48

+0

我知道,它令人沮丧。它带有Adafruit示例代码,你可以在这里获得它:https://github.com/adafruit/Adafruit_nRF8001/blob/master/utility/lib_aci.h。它处理与蓝牙设备的通信,我告诉它哪个从设备选择,就绪和复位引脚使用,并管理设备。 – 2015-02-08 05:33:22

+0

在那个代码文件中,我看到'lib_aci_init',这可能是你在这个问题中输入的意思。 – 2015-02-08 05:34:06

回答

0

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

函数lib_aci_init调用hal_aci_tl_init它设置SPI与nrf8001进行对话,这些设置很可能与SD卡的设置冲突。即使它们没有冲突,你也不得不使用从属选择引脚或类似的东西来避免硬件冲突。

+0

好猜,但我使用从选择 - 据我所知,SPI协议专门设置为允许与多个设备进行通信。似乎造成这个问题的线路是'SPI.setBitOrder(LSBFIRST);'将其删除将打破蓝牙,保持它打破闪存 – 2015-02-08 05:42:54

+0

好的,这是一个很好的发现。如果在任何函数调用aci库之前调用'SPI.setBitOrder(LSBFIRST);',您可能会使它工作,然后在调用SD卡库之前将其更改回它需要的设置。 – 2015-02-08 06:18:14

+0

不幸的是,它涉及一个SPI.begin和配对的SPI.end调用,以及一些正在使用的SPI,我无法看到,因为当我开始在调用SPI的代码块周围添加开始/结束时,它崩溃了(没有错误,只是冻结)。我得到它为闪存模块工作。但是BT没有运气,我现在正在努力使闪存模块与LSB首先兼容。 – 2015-02-08 07:36:28