This repository has been archived on 2024-05-28. You can view files and clone it, but cannot push or open issues or pull requests.
2023-11-14 16:25:09 -05:00

121 lines
3.5 KiB
C++
Executable File

#include "ov5640_configs.h"
#include "ov5640.h"
#include "prepherials.h"
//#include "tim.h"
//#include "i2c.h"
//#include "dma.h"
//#include "uart.h"
#include "bsp.h"
#include "delay.h"
#include "global_variable.h"
#define OV5640_I2C_ADDR 0x78
__WARN_UNUSED_RESULT hal_status_e ov5640_read_reg(uint16_t reg[2]) {
// while (READ_BIT(i2c1_p->event, I2C_SEND_RECEIVE_COMPLETE) == 0);
uint8_t reg_addr[2];
reg_addr[0] = (reg[0] >> 8) & 0xFF;
reg_addr[1] = reg[0] & 0xFF;
i2c1.send_it_dep(OV5640_I2C_ADDR, reg_addr, 2, 10);
i2c1.read_block_dep(OV5640_I2C_ADDR, 1, 10);
uint8_t tmp_data;
i2c1.i2c_wait_for_transfer_complete(10);
i2c1.recv_queue_dep.pop(&tmp_data);
reg[1] = (uint16_t) tmp_data;
return HAL_OK;
}
__WARN_UNUSED_RESULT hal_status_e ov5640_write_reg(const uint16_t reg[][2], uint16_t len) {
for (int i = 0; i < len; i++) {
uint8_t data[3];
data[0] = (reg[i][0] >> 8) & 0xFF;
data[1] = reg[i][0] & 0xFF;
data[2] = reg[i][1] & 0xFF;
// wait for receive complete
i2c1.send_it_dep(OV5640_I2C_ADDR, data, 3, 10);
}
return HAL_OK;
}
void camera_sleep() {
pf.set_high(0);
}
void camera_wakeup() {
pf.set_low(0);
}
void camera_clock_init() {
pe.init(9, AF, 1); // PE9 ------> TIM1_CH1 for camera clock
// tim_set_gpio_ch1();
// timer_init_default(timer1);
tim1.init_default();
// timer_set_pwm(timer1, CH1, 4, 4);
tim1.set_pwm(CH1, 4, 4);
// timer_enable_output(timer1, CH1);
tim1.enable_output(CH1);
}
void camera_uart_int() {
// IF_ERROR_STUCK(uart_gpio_init(usart1_p, 0));
// IF_ERROR_STUCK(uart_init(usart1_p, 115200, 50, 20));
}
void camera_i2c_init() {
// IF_ERROR_STUCK(i2c_gpio_init(i2c1_p, 0));
// IF_ERROR_STUCK(i2c_init(i2c1_p, 20, 20));
}
void camera_sleep_init() {
// IF_ERROR_STUCK(gpio_init(gpiof_p, GGPIO_PIN_0, OUTPUT, PULL_PUSH, VERY_HIGH_SPEED, 0));
}
void camera_read_id() {
uint8_t data[3];
data[0] = 0x30, data[1] = 0x0A;
i2c1.send_it_dep(OV5640_I2C_ADDR, data, 2, 10);
i2c1.read_block_dep(OV5640_I2C_ADDR, 1, 10);
data[0] = 0x30, data[1] = 0x0B;
i2c1.send_it_dep(OV5640_I2C_ADDR, data, 2, 10);
i2c1.read_block_dep(OV5640_I2C_ADDR, 1, 10);
// I should have read 0x56 and 0x40 (I check this use debug mode)
}
void camera_init() {
camera_clock_init();
camera_uart_int();
camera_i2c_init();
camera_sleep_init();
IF_ERROR_STUCK(ov5640_write_reg(OV5640_Common, sizeof(OV5640_Common))); // init_old camera
IF_ERROR_STUCK(ov5640_write_reg(OV5640_PF_JPEG, sizeof(OV5640_PF_JPEG)));
uint16_t tmp_addr[1][2] = {{OV5640_TIMING_TC_REG21, 0xA8}};
// setup for jpeg mode
IF_ERROR_STUCK(ov5640_read_reg(tmp_addr[0]));
tmp_addr[0][1] |= (uint8_t) (1 << 5);
IF_ERROR_STUCK(ov5640_write_reg(tmp_addr, 1));
tmp_addr[0][0] = OV5640_SYSREM_RESET02;
IF_ERROR_STUCK(ov5640_read_reg(tmp_addr[0]));
tmp_addr[0][1] &= ~((1 << 2) | (1 << 3) | (1 << 4));
IF_ERROR_STUCK(ov5640_write_reg(tmp_addr, 1));
tmp_addr[0][0] = OV5640_CLOCK_ENABLE02;
IF_ERROR_STUCK(ov5640_read_reg(tmp_addr[0]));
tmp_addr[0][1] |= (1 << 3) | (1 << 5);
IF_ERROR_STUCK(ov5640_write_reg(tmp_addr, 1));
// end setup for jpeg mode
// dma_s *dcmi_dma = dma1_p;
dcmi_gpio_setup();
dma10.init(86,
DMA_DATA_WIDTH_32_BITS, DMA_DATA_WIDTH_32_BITS,
DMA_ADDR_FIX, DMA_ADDR_INC,
DMA_TYPE_PREPHERIAL, DMA_TYPE_MEMORY, PICTURE_BUFFER_SIZE * 4);
dcmi.init_old();
}