自己写的IIC,但是是CMOS摄像头没给响应,求解答

2019-07-15 21:01发布

module iic_contr//缺少读取数据部分(        input                                                                clk,//50MHz        input                                                                rst_n,        //iic        inout                                                                sda,        output        reg                                        scl,        //        input                                        [ 7:0]        addr,//coms摄像头地址,ox42=8'b0100_0010        input                                        [15:0]        ad_da,//寄存器+要配置的值        output        reg                                        configure_done,//配置完成        output        reg                                        configure_error0,//ID地址响应失败        output        reg                                        configure_error1,//存储器地址响应失败        output        reg                                        configure_error2//发送数据失败        );//coms传感器初上电不稳定,需延时1mslocalparam        DELAY_TOP=16'd5_0000;reg        [15:0]        delay_cnt;always@(posedge clk or negedge rst_n)begin                if(!rst_n)                delay_cnt<=0;        else if(delay_cnt<DELAY_TOP)                delay_cnt<=delay_cnt+1'b1;        else                delay_cnt<=delay_cnt;endwire        delay_done=(delay_cnt==DELAY_TOP)?1'b1:1'b0;
//scl时钟的生成        //scl产生标志reg        w_flag;//写开始标志reg        clk_cnt_flag;always@(posedge clk or negedge rst_n)begin        if(!rst_n)                clk_cnt_flag<=1'b0;        else if(w_flag)                //else if(r_flag)                clk_cnt_flag<=1'b1;        else                clk_cnt_flag<=1'b0;end        //scl为400KHz以内localparam        CLK_CNT_TOP=9'd500;reg        [8:0]        clk_cnt;always@(posedge clk or negedge rst_n)begin        if(!rst_n)                clk_cnt<=0;        else if(clk_cnt_flag)                if(clk_cnt<CLK_CNT_TOP-1'b1)                        clk_cnt<=clk_cnt+1'b1;                else                        clk_cnt<=1'b0;        else                clk_cnt<=0;end        //always@(posedge clk or negedge rst_n)begin                if(!rst_n)                scl<=1'b1;        else if(clk_cnt_flag)                if(clk_cnt<9'd250)                        scl<=1'b1;                else                        scl<=1'b0;        else                scl<=1'b1;end        //scl高读电平中间wire        l_flag=(clk_cnt==9'd375)?1'b1:1'b0;wire        h_flag=(clk_cnt==9'd125)?1'b1:1'b0;//iic state简化版localparam        IDLE                        =4'd0;localparam        START0                =4'd1;localparam        ADDR                        =4'd2;localparam        ACK0                        =4'd3;reg        [3:0]        state;reg        [3:0]        cnt0;reg                        en;//输出数据使能信号reg                        sda_r;
always@(posedge clk or negedge rst_n)begin        if(!rst_n)                begin                state<=IDLE;                en<=0;                cnt0<=4'd8;                cnt1<=0;                w_flag<=0;                configure_done<=0;                configure_error0<=0;                configure_error1<=0;                configure_error2<=0;                reg_cnt<=0;                sda_r<=1'b1;                end        else                 case(state)                IDLE:                        begin                                if(delay_done&&!configure_done&&!configure_error0&&!configure_error1&&!configure_error2)                                begin                                state<=START0;                                en<=1'b1;                                 w_flag<=1'b1;                                end                        else                                state<=IDLE;                        end                START0:                         begin                                 if(h_flag)                                        begin                                        sda_r<=1'b0;                                        state<=ADDR;                                        end                                else                                        state<=START0;                        end                ADDR:                        begin                        if(l_flag)                                if(cnt0>=4'd1)                                        begin                                        cnt0<=cnt0-1'b1;                                        sda_r<=addr[cnt0-1'b1];                                        state<=ADDR;                                        end                                else if(cnt0==0)                                        begin                                        cnt0<=4'd8;                                        state<=ACK0;                                        en<=1'b0;                                        end                        else                                begin                                cnt0<=cnt0;
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。