#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(); }