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;
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>