Временные диаграммы обмена данными по шине SPI Arducam
Тест на платформе Arduino UNO
В Arducam провели полный тест на платформе Arduino UNO при частоте SPI 4 МГц (на примере ArduCAM_MINI_5MP_Plus).
1. Проверка сенсора
- Адрес I2C: запись — 0 × 78, чтение — 0 × 79
- ID сенсора читается из регистров 0 × 300A и 0 × 300B
- ID сенсора: 5642


2. Тест SPI
Запишите значение 0 × 55 по адресу 0 × 00 и прочитайте значение с адреса 0 × 00.

3. Передача данных изображения
После запуска съёмки в цикле читается адрес 0 × 41, пока значение по нему не станет 0 × 08 — это значит, что кадр завершён.

Затем из регистров 0 × 42, 0 × 43 и 0 × 44 считывается длина изображения.

Далее данные изображения читаются в пакетном режиме (burst):
Сначала установите низкий уровень на линии SPI CS и прочитайте адрес 0 × 3C — это операция пакетного чтения FIFO (Burst FIFO read).

Затем читаются данные изображения: изображение начинается с байтов 0xFF 0xD8 и заканчивается байтами 0xFF 0xD9.


Код
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;
}
}
Как обычно, частота кадров ограничена быстродействием контроллера.
В Arducam тестировали ArduCAM MINI 2MP на платформе STM32F103: частота кадров достигает 15 к/с.