STM32/STM8技术william hill官网
直播中

岳磊_79571119

3年用户 3经验值
擅长:嵌入式技术
私信 关注
[问答]

OV7670摄像头使用串口发送数据到另一个板子上的lcd,出现花屏

7931d2eb428113feb7c56325969cc37.jpg
64f784267aef02c1adbd11225ec3552.jpg
36a966b12a7f8eeb0fe89e43ebc127d.jpg
测试色带是正常的平整的,如图所示
57850aca89057a389bdd874c941a08b.jpg

摄像头端

void ov7670()//单片机读取OV7670的图片像素并发送到TFT屏幕上
{
uint8_t sendData[5]; // 假设数组长度为5个字节
while(OV7670_VS()==0){};
OV7670_W_WRST(0);
OV7670_W_WRST(1);
OV7670_W_WEN(1);
Delay_us(40000);
while(OV7670_VS()==0);
OV7670_W_WRST(0);
OV7670_W_WRST(1);
OV7670_W_WEN(0);
Delay_us(50000);

OV7670_W_OE(0);		
	OV7670_W_RRST(0);
	
	OV7670_W_RCLK(0);
	Delay_us(20000);
	OV7670_W_RCLK(1);
	Delay_us(20000);
	OV7670_W_RCLK(0);
	Delay_us(20000);
    OV7670_W_RRST(1);
	Delay_us(20000);
	OV7670_W_RCLK(1);

// set_windows(0,0,lcddev.width-1,lcddev.height-1);
for(h=0;h<160;h++)//128
{
// printf("------1--------\n");
for(w=0;w<128;w++)
{
OV7670_W_RCLK(0);
// 读取 PA15, PB3~PB9 引脚状态
uint8_t PA15_state = (GPIOA->IDR >> 15) & 0x01;
uint8_t PB3_state = (GPIOB->IDR >> 3) & 0x01;
uint8_t PB4_state = (GPIOB->IDR >> 4) & 0x01;
uint8_t PB5_state = (GPIOB->IDR >> 5) & 0x01;
uint8_t PB6_state = (GPIOB->IDR >> 6) & 0x01;
uint8_t PB7_state = (GPIOB->IDR >> 7) & 0x01;
uint8_t PB8_state = (GPIOB->IDR >> 8) & 0x01;
uint8_t PB9_state = (GPIOB->IDR >> 9) & 0x01;
value1 = (uint8_t)((PA15_state << 7) | (PB9_state << 6) | (PB8_state << 5) | (PB7_state << 4) | (PB6_state << 3) | (PB5_state << 2) | (PB4_state << 1) | PB3_state);

// printf("v1=%d\n",value1);
OV7670_W_RCLK(1);
OV7670_W_RCLK(0);
PA15_state = (GPIOA->IDR >> 15) & 0x01;
PB3_state = (GPIOB->IDR >> 3) & 0x01;
PB4_state = (GPIOB->IDR >> 4) & 0x01;
PB5_state = (GPIOB->IDR >> 5) & 0x01;
PB6_state = (GPIOB->IDR >> 6) & 0x01;
PB7_state = (GPIOB->IDR >> 7) & 0x01;
PB8_state = (GPIOB->IDR >> 8) & 0x01;
PB9_state = (GPIOB->IDR >> 9) & 0x01;
value2 = (uint8_t)((PA15_state << 7) | (PB9_state << 6) | (PB8_state << 5) | (PB7_state << 4) | (PB6_state << 3) | (PB5_state << 2) | (PB4_state << 1) | PB3_state);

// printf("v2=%d\n",value2);
OV7670_W_RCLK(1);

color = value1 << 8 | value2;

// color = color | value2;
//// printf("color=%d\n",color);

// TFT_WRITE_uint16_t_DATA(color);
sendData[4] = 1;
sendData[3] = w ;
sendData[2] = h ;
sendData[0] = value1; // 获取 color 的高 8 位
sendData[1] = value2; // 获取 color 的高 8 位
// printf("------2--------\n");
// printf("v1=%d,v2=%d\n",value1,value2);
printf("w=%d,H=%d,color1=%d,color2=%d\n",sendData[3],sendData[2],sendData[0],sendData[1]);
HAL_UART_Transmit_DMA(&huart2, sendData, sizeof(sendData));
}

}	
	OV7670_W_OE(1);

}
lcd端串口接收中断

if (huart == &huart2)
	{			
				printf("2\n");
				uint16_t color = (uint16_t) sendData[0] << 8;
					color |= (uint16_t)sendData[1];

LCD_DrawPoint((uu16)sendData[3],(uu16)sendData[2],color);

}




[*附件:CS_LCD.zip](//file1.elecfans.com/web2/M00/07/27/wKgaombjCKyALQ21AX4uYeDWbOw675.zip)
[*附件:CS_SXT-3.zip](//file1.elecfans.com/web2/M00/07/27/wKgaombjCUmAcLNfAGdLsN9w2Nw837.zip)

回帖(1)

孙成红

5 天前
看起来你正在尝试使用OV7670摄像头通过串口将图像数据发送到另一个板子上的LCD显示。你提供的代码片段是摄像头端的初始化和数据发送部分。花屏问题可能由多种原因引起,包括但不限于:

1. **同步问题**:摄像头和LCD的时钟同步可能没有正确设置,导致数据传输时序错误。
2. **数据传输速率**:如果数据传输速率不匹配,可能会导致图像数据在传输过程中丢失或错误。
3. **串口通信设置**:串口的波特率、数据位、停止位和奇偶校验设置需要在发送端和接收端一致。
4. **缓冲区溢出**:如果发送的数据量超过了接收端的处理能力,可能会导致数据丢失或错误。
5. **电源和接地问题**:不稳定的电源或不良的接地可能导致信号干扰,影响数据传输。

为了解决花屏问题,你可以尝试以下步骤:

- **检查时钟同步**:确保摄像头和LCD的时钟频率匹配,并且同步信号正确。
- **调整串口设置**:确保发送端和接收端的串口配置完全一致。
- **增加缓冲区**:如果可能,增加发送和接收端的缓冲区大小,以减少数据丢失的风险。
- **检查电源和接地**:确保所有设备的电源稳定,并且接地良好。
- **调试和测试**:使用示波器或逻辑分析仪检查数据传输过程中的信号完整性。

此外,你的代码片段似乎不完整,如果需要更具体的帮助,请提供完整的代码和更多的上下文信息。如果你有具体的调试问题或需要进一步的代码审查,请随时提问。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分