无法在我的Andruino Mega上使用两个SPI设备(及其库)

时间:2018-08-22 12:51:15

标签: bluetooth arduino bluetooth-lowenergy uart spi

我在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(),但这不是一个好的解决方案。当然,这会关闭所有蓝牙连接。

预先感谢

0 个答案:

没有答案