卡缪.维丹 发表于 2026-3-8 20:43:15

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>压缩包内是全部的代码

卡缪.维丹 发表于 2026-3-8 20:45:44

调试的相关视频

卡缪.维丹 发表于 2026-3-8 20:56:23

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部分的代码

卡缪.维丹 发表于 2026-3-8 20:59:57

关于MTV初始化的问题

最近在尝试自己初始化MTV,<p>目前已经成功初始化DMA,ST7789控制的LCD屏幕,以及摄像头的IIc与串口等,可图像输出的数据任然是乱码,手指摁上去后图像会明显变灰,想请教一下站内的大佬问题出在哪里,如何能获得图像</p>
<p>用的是猪肺的总钻风V2.1,烧入猪肺的例程可以使用但异常卡顿,所以就自己从头开始写</p>


卡缪.维丹 发表于 2026-3-8 21:00:55

以下是我全部的代码,希望有大佬能指点迷津

卡缪.维丹 发表于 2026-3-8 21:01:21

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部分

卡缪.维丹 发表于 2026-3-8 21:01:57

#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初始化的寄存器

ercircle 发表于 2026-3-9 09:21:01


用带fifo的摄像头模块
简单图像识别, 30W像素摄像头,适合扫码,智能车, STC32G144K246 - 第2页 - 全国大学生智能汽车竞赛,清华卓老师 国芯人工智能技术交流网站 - AI32位8051交流社区

i8080接口-DMA读取带FIFO的OV7725摄像头@STC32G144K246,速率可达500帧@120MHz - STC32G144K246 测试版块,PGA/运放,DAC,CAN-FD,主频100MHz以下 国芯人工智能技术交流网站 - AI32位8051交流社区

页: [1]
查看完整版本: STC初始化带FIFo的Mt9V034初始化序列问题