本帖最后由 CrazyCat 于 2025-3-21 00:17 编辑
IIC的重要意义:
易灵思FPGA在图像方面具有巨大的优势(低功耗、接口丰富、实用的MIPI_IP),而图像的数据来源基本都是来自于摄像头或者其他视频输入子卡(如AD7611接收视频数据源),不管是摄像头还是其他芯片,基本都是用IIC协议去配置,在易灵动思的各个Demo中,基本都能看到"i2c_timing_ctrl_reg16_dat8_wronly.v"这个.v文件,该IIC配置文件也是ISP处理时自动曝光、增益调节、串口实时控制显示模式的核心部分,本帖子将从整体代码解析,到该.v文件的进阶应用入手,玩转IIC协议。
一般FPGA在上电后到摄像头开始正常工作之前,有一段时间,在这段时间里面,对摄像头进行IIC配置操作是无效的(具体可以看摄像头的手册规定),所以一般我们在FPGA上电后,延时一段时间后才对摄像头进行配置
//----------------------------------------
//Delay xxus until i2c slave is steady
reg [19:0] delay_cnt;
localparam DELAY_TOP = CLK_FREQ/1000; //1ms Setting time after software/hardware reset
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;
end
wire delay_done = (delay_cnt == DELAY_TOP) ? 1'b1 : 1'b0;
在延时一段时间后(CLK_FREQ/1000个CLK_FREQ的周期为1ms,大家可以随便拿一个频率的时钟来验证下,如50Mhz),拉高delay_done,作为我们后续的一个使能条件。SCL、SDA信号的生成
SCL和SDA的生成是代码的核心部分,后续状态机的跳转,信号的输出也是以该部分作为基础,其波形图大致如下 |