STC初始化带FIFo的Mt9V034初始化序列问题
<p>目前已经成功初始化DMA,ST7789控制的LCD屏幕,以及摄像头的IIc与串口等,可图像输出的数据任然是乱码,手指摁上去后图像会明显变灰,想请教一下站内的大佬问题出在哪里,如何能获得图像</p><p>用的是猪肺的总钻风V2.1,烧入猪肺的例程可以使用但异常卡顿,所以就自己从头开始写</p>
<video controls="controls" src="forum.php?mod=attachment&aid=133257"></video>
<p>压缩包内是全部的代码
调试的相关视频 void start_get_image(void)
{
// ============== 第一阶段:捕获一帧 ==============
P_mtv_WEN = 1; // 先关闭写使能
while(P_mtv_VSY == 1); // 等待 VSYNC 变低(进入消隐区)
P_mtv_WRST = 0;
Delay10us();
P_mtv_WRST = 1; // 复位 FIFO 写指针
while(P_mtv_VSY == 0); // 等待 VSYNC 变高(新的一帧开始)
P_mtv_WEN = 0; // 立刻拉低 WEN,允许存数据
while(P_mtv_VSY == 1); // 等待新的一帧结束
P_mtv_WEN = 1; // 立刻拉高 WEN,锁定数据
// ============== 第二阶段:准备读取 ==============
Delay10us();
P_mtv_OE = 0; // 使能 FIFO 输出到 P2 口
Delay10us();
P_mtv_RRST = 0;
P_mtv_RCK = 0; Delay10us();
P_mtv_RCK = 1; Delay10us(); // 第一个脉冲
P_mtv_RCK = 0; Delay10us();
P_mtv_RRST = 1; Delay10us();
P_mtv_RCK = 1; Delay10us();
// 【关键修复】手动读丢第一个无效的假字节 (Dummy Byte)
P_mtv_RCK = 0; Delay10us();
P_mtv_RCK = 1; Delay10us();
// ============== 第三阶段:启动 DMA ==============
// 【关键修复】强制转换必须是 unsigned long,防止指针高位被截断!
DMA_LCM_RXAH = (unsigned char)(((unsigned long)(&image_dat)) >> 8);
DMA_LCM_RXAL = (unsigned char)(((unsigned long)(&image_dat)));
DMA_LCM_AMTH = (unsigned char)(5640 >> 8);
DMA_LCM_AMT= (unsigned char)(5640 & 0xFF);
lcm_done = 1;
DMA_LCM_CR = 0x89;
while(lcm_done);
// ============== 第四阶段:收尾 ==============
// 【最致命修复】必须关闭 OE 释放总线,否则 TFT 屏幕必定乱码或黑点!
P_mtv_OE = 1;
}这是DMA部分的代码
关于MTV初始化的问题
最近在尝试自己初始化MTV,<p>目前已经成功初始化DMA,ST7789控制的LCD屏幕,以及摄像头的IIc与串口等,可图像输出的数据任然是乱码,手指摁上去后图像会明显变灰,想请教一下站内的大佬问题出在哪里,如何能获得图像</p><p>用的是猪肺的总钻风V2.1,烧入猪肺的例程可以使用但异常卡顿,所以就自己从头开始写</p>
以下是我全部的代码,希望有大佬能指点迷津 void start_get_image(void)
{
// ============== 第一阶段:捕获一帧 ==============
P_mtv_WEN = 1; // 先关闭写使能
while(P_mtv_VSY == 1); // 等待 VSYNC 变低(进入消隐区)
P_mtv_WRST = 0;
Delay10us();
P_mtv_WRST = 1; // 复位 FIFO 写指针
while(P_mtv_VSY == 0); // 等待 VSYNC 变高(新的一帧开始)
P_mtv_WEN = 0; // 立刻拉低 WEN,允许存数据
while(P_mtv_VSY == 1); // 等待新的一帧结束
P_mtv_WEN = 1; // 立刻拉高 WEN,锁定数据
// ============== 第二阶段:准备读取 ==============
Delay10us();
P_mtv_OE = 0; // 使能 FIFO 输出到 P2 口
Delay10us();
P_mtv_RRST = 0;
P_mtv_RCK = 0; Delay10us();
P_mtv_RCK = 1; Delay10us(); // 第一个脉冲
P_mtv_RCK = 0; Delay10us();
P_mtv_RRST = 1; Delay10us();
P_mtv_RCK = 1; Delay10us();
// 【关键修复】手动读丢第一个无效的假字节 (Dummy Byte)
P_mtv_RCK = 0; Delay10us();
P_mtv_RCK = 1; Delay10us();
// ============== 第三阶段:启动 DMA ==============
// 【关键修复】强制转换必须是 unsigned long,防止指针高位被截断!
DMA_LCM_RXAH = (unsigned char)(((unsigned long)(&image_dat)) >> 8);
DMA_LCM_RXAL = (unsigned char)(((unsigned long)(&image_dat)));
DMA_LCM_AMTH = (unsigned char)(5640 >> 8);
DMA_LCM_AMT= (unsigned char)(5640 & 0xFF);
lcm_done = 1;
DMA_LCM_CR = 0x89;
while(lcm_done);
// ============== 第四阶段:收尾 ==============
// 【最致命修复】必须关闭 OE 释放总线,否则 TFT 屏幕必定乱码或黑点!
P_mtv_OE = 1;
}
这是我代码的DMA部分 #define MT9V034_ADDR_WRITE 0xB8
#define MT9V034_ADDR_READ0xB9
#define DEVICE_ADDR 0xB8
#define CHIP_ID_ADDR 0x00
#define CHIP_ID_VALUE 0x1324
#define ROW_START_ADDR 0x01
#define ROW_START_VALUE 0x01
#define COL_START_ADDR 0x02
#define COL_START_VALUE 0x04
#define WINDOWS_HEIGHT_ADDR 0x03
#define WINDOWS_HEIGHT_VALUE 120
#define WINDOW_WIDTH_ADDR 0x04
#define WINDOW_WIDTH_VALUE 188
#define HORIZONTAL_BLANKING_ADDR 0x05
#define HORIZONTAL_BLANKING_VALUE 91
#define CHIP_CONTROL_ADDR 0x07
#define CHIP_CONTROL_VALUE 0x188
#define COARSE_SHUTTER_WIDTH_1_ADDR 0x08
#define COARSE_SHUTTER_WIDTH_1_VALUE 0x1BB
#define COARSE_SHUTTER_WIDTH_2_ADDR 0x09
#define COARSE_SHUTTER_WIDTH_2_VALUE 0x1D9
#define COARSE_SHUTTER_WIDTH_3_ADDR 0x0A
#define COARSE_SHUTTER_WIDTH_3_VALUE 0x164
#define COARSE_SHUTTER_WIDTH_TOTAL_ADDR 0x0B
#define COARSE_SHUTTER_WIDTH_TOTAL_VALUE 480 // Related to exposure time
#define VERTICAL_BLANKING_ADDR 0x06
// Value = COARSE_SHUTTER_WIDTH_TOTAL_VALUE-COARSE_SHUTTER_WIDTH_1_ADDR+7
#define READ_MODE_ADDR 0x0D
#define READ_MODE_VALUE 0x3A // 4*4 binning mode & flip row and column
#define SENSOR_TYPE_CONTROL_ADDR 0x0F
#define SENSOR_TYPE_CONTROL_VALUE 0x00 // Linear opeartion & mono sensor
#define ADC_COMPANDING_MODE_ADDR 0x1C
#define ADC_COMPANDING_MODE_VALUE 0x202
#define AEC_AGC_DESIRED_BIN_ADDR 0xA5
#define AEC_AGC_DESIRED_BIN_VALUE 0x3A
#define AEC_LOW_PASS_FILTER_ADDR 0xA8
#define AEC_LOW_PASS_FILTER_VALUE 0x01
#define AGC_LOW_PASS_FILTER_ADDR 0xAA
#define AGC_LOW_PASS_FILTER_VALUE 0x02
#define AGC_AEC_BIN_DIFFERENCE_THRESHOLD_ADDR 0xAE
#define AGC_AEC_BIN_DIFFERENCE_THRESHOLD_VALUE 0x0A
#define AGC_AEC_ENABLE_ADDR 0xAF
#define AGC_AEC_ENABLE_VALUE 0x02 // Enable AGC & disable AEC
这是我MTV初始化的寄存器
用带fifo的摄像头模块
简单图像识别, 30W像素摄像头,适合扫码,智能车, STC32G144K246 - 第2页 - 全国大学生智能汽车竞赛,清华卓老师 国芯人工智能技术交流网站 - AI32位8051交流社区
i8080接口-DMA读取带FIFO的OV7725摄像头@STC32G144K246,速率可达500帧@120MHz - STC32G144K246 测试版块,PGA/运放,DAC,CAN-FD,主频100MHz以下 国芯人工智能技术交流网站 - AI32位8051交流社区
页:
[1]