当前位置:   article > 正文

OV5640的初始化

ov5640

OV5640的初始化

OV5640的基本知识

输出格式

  • RGB888:用3个时钟周期发一个像素的数据,R、G、B每个通道由8bit数据组成

  • RGB565:用2个时钟周期发一个像素的数据,R通道占5bit、G通道占6bit、B通道占5bit

图像窗大小

 

OV5640使用寄存器0x3800 ~ 0x3814来配置图像窗口。

  • physical pixel size(最大为2632 * 1951)是传感器中的总像素阵列大小。

  • ISP input size(最大为2592 * 1944)是从像素数组中读取的总像素数据。

  • 最终的data output size(输出窗口大小),也就是需要的分辨率是由{0x3808,0x3809}和{0x380A ,0x380B}决定的,这也是我们最终输出到显示器的图像大小。

输出速率

表中列出了几种参考的数据速率,但其本身支持2592 * 1944大小之下的任意分辨率,所以除了列出的这几种常用配置外,具体传输速率无法真正确定。

传输速率是配置完成后就固定下来的参数,不可在FPGA(主机端)更改,只能用于计算总线带宽是否足够。

 

参数配置

OV5640的寄存器非常多,但是很多参数我们不用配置,直接使用默认值即可,唯一需要我们做的是配置输出窗的大小,用以适配我们后面的设计。

这里给出两种常用的配置(1920*10801280*720),其他保持默认的参数会在下方的完整代码中给出。

  1. //1920*1080
  2. write_i2c(0x3800 ,0x01);
  3. write_i2c(0x3801 ,0x50);
  4. write_i2c(0x3802 ,0x01);
  5. write_i2c(0x3803 ,0xb2);
  6. write_i2c(0x3804 ,0x08);
  7. write_i2c(0x3805 ,0xef);
  8. write_i2c(0x3806 ,0x05);
  9. write_i2c(0x3807 ,0xf2);
  10. write_i2c(0x3808 ,0x07);
  11. write_i2c(0x3809 ,0x80);
  12. write_i2c(0x380a ,0x04);
  13. write_i2c(0x380b ,0x38);
  14. write_i2c(0x380c ,0x09);
  15. write_i2c(0x380d ,0xc4);
  16. write_i2c(0x380e ,0x04);
  17. write_i2c(0x380f ,0x60);
  18. write_i2c(0x3810 ,0x00);
  19. write_i2c(0x3811 ,0x10);
  20. write_i2c(0x3812 ,0x00);
  21. write_i2c(0x3813 ,0x04);
  22. //1280*720
  23. write_i2c(0x3800 ,0x00);
  24. write_i2c(0x3801 ,0x00);
  25. write_i2c(0x3802 ,0x00);
  26. write_i2c(0x3803 ,0xfa);
  27. write_i2c(0x3804 ,0x0a);
  28. write_i2c(0x3805 ,0x3f);
  29. write_i2c(0x3806 ,0x06);
  30. write_i2c(0x3807 ,0xa9);
  31. write_i2c(0x3808 ,0x05);
  32. write_i2c(0x3809 ,0x00);
  33. write_i2c(0x380a ,0x02);
  34. write_i2c(0x380b ,0xd0);
  35. write_i2c(0x380c ,0x07);
  36. write_i2c(0x380d ,0x64);
  37. write_i2c(0x380e ,0x02);
  38. write_i2c(0x380f ,0xe4);
  39. write_i2c(0x3810 ,0x00);
  40. write_i2c(0x3811 ,0x10);
  41. write_i2c(0x3812 ,0x00);
  42. write_i2c(0x3813 ,0x04);

控制模块的设计

OV5640的初始化流程

这一流程可分为4个阶段:上电等待、软复位、复位等待、配置所有寄存器。

下面两张图可以得出,上电等待的时间为26ms(实际上25ms也是可以的),软复位的等待时间为1ms。

 

 

状态机设计

实际上,在已经有接口模块的现在(I2C接口模块),控制模块要做的事情就很简单了,发送请求、命令和要发送的数据。

  1.    localparam      IDLE = 5'b00001,
  2.                    CMD  = 5'b00010,
  3.                    SEND = 5'b00100,
  4.                    WAIT = 5'b01000,
  5.                    DONE = 5'b10000;

这个状态机非常单薄,所以只做简单阐述:

  • IDLE:空闲状态

  • CMD:这一状态是为了让这个模块更稳定而设置的,负责的是命令和数据的改变,不发送数据

  • SEND:这一状态只负责发送命令、数据、请求给接口模块,命令和数据的改变不在此状态执行

  • WAIT:用于处理上电和软复位的等待

  • DONE:给更上层的模块发送初始化结束信号

完整代码

这一代码非常长,但本身很简单,主要长在要配置的寄存器极多。这一代码直接使用,涉及到的参数只有4个,一并贴出:

  1. //所用参数
  2. `define     START_CMD   4'b0001
  3. `define     WRITE_CMD   4'b0010
  4. `define     READ_CMD    4'b0100
  5. `define     STOP_CMD    4'b1000
  6. //原本参数是写在param.v里,使用时可以自己新建一个param.v文件,或者把这些参数放进来即可
  7. //模块本体
  8. `include "param.v"
  9. module ov5640_cfg
  10. (
  11.    input           clk         ,
  12.    input           rst_n       ,
  13.    output          i2c_start   ,
  14.    output  [7:0]   i2c_data_out,
  15.    output  [3:0]   i2c_cmd     ,
  16.    input   [7:0]   dout       ,
  17.    input           i2c_end     ,
  18.    output          initial_done
  19. );
  20.    parameter       CMD_NUM     = 256;
  21.    parameter       BYTE_NUM    = 4;
  22.    parameter       TIME_25MS   = 1_250_000;
  23.    parameter       TIME_2MS    = 100_000;
  24.    reg             i2c_start_r   ;
  25.    reg [7:0]       i2c_data_out_r;
  26.    reg [3:0]       i2c_cmd_r     ;
  27.    reg             initial_done_r;
  28.    reg [20:0]      cnt_delay_num;
  29.    reg [20:0]      cnt_delay;  //最大计到1_250_000,即25ms
  30.    wire            add_cnt_delay,
  31.                    end_cnt_delay;
  32.    reg [3:0]       cnt_send;
  33.    wire            add_cnt_send,
  34.                    end_cnt_send;
  35.    reg [9:0]       cnt_cmd;    //逐条发送命令及数据
  36.    wire            add_cnt_cmd,
  37.                    end_cnt_cmd;
  38.    reg             start_flag0,
  39.                    start_flag1;
  40.    reg [23:0]      addr_data;
  41. //状态机参数定义
  42.    localparam      IDLE = 5'b00001,
  43.                    CMD  = 5'b00010,
  44.                    SEND = 5'b00100,
  45.                    WAIT = 5'b01000,
  46.                    DONE = 5'b10000;
  47.    reg [4:0]       state_c,
  48.                    state_n;
  49.    
  50.    wire            idle2cmd ,
  51.                    cmd2wait ,
  52.                    cmd2send ,
  53.                    wait2cmd ,
  54.                    send2cmd ,
  55.                    cmd2done ,
  56.                    done2idle;
  57. //状态机状态跳转
  58.    always@(posedge clk or negedge rst_n)begin
  59.        if(!rst_n)
  60.            state_c <= IDLE;
  61.        else
  62.            state_c <= state_n;
  63.    end
  64.    always@(*)begin
  65.        case(state_c)
  66.            IDLE:begin
  67.                if(idle2cmd)
  68.                    state_n = CMD;
  69.                else
  70.                    state_n = state_c;
  71.            end
  72.            CMD :begin
  73.                if(cmd2wait)
  74.                    state_n = WAIT;
  75.                else if(cmd2send)
  76.                    state_n = SEND;
  77.                else if(cmd2done)
  78.                    state_n = DONE;
  79.                else
  80.                    state_n = state_c;
  81.            end
  82.            SEND:begin
  83.                if(send2cmd)
  84.                    state_n = CMD;
  85.                else
  86.                    state_n = state_c;
  87.            end
  88.            WAIT:begin
  89.                if(wait2cmd)
  90.                    state_n = CMD;
  91.                else
  92.                    state_n = state_c;
  93.            end
  94.            DONE:begin
  95.                if(done2idle)
  96.                    state_n = IDLE;
  97.                else
  98.                    state_n = state_c;
  99.            end
  100.            default: state_n = IDLE;
  101.        endcase
  102.    end
  103.    assign  idle2cmd  = (state_c == IDLE) && (~start_flag1);
  104.    assign  cmd2wait  = (state_c == CMD ) && ((cnt_cmd == 0) || (cnt_cmd == 3));
  105.    assign  cmd2send  = (state_c == CMD ) && (~end_cnt_cmd) && (~(cnt_cmd == 0) || (cnt_cmd == 3));
  106.    assign  wait2cmd  = (state_c == WAIT) && (end_cnt_delay);
  107.    assign  send2cmd  = (state_c == SEND) && (end_cnt_send);
  108.    assign  cmd2done  = (state_c == CMD ) && (end_cnt_cmd);
  109.    assign  done2idle = (state_c == DONE) && (1'b1);
  110. //计数器
  111.    always@(posedge clk or negedge rst_n)begin
  112.        if(!rst_n)
  113.            cnt_delay <= 1'b0;
  114.        else if(add_cnt_delay)
  115.                if(end_cnt_delay)
  116.                    cnt_delay <= 1'b0;
  117.                else
  118.                    cnt_delay <= cnt_delay + 1'b1;
  119.            else
  120.                cnt_delay <= cnt_delay;
  121.    end
  122.    assign add_cnt_delay = (state_c == WAIT);
  123.    assign end_cnt_delay = add_cnt_delay && cnt_delay >= cnt_delay_num - 1'b1;
  124.    always@(*)begin
  125.        if(cnt_cmd == 0)
  126.            cnt_delay_num = TIME_25MS;
  127.        else if(cnt_cmd == 3)
  128.            cnt_delay_num = TIME_2MS;
  129.        else
  130.            cnt_delay_num = cnt_delay_num;
  131.    end
  132.    always@(posedge clk or negedge rst_n)begin
  133.        if(!rst_n)
  134.            cnt_cmd <= 1'b0;
  135.        else if(add_cnt_cmd)
  136.                if(end_cnt_cmd)
  137.                    cnt_cmd <= 1'b0;
  138.                else
  139.                    cnt_cmd <= cnt_cmd + 1'b1;
  140.            else
  141.                cnt_cmd <= cnt_cmd;
  142.    end
  143.    assign add_cnt_cmd = (state_c == CMD);
  144.    assign end_cnt_cmd = add_cnt_cmd && cnt_cmd >= CMD_NUM - 1'b1;
  145.    always@(posedge clk or negedge rst_n)begin
  146.        if(!rst_n)
  147.            cnt_send <= 1'b0;
  148.        else if(add_cnt_send)
  149.                if(end_cnt_send)
  150.                    cnt_send <= 1'b0;
  151.                else
  152.                    cnt_send <= cnt_send + 1'b1;
  153.            else
  154.                cnt_send <= cnt_send;
  155.    end
  156.    assign add_cnt_send = (state_c == SEND) && i2c_end;
  157.    assign end_cnt_send = add_cnt_send && cnt_send >= BYTE_NUM - 1'b1;
  158. //启动信号
  159.    always@(posedge clk or negedge rst_n)begin
  160.        if(!rst_n) begin
  161.            start_flag0 <= 1'b0;
  162.            start_flag1 <= 1'b0;
  163.        end
  164.        else begin
  165.            start_flag0 <= 1'b1;
  166.            start_flag1 <= start_flag0;
  167.        end
  168.    end
  169. //输出控制
  170.    always@(*)begin
  171.        if(state_n == SEND)
  172.                case(cnt_send)
  173.                    'd0:TX(1'b1,`START_CMD|`WRITE_CMD,8'h78);
  174.                    'd1:TX(1'b1,`WRITE_CMD,addr_data[23:16]);
  175.                    'd2:TX(1'b1,`WRITE_CMD,addr_data[15: 8]);
  176.                    'd3:TX(1'b1,`WRITE_CMD|`STOP_CMD,addr_data[7 : 0]);
  177.                    default: TX(1'b0,4'd0,8'd0);
  178.                endcase
  179.        else
  180.            TX(1'b0,4'd0,8'd0);
  181.    end
  182.    always@(posedge clk or negedge rst_n)begin
  183.        if(!rst_n)
  184.            initial_done_r <= 1'b0;
  185.        else if(state_c == DONE)    
  186.            initial_done_r <= 1'b1;
  187.        else
  188.            initial_done_r <= initial_done_r;
  189.    end
  190.    assign  initial_done = initial_done_r;
  191. //命令集
  192.    always@(*)begin
  193.        case(cnt_cmd)
  194.        //15fps VGA output
  195.        // 24MHz input clock, 84MHz PCLK
  196.        0   :           addr_data   =   0;             //power_on wait time
  197.        1   :           addr_data = {24'h3103_11}; // system clock from pad, bit[1]
  198.        2   :           addr_data = {24'h3008_82}; // software reset, bit[7]
  199.        3   :           addr_data   =   0;             //software reset wait time
  200.        4   :           addr_data = {24'h3008_42}; // software power down, bit[6]
  201.        5   :           addr_data = {24'h3103_03}; // system clock from PLL, bit[1]
  202.        6   :           addr_data = {24'h3017_ff}; // FREX, Vsync, HREF, PCLK, D[9:6] output enable
  203.        7   :           addr_data = {24'h3018_ff}; // D[5:0], GPIO[1:0] output enable
  204.        8   :           addr_data = {24'h3034_1a}; // MIPI 10-bit
  205.        9   :           addr_data = {24'h3037_13}; // PLL root divider, bit[4], PLL pre-divider, bit[3:0]
  206.        10 :           addr_data = {24'h3108_01}; // PCLK root divider, bit[5:4], SCLK2x root divider, bit[3:2]
  207.        11 :           addr_data = {24'h3630_36}; //SCLK root divider, bit[1:0]
  208.        12 :           addr_data = {24'h3631_0e};
  209.        13 :           addr_data = {24'h3632_e2};
  210.        14 :           addr_data = {24'h3633_12};
  211.        15 :           addr_data = {24'h3621_e0};
  212.        16 :           addr_data = {24'h3704_a0};
  213.        17 :           addr_data = {24'h3703_5a};
  214.        18 :           addr_data = {24'h3715_78};
  215.        19 :           addr_data = {24'h3717_01};
  216.        20 :           addr_data = {24'h370b_60};
  217.        21 :           addr_data = {24'h3705_1a};
  218.        22 :           addr_data = {24'h3905_02};
  219.        23 :           addr_data = {24'h3906_10};
  220.        24 :           addr_data = {24'h3901_0a};
  221.        25 :           addr_data = {24'h3731_12};
  222.        26 :           addr_data = {24'h3600_08}; // VCM control
  223.        27 :           addr_data = {24'h3601_33}; // VCM control
  224.        28 :           addr_data = {24'h302d_60}; // system control
  225.        29 :           addr_data = {24'h3620_52};
  226.        30 :           addr_data = {24'h371b_20};
  227.        31 :           addr_data = {24'h471c_50};
  228.        32 :           addr_data = {24'h3a13_43}; // pre-gain = 1.047x
  229.        33 :           addr_data = {24'h3a18_00}; // gain ceiling
  230.        34 :           addr_data = {24'h3a19_f8}; // gain ceiling = 15.5x
  231.        35 :           addr_data = {24'h3635_13};
  232.        36 :           addr_data = {24'h3636_03};
  233.        37 :           addr_data = {24'h3634_40};
  234.        38 :           addr_data = {24'h3622_01};
  235.        // 50/60Hz detection 50/60Hz 灯光条纹过滤
  236.        39 :           addr_data = {24'h3c01_34}; // Band auto, bit[7]
  237.        40 :           addr_data = {24'h3c04_28}; // threshold low sum
  238.        41 :           addr_data = {24'h3c05_98}; // threshold high sum
  239.        42 :           addr_data = {24'h3c06_00}; // light meter 1 threshold[15:8]
  240.        43 :           addr_data = {24'h3c07_08}; // light meter 1 threshold[7:0]
  241.        44 :           addr_data = {24'h3c08_00}; // light meter 2 threshold[15:8]
  242.        45 :           addr_data = {24'h3c09_1c}; // light meter 2 threshold[7:0]
  243.        46 :           addr_data = {24'h3c0a_9c}; // sample number[15:8]
  244.        47 :           addr_data = {24'h3c0b_40}; // sample number[7:0]
  245.        48 :           addr_data = {24'h3810_00}; // Timing Hoffset[11:8]
  246.        49 :           addr_data = {24'h3811_10}; // Timing Hoffset[7:0]
  247.        50 :           addr_data = {24'h3812_00}; // Timing Voffset[10:8]
  248.        51 :           addr_data = {24'h3708_64};
  249.        52 :           addr_data = {24'h4001_02}; // BLC start from line 2
  250.        53 :           addr_data = {24'h4005_1a}; // BLC always update
  251.        54 :           addr_data = {24'h3000_00}; // enable blocks
  252.        55 :           addr_data = {24'h3004_ff}; // enable clocks
  253.        56 :           addr_data = {24'h300e_58}; //MIPI power down,DVP enable
  254.        57 :           addr_data = {24'h302e_00};
  255.        58 :           addr_data = {24'h4300_61}; // RGB,
  256.        59 :           addr_data = {24'h501f_01}; // ISP RGB
  257.        60 :           addr_data = {24'h440e_00};
  258.        61 :           addr_data = {24'h5000_a7}; // Lenc on, raw gamma on, BPC on, WPC on, CIP on
  259.        // AEC target 自动曝光控制
  260.        62 :           addr_data = {24'h3a0f_30}; // stable range in high
  261.        63 :           addr_data = {24'h3a10_28}; // stable range in low
  262.        64 :           addr_data = {24'h3a1b_30}; // stable range out high
  263.        65 :           addr_data = {24'h3a1e_26}; // stable range out low
  264.        66 :           addr_data = {24'h3a11_60}; // fast zone high
  265.        67 :           addr_data = {24'h3a1f_14}; // fast zone low
  266.        // Lens correction for ? 镜头补偿
  267.        68 :           addr_data = {24'h5800_23};
  268.        69 :           addr_data = {24'h5801_14};
  269.        70 :           addr_data = {24'h5802_0f};
  270.        71 :           addr_data = {24'h5803_0f};
  271.        72 :           addr_data = {24'h5804_12};
  272.        73 :           addr_data = {24'h5805_26};
  273.        74 :           addr_data = {24'h5806_0c};
  274.        75 :           addr_data = {24'h5807_08};
  275.        76 :           addr_data = {24'h5808_05};
  276.        77 :           addr_data = {24'h5809_05};
  277.        78 :           addr_data = {24'h580a_08};
  278.        79 :           addr_data = {24'h580b_0d};
  279.        80 :           addr_data = {24'h580c_08};
  280.        81 :           addr_data = {24'h580d_03};
  281.        82 :           addr_data = {24'h580e_00};
  282.        83 :           addr_data = {24'h580f_00};
  283.        84 :           addr_data = {24'h5810_03};
  284.        85 :           addr_data = {24'h5811_09};
  285.        86 :           addr_data = {24'h5812_07};
  286.        87 :           addr_data = {24'h5813_03};
  287.        88 :           addr_data = {24'h5814_00};
  288.        89 :           addr_data = {24'h5815_01};
  289.        90 :           addr_data = {24'h5816_03};
  290.        91 :           addr_data = {24'h5817_08};
  291.        92 :           addr_data = {24'h5818_0d};
  292.        93 :           addr_data = {24'h5819_08};
  293.        94 :           addr_data = {24'h581a_05};
  294.        95 :           addr_data = {24'h581b_06};
  295.        96 :           addr_data = {24'h581c_08};
  296.        97 :           addr_data = {24'h581d_0e};
  297.        98 :           addr_data = {24'h581e_29};
  298.        99 :           addr_data = {24'h581f_17};
  299.        100 :           addr_data = {24'h5820_11};
  300.        101 :           addr_data = {24'h5821_11};
  301.        102 :           addr_data = {24'h5822_15};
  302.        103 :           addr_data = {24'h5823_28};
  303.        104 :           addr_data = {24'h5824_46};
  304.        105 :           addr_data = {24'h5825_26};
  305.        106 :           addr_data = {24'h5826_08};
  306.        107 :           addr_data = {24'h5827_26};
  307.        108 :           addr_data = {24'h5828_64};
  308.        109 :           addr_data = {24'h5829_26};
  309.        110 :           addr_data = {24'h582a_24};
  310.        111 :           addr_data = {24'h582b_22};
  311.        112 :           addr_data = {24'h582c_24};
  312.        113 :           addr_data = {24'h582d_24};
  313.        114 :           addr_data = {24'h582e_06};
  314.        115 :           addr_data = {24'h582f_22};
  315.        116 :           addr_data = {24'h5830_40};
  316.        117 :           addr_data = {24'h5831_42};
  317.        118 :           addr_data = {24'h5832_24};
  318.        119 :           addr_data = {24'h5833_26};
  319.        120 :           addr_data = {24'h5834_24};
  320.        121 :           addr_data = {24'h5835_22};
  321.        122 :           addr_data = {24'h5836_22};
  322.        123 :           addr_data = {24'h5837_26};
  323.        124 :           addr_data = {24'h5838_44};
  324.        125 :           addr_data = {24'h5839_24};
  325.        126 :           addr_data = {24'h583a_26};
  326.        127 :           addr_data = {24'h583b_28};
  327.        128 :           addr_data = {24'h583c_42};
  328.        129 :           addr_data = {24'h583d_ce}; // lenc BR offset
  329.        // AWB 自动白平衡
  330.        130 :           addr_data = {24'h5180_ff}; // AWB B block
  331.        131 :           addr_data = {24'h5181_f2}; // AWB control
  332.        132 :           addr_data = {24'h5182_00}; // [7:4] max local counter, [3:0] max fast counter
  333.        133 :           addr_data = {24'h5183_14}; // AWB advanced
  334.        134 :           addr_data = {24'h5184_25};
  335.        135 :           addr_data = {24'h5185_24};
  336.        136 :           addr_data = {24'h5186_09};
  337.        137 :           addr_data = {24'h5187_09};
  338.        138 :           addr_data = {24'h5188_09};
  339.        139 :           addr_data = {24'h5189_75};
  340.        140 :           addr_data = {24'h518a_54};
  341.        141 :           addr_data = {24'h518b_e0};
  342.        142 :           addr_data = {24'h518c_b2};
  343.        143 :           addr_data = {24'h518d_42};
  344.        144 :           addr_data = {24'h518e_3d};
  345.        145 :           addr_data = {24'h518f_56};
  346.        146 :           addr_data = {24'h5190_46};
  347.        147 :           addr_data = {24'h5191_f8}; // AWB top limit
  348.        148 :           addr_data = {24'h5192_04}; // AWB bottom limit
  349.        149 :           addr_data = {24'h5193_70}; // red limit
  350.        150 :           addr_data = {24'h5194_f0}; // green limit
  351.        151 :           addr_data = {24'h5195_f0}; // blue limit
  352.        152 :           addr_data = {24'h5196_03}; // AWB control
  353.        153 :           addr_data = {24'h5197_01}; // local limit
  354.        154 :           addr_data = {24'h5198_04};
  355.        155 :           addr_data = {24'h5199_12};
  356.        156 :           addr_data = {24'h519a_04};
  357.        157 :           addr_data = {24'h519b_00};
  358.        158 :           addr_data = {24'h519c_06};
  359.        159 :           addr_data = {24'h519d_82};
  360.        160 :           addr_data = {24'h519e_38}; // AWB control
  361.        // Gamma 伽玛曲线
  362.        161 :           addr_data = {24'h5480_01}; //Gamma bias plus on, bit[0]
  363.        162 :           addr_data = {24'h5481_08};
  364.        163 :           addr_data = {24'h5482_14};
  365.        164 :           addr_data = {24'h5483_28};
  366.        165 :           addr_data = {24'h5484_51};
  367.        166 :           addr_data = {24'h5485_65};
  368.        167 :           addr_data = {24'h5486_71};
  369.        168 :           addr_data = {24'h5487_7d};
  370.        169 :           addr_data = {24'h5488_87};
  371.        170 :           addr_data = {24'h5489_91};
  372.        171 :           addr_data = {24'h548a_9a};
  373.        172 :           addr_data = {24'h548b_aa};
  374.        173 :           addr_data = {24'h548c_b8};
  375.        174 :           addr_data = {24'h548d_cd};
  376.        175 :           addr_data = {24'h548e_dd};
  377.        176 :           addr_data = {24'h548f_ea};
  378.        177 :           addr_data = {24'h5490_1d};
  379.        // color matrix 色彩矩阵
  380.        178 :           addr_data = {24'h5381_1e}; // CMX1 for Y
  381.        179 :           addr_data = {24'h5382_5b}; // CMX2 for Y
  382.        180 :           addr_data = {24'h5383_08}; // CMX3 for Y
  383.        181 :           addr_data = {24'h5384_0a}; // CMX4 for U
  384.        182 :           addr_data = {24'h5385_7e}; // CMX5 for U
  385.        183 :           addr_data = {24'h5386_88}; // CMX6 for U
  386.        184 :           addr_data = {24'h5387_7c}; // CMX7 for V
  387.        185 :           addr_data = {24'h5388_6c}; // CMX8 for V
  388.        186 :           addr_data = {24'h5389_10}; // CMX9 for V
  389.        187 :           addr_data = {24'h538a_01}; // sign[9]
  390.        188 :           addr_data = {24'h538b_98}; // sign[8:1]
  391.        // UV adjust UV 色彩饱和度调整
  392.        189 :           addr_data = {24'h5580_06}; // saturation on, bit[1]
  393.        190 :           addr_data = {24'h5583_40};
  394.        191 :           addr_data = {24'h5584_10};
  395.        192 :           addr_data = {24'h5589_10};
  396.        193 :           addr_data = {24'h558a_00};
  397.        194 :           addr_data = {24'h558b_f8};
  398.        195 :           addr_data = {24'h501d_40}; // enable manual offset of contrast
  399.        // CIP 锐化和降噪
  400.        196 :           addr_data = {24'h5300_08}; //CIP sharpen MT threshold 1
  401.        197 :           addr_data = {24'h5301_30}; //CIP sharpen MT threshold 2
  402.        198 :           addr_data = {24'h5302_10}; // CIP sharpen MT offset 1
  403.        199 :           addr_data = {24'h5303_00}; // CIP sharpen MT offset 2
  404.        200 :           addr_data = {24'h5304_08}; // CIP DNS threshold 1
  405.        201 :           addr_data = {24'h5305_30}; // CIP DNS threshold 2
  406.        202 :           addr_data = {24'h5306_08}; // CIP DNS offset 1
  407.        203 :           addr_data = {24'h5307_16}; // CIP DNS offset 2
  408.        204 :           addr_data = {24'h5309_08}; //CIP sharpen TH threshold 1
  409.        205 :           addr_data = {24'h530a_30}; //CIP sharpen TH threshold 2
  410.        206 :           addr_data = {24'h530b_04}; //CIP sharpen TH offset 1
  411.        207 :           addr_data = {24'h530c_06}; //CIP sharpen TH offset 2
  412.        208 :           addr_data = {24'h5025_00};
  413.        209 :           addr_data = {24'h3008_02}; //wake up from standby,bit[6]
  414.        // input clock 24Mhz, PCLK 84Mhz
  415.        210 :           addr_data = {24'h3035_21}; // PLL
  416.        211 :           addr_data = {24'h3036_69}; // PLL
  417.        212 :           addr_data = {24'h3c07_07}; // lightmeter 1 threshold[7:0]
  418.        213 :           addr_data = {24'h3820_47}; // flip
  419.        214 :           addr_data = {24'h3821_01}; // no mirror
  420.        215 :           addr_data = {24'h3814_31}; // timing X inc
  421.        216 :           addr_data = {24'h3815_31}; // timing Y inc
  422.    
  423.        217 :           addr_data = {24'h3800_00}; // HS
  424.        218 :           addr_data = {24'h3801_00}; // HS   start from 0
  425.        219 :           addr_data = {24'h3802_00}; // VS
  426.        220 :           addr_data = {24'h3803_fa}; // VS   start from 250
  427.        221 :           addr_data = {24'h3804_0a}; // HW
  428.        222 :           addr_data = {24'h3805_3f}; // HW   end at 2623
  429.        223 :           addr_data = {24'h3806_06}; // VH
  430.        224 :           addr_data = {24'h3807_a9}; // VH   end at 1705
  431.        225 :           addr_data = {24'h3808_05}; // DVPHO 1280
  432.        226 :           addr_data = {24'h3809_00}; // DVPHO
  433.        227 :           addr_data = {24'h380a_02}; // DVPVO 720
  434.        228 :           addr_data = {24'h380b_d0}; // DVPVO
  435.        229 :           addr_data = {24'h380c_07}; // HTS
  436.        230 :           addr_data = {24'h380d_64}; // HTS   total 1892
  437.        231 :           addr_data = {24'h380e_02}; // VTS
  438.        232 :           addr_data = {24'h380f_e4}; // VTS   total 740
  439.        233 :           addr_data = {24'h3813_04}; // timing V offset
  440.    
  441.        234 :           addr_data = {24'h3618_00};
  442.        235 :           addr_data = {24'h3612_29};
  443.        236 :           addr_data = {24'h3709_52};
  444.        237 :           addr_data = {24'h370c_03};
  445.        238 :           addr_data = {24'h3a02_02}; // 60Hz max exposure
  446.        239 :           addr_data = {24'h3a03_e0}; // 60Hz max exposure
  447.        240 :           addr_data = {24'h3a14_02}; // 50Hz max exposure
  448.        241 :           addr_data = {24'h3a15_e0}; // 50Hz max exposure
  449.        242 :           addr_data = {24'h4004_02}; // BLC line number
  450.        243 :           addr_data = {24'h3002_1c}; // reset JFIFO, SFIFO, JPG
  451.        244 :           addr_data = {24'h3006_c3}; // disable clock of JPEG2x, JPEG
  452.        245 :           addr_data = {24'h4713_03}; // JPEG mode 3
  453.        246 :           addr_data = {24'h4407_04}; // Quantization scale
  454.        247 :           addr_data = {24'h460b_37};
  455.        248 :           addr_data = {24'h460c_20};
  456.        249 :           addr_data = {24'h4837_16}; // MIPI global timing
  457.        250 :           addr_data = {24'h3824_04}; // PCLK manual divider
  458.        251 :           addr_data = {24'h5001_83}; // SDE on, CMX on, AWB on
  459.        252 :           addr_data = {24'h3503_00}; // AEC/AGC on            
  460.        253 :           addr_data = {24'h4740_20}; // VS 1
  461.        254 :           addr_data = {24'h503d_80}; // color bar
  462.        255 :           addr_data = {24'h4741_00}; //
  463. default :    addr_data = 0;
  464.        endcase
  465.    end
  466. //数据发送task
  467.    task    TX;
  468.        input           req;
  469.        input   [3:0]   cmd;
  470.        input   [7:0]   data;
  471.        begin
  472.            i2c_start_r = req;
  473.            i2c_cmd_r = cmd;
  474.            i2c_data_out_r = data;
  475.        end
  476.    endtask
  477.    assign  i2c_start = i2c_start_r;
  478.    assign  i2c_cmd = i2c_cmd_r;
  479.    assign  i2c_data_out = i2c_data_out_r;
  480. endmodule

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/607771
推荐阅读
相关标签
  

闽ICP备14008679号