I put the above code in a loop, and it now alternates between returning a fifo length of 8 and 8388606. Code and output below. Again, the only modifications are to SPI…which seems to be working. I slimmed down the code a much as I could.
Output:
ArduCAM Start!
SPI interface OK.
SD Card detected.
OV5642 detected.
Grab
Start Capture
Capture Done!
8
End Grab
Start Capture
Capture Done!
8388606
Start Capture
Capture Done!
8
Start Capture
Capture Done!
8388606
Start Capture
Capture Done!
Code:
#include <SD.h>
#include <Wire.h>
#include <ArduCAM.h>
#include <SPI.h>
//#include <UTFT_SPI.h>
#include “memorysaver.h”
#define SD_CS BUILTIN_SDCARD
const int SPI_CS = 34;
#define BMPIMAGEOFFSET 66
const int bmp_header[BMPIMAGEOFFSET] PROGMEM =
{
0x42, 0x4D, 0x36, 0x58, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x28, 0x00,
0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x03, 0x00,
0x00, 0x00, 0x00, 0x58, 0x02, 0x00, 0xC4, 0x0E, 0x00, 0x00, 0xC4, 0x0E, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x1F, 0x00,
0x00, 0x00
};
ArduCAM myCAM(OV5642, SPI_CS);
void setup()
{
uint8_t vid = 0, pid = 0;
uint8_t temp = 0;
Wire.begin();
Serial.begin(115200);
Serial.println(F(“ArduCAM Start!”));
// set the SPI_CS as an output:
pinMode(SPI_CS, OUTPUT);
// initialize SPI:
SPI1.begin();
SPI1.setMISO(39);
SPI1.setMOSI(26);
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;
}
}
//Initialize SD Card
while(!SD.begin(SD_CS)){
Serial.println(F(“SD Card Error!”));delay(1000);
}
Serial.println(F(“SD Card detected.”));
while(1){
//Check if the camera module type is OV5642
myCAM.wrSensorReg16_8(0xff, 0x01);
myCAM.rdSensorReg16_8(OV5642_CHIPID_HIGH, &vid);
myCAM.rdSensorReg16_8(OV5642_CHIPID_LOW, &pid);
if((vid != 0x56) || (pid != 0x42)){
Serial.println(F(“Can’t find OV5642 module!”));
delay(1000);continue;
} else{
Serial.println(F(“OV5642 detected.”)); break;
}
}
myCAM.InitCAM();
char str[8];
itoa(97, str, 10);
strcat(str, “.bmp”); //Generate file name
Serial.println(“Grab”);
GrabImage(str);
Serial.println(“End Grab”);
}
void loop()
{
char str[8];
unsigned long previous_time = 0;
static int k = 0;
// myCAM.set_mode(MCU2LCD_MODE); //Switch to CAM
while (1)
{
previous_time = millis();
if ((millis() - previous_time) < 1500)
{
k = k + 1;
itoa(k, str, 10);
strcat(str, “.bmp”); //Generate file name
GrabImage(str);
}
}
}
void GrabImage(char* str)
{
File outFile;
char VH = 0, VL = 0;
byte buf[256];
static int k = 0;
int i, j = 0;
outFile = SD.open(str, O_WRITE | O_CREAT | O_TRUNC);
if (! outFile)
{
Serial.println(F(“Open File Error”));
return;
}
//Flush the FIFO
myCAM.flush_fifo();
//Start capture
myCAM.set_mode(BMP);
myCAM.start_capture();
Serial.println(F(“Start Capture”));
//Polling the capture done flag
while (!myCAM.get_bit(ARDUCHIP_TRIG, CAP_DONE_MASK));
Serial.println(F(“Capture Done!”));
k = 0;
//Write the BMP header
for ( i = 0; i < BMPIMAGEOFFSET; i++)
{
char ch = pgm_read_byte(&bmp_header[i]);
buf[k++] = ch;
}
outFile.write(buf, k);
Serial.println(myCAM.read_fifo_length());
//Read the first dummy byte
myCAM.read_fifo();
k = 0;
//Read 320x240x2 byte from FIFO
//Save as RGB565 bmp format
for (i = 0; i < 240; i++)
for (j = 0; j < 320; j++)
{
VH = myCAM.read_fifo();
VL = myCAM.read_fifo();
//Serial.println(VL,DEC);
buf[k++] = VL;
buf[k++] = VH;
//Write image data to bufer if not full
if (k >= 256)
{
//Write 256 bytes image data to file from buffer
outFile.write(buf, 256);
k = 0;
}
}
//Close the file
outFile.close();
//Clear the capture done flag
myCAM.clear_fifo_flag();
return;
}