完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
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传感器初上电不稳定,需延时1ms localparam 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_cnt<=delay_cnt+1'b1; else delay_cnt<=delay_cnt; end wire 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<=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; en<=en; state<=ADDR; sda_r<=sda_r; end end ACK0: begin if(h_flag) if(sda==0) state<=ADDR_R; else begin sda_r<=0; configure_error0<=1'b1; state<=STOP; end else state<=ACK0; end 这是部分代码,主要出现问题是摄像头那边没给响应,地址没给错,下面是仿真出来的波形,依个人理解觉得没问题的,如果哪里错了请指出,先谢谢各位大佬们了
|
|
相关推荐
1个回答
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
NVMe高速传输之摆脱XDMA设计52:主要功能测试结果与分析4(NVMe 指令提交与完成机制测试)
866 浏览 0 评论
NVMe高速传输之摆脱XDMA设计51:主要功能测试结果与分析3 nvmePCIe高速存储 PCIe高速存储
546 浏览 0 评论
NVMe高速传输之摆脱XDMA设计50:主要功能测试结果与分析2 nvmePCIe高速存储
524 浏览 0 评论
NVMe高速传输之摆脱XDMA设计49:主要功能测试结果与分析1
1568 浏览 0 评论
1031 浏览 0 评论
4525 浏览 64 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-9 07:36 , Processed in 0.769673 second(s), Total 72, Slave 53 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
3726