FPGA 芯片通過 I2C 總線連接 EEPROM 24LC04, I2C 的兩根總線各上拉一個 4.7K的電阻到 3.3V,所以當總線上沒有輸出時會被拉高, 24LC04 的寫保護沒有使能,丌然 FPGA 會無法寫入數(shù)據(jù)。因為在電路上 A0~A2 都為低,所以 24LC04 的設備地址為 0xA0。PGL12G 板子,是將FPGA芯片作為IIC 主站設備,將EEPROM作為了個從站設備;
原理圖:
I2C 設備的操作可分為寫單個存儲字節(jié),寫多個存儲字節(jié),讀單個存儲字節(jié)和讀多個存儲字節(jié)。
①總線空閑狀態(tài)
I2C 總線總線的 SDA 和 SCL 兩條信號線同時處于高電平時,規(guī)定為總線的空閑狀態(tài)。此時各個器件的輸出級場效應管均處在截止狀態(tài),即釋放總線,由兩條信號線各自的上拉電阻把電平拉高。
②啟動信號(Start)
在時鐘線 SCL 保持高電平期間,數(shù)據(jù)線 SDA 上的電平被拉低(即負跳變),定義為 I2C 總線總線的啟動信號,它標志著一次數(shù)據(jù)傳輸?shù)拈_始。啟動信號是由主控器主動建立的,在建立該信號前 I2C 總線必須處于空閑狀態(tài),在時鐘線 SCL 保持高電平期間,數(shù)據(jù)線 SDA 被釋放,使得 SDA 返回高電平(即正跳變),稱為 I2C 總線的停止信號,它標志著一次數(shù)據(jù)傳輸?shù)慕K止。停止信號也是由主 控器主動建立的,建立該信號后, I2C 總線將返回空閑狀態(tài)。
④數(shù)據(jù)位傳送
在 I2C 總線上傳送的每一位數(shù)據(jù)都有一個時鐘脈沖相對應(戒同步控制),即在 SCL 串行時鐘的配合下,在 SDA 上逐位地串行傳送每一位數(shù)據(jù)。迚行數(shù)據(jù)傳送時,在 SCL 呈現(xiàn)高電平期間,SDA 上的電平必須保持穩(wěn)定,低電平為數(shù)據(jù) 0,高電平為數(shù)據(jù) 1。只有在 SCL 為低電平期間,才允許 SDA 上的電平改變狀態(tài)。
⑤應答信號( ACK 和 NACK)
I2C 總線上的所有數(shù)據(jù)都是以 8 位字節(jié)傳送的,収送器每収送一個字節(jié),就在時鐘脈沖 9 期間釋放數(shù)據(jù)線,由接收器反饋一個應答信號。應答信號為低電平時,規(guī)定為有效應答位( ACK 簡稱應答位),表示接收器已經(jīng)成功地接收了該字節(jié);應答信號為高電平時,規(guī)定為非應答位( NACK),一般表示接收器接收該字節(jié)沒有成功。對于反饋有效應答位 ACK 的要求是,接收器在第 9 個時鐘脈沖乊前的低電平期間將 SDA 線拉低,并且確保在該時鐘的高電平期間為穩(wěn)定的低電平。如果接收器是主控器,則在它收到最后一個字節(jié)后,収送一個 NACK 信號,以通知被控収送器結束數(shù)據(jù)収送,并釋放 SDA 線,以便主控接收器収送一個停止信號。
module i2c_eeprom_test(
input sys_clk,
input rst_n,
input key1,
inout i2c_sda,
inout i2c_scl,
output [3:0] led
);
localparam S_IDLE = 0;
localparam S_READ = 1;
localparam S_WAIT = 2;
localparam S_WRITE = 3;
reg[3:0] state;
wire button_negedge;
reg[7:0] read_data;
reg[31:0] timer;
wire scl_pad_i;
wire scl_pad_o;
wire scl_padoen_o;
wire sda_pad_i;
wire sda_pad_o;
wire sda_padoen_o;
reg[ 7:0] i2c_slave_dev_addr;
reg[15:0] i2c_slave_reg_addr;
reg[ 7:0] i2c_write_data;
reg i2c_read_req;
wire i2c_read_req_ack;
reg i2c_write_req;
wire i2c_write_req_ack;
wire[7:0] i2c_read_data;
assign led = ~read_data[3:0];
ax_debounce ax_debounce_m0
(
.clk (sys_clk),
.rst (~rst_n),
.button_in (key1),
.button_posedge (),
.button_negedge (button_negedge),
.button_out ()
);
always@(posedge sys_clk or negedge rst_n)
begin
if(rst_n == 1'b0)
begin
state <= S_IDLE;
i2c_write_req <= 1'b0;
read_data <= 8'h00;
timer <= 32'd0;
i2c_write_data <= 8'd0;
i2c_slave_reg_addr <= 16'd0;
i2c_slave_dev_addr <= 8'ha0;//1010 000 0
i2c_read_req <= 1'b0;
end
else
case(state)
S_IDLE:
begin
if(timer >= 32'd12_499_999)//250ms
state <= S_READ;
else
timer <= timer + 32'd1;
end
S_READ:
begin
if(i2c_read_req_ack)
begin
i2c_read_req <= 1'b0;
read_data <= i2c_read_data;
state <= S_WAIT;
end
else
begin
i2c_read_req <= 1'b1;
i2c_slave_dev_addr <= 8'ha0;
i2c_slave_reg_addr <= 16'd0;
end
end
S_WAIT:
begin
if(button_negedge)
begin
state <= S_WRITE;
read_data <= read_data + 8'd1;
end
end
S_WRITE:
begin
if(i2c_write_req_ack)
begin
i2c_write_req <= 1'b0;
state <= S_READ;
end
else
begin
i2c_write_req <= 1'b1;
i2c_write_data <= read_data;
end
end
default:
state <= S_IDLE;
endcase
end
assign sda_pad_i = i2c_sda;
assign i2c_sda = ~sda_padoen_o ? sda_pad_o : 1'bz;
assign scl_pad_i = i2c_scl;
assign i2c_scl = ~scl_padoen_o ? scl_pad_o : 1'bz;
i2c_master_top i2c_master_top_m0
(
.rst(~rst_n),
.clk(sys_clk),
.clk_div_cnt(16'd500), //Standard mode:100Khz
// I2C signals
// i2c clock line
.scl_pad_i(scl_pad_i), // SCL-line input
.scl_pad_o(scl_pad_o), // SCL-line output (always 1'b0)
.scl_padoen_o(scl_padoen_o), // SCL-line output enable (active low)
// i2c data line
.sda_pad_i(sda_pad_i), // SDA-line input
.sda_pad_o(sda_pad_o), // SDA-line output (always 1'b0)
.sda_padoen_o(sda_padoen_o), // SDA-line output enable (active low)
.i2c_addr_2byte(1'b0),
.i2c_read_req(i2c_read_req),
.i2c_read_req_ack(i2c_read_req_ack),
.i2c_write_req(i2c_write_req),
.i2c_write_req_ack(i2c_write_req_ack),
.i2c_slave_dev_addr(i2c_slave_dev_addr),
.i2c_slave_reg_addr(i2c_slave_reg_addr),
.i2c_write_data(i2c_write_data),
.i2c_read_data(i2c_read_data),
.error()
);
endmodule
責任編輯:PSY
原文標題:紫光同創(chuàng)PGL22G開發(fā)平臺試用連載(4)——用開源軟件 opencores 上的 I2C master控制器去控制I2C接口
文章出處:【微信公眾號:FPGA開發(fā)圈】歡迎添加關注!文章轉載請注明出處。
-
控制器
+關注
關注
112文章
16332瀏覽量
177803 -
開源軟件
+關注
關注
0文章
210瀏覽量
15900 -
接口
+關注
關注
33文章
8575瀏覽量
151014 -
操作
+關注
關注
0文章
43瀏覽量
18870
原文標題:紫光同創(chuàng)PGL22G開發(fā)平臺試用連載(4)——用開源軟件 opencores 上的 I2C master控制器去控制I2C接口
文章出處:【微信號:FPGA-EETrend,微信公眾號:FPGA開發(fā)圈】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論