我在Arduino Mega 2560上有三个SPI设备。 一个Adafruit nRF8001蓝牙模块,一个Arducam mini 2MP和一个tft显示器,所有这三个设备都通过SPI进行通信并具有自己的CS(Mega上的电缆选择连接)。 每个人都可以正常工作。 现在,我试图让两个设备(蓝牙和Arducam)一起工作,但是一旦我启动了蓝牙服务,就无法与其他设备通信。即使我停止调用“ uart.pollACI()”并更改了CS电压。 由于它们都使用相同的SPI端口,因此无法同时运行它们,因此我的计划是暂停蓝牙,拍照并继续使用蓝牙(最好不断开任何连接)。 我不知道我是否可以轻松实现此目的,目前我唯一看到的方法是修改蓝牙库,以便对SPI通信进行完全控制(需要深入到发送字节的部分)到ble模块。 因此,问题在于,即使我停止调用uart.pollACI(),我的Arduino仍在通过SPI向蓝牙模块发送信息,而我没有机会停止或暂停这种通信尝试。因为arduino仍通过SPI发送蓝牙信息,所以我没有机会与相机通信。
代码如下:
#include <Wire.h>
#include <ArduCAM.h>
#include <SPI.h>
#include "memorysaver.h"
#include "Adafruit_BLE_UART.h"
#define ADAFRUITBLE_RDY 21
#define ADAFRUITBLE_RST 40
#define TFT_SCK 52
#define TFT_MOSI 51
#define TFT_DC 45
#define TFT_RESET 42
#define TFT_CS 53
#define BLE_CS 44
#define CAM_CS 46
bool run_BLE = false;
bool uart_started = false;
uint32_t length = 0;
ArduCAM myCAM( OV2640, CAM_CS );
Adafruit_BLE_UART uart = Adafruit_BLE_UART(BLE_CS, ADAFRUITBLE_RDY, ADAFRUITBLE_RST);
void setup()
{
pinMode(TFT_CS, OUTPUT);
pinMode(BLE_CS, OUTPUT);
pinMode(CAM_CS, OUTPUT);
digitalWrite(TFT_CS, HIGH);
digitalWrite(BLE_CS, HIGH);
//BLE Initialisierung
digitalWrite(BLE_CS, LOW);
delay(1000);
Serial1.begin(9600);
while(!Serial1); // Leonardo/Micro should wait for serial init
Serial1.println(F("Bluetooth test"));
uart.setACIcallback(aciCallback);
uart.setRXcallback(rxCallback);
//uart.begin();
digitalWrite(BLE_CS, HIGH);
//CAM Initialisierung
digitalWrite(CAM_CS, LOW);
delay(1000);
uint8_t vid, pid;
uint8_t temp;
Wire.begin();
Serial.begin(921600);
while(!Serial);
Serial.println(F("ArduCAM Start!"));
SPI.begin();
//Reset the CPLD
myCAM.write_reg(0x07, 0x80);
delay(100);
myCAM.write_reg(0x07, 0x00);
delay(100);
while(1)
{
//Check if the ArduCAM SPI bus is OK
myCAM.write_reg(ARDUCHIP_TEST1, 0x55);
temp = myCAM.read_reg(ARDUCHIP_TEST1);
if (temp != 0x55){
Serial.println(F("SPI interface Error!"));
delay(1000);continue;
}else{
Serial.println(F("SPI interface OK."));break;
}
}
while(1)
{
//Check if the camera module type is OV2640
myCAM.wrSensorReg8_8(0xff, 0x01);
myCAM.rdSensorReg8_8(OV2640_CHIPID_HIGH, &vid);
myCAM.rdSensorReg8_8(OV2640_CHIPID_LOW, &pid);
if ((vid != 0x26 ) && (( pid != 0x41 ) || ( pid != 0x42 ))){
Serial.println(F("Can't find OV2640 module!"));
delay(1000);continue;
}
else{
Serial.println(F("OV2640 detected."));break;
}
}
myCAM.set_format(JPEG);
myCAM.InitCAM();
myCAM.OV2640_set_JPEG_size(OV2640_320x240);
digitalWrite(CAM_CS, HIGH);
delay(1000);
}
void loop()
{
if(run_BLE)
{
//I change the CS pins in takePicture(), where run_BLE is set to true
if(!uart_started)
{
uart.begin();
uart_started = true;
}
uart.pollACI();
}
else
{
takePicture();
}
}
void takePicture()
{
digitalWrite(BLE_CS, HIGH);
digitalWrite(CAM_CS, LOW);
delay(1000);
//Flush the FIFO
myCAM.flush_fifo();
//Clear the capture done flag
myCAM.clear_fifo_flag();
//Start capture
myCAM.start_capture();
Serial.println(F("start Capture"));
while(!myCAM.get_bit(ARDUCHIP_TRIG , CAP_DONE_MASK));
Serial.println(F("Capture Done."));
length = myCAM.read_fifo_length();
Serial.print(F("The fifo length is :"));
Serial.println(length, DEC);
if (length >= MAX_FIFO_SIZE) //384K
{
Serial.println(F("Over size."));
return ;
}
if (length == 0 ) //0 kb
{
Serial.println(F("Size is 0."));
return ;
}
digitalWrite(BLE_CS, LOW);
digitalWrite(CAM_CS, HIGH);
delay(1000);
run_BLE = true;
}
...
...
...
因此,一旦我在循环中启动“ uart.begin()”,我就无法与相机进行通讯了。当前,代码正在拍照并打印信息。之后,蓝牙模块启动。
我阻止uart发送的唯一方法是调用SPI.end(),但这不是一个好的解决方案。当然,这会关闭所有蓝牙连接。
预先感谢