Временные диаграммы шины SPI в камере Arducam Mini
Временные диаграммы ниже показывают полный цикл работы модуля ArduCAM 5MP Plus (OV5642):








1. Проверка идентификатора модели сенсора
Адрес OV5642 на шине I2C (ведомое устройство): 0 × 78 для записи, 0 × 79 для чтения. Регистры идентификатора модели OV5642: 0 × 300A = 0 × 56 и 0 × 300B = 0 × 42.
2. Операции SPI
Операции показаны на плате Arduino UNO при частоте SPI 4 МГц.
2.1. Проверка шины SPI
Запишите 0 × 55 по адресу 0 × 00 и прочитайте значение по адресу 0 × 00.
2.2. Передача данных изображения
После команды захвата опрашивайте флаг завершения захвата, читая регистр 0 × 41, пока его значение не станет равно 0 × 08. Затем прочитайте длину изображения из регистров 0 × 42–0 × 44 — это общая длина действительных данных изображения.
Далее отправьте команду пакетного чтения FIFO 0 × 3C и читайте байты из FIFO. На диаграмме ниже первыми читаются байты 0xFF, 0xD8 — в данном случае это заголовок JPEG. Каждый цикл пакетного чтения должен начинаться с команды 0 × 3C, после которой можно прочитать любое количество данных; в этом примере читается 256 байт. При чтении по линии MOSI нужно передавать фиктивные данные, например 0 × 00. В конце действительных данных читается окончание JPEG — в данном случае 0xFF, 0xD9.
2.3. Полная временная диаграмма захвата и чтения
Вывод CS активен (низкий уровень) только во время пакетного чтения 256 байт; пока эти 256 байт передаются по UART, CS переводится в высокий уровень. Один кадр читается за несколько циклов пакетного чтения.
3. Ключевой код функции пакетного чтения
/**important code in the burst read function/
myCAM.CS_LOW();
myCAM.set_fifo_burst();
while ( length– )
{
temp_last = temp;
temp = SPI.transfer(0x00);
//Read JPEG data from FIFO
if ( (temp == 0xD9) && (temp_last == 0xFF) ) //If find the end ,break while,
{
buf[i++] = temp; //save the last 0XD9
//Write the remain bytes in the buffer
myCAM.CS_HIGH();
Serial.write(buf,i);
is_header = false;
i = 0;
}
if (is_header == true)
{
//Write image data to buffer if not full
if (i < 256)
buf[i++] = temp;
else
{
//Write 256 bytes image data to file
myCAM.CS_HIGH();
Serial.write(buf,256);
delay(5);
i = 0;
buf[i++] = temp;
myCAM.CS_LOW();
myCAM.set_fifo_burst();
}
}
else if ((temp == 0xD8) & (temp_last == 0xFF))
{
is_header = true;
Serial.println(F(“ACK IMG”));
buf[i++] = temp_last;
buf[i++] = temp;
}
}



