板子使用的是黑金的是xilinx spartan—6开发板,首先准备一份24LC04B芯片资料,读懂资料后列出关键参数。
如下:
1、空闲状态为SDA和SCL都为高电平
2、开始状态为:保持SCL,SDA高电平不变,SDA 保持最少4us,之后SDA为低,保持最少4us
3、结束状态为:保持SCL为高、SDA为低电平不变,保持最少4us,SDA为高保持最少4us
4、时间间隔4us要求来源(上面数据为24LC04,下面数据为24LC04B)
初步估算了一下时钟要求,100k(10us)符合要求,由于start有效位是在SCL高电平中间,所以SCL的上升沿和下降沿之间可以假设2个时钟周期,由上升沿触发,之后可以开始写程序了。
一、写流程
写寄存器的标准流程为:
1. Master发起START
2. Master发送I2C addr(7bit)和w操作0(1bit),等待ACK
3. Slave发送ACK
4. Master发送reg addr(8bit),等待ACK
5. Slave发送ACK
6. Master发送data(8bit),即要写入寄存器中的数据,等待ACK
7. Slave发送ACK
8. 第6步和第7步可以重复多次,即顺序写多个寄存器
9. Master发起STOP
二、数据写入芯片时间
由芯片资料得到3ms,为了方便程序中设置为4ms,其中为了方便调试,放入了很多测试点以及led灯显示。
三、读流程
1. Master发送I2Caddr(7bit)和 w操作0(1bit),等待ACK
2. Slave发送ACK
3. Master发送reg addr(8bit),等待ACK
4. Slave发送ACK
5. Master发起START
6. Master发送I2C addr(7bit)和R读1位,等待ACK
7. Slave发送ACK
8. Slave发送data(8bit),即寄存器里的值
9. Master发送ACK
10. 第8步和第9步可以重复多次,即顺序读多个寄存器
四、程序
top和iic文件,时钟文件自己写吧,采用10us为周期的时钟。
top文件
`timescale 1ns / 1ps
module model(
CLK_50M,
reset,
led,
SDA,SCL,
clk_1s,
clk_100ms,
clk_10ms,
clk_1ms,
clk_10us,
bit_state,
write_down,read_down,
test0,test1,test2,test3,test4,test5,test6,test7,test8,test9,
read_data
);
input CLK_50M,reset;
output SCL,write_down,read_down,test0,test1,test2,test3,test4,test5,test6,test7,test8,test9;
output [3:0]led;
output [7:0]bit_state;
output [7:0]read_data;
inout SDA;
output clk_1s,clk_100ms,clk_10ms,clk_1ms,clk_10us;
//output [3:0] led;
//output [5:0] sel;
//output [7:0] LED;
wire clk_1s,clk_100ms,clk_10ms,clk_1ms,clk_10us;
//分析仪采样频率