/* 摄像头IO口采用直接操作寄存器的方式实现,极大提升io速度 */#define BSP_FIFO_RCK_PIN "PA.5"#define BSP_FIFO_RCK_SET_LOW (GPIOA_BASE[GPIOx] &= ~(1ul << 5))#define BSP_FIFO_RCK_SET_HIGH (GPIOA_BASE[GPIOx] |= (1ul << 5))
/* sccb总线的初始化并设置ov7670相应寄存器 */ sccb_init();
if(sccb_write_reg(0x12, 0x80) == RT_FALSE){ return RT_FALSE; }
rt_thread_delay(50);
id1 = sccb_read_reg(0x0b); id2 = sccb_read_reg(0x0a);
rt_kprintf("id1 = 0x%02x, id2 = 0x%02xn", id1, id2);
for(rt_uint16_t i = 0;i < sizeof(ov7670_init_reg_tbl) / sizeof(ov7670_init_reg_tbl[0]);i++){ sccb_write_reg(ov7670_init_reg_tbl[0], ov7670_init_reg_tbl[1]);}
/* 开启摄像头vsync扫描线程(没有外部中断因此改用轮询的方式实现) */ rt_thread_t thread; /* 查询VSYNC线程 */ thread = rt_thread_create("ov7670_vsync", ov7670_vsync_thread_entry, RT_NULL, 1024, 5, 100);
if (thread == RT_NULL){ rt_kprintf("ov7670_vsync thread create fail!n"); return RT_FALSE; } /* 启动线程 */rt_thread_startup(thread);
/* 提取hal库实现了uart的数据发送函数 */void uart1_send(rt_uint8_t *pbuf, rt_uint32_t len){ for(rt_uint32_t i = 0;i < len;i++){ hal_uart_clrflag(UART1_BASE, UART_FLAG_TXPND); hal_uart_write(UART1_BASE, pbuf); while(hal_uart_getflag(UART1_BASE, UART_FLAG_TXPND) == 0); }}
/* LCD底层驱动代码,因为引脚不够,所以无法演示,测试可用,另外程序里也配有寄存器版本的操作代码 */
static rt_uint32_t spi_bit_xfer(struct rt_spi_device *device, struct rt_spi_message *message){ struct rt_spi_bit_ops *ops = (struct rt_spi_bit_ops *)device->user_data;
rt_uint8_t tmp_buf[1024]; rt_memset(tmp_buf, 0, sizeof(tmp_buf));
if(message->send_buf == RT_NULL){ message->send_buf = tmp_buf; }else if(message->recv_buf == RT_NULL){ message->recv_buf = tmp_buf; }else{ return RT_FALSE; }
if (message->cs_take){ ops->set_cs(ops->data, PIN_LOW); }#ifdef SPI_DC message->length & SPI_DC ? ops->set_dc(ops->data, PIN_HIGH) : ops->set_dc(ops->data, PIN_LOW); message->length &= ~SPI_DC; /* 复原消息长度 */// rt_kprintf("message->length = %dn", message->length);#endif spi_rw_bytes(device, (rt_uint8_t *)message->send_buf, (rt_uint8_t *)message->recv_buf, message->length);
if (message->cs_release){ ops->set_cs(ops->data, PIN_HIGH); }}
static const struct rt_spi_ops spi_bit_bus_ops ={ RT_NULL, spi_bit_xfer
};
评论