日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

EEPROM的操作---SPI接口和I2C接口

發布時間:2024/4/15 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 EEPROM的操作---SPI接口和I2C接口 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

 

參考:http://blog.csdn.net/yuanlulu/article/details/6163106

 ROM最初不能編程,出廠什么內容就永遠什么內容,不靈活。后來出現了PROM,可以自己寫入一次,要是寫錯了,只能換一片,自認倒霉。人類文明不斷進步,終于出現了可多次擦除寫入的EPROM,每次擦除要把芯片拿到紫外線上照一下,想一下你往單片機上下了一個程序之后發現有個地方需要加一句話,為此你要把單片機放紫外燈下照半小時,然后才能再下一次,這么折騰一天也改不了幾次。歷史的車輪不斷前進,偉大的EEPROM出現了,拯救了一大批程序員,終于可以隨意的修改rom中的內容了

  EEPROM的全稱是“電可擦除可編程只讀存儲器”,即Electrically Erasable Programmable Read-Only Memory。是相對于紫外擦除的rom來講的。但是今天已經存在多種EEPROM的變種,變成了一類存儲器的統稱.這種rom的特點是可以隨機訪問和修改任何一個字節,可以往每個bit中寫入0或者1。這是最傳統的一種EEPROM,掉電后數據不丟失,可以保存100年,可以擦寫100w次。具有較高的可靠性,但是電路復雜/成本也高。因此目前的EEPROM都是幾十千字節到幾百千字節的,絕少有超過512K的。

  EEPROM的接口分為兩種:SPI和I2C。

? ? ? SPI接口為四線,型號如AT25XXX。?

    

?

? ? ? I2C接口為2線,型號如24CL02/04/XX.

? ? ??  

    這兩種EEPROM的操作主要按SPI 和I2C的協議操作就可以了,不過也有一些需要注意的地方。在這里記錄下來,不涉及細節的處理。

? ? ? 對于SPI接口的EEPROM:

    1、在寫數據的時候需要先寫WR_EN的命令,然后在按SPI寫寫操作。讀的時候不需要先寫WR_EN.

? ? ? ? ? ? ? ? ?

??  2、WR_EN 和WR_DATA 的操作之間要隔一段時間,如10us,不能寫完WR_EN就寫WR_DATA,否則數據將不能被寫入。

? ? ? ? ?3、WR_DATA操作送入EEPROM之后,要等待一段時間,等EEPROM將數據寫入內部,時間長短可以參考datasheet中的一個參數 write_cycle。

? ? ? ?

? ? 4、RD_DATA操作到下一次的WR_EN/WR_DATA命令之間也要間隔一段時間,如400us.

? ? 5、SPI協議的最后一個SPI_CLK也要保證完整,有低有高,不能只有一半,如將SPI_CLK拉高之后不拉低就將SPI_CS信號拉低。

? ? ??

  ? ?example: verilog?

  ? EEPROM--SPI interface ? ??

module EE_WR( //------------outputs----------- output EE_SI, output EE_CSb, output EE_SCK, input EE_SO, //------------inputs------------ input clk,//50MHZ input rst )/*synthesis noprune*/;parameter cmd_wr_en =8'h06 /* synthesis keep */;parameter cmd_wr_sr =16'h0180 /* synthesis keep */; //16'h018C all block are protectedparameter cmd_rd_sr =8'h05 /* synthesis keep */;parameter cmd_wr_op =536'h020000_63555560595857565554535251504948474645444342414039383736353433323130292827262524232221201918171615141312111009080706050403020100 /* synthesis keep */;//parameter cmd_wr_op =32'h020000_f5 /* synthesis keep */;parameter cmd_rd_op =24'h030000 /* synthesis keep */;parameter tck_delay = 4'd6;parameter num_data_bit = 12'd512;parameter IDLE = 5'd0;parameter WR_EN_1 = 5'd1;parameter WR_EN_2 = 5'd2;parameter WR_EN_3 = 5'd3;parameter WR_EN_4 = 5'd4;parameter WR_EN_5 = 5'd5;parameter WR_SR_1 = 5'd6;parameter WR_SR_2 = 5'd7;parameter WR_SR_3 = 5'd8;parameter WR_SR_4 = 5'd9;parameter WR_SR_5 = 5'd10; parameter RD_SR_1 = 5'd11;parameter RD_SR_2 = 5'd12;parameter RD_SR_3 = 5'd13;parameter RD_SR_4 = 5'd14;parameter RD_SR_5 = 5'd15;parameter RD_SR_6 = 5'd16;parameter RD_SR_7 = 5'd17; parameter WR_DATA_1 = 5'd18;parameter WR_DATA_2 = 5'd19;parameter WR_DATA_3 = 5'd20;parameter WR_DATA_4 = 5'd21;parameter WR_DATA_5 = 5'd22; parameter RD_DATA_1 = 5'd23;parameter RD_DATA_2 = 5'd24;parameter RD_DATA_3 = 5'd25;parameter RD_DATA_4 = 5'd26;parameter RD_DATA_5 = 5'd27;parameter RD_DATA_6 = 5'd28;parameter RD_DATA_7 = 5'd29; reg [31:0] cnt;always @(posedge clk or negedge rst ) beginif(rst == 0 ) cnt <= 0;else if(cnt == 32'd500_000_000) cnt <= 32'd500_000_000; else cnt <= cnt + 1;endwire wr_en /* synthesis keep */;wire wr_op /* synthesis keep */;wire rd_op /* synthesis keep */;wire rd_sr /* synthesis keep */;wire wr_sr /* synthesis keep */; assign wr_en = (cnt == 32'd000_000_500); assign rd_sr = (cnt == 32'd000_000_000); assign wr_sr = (cnt == 32'd000_000_000); assign wr_op = (cnt == 32'd000_001_000); assign rd_op = (cnt == 32'd001_000_000);reg [4:0] state;reg [3:0] delay;reg [11:0] num;reg [7:0] data_sr;reg [7:0] data_rd;reg spi_clk;reg spi_cs;reg spi_si; always @(posedge clk or negedge rst ) beginif(rst == 0 ) beginspi_clk <= 0;spi_cs <= 1;spi_si <= 0;delay <= 0;num <= 0;state <= IDLE;data_sr <= 0; data_rd<= 0;endelse begincase(state) IDLE : beginspi_clk <= 0;spi_cs <= 1;spi_si <= 0;delay <= 0;num <= 0;data_sr <= 0; data_rd <= 0;if(wr_en) state <= WR_EN_1; // else if(wr_sr) state <= WR_SR_1; // else if(rd_sr) state <= RD_SR_1; else if(wr_op) state <= WR_DATA_1; else if(rd_op) state <= RD_DATA_1 ; else state <= state;end //-------------wr_en------------- WR_EN_1: begin //拉低CSspi_clk <= 0;spi_cs <= 0;num <= 7;if(delay == tck_delay) begin state <= state + 1; delay <= 0; endelse begin state <= state; delay <= delay + 1; endend WR_EN_2: begin //sck 下降沿spi_clk <= 0;spi_si <= cmd_wr_en[num];if(delay == tck_delay) begin state <= state + 1; delay <= 0; end else begin state <= state; delay <= delay + 1; endend WR_EN_3: begin //sck 上升沿spi_clk <= 1;spi_si <= spi_si;if(delay == tck_delay) beginif(num == 0) begin state <= state + 1; delay <= 0; endelse begin state <= WR_EN_2; delay <= 0; num <= num - 1; end endelse begin state <= state; delay <= delay + 1; endend WR_EN_4: begin //SCK 下降沿延時一個spi_clk <= 0;spi_si <= spi_si;if(delay == tck_delay) begin state <= state + 1; delay <= 0; endelse begin state <= state; delay <= delay + 1; endend WR_EN_5: begin //CS 拉高spi_cs <= 1;spi_clk<= 0;spi_si <= 0;if(delay == tck_delay) begin state <= IDLE; delay <= 0; endelse begin state <= state; delay <= delay + 1; endend //-------------wr_sr-------------WR_SR_1: begin //拉低CSspi_clk <= 0;spi_cs <= 0;num <= 15;spi_si <= 0;if(delay == tck_delay) begin state <= state + 1; delay <= 0; endelse begin state <= state; delay <= delay + 1; endendWR_SR_2: begin //sck 下降沿spi_clk <= 0; spi_si <= cmd_wr_sr[num];if(delay == tck_delay) begin state <= state + 1; delay <= 0; end else begin state <= state; delay <= delay + 1; endend WR_SR_3: begin //sck 上升沿spi_clk <= 1;spi_si <= spi_si;if(delay == tck_delay) begin if(num == 0) begin state <= state + 1; delay <= 0; endelse begin state <= WR_SR_2; delay <= 0; num <= num -1; endendelse begin state <= state; delay <= delay + 1; endend WR_SR_4: begin //SCK 下降沿延時一個spi_clk <= 0;spi_si <= spi_si;if(delay == tck_delay) begin state <= state + 1; delay <= 0; endelse begin state <= state; delay <= delay + 1; endend WR_SR_5: begin //CS 拉高spi_cs <= 1;spi_clk<= 0;spi_si <= 0;if(delay == tck_delay) begin state <= IDLE; delay <= 0; endelse begin state <= state; delay <= delay + 1; endend //-----rd_sr-----------RD_SR_1: begin //拉低CSspi_clk <= 0;spi_cs <= 0;num <= 7;data_sr <= 0; spi_si <= 0;if(delay == tck_delay) begin state <= state + 1; delay <= 0; endelse begin state <= state; delay <=delay + 1; endendRD_SR_2: begin //sck 下降沿spi_clk <= 0;spi_si <= cmd_rd_sr[num];if(delay == tck_delay) begin state <= state + 1; delay <= 0; endelse begin state <= state; delay <= delay + 1; endend RD_SR_3: begin //sck 上升沿spi_clk <= 1;spi_si <= spi_si;if(delay == tck_delay) begin if(num == 0) begin state <= state + 1; delay <= 0; num <= 7; endelse begin state <= RD_SR_2; delay <= 0; num <= num - 1; endend else begin state <= state; delay <= delay + 1; endend RD_SR_4: begin //read SCK 下降沿spi_clk <= 0;spi_si <= 0; data_sr <= data_sr;if(delay == tck_delay) begin state <= state + 1; delay <= 0; endelse begin state <= state; delay <= delay + 1; endend RD_SR_5: begin //READ sck 上升沿spi_clk <= 1;data_sr[num] <= EE_SO;if(delay == tck_delay) begin if(num == 0) begin state <= state + 1; delay <= 0; endelse begin state <= RD_SR_4; delay <= 0; num <= num - 1; endend else begin state <= state; delay <= delay + 1; endend RD_SR_6: begin //SCK 下降沿延時一個spi_clk <= 0;data_sr <= data_sr;if(delay == tck_delay) begin state <= state + 1; delay <= 0; endelse begin state <= state; delay <= delay + 1; endend RD_SR_7: begin //CS拉高 spi_cs <= 1;spi_clk<= 0;spi_si <= 0;if(delay == tck_delay) begin state <= IDLE; delay <= 0; endelse begin state <= state; delay <= delay + 1; endend //---------------------wr_data------------------WR_DATA_1: begin //拉低CSspi_clk <= 0;spi_cs <= 0;spi_si <= 0;num <= num_data_bit + 23;if(delay == tck_delay) begin state <= state + 1; delay <= 0; endelse begin state <= state; delay <= delay + 1; endendWR_DATA_2: begin //SCK下降沿spi_clk <= 0;spi_si <= cmd_wr_op[num];if(delay == tck_delay) begin state <= state + 1; delay <= 0; endelse begin state <= state; delay <= delay + 1; endend WR_DATA_3: begin //SCK 上升沿 spi_clk <= 1;spi_si <= spi_si;if(delay == tck_delay) begin if(num == 0) begin state <= state + 1; delay <= 0; endelse begin state <= WR_DATA_2; delay <= 0; num <= num - 1; endendelse begin state <= state; delay <= delay + 1; endend WR_DATA_4: begin //SCK延時下降沿spi_clk <= 0;spi_si <= 0;if(delay == tck_delay) begin state <= state + 1; delay <= 0; endelse begin state <= state; delay <= delay + 1; endend WR_DATA_5: begin //CS拉高 spi_cs <= 1;spi_clk<= 0;spi_si <= 0;if(delay == tck_delay) begin state <= IDLE; delay <= 0; endelse begin state <= state; delay <= delay + 1; endend //---------------------rd_data-------------------RD_DATA_1: begin //拉低CSspi_clk <= 0;spi_cs <= 0;spi_si <= 0;num <= 23;if(delay == tck_delay) begin state <= state + 1; delay <= 0; endelse begin state <= state; delay <= delay + 1; endendRD_DATA_2: begin //SCK下降沿spi_clk <= 0;spi_si <= cmd_rd_op[num];if(delay == tck_delay) begin state <= state + 1; delay <= 0; endelse begin state <= state; delay <= delay + 1; endend RD_DATA_3: begin //SCK 上升沿 spi_clk <= 1;spi_si <= spi_si;if(delay == tck_delay) begin if(num == 0) begin state <= state + 1; delay <= 0; num <= num_data_bit - 1; endelse begin state <= RD_DATA_2; delay <= 0; num <= num - 1; endendelse begin state <= state; delay <= delay + 1; endend RD_DATA_4: begin //read SCK 下降沿spi_clk <= 0;spi_si <= 0; data_rd <= data_rd;if(delay == tck_delay) begin state <= state + 1; delay <= 0; endelse begin state <= state; delay <= delay + 1; endend RD_DATA_5: begin //READ sck 上升沿spi_clk <= 1;data_rd[num] <= EE_SO;if(delay == tck_delay) begin if(num == 0) begin state <= state + 1; delay <= 0; endelse begin state <= RD_DATA_4; delay <= 0; num <= num - 1; endend else begin state <= state; delay <= delay + 1; endend RD_DATA_6: begin //SCK 下降沿延時一個spi_clk <= 0;data_rd <= data_rd;if(delay == tck_delay) begin state <= state + 1; delay <= 0; endelse begin state <= state; delay <= delay + 1; endend RD_DATA_7 :begin //CS拉高 spi_cs <= 1;spi_clk<= 0;spi_si <= 0;if(delay == tck_delay) begin state <= IDLE; delay <= 0; endelse begin state <= state; delay <= delay + 1; endend default : state <= 0;endcaseend end assign EE_CSb = spi_cs;assign EE_SCK = spi_clk;assign EE_SI = spi_si;endmodule View Code

?  tb:?

`timescale 1 ps/1 psmodule EE_WR_tb ;wire EE_SI; wire EE_CSb;wire EE_SCK; reg EE_SO;//------------inputs------------reg clk;//50MHZreg rst;EE_WR u0_EE_WR( //------------outputs----------- .EE_SI(EE_SI), .EE_CSb(EE_CSb),.EE_SCK(EE_SCK), .EE_SO(EE_SO),//------------inputs------------.clk(clk),//50MHZ .rst(rst))/*synthesis noprune*/;parameter T = 20000;always #(T/2) clk = ~clk;initial beginclk = 0;rst =0;#(300*T) $stop;#(200*T) rst =1; endendmodule View Code

?對于I2C的接口:

? ? 1、讀寫之間按I2C的協議進行就可以。

? ? 2、在讀取數據時候,master在接收完8bit數據之后,需要給從機發一個ACK(輸出一個SDA =0)。注意讀取的時候ACK是由Master發出的,在寫數據的時候ACK是由slaver發出的。

? ?可以參考:http://blog.csdn.net/lingfeng5/article/details/73361833

? ?3、寫數據同樣也有一定的write_cycle. 參考datasheet.

? ? ?

  example: verilog

View Code // `define SIM //if run modelsim, enable module eeprom_data(input clk,input rst_n,output wr_en,output reg [7:0] wr_addr,output reg [7:0] wr_data,output reg wr_flag,output rd_en,output reg [7:0] rd_addr,input [7:0] rd_data,output reg rd_flag,input rd_wrdata_en, //only one clk cycle high timeinput wr_rddata_en);reg [7:0] wr_cnt;reg [7:0] rd_cnt;reg [31:0] cnt;reg [5:0] rd_wrdata_en_flag;always @(posedge clk or negedge rst_n)begin if(rst_n == 0) rd_wrdata_en_flag <= 6'd0;else rd_wrdata_en_flag <= {rd_wrdata_en_flag[5:0],rd_wrdata_en}; end`ifdef SIMalways @(posedge clk or negedge rst_n)beginif(rst_n == 0) cnt <= 0;else if(cnt == 32'd100_000) cnt <= 0;else cnt <= cnt + 1;endassign wr_en = (cnt == 32'd20_000);assign rd_en = (cnt == 32'd70_000); `else always @(posedge clk or negedge rst_n)beginif(rst_n == 0) cnt <= 0;else if(cnt == 32'd500_000_000) cnt <= 0;else cnt <= cnt + 1;endassign wr_en = (cnt == 32'd200_000_000);assign rd_en = (cnt == 32'd400_000_000); `endifparameter data_num = 8'd16; //the data number of need to be write or read //=========================================//writealways @(posedge clk or negedge rst_n)beginif(rst_n == 0) wr_addr <= 0;else if(rd_wrdata_en_flag[5]) beginif(wr_addr == data_num) wr_addr <= 0; else wr_addr <= wr_addr + 1;end else wr_addr <= wr_addr;endalways @(posedge clk or negedge rst_n)beginif(rst_n == 0) wr_data <= 0;else if(rd_wrdata_en_flag[5]) beginif(wr_data == data_num) wr_data <= 0; else wr_data <= wr_data + 1;end else wr_data <= wr_data;endalways @(posedge clk or negedge rst_n)beginif(rst_n == 0) wr_cnt <= 0;else if(rd_wrdata_en_flag[5]) beginif(wr_cnt == data_num) wr_cnt <= 0; else wr_cnt <= wr_cnt + 1;end else wr_cnt <= wr_cnt;endalways @(posedge clk or negedge rst_n)beginif(rst_n == 0) wr_flag <= 0;else if(wr_en) wr_flag <= 1;else if(rd_wrdata_en_flag[5]) beginif(wr_cnt == data_num) wr_flag <= 0; else wr_flag <= 1;end else wr_flag <= wr_flag;end //====================================//readalways @(posedge clk or negedge rst_n)beginif(rst_n == 0) rd_addr <= 0;else if(wr_rddata_en) beginif(rd_addr == data_num) rd_addr <= 0; else rd_addr <= rd_addr + 1;end else rd_addr <= rd_addr;end// always @(posedge clk or negedge rst_n) // begin // if(rst_n == 0) rd_data <= 0; // else if(wr_rddata_en) begin // if(rd_data == 8'D127) rd_data <= 0; // else rd_data <= rd_data + 1; // end // else rd_data <= rd_data; // end // always @(posedge clk or negedge rst_n)beginif(rst_n == 0) rd_cnt <= 0;else if(wr_rddata_en) beginif(rd_cnt == data_num) rd_cnt <= 0; else rd_cnt <= rd_cnt + 1;end else rd_cnt <= rd_cnt;endalways @(posedge clk or negedge rst_n)beginif(rst_n == 0) rd_flag <= 0;else if(rd_en) rd_flag <= 1;else if(wr_rddata_en) beginif(data_num == 0) rd_flag <= 0;else if(rd_cnt == (data_num-1)) rd_flag <= 0; else rd_flag <= 1;end else rd_flag <= rd_flag;endwire fifo_empty;wire [4:0] cnt_fifo;wire clr_fifo;assign clr_fifo = wr_rddata_en&&(rd_cnt == (data_num-1));RD_DATA_BUF u_rd_data_buf(.aclr(clr_fifo),.clock(clk),.data(rd_data),.rdreq(1'b0), .wrreq(wr_rddata_en),.empty(fifo_empty),.full(),.q(),.usedw(cnt_fifo));endmodule View Code //======================================// I2C.v// //========================== // `define SIM //if run modelsim, enable module I2C( input clk, //sysclk = 50Mhzinput rst_n,input [1:0] wr_rd_en, //wr_rd_en[1] = read, wr_rd_en[0] = writeinput wr_data_flag, //if still have data to write,the flag always is highinput rd_data_flag, //if still have data to read,the flag always is highinput [7:0] wr_addr,input [7:0] wr_data,input [7:0] rd_addr,output [7:0] rd_data,output rd_wrdata_en, //read data from eeprom_data.v to write eepromoutput wr_rddata_en, //write the read data from eeprom to eeprom_data.voutput ee_I2C_CLK,inout ee_I2C_SDA);reg [1:0] wr_rd_en_reg1,wr_rd_en_reg2;reg [4:0] state;parameter IDLE = 5'd0;parameter START_1 = 5'd1;parameter START_2 = 5'd2;parameter START_3 = 5'd3;parameter WR_CTL_1 = 5'd4;parameter WR_CTL_2 = 5'd5;parameter WR_CTL_ACK1 = 5'd6;parameter WR_CTL_ACK2 = 5'd7;parameter WR_ADDR_1 = 5'd8; parameter WR_ADDR_2 = 5'd9; parameter WR_ADDR_ACK1 = 5'd10;parameter WR_ADDR_ACK2 = 5'd11;parameter WR_DATA_1 = 5'd12;parameter WR_DATA_2 = 5'd13; parameter WR_DATA_3 = 5'd14; parameter WR_DATA_ACK1 = 5'd15;parameter WR_DATA_ACK2 = 5'd16;parameter RD_DATA_1 = 5'd17;parameter RD_DATA_2 = 5'd18; parameter RD_DATA_ACK1 = 5'd19; parameter RD_DATA_ACK2 = 5'd20;parameter STOP_1 = 5'd21;parameter STOP_2 = 5'd22;parameter STOP_3 = 5'd23; parameter WRITE_TIME = 5'd24; //delay 10ms parameter CMD_control = 7'b1010000; //eeprom addr = 3'b000;`ifdef SIMparameter delay = 20'd100; parameter delay_10ms = 20'd500; `elseparameter delay = 20'd300; parameter delay_10ms = 20'd500000; `endif always @(posedge clk or negedge rst_n) beginif(rst_n == 0) begin wr_rd_en_reg2 <= 2'd0;wr_rd_en_reg1 <= 2'd0 ;endelse beginwr_rd_en_reg2 <= wr_rd_en_reg1;wr_rd_en_reg1 <= wr_rd_en ;endendreg [4:0] num; //data = 8bitreg [19:0] delay_cnt; reg [7:0] addr_reg; //reg addrreg [7:0] data_reg; //reg datareg wr_flag; //write flagreg rd_flag; //read flagreg rd_restart_flag; // read, the next start flagreg dir_sda_flag; // dir of sda flagreg rd_wrdata_flag; //when write data ,need read data firstreg wr_rddata_flag;reg [7:0] rd_data_reg;reg ee_sclk_reg; reg ee_data_reg;always @(posedge clk or negedge rst_n) beginif(rst_n == 0) begin state <= IDLE;num <= 0;delay_cnt <= 0;addr_reg <= 0;data_reg <= 0;wr_flag <= 0;dir_sda_flag <= 0;rd_flag <= 0;rd_restart_flag <= 0;rd_wrdata_flag <= 0;wr_rddata_flag <= 0;rd_data_reg <= 0;ee_sclk_reg <= 1;ee_data_reg <= 1;endelse begincase(state)IDLE: beginnum <= 0;delay_cnt <= 0;data_reg <= 0;addr_reg <= 0;wr_flag <= 0;dir_sda_flag <= 0;rd_flag <= 0;rd_restart_flag <= 0;rd_wrdata_flag <= 0;wr_rddata_flag <= 0;rd_data_reg <= 0;ee_sclk_reg <= 1;ee_data_reg <= 1;if(wr_rd_en_reg2 == 2'b01) begin //writeaddr_reg <= wr_addr ;wr_flag <= 1;rd_flag <= 0;state <= START_1; dir_sda_flag <= 1; endelse if(wr_rd_en_reg2 == 2'b10) begin //readaddr_reg <= rd_addr ;wr_flag <= 0;rd_flag <= 1;state <= START_1;dir_sda_flag <= 1;rd_data_reg <= 0; endelse beginstate <= state;endendSTART_1: begin //reg ee_sclk_reg <= 1;ee_data_reg <= 1;if(delay_cnt == delay<<1 ) beginstate <= state + 1;delay_cnt <= 0;endelse begin state <= state ;delay_cnt <= delay_cnt + 1;endendSTART_2: begin //pull down DATA ee_sclk_reg <= 1;ee_data_reg <= 0;if(delay_cnt == delay ) beginstate <= state + 1;delay_cnt <= 0;endelse begin state <= state ;delay_cnt <= delay_cnt + 1;endendSTART_3: begin //pull down SCL ee_sclk_reg <= 0;ee_data_reg <= 0;num <= 7;if(delay_cnt == delay ) begin delay_cnt <= 0;if(rd_restart_flag) begin data_reg <= {CMD_control,1'b1};state <= WR_CTL_1; endelse if((wr_flag ==1)&&(rd_flag == 0)) begindata_reg <= {CMD_control,1'b0};state <= WR_CTL_1;end else if((wr_flag == 0)&&(rd_flag == 1)) begindata_reg <= {CMD_control,1'b0};state <= WR_CTL_1;end else begindata_reg <= 0; state <= IDLE;endendelse begin state <= state ;delay_cnt <= delay_cnt + 1;endendWR_CTL_1 : begin //write CMD,change data at middle of SCL low timeee_sclk_reg <= 0; if(delay_cnt == delay>>1) ee_data_reg <= data_reg[num];else ee_data_reg <= ee_data_reg;if(delay_cnt == delay) begin state <= state + 1;delay_cnt <= 0;endelse begin state <= state ;delay_cnt <= delay_cnt + 1;endendWR_CTL_2: begin //write CMD,write dataee_sclk_reg <= 1;ee_data_reg <= ee_data_reg;if(delay_cnt == delay) begin if(num == 0) begin state <= state + 1;delay_cnt <= 0; endelse begin state <= WR_CTL_1;delay_cnt <= 0;num <= num -1;endendelse begin state <= state ;delay_cnt <= delay_cnt + 1;endendWR_CTL_ACK1 : begin //ackee_sclk_reg <= 0;ee_data_reg <= 0;if(delay_cnt == 4) dir_sda_flag <= 0; //delay, make sure SDA change in the SCK Lowelse dir_sda_flag <= dir_sda_flag;if(delay_cnt == delay) beginstate <= state + 1;delay_cnt <= 0;endelse beginstate <= state ;delay_cnt <= delay_cnt + 1;endendWR_CTL_ACK2 : beginee_sclk_reg <= 1;if(delay_cnt == delay) begin delay_cnt <= 0;if(rd_restart_flag) begin state <= RD_DATA_1;delay_cnt <= 0; num <= 7;rd_restart_flag <= 0;endelse beginstate <= WR_ADDR_1; num <= 7;endendelse beginstate <= state ;delay_cnt <= delay_cnt + 1;endendWR_ADDR_1: begin //write addr,change dataee_sclk_reg <= 0; if(delay_cnt == 4) dir_sda_flag <= 1;else dir_sda_flag <= dir_sda_flag;if(delay_cnt == delay>>1) ee_data_reg <= addr_reg[num];else ee_data_reg <= ee_data_reg;if(delay_cnt == delay) begin state <= state + 1;delay_cnt <= 0;endelse begin state <= state ;delay_cnt <= delay_cnt + 1;end end WR_ADDR_2: begin //write addr,WRITE dataee_sclk_reg <= 1;ee_data_reg <= ee_data_reg;if(delay_cnt == delay) begin if(num == 0) begin state <= WR_ADDR_ACK1;delay_cnt <= 0; endelse begin state <= WR_ADDR_1;delay_cnt <= 0;num <= num -1;endendelse begin state <= state ;delay_cnt <= delay_cnt + 1;endendWR_ADDR_ACK1 : beginee_sclk_reg <= 0;ee_data_reg <= 0;if(delay_cnt == 4) dir_sda_flag <= 0;else dir_sda_flag <= dir_sda_flag;if(delay_cnt == delay) beginstate <= state + 1;delay_cnt <= 0;endelse beginstate <= state ;delay_cnt <= delay_cnt + 1;end endWR_ADDR_ACK2: beginee_sclk_reg <= 1;if(delay_cnt == delay) begindelay_cnt <= 0;if((wr_flag ==1)&&(rd_flag == 0)) beginstate <= WR_DATA_1 ;num <= 7;endelse if((wr_flag ==0)&&(rd_flag == 1)) beginstate <= START_1 ;rd_restart_flag <= 1;dir_sda_flag <= 1;endelse beginstate <= IDLE ;end endelse beginstate <= state ;delay_cnt <= delay_cnt + 1;end endWR_DATA_1 : beginee_sclk_reg <= 0; num <= 7 ;if(delay_cnt == 3) dir_sda_flag <= 1;else dir_sda_flag <= dir_sda_flag;if(delay_cnt == 1) rd_wrdata_flag <= 1;else rd_wrdata_flag <= 0;if(delay_cnt == 5) begindelay_cnt <= 0 ;state <= state + 1;data_reg <= wr_data;endelse begin delay_cnt <= delay_cnt + 1 ;state <= state;end endWR_DATA_2 : beginee_sclk_reg <= 0;if(delay_cnt == delay>>1) ee_data_reg <= data_reg[num];else ee_data_reg <= ee_data_reg;if(delay_cnt == delay) begin state <= state + 1;delay_cnt <= 0;endelse begin state <= state ;delay_cnt <= delay_cnt + 1;end endWR_DATA_3: begin ee_sclk_reg <= 1;ee_data_reg <= ee_data_reg;if(delay_cnt == delay) begin if(num == 0) beginstate <= WR_DATA_ACK1;delay_cnt <= 0; end else begin state <= WR_DATA_2;delay_cnt <= 0;num <= num -1;endendelse begin state <= state ;delay_cnt <= delay_cnt + 1;end endWR_DATA_ACK1: beginee_sclk_reg <= 0;ee_data_reg <= 0;if(delay_cnt == 4) dir_sda_flag <= 0;else dir_sda_flag <= dir_sda_flag;if(delay_cnt == delay) beginstate <= state + 1;delay_cnt <= 0;endelse beginstate <= state ;delay_cnt <= delay_cnt + 1;end endWR_DATA_ACK2: beginee_sclk_reg <= 1;if(delay_cnt == delay) begindelay_cnt <= 0;dir_sda_flag <= 1;if(wr_data_flag) state <= WR_DATA_1 ;else state <= STOP_1 ; endelse beginstate <= state ;delay_cnt <= delay_cnt + 1;end end RD_DATA_1: begin //readee_sclk_reg <= 0;if(delay_cnt == 4) dir_sda_flag <= 0;else dir_sda_flag <= dir_sda_flag;if(delay_cnt == delay>>1) rd_data_reg[num] <= ee_I2C_SDA;else data_reg <= data_reg;if(delay_cnt == delay) begin state <= state + 1;delay_cnt <= 0;endelse begin state <= state ;delay_cnt <= delay_cnt + 1;endendRD_DATA_2: beginee_sclk_reg <= 1; if(delay_cnt == delay) begin if(num == 0) beginstate <= state + 1;delay_cnt <= 0;endelse beginstate <= RD_DATA_1;delay_cnt <= 0;num <= num - 1;endendelse begin state <= state ;delay_cnt <= delay_cnt + 1;endendRD_DATA_ACK1: begin //read data from slave, Notice: the ACK send from Master. ee_sclk_reg <= 0; if(delay_cnt == 4) dir_sda_flag <= 1;else dir_sda_flag <= dir_sda_flag;if(rd_data_flag) ee_data_reg <= 0; //if have data need to read, Master must PULL DOWN the SDA else ee_data_reg <= 1;if(delay_cnt == delay) beginstate <= state + 1;delay_cnt <= 0;endelse beginstate <= state ;delay_cnt <= delay_cnt + 1;end endRD_DATA_ACK2 : begin ee_sclk_reg <= 1;if(delay_cnt == 2) wr_rddata_flag <= 1;else wr_rddata_flag <= 0;if(delay_cnt == delay) begindelay_cnt <= 0;if(rd_data_flag) beginstate <= RD_DATA_1 ;num <= 7;endelse beginstate <= STOP_1 ; num <= 0;endendelse beginstate <= state ;delay_cnt <= delay_cnt + 1;end endSTOP_1: begin ee_sclk_reg <= 0; ee_data_reg <= 0;if(delay_cnt == delay) begin state <= state + 1;delay_cnt <= 0;endelse begin state <= state ;delay_cnt <= delay_cnt + 1;end end STOP_2: beginee_sclk_reg <= 1; ee_data_reg <= 0;if(delay_cnt == delay) begin state <= state + 1;delay_cnt <= 0;endelse begin state <= state ;delay_cnt <= delay_cnt + 1;end endSTOP_3: beginee_sclk_reg <= 1; ee_data_reg <= 1;if(delay_cnt == delay) begin if(wr_flag == 1) begin state <= state + 1;delay_cnt <= 0;endelse begin //read,not need wait.rd_flag <= 0;state <= IDLE; delay_cnt <= 0;endendelse begin state <= state ;delay_cnt <= delay_cnt + 1;end endWRITE_TIME: begin //if write, need wait a lot time to re-satrt.if read, not need wait.wr_flag <= 0;if(delay_cnt == delay_10ms) begin state <= IDLE;delay_cnt <= 0;endelse begin state <= state ;delay_cnt <= delay_cnt + 1;end enddefault: state <= IDLE; endcase endend//----------------------------------assign ee_I2C_CLK = ee_sclk_reg;assign ee_I2C_SDA = dir_sda_flag ? ee_data_reg: 1'bz;assign rd_wrdata_en = rd_wrdata_flag;assign wr_rddata_en = wr_rddata_flag;assign rd_data = rd_data_reg;endmodule View Code // megafunction wizard: %FIFO% // GENERATION: STANDARD // VERSION: WM1.0 // MODULE: scfifo // ============================================================ // File Name: RD_DATA_BUF.v // Megafunction Name(s): // scfifo // // Simulation Library Files(s): // altera_mf // ============================================================ // ************************************************************ // THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! // // 16.0.0 Build 211 04/27/2016 SJ Standard Edition // ************************************************************//Copyright (C) 1991-2016 Altera Corporation. All rights reserved. //Your use of Altera Corporation's design tools, logic functions //and other software and tools, and its AMPP partner logic //functions, and any output files from any of the foregoing //(including device programming or simulation files), and any //associated documentation or information are expressly subject //to the terms and conditions of the Altera Program License //Subscription Agreement, the Altera Quartus Prime License Agreement, //the Altera MegaCore Function License Agreement, or other //applicable license agreement, including, without limitation, //that your use is for the sole purpose of programming logic //devices manufactured by Altera and sold by Altera or its //authorized distributors. Please refer to the applicable //agreement for further details.// synopsys translate_off `timescale 1 ps / 1 ps // synopsys translate_on module RD_DATA_BUF (aclr,clock,data,rdreq,wrreq,empty,full,q,usedw);input aclr;input clock;input [7:0] data;input rdreq;input wrreq;output empty;output full;output [7:0] q;output [4:0] usedw;wire sub_wire0;wire sub_wire1;wire [7:0] sub_wire2;wire [4:0] sub_wire3;wire empty = sub_wire0;wire full = sub_wire1;wire [7:0] q = sub_wire2[7:0];wire [4:0] usedw = sub_wire3[4:0];scfifo scfifo_component (.aclr (aclr),.clock (clock),.data (data),.rdreq (rdreq),.wrreq (wrreq),.empty (sub_wire0),.full (sub_wire1),.q (sub_wire2),.usedw (sub_wire3),.almost_empty (),.almost_full (),.eccstatus (),.sclr ());defparamscfifo_component.add_ram_output_register = "OFF",scfifo_component.intended_device_family = "Cyclone IV E",scfifo_component.lpm_numwords = 32,scfifo_component.lpm_showahead = "OFF",scfifo_component.lpm_type = "scfifo",scfifo_component.lpm_width = 8,scfifo_component.lpm_widthu = 5,scfifo_component.overflow_checking = "ON",scfifo_component.underflow_checking = "ON",scfifo_component.use_eab = "ON";endmodule// ============================================================ // CNX file retrieval info // ============================================================ // Retrieval info: PRIVATE: AlmostEmpty NUMERIC "0" // Retrieval info: PRIVATE: AlmostEmptyThr NUMERIC "-1" // Retrieval info: PRIVATE: AlmostFull NUMERIC "0" // Retrieval info: PRIVATE: AlmostFullThr NUMERIC "-1" // Retrieval info: PRIVATE: CLOCKS_ARE_SYNCHRONIZED NUMERIC "1" // Retrieval info: PRIVATE: Clock NUMERIC "0" // Retrieval info: PRIVATE: Depth NUMERIC "32" // Retrieval info: PRIVATE: Empty NUMERIC "1" // Retrieval info: PRIVATE: Full NUMERIC "1" // Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone IV E" // Retrieval info: PRIVATE: LE_BasedFIFO NUMERIC "0" // Retrieval info: PRIVATE: LegacyRREQ NUMERIC "1" // Retrieval info: PRIVATE: MAX_DEPTH_BY_9 NUMERIC "0" // Retrieval info: PRIVATE: OVERFLOW_CHECKING NUMERIC "0" // Retrieval info: PRIVATE: Optimize NUMERIC "2" // Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0" // Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" // Retrieval info: PRIVATE: UNDERFLOW_CHECKING NUMERIC "0" // Retrieval info: PRIVATE: UsedW NUMERIC "1" // Retrieval info: PRIVATE: Width NUMERIC "8" // Retrieval info: PRIVATE: dc_aclr NUMERIC "0" // Retrieval info: PRIVATE: diff_widths NUMERIC "0" // Retrieval info: PRIVATE: msb_usedw NUMERIC "0" // Retrieval info: PRIVATE: output_width NUMERIC "8" // Retrieval info: PRIVATE: rsEmpty NUMERIC "1" // Retrieval info: PRIVATE: rsFull NUMERIC "0" // Retrieval info: PRIVATE: rsUsedW NUMERIC "0" // Retrieval info: PRIVATE: sc_aclr NUMERIC "1" // Retrieval info: PRIVATE: sc_sclr NUMERIC "0" // Retrieval info: PRIVATE: wsEmpty NUMERIC "0" // Retrieval info: PRIVATE: wsFull NUMERIC "1" // Retrieval info: PRIVATE: wsUsedW NUMERIC "0" // Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all // Retrieval info: CONSTANT: ADD_RAM_OUTPUT_REGISTER STRING "OFF" // Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone IV E" // Retrieval info: CONSTANT: LPM_NUMWORDS NUMERIC "32" // Retrieval info: CONSTANT: LPM_SHOWAHEAD STRING "OFF" // Retrieval info: CONSTANT: LPM_TYPE STRING "scfifo" // Retrieval info: CONSTANT: LPM_WIDTH NUMERIC "8" // Retrieval info: CONSTANT: LPM_WIDTHU NUMERIC "5" // Retrieval info: CONSTANT: OVERFLOW_CHECKING STRING "ON" // Retrieval info: CONSTANT: UNDERFLOW_CHECKING STRING "ON" // Retrieval info: CONSTANT: USE_EAB STRING "ON" // Retrieval info: USED_PORT: aclr 0 0 0 0 INPUT NODEFVAL "aclr" // Retrieval info: USED_PORT: clock 0 0 0 0 INPUT NODEFVAL "clock" // Retrieval info: USED_PORT: data 0 0 8 0 INPUT NODEFVAL "data[7..0]" // Retrieval info: USED_PORT: empty 0 0 0 0 OUTPUT NODEFVAL "empty" // Retrieval info: USED_PORT: full 0 0 0 0 OUTPUT NODEFVAL "full" // Retrieval info: USED_PORT: q 0 0 8 0 OUTPUT NODEFVAL "q[7..0]" // Retrieval info: USED_PORT: rdreq 0 0 0 0 INPUT NODEFVAL "rdreq" // Retrieval info: USED_PORT: usedw 0 0 5 0 OUTPUT NODEFVAL "usedw[4..0]" // Retrieval info: USED_PORT: wrreq 0 0 0 0 INPUT NODEFVAL "wrreq" // Retrieval info: CONNECT: @aclr 0 0 0 0 aclr 0 0 0 0 // Retrieval info: CONNECT: @clock 0 0 0 0 clock 0 0 0 0 // Retrieval info: CONNECT: @data 0 0 8 0 data 0 0 8 0 // Retrieval info: CONNECT: @rdreq 0 0 0 0 rdreq 0 0 0 0 // Retrieval info: CONNECT: @wrreq 0 0 0 0 wrreq 0 0 0 0 // Retrieval info: CONNECT: empty 0 0 0 0 @empty 0 0 0 0 // Retrieval info: CONNECT: full 0 0 0 0 @full 0 0 0 0 // Retrieval info: CONNECT: q 0 0 8 0 @q 0 0 8 0 // Retrieval info: CONNECT: usedw 0 0 5 0 @usedw 0 0 5 0 // Retrieval info: GEN_FILE: TYPE_NORMAL RD_DATA_BUF.v TRUE // Retrieval info: GEN_FILE: TYPE_NORMAL RD_DATA_BUF.inc FALSE // Retrieval info: GEN_FILE: TYPE_NORMAL RD_DATA_BUF.cmp FALSE // Retrieval info: GEN_FILE: TYPE_NORMAL RD_DATA_BUF.bsf FALSE // Retrieval info: GEN_FILE: TYPE_NORMAL RD_DATA_BUF_inst.v FALSE // Retrieval info: GEN_FILE: TYPE_NORMAL RD_DATA_BUF_bb.v TRUE // Retrieval info: LIB_FILE: altera_mf View Code TB: `timescale 1 ps/1 psmodule EEPROM_TB;reg clk;reg rst_n;wire ee_I2C_CLK;wire ee_I2C_SDA;EEPROM u_EEPROM(.clk(clk),.rst_n(rst_n),.EEPROM_SCK(ee_I2C_CLK),.EEPROM_SDA(ee_I2C_SDA));parameter T = 20000;always #(T/2) clk = ~clk;initial beginclk = 0;rst_n = 0;$stop;#(500*T) rst_n = 1; endendmodule View Code

?

? ??

?

? ? ?

?

轉載于:https://www.cnblogs.com/fhyfhy/p/7878679.html

總結

以上是生活随笔為你收集整理的EEPROM的操作---SPI接口和I2C接口的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

欧美黑人xxxx猛性大交 | 天天操欧美 | 在线观看不卡的av | 日韩欧美有码在线 | 久久一线 | 精品国产黄色片 | av在线播放国产 | 天天干一干 | 日韩欧美国产免费播放 | 久久精品导航 | 亚洲综合狠狠干 | 麻豆传媒在线免费看 | 欧美a级在线免费观看 | 国产亚洲午夜高清国产拍精品 | 中文字幕xxxx| 久久字幕精品一区 | 色婷婷狠狠18 | 色资源二区在线视频 | 欧美一级在线看 | 中文区中文字幕免费看 | 亚洲精品国内 | 国产乱码精品一区二区蜜臀 | 久草在线视频看看 | 久久黄页| 午夜电影av | 91麻豆精品国产自产在线 | 国产一二三区在线观看 | 精精国产xxxx视频在线播放 | 91av中文字幕 | 亚洲 欧美 综合 在线 精品 | 国产91粉嫩白浆在线观看 | 亚洲国产精品va在线看黑人 | 亚洲一区二区黄色 | 波多野结衣一区三区 | 欧美了一区在线观看 | 日本精品久久久久 | 五月激情在线 | 中文字幕av专区 | 性色av免费看 | 98福利在线| 91欧美日韩国产 | 日韩在线高清视频 | 国产一区免费在线观看 | www日韩高清 | 欧洲黄色片 | 成年人免费电影在线观看 | 国产精品初高中精品久久 | 国产中年夫妇高潮精品视频 | 激情五月综合 | 亚洲精品一区二区三区四区高清 | 久久婷婷开心 | 青青久草在线视频 | 正在播放国产一区 | 欧美精品久久久久久久久久久 | 日韩激情视频在线 | 99精品国产一区二区三区麻豆 | 午夜影院三级 | 欧美精品乱码99久久影院 | 18女毛片 | 国产精品男女啪啪 | 亚洲免费小视频 | 久久国产精品小视频 | 福利一区二区三区四区 | 韩日视频在线 | 国产精品美乳一区二区免费 | 日韩亚洲国产精品 | 偷拍精偷拍精品欧洲亚洲网站 | 视频一区在线播放 | 亚洲欧洲久久久 | 成人影视免费 | 日韩视频一二三区 | 日韩成人免费在线观看 | 超碰在线观看97 | 日本久久久久久久久久久 | 天天干天天干天天色 | 五月天com | 久久久精品视频网站 | www.色com| 色香com.| 在线免费试看 | 日韩欧美在线播放 | 在线涩涩 | 亚洲综合射 | 国产涩涩网站 | 97视频在线观看免费 | 九九视频网站 | 一区二区三区免费看 | 91九色精品女同系列 | 精品国产一区二区三区不卡 | 国产亚洲人成网站在线观看 | 天天干 夜夜操 | 成人免费网站在线观看 | 久草在线一免费新视频 | 奇米网8888| 免费欧美精品 | 欧美极品裸体 | 色无五月 | 久久精品三级 | 免费毛片一区二区三区久久久 | 手机在线观看国产精品 | 一本大道久久精品懂色aⅴ 五月婷社区 | 黄色官网在线观看 | 久草精品电影 | 久久久久久久久免费视频 | 欧美特一级 | 懂色av懂色av粉嫩av分享吧 | 国产在线中文字幕 | 免费在线观看视频一区 | 久久艹艹| www久草 | 精品国产1区二区 | 视频在线观看一区 | 国产麻豆果冻传媒在线观看 | 国产理论免费 | av在线日韩 | av电影亚洲| 97精品在线观看 | 久久社区视频 | 182午夜在线观看 | 中文字幕免费不卡视频 | 成人黄性视频 | 亚洲精品久久久久久久不卡四虎 | 国产精品一区二区白浆 | 久久精品一区二 | 国产精品久久久久一区二区三区 | 99热精品久久| 日韩精品一区二区不卡 | 波多野结衣亚洲一区二区 | 国产精品永久久久久久久久久 | 好看的国产精品视频 | 中文字幕亚洲综合久久五月天色无吗'' | 色婷婷色 | 免费看黄在线观看 | 一区二区不卡视频在线观看 | 怡红院成人在线 | 国产精品久久久久久久久久免费看 | 日本性xxx| 婷婷久久精品 | 国产精品美女在线观看 | www.大网伊人 | 欧美二区在线播放 | 国产在线小视频 | 成人av资源在线 | 日韩黄色在线电影 | 国产一级二级在线观看 | 最新精品国产 | 九九久久电影 | 草久在线| 亚洲视频精品在线 | 亚洲国产大片 | 久久精品99久久 | 久久91久久久久麻豆精品 | 在线亚洲天堂网 | 毛片99| 丁香花在线观看视频在线 | 在线观看中文字幕视频 | 免费成人结看片 | 国产精品一区二区在线观看免费 | 亚洲综合色视频 | 日本黄色免费在线观看 | 亚洲少妇久久 | 91资源在线 | 国产99久久九九精品免费 | 夜夜夜影院 | 在线观看日韩视频 | 欧美一区免费观看 | 亚洲黄电影 | 国产精品久久久久久久免费观看 | 在线视频中文字幕一区 | 免费看黄网站在线 | 91香蕉国产在线观看软件 | www国产一区| 91成人欧美 | 天堂av在线中文在线 | 国产成人亚洲在线观看 | 国产精品久久久久国产a级 激情综合中文娱乐网 | 国产精品一区二区吃奶在线观看 | 色偷偷888欧美精品久久久 | 91精彩在线视频 | 中文字幕一区二区三区精华液 | 亚洲三级影院 | 久久久久久久毛片 | 色五丁香| 国产 日韩 在线 亚洲 字幕 中文 | 婷婷综合亚洲 | 中文字幕在线看视频 | 亚洲一区二区三区miaa149 | 欧美视频在线二区 | 深夜福利视频在线观看 | 欧美一区二区日韩一区二区 | 亚洲美女精品视频 | 久久国产精品视频观看 | 精品国产一区在线观看 | 超碰在97 | 国产69精品久久久久久 | 欧美-第1页-屁屁影院 | 在线久热| 亚洲片在线资源 | 日韩欧美视频免费在线观看 | 国产香蕉97碰碰碰视频在线观看 | 国产一区免费看 | 国产精品毛片一区二区在线看 | 国产精品免费高清 | 国产美女精品视频 | 精品96久久久久久中文字幕无 | 免费精品在线视频 | 欧美黑人性猛交 | 国产在线中文 | 久久久久久久久久久网 | 4hu视频 | 免费观看视频的网站 | 99c视频在线 | 在线91av| 欧美在线不卡一区 | 欧美日韩高清在线 | 天天插天天操天天干 | 日韩午夜av| 午夜视频在线瓜伦 | 亚洲精欧美一区二区精品 | 日韩在线欧美在线 | 亚洲播放一区 | 国产系列在线观看 | 97超碰资源站 | 中文字幕av在线播放 | 久久夜av | 99精品国产在热久久下载 | 欧美午夜激情网 | 日韩电影在线观看中文字幕 | 在线播放91 | 久久久网站 | 色吊丝在线永久观看最新版本 | 久久视频99 | 99国内精品久久久久久久 | 天天干天天做天天爱 | 91成人网在线播放 | 久久视频免费看 | 成人精品电影 | 久久免费99 | 91视频在线观看下载 | 国产成人精品一区二区在线观看 | 精品国产亚洲一区二区麻豆 | 国产一级在线观看 | 久久免费99精品久久久久久 | 亚洲一片黄 | 精品国产伦一区二区三区观看说明 | 午夜性色| 九九久久久久久久久激情 | 免费看黄色小说的网站 | 欧美一区二区三区四区夜夜大片 | 久久成人午夜视频 | 国产精品一区欧美 | 国产精品久久久久久久久久久久午夜片 | 国产在线一卡 | 中文成人字幕 | 国产精品理论片在线观看 | 97国产大学生情侣白嫩酒店 | 男女激情麻豆 | 日韩 在线观看 | 国产精品久久久久毛片大屁完整版 | 日韩欧美在线观看一区二区 | 久久精品99久久久久久2456 | 久久成人人人人精品欧 | 91九色在线 | 国产精品3 | 97国产视频| 中文字幕在线观看完整 | 国产精品综合久久久久久 | 99久久er热在这里只有精品15 | 国产成人在线一区 | 丁香花五月 | 天天射天天操天天 | 91人人爽人人爽人人精88v | 久艹视频在线观看 | 成人午夜影视 | 国产精品入口传媒 | 韩国在线视频一区 | 国产精品com | 国产中文视 | 天天曰天天干 | 91精品视频在线观看免费 | 久久三级毛片 | 欧美在线一二区 | 在线观看免费高清视频大全追剧 | 日日干日日 | 国产录像在线观看 | 亚洲涩涩色 | 97免费在线观看 | 江苏妇搡bbbb搡bbbb | 涩涩成人在线 | 91精品综合在线观看 | 男女免费av| 免费激情网 | www.色午夜 | 激情久久影院 | 成人午夜电影在线 | 免费看的黄色小视频 | 久久有精品 | 久久久久草 | 国产精品视频一二三 | 中文字幕在线国产精品 | 国产又粗又猛又黄又爽 | 五月婷婷综| 欧美一级性 | 久久夜夜夜 | www.久久视频| 在线免费国产视频 | 六月激情久久 | 精品国产中文字幕 | 国产精品美女久久久久久2018 | 黄色av大片| 国产一区二区日本 | 国产欧美在线一区二区三区 | a级国产乱理伦片在线观看 亚洲3级 | 96精品高清视频在线观看软件特色 | 992tv在线成人免费观看 | 五月天中文字幕mv在线 | 九九热只有这里有精品 | 18性欧美xxxⅹ性满足 | 日躁夜躁狠狠躁2001 | 亚洲高清视频在线观看 | 成人在线视频论坛 | 狠狠搞,com| 国产高清成人在线 | 亚洲色视频 | 嫩草av在线| 国产综合精品久久 | 国产一级片久久 | 中文字幕在线一二 | 久保带人 | 亚洲精品av中文字幕在线在线 | 伊人国产视频 | av中文字幕在线看 | 在线免费高清一区二区三区 | 在线观看深夜福利 | 日韩在线色视频 | 欧美精品久久久久久久久久丰满 | 一区免费视频 | 亚洲一区av | 日韩在线网址 | 久久免费视频这里只有精品 | 999国产在线 | 黄毛片在线观看 | 国产一区福利在线 | 91精品老司机久久一区啪 | 91黄色视屏 | 久久久久在线观看 | 亚洲性少妇性猛交wwww乱大交 | 一本一本久久a久久精品综合妖精 | 8x8x在线观看视频 | 日韩精品高清视频 | 美女性爽视频国产免费app | japanese黑人亚洲人4k | 日韩在线大片 | 亚洲经典视频 | 国产69精品久久久久久久久久 | 日韩在线高清免费视频 | 91一区二区三区在线观看 | av免费观看网址 | 亚洲区另类春色综合小说 | 久久久www | 国产一线天在线观看 | 久久久精品在线观看 | av福利在线 | 婷婷六月天综合 | 日韩色中色 | 国产亚洲精品久久久久久久久久 | 开心激情综合网 | 久草视频在线资源 | 天天操天天干天天操天天干 | 日本中文乱码卡一卡二新区 | 一本色道久久综合亚洲二区三区 | 色综合久久五月 | 99视频久 | 黄色大全免费观看 | 五月婷婷久久丁香 | 久久精品成人 | 久久久久久97三级 | 人人射人人射 | 精品久久久久久久久久久久久久久久久久 | 五月婷婷视频在线 | 四虎永久精品在线 | 久久久久 免费视频 | 三级免费黄 | 精品国产视频在线观看 | 国产在线色 | 日韩三级成人 | www.午夜| 最近中文字幕在线 | 日韩在线高清 | 97av精品| 黄色成年 | 国产一级高清视频 | 黄色在线观看污 | 五月天免费网站 | 亚洲欧美精品一区二区 | 欧美日韩高清一区二区 国产亚洲免费看 | 国产精品一区二区三区视频免费 | 成人资源在线观看 | 黄色91在线 | 国产精品久久久久婷婷二区次 | 亚洲aⅴ久久精品 | 欧美电影在线观看 | 国产网红在线观看 | 成年人app网址 | 色婷婷综合久久久久中文字幕1 | 精品国产网址 | 手机在线看a | 久草视频首页 | 国产区免费 | 一级黄色片在线免费看 | 精产嫩模国品一二三区 | 91探花在线| 国产高清永久免费 | 在线а√天堂中文官网 | 狠狠操狠狠干天天操 | 久久草在线精品 | 久久一区二区免费视频 | 国产成人一级 | 视频在线观看国产 | 毛片网在线观看 | 91夫妻自拍 | 国产精品第54页 | 亚洲视频精选 | 天天射天天艹 | 日韩网站一区 | 天天综合日日夜夜 | 日韩av男人的天堂 | 久久久久久综合 | 日本99精品 | 精品国产伦一区二区三区 | 亚洲视频一 | 久久久久免费电影 | 日韩精品一区二区在线观看 | 国产91av视频在线观看 | 天天操天天干天天插 | 久久视频在线看 | 色噜噜在线观看 | 久久久久久中文字幕 | 精品国产伦一区二区三区观看方式 | av电影免费在线播放 | 国产精品久久久久久久av电影 | 香蕉视频久久久 | 综合久久2023 | 久久综合狠狠综合久久激情 | 久热国产视频 | 欧美国产日韩一区二区三区 | 日本视频精品 | 成 人 黄 色 视频播放1 | 久久久久亚洲精品国产 | 国产精品乱码一区二区视频 | 色偷偷男人的天堂av | 一本一本久久a久久精品牛牛影视 | 青青草华人在线视频 | 国产高清在线免费观看 | 97视频在线观看网址 | 伊人在线视频 | 久久经典视频 | 91精品视频在线免费观看 | 久久er99热精品一区二区 | 激情久久久久 | 在线观看一区 | 久久国产精品色av免费看 | 婷婷伊人综合 | 日韩在线中文字幕视频 | 亚洲精品视频免费 | 亚洲一区二区三区精品在线观看 | 国产麻豆剧传媒免费观看 | 国产精品va最新国产精品视频 | 综合天堂av久久久久久久 | 国产一二三精品 | 日本中文字幕久久 | 久久人人爽人人爽人人片av软件 | 亚洲精品在线观看中文字幕 | 日韩在线免费视频观看 | 国产福利91精品一区二区三区 | 免费观看一级 | 国产精品久久久久久久午夜 | 国产日韩欧美在线免费观看 | 少妇视频一区 | 碰超在线观看 | 97天天综合网 | 日韩精品中文字幕久久臀 | 99久久精品电影 | 在线观看亚洲视频 | 亚洲精品乱码久久久久久9色 | 日韩av电影免费观看 | 久久99国产综合精品 | 亚洲精品视频在线观看视频 | 久草电影在线 | 天天干天天看 | 性色va| 国产精品女视频 | 久久热首页 | 夜夜躁日日躁 | 国产精品久免费的黄网站 | 91免费看黄色 | 国产精品video | 国产精品久久久久久电影 | 中文av在线免费观看 | 色瓜| 91视频麻豆| 欧美亚洲成人免费 | 国产精品18久久久久久久久久久久 | av电影在线免费 | www.久久com| 麻花豆传媒mv在线观看网站 | 精品久久久久久久久久久久久久久久 | 日韩精品大片 | 西西www4444大胆在线 | 亚洲最新在线 | 亚洲成人蜜桃 | 在线看国产一区 | 91免费观看视频网站 | 午夜精品一区二区三区免费 | 美女视频黄免费网站 | 国产成人精品亚洲日本在线观看 | a电影免费看 | 黄色av电影在线 | 欧美精品一二三 | 久草在线视频精品 | 久久久www成人免费毛片麻豆 | 久爱综合 | 911久久香蕉国产线看观看 | 亚洲天堂网在线视频观看 | 久热超碰 | 日韩一区二区三区在线观看 | 国产精品资源在线观看 | 日韩三级视频在线观看 | www九九热 | 天天综合久久 | 日韩欧美国产精品 | 亚洲精品乱码久久久久久写真 | 成人亚洲精品久久久久 | 免费h精品视频在线播放 | 国产91欧美 | 在线看国产精品 | 国产精品成人在线观看 | 黄色av免费看 | 日日精品 | 国产成人61精品免费看片 | 国产黄色片久久久 | 婷婷国产在线 | 国产精品九九九 | 亚洲高清久久久 | 国产精品刺激对白麻豆99 | 久久久久久久久久免费 | 亚洲国产精品影院 | 国产99久久久国产精品免费二区 | 色伊人网| 黄色av网站在线免费观看 | 成人中文字幕+乱码+中文字幕 | 天堂在线视频免费观看 | 久久久久国产精品一区二区 | 丁香五月亚洲综合在线 | 中文字幕成人网 | 久久久久免费电影 | 狠狠狠色丁香婷婷综合久久88 | 337p日本欧洲亚洲大胆裸体艺术 | 国产精品高潮久久av | 国产精品免费观看久久 | 一区二区三区四区五区在线 | 欧美日韩啪啪 | 五月天综合色 | 毛片网在线播放 | 日韩欧美综合精品 | 免费一级片久久 | 成人xxxx | 成 人 免费 黄 色 视频 | 97超碰在线久草超碰在线观看 | 精品亚洲欧美无人区乱码 | 521色香蕉网站在线观看 | 久久久人人人 | 中文不卡视频在线 | 日本精品午夜 | 成人午夜电影久久影院 | 91视频午夜| 欧美精品在线观看 | 99这里只有精品视频 | av三级在线播放 | 99在线精品观看 | 国产不卡在线看 | 手机看片福利 | 狠狠色噜噜狠狠狠合久 | 日韩视频区 | 91精品国产高清自在线观看 | 久久精品99久久久久久 | 激情伊人 | 午夜婷婷在线观看 | 国产精品xxxx18a99 | 国产亚洲高清视频 | 欧美性高跟鞋xxxxhd | 欧女人精69xxxxxx | 中文字幕色网站 | 在线观看国产日韩 | 五月婷亚洲 | 狠狠狠干狠狠 | 91亚洲国产成人久久精品网站 | 人人添人人澡人人澡人人人爽 | 日韩精品在线免费播放 | 四虎影视成人永久免费观看视频 | 色婷婷88av视频一二三区 | 国产精品高清免费在线观看 | 欧美色噜噜噜 | 日本精品一区二区在线观看 | 综合久久综合久久 | 国产精品大尺度 | 中文成人字幕 | 久久高清免费 | 日日草天天干 | 成人午夜电影在线 | 久热色超碰| 久久久精品一区二区三区 | 一级欧美一级日韩 | 国产三级精品在线 | 日韩乱色精品一区二区 | 国产午夜剧场 | 一区二区三区高清在线观看 | 久久久久成人免费 | 日韩高清毛片 | 69视频网站 | 免费99| 午夜性盈盈 | 国产一级大片在线观看 | 午夜精品一区二区三区在线观看 | 亚洲最新毛片 | 国产日韩欧美在线 | 狠狠色丁香九九婷婷综合五月 | 久久久999| 一级理论片在线观看 | 99精品在线直播 | 日本韩国精品在线 | 91夫妻自拍 | 中文字幕在线观看1 | 色97在线 | 国产五月天婷婷 | 久久国产高清 | 亚洲综合色丁香婷婷六月图片 | 婷婷av资源 | 久久国产一区二区 | 在线a人v观看视频 | 521色香蕉网站在线观看 | 美女免费视频网站 | 91视频这里只有精品 | 中文字幕在线日本 | 国产精品99久久久久久大便 | 一级久久精品 | 又黄又爽又色无遮挡免费 | 久久伦理影院 | 国产一区二区精品91 | 91成人短视频在线观看 | 少妇搡bbbb搡bbb搡aa | av高清免费| 在线成人国产 | 麻豆一区二区三区视频 | 国产日韩欧美中文 | www.国产高清 | 色噜噜在线观看视频 | 欧美va天堂va视频va在线 | 五月婷影院 | 一级久久精品 | 色婷婷88av视频一二三区 | 亚洲片在线观看 | 久久精久久精 | 国产色婷婷在线 | www.人人草 | 久久久免费观看视频 | 亚洲黄色免费网站 | 国内精品久久久久影院日本资源 | 在线观看黄色国产 | 欧美精品亚洲精品 | 日本二区三区在线 | 午夜视频不卡 | 亚洲国产精品成人av | 公开超碰在线 | 狠狠干五月天 | 美女久久久久久久 | 国产一区二区在线影院 | av一区在线播放 | 日韩欧美一区二区在线播放 | 免费观看性生活大片 | 色网免费观看 | 91一区一区三区 | 在线日韩精品视频 | 欧美日韩高清一区二区 | 欧美精选一区二区三区 | 国产原创在线视频 | 四虎在线视频免费观看 | av电影免费看 | 很污的网站 | 久久国产精品成人免费浪潮 | 日韩电影在线观看一区 | 欧美精品乱码久久久久久按摩 | 91av久久 | 婷婷综合亚洲 | 91激情在线视频 | 韩国av电影在线观看 | 国产精品久久久久久久久久久久午夜 | 欧美日韩国产二区 | 高清有码中文字幕 | 成人免费av电影 | 久久一区二区三区国产精品 | av电影一区二区 | 视频国产在线 | 一区二区三区免费播放 | 五月天久久久久久 | 激情综合啪啪 | 亚洲精品国产精品国自产观看浪潮 | 国产精品久久久久久久久久白浆 | 99久视频 | 456成人精品影院 | 最近免费观看的电影完整版 | 狠狠干天天射 | 成人a免费 | 99久久精品久久久久久清纯 | 狠狠干成人综合网 | 久久大片| 国产看片免费 | 久久理论片 | 中文字幕免费在线 | 久久久 精品| 国产精品久久一卡二卡 | 亚洲一区 影院 | 人人爽人人爽人人爽 | 日韩a在线播放 | 玖草在线观看 | 婷婷www| 亚洲中字幕 | 四虎免费在线观看视频 | 91香蕉嫩草 | 久久与婷婷 | 国产999精品 | 亚洲国产经典视频 | 国产精品久久久久久欧美 | 亚洲成av人电影 | 精品久久久久国产免费第一页 | 国内精品久久天天躁人人爽 | 亚洲一区视频免费观看 | 91成人免费在线视频 | 欧洲高潮三级做爰 | 99精品亚洲 | 国产精品久久久久一区二区三区共 | 久久综合久久伊人 | 高清av中文在线字幕观看1 | 国产精品 中文字幕 亚洲 欧美 | 久热只有精品 | 91久久国产综合精品女同国语 | 日日夜夜骑 | 2023亚洲精品国偷拍自产在线 | 国产午夜精品一区二区三区欧美 | 国产精品女人久久久久久 | 国产精品久久婷婷六月丁香 | 亚洲免费在线观看视频 | 一区二区三区免费看 | 911香蕉| 久久久久久片 | 中文日韩在线 | 波多野结依在线观看 | 青草视频在线看 | 狠狠色丁香九九婷婷综合五月 | 久久久精品在线观看 | 国产精品国内免费一区二区三区 | 韩国视频一区二区三区 | 久久激情婷婷 | 国产99久久| 中文字幕在线精品 | 亚洲国产一区在线观看 | 午夜电影久久久 | 日韩久久在线 | 91福利视频免费观看 | 天堂av中文字幕 | 国产精品美女免费视频 | 中文字幕影片免费在线观看 | 国产夫妻性生活自拍 | 久草.com | 五月天天在线 | 免费观看www小视频的软件 | 日本mv大片欧洲mv大片 | 国产精品毛片一区视频播 | 99久热在线精品视频成人一区 | 在线免费黄 | 成年人毛片在线观看 | av网站手机在线观看 | 丰满少妇在线观看 | 日本成址在线观看 | 香蕉91视频 | 成人 亚洲 欧美 | 天天操网址 | 精品国产诱惑 | 三级a毛片 | 亚洲三级在线 | 国产美女黄网站免费 | 免费成视频 | 国产精华国产精品 | 日日夜夜骑 | 国产 欧美 在线 | 国产欧美最新羞羞视频在线观看 | 色婷婷亚洲| 欧美精品黑人性xxxx | 天天操天天操一操 | 性色xxxxhd| 天天天色 | 欧美成天堂网地址 | 激情综合色播五月 | 欧美一级久久 | 97视频人人澡人人爽 | 亚洲最新av网址 | 久久精品波多野结衣 | 天堂视频中文在线 | av免费在线观 | 嫩草91影院 | 狠狠狠狠狠干 | 国产小视频在线看 | 亚洲精品久久久久久久不卡四虎 | 五月婷婷久草 | 欧美一级免费片 | 亚洲精品视频久久 | 99热9| 伊人久在线 | 蜜臀久久99静品久久久久久 | 国产精品少妇 | 天天操天天是 | 午夜美女网站 | 色婷婷九月| 在线成人av | 在线中文日韩 | 色先锋资源网 | 国产精品亚洲人在线观看 | 久久久国产精品成人免费 | 亚洲3级 | 99久久er热在这里只有精品66 | 欧美日韩精品在线 | 在线观看香蕉视频 | 久精品在线观看 | 亚洲人在线 | 成人久久免费 | 精品视频资源站 | 999国内精品永久免费视频 | 久久久久久久久久久精 | 国产a视频免费观看 | 日韩高清在线观看 | 五月婷婷一级片 | 91精彩视频在线观看 | 国产一区二区三区 在线 | 97在线观看| 国产精品手机在线观看 | 黄色a在线 | 91完整版 | 国产麻豆电影在线观看 | 久草在线在线精品观看 | 国产一级视频在线免费观看 | 国产在线 一区二区三区 | 在线观看国产一区 | 久久一区二区三区日韩 | 免费又黄又爽 | 夜夜骑天天操 | 日本公妇在线观看高清 | 在线观看视频免费大全 | 久久刺激视频 | 亚洲精品av在线 | 国产精品精品国产色婷婷 | av在线最新 | 天天爽天天爽 | 国产精品视频你懂的 | 午夜久久福利 | 色wwwww| av免费在线播放 | 中文字幕国产精品一区二区 | 精品国产片 | 日韩www在线 | 日韩av线观看 | 久久电影国产免费久久电影 | 国产精品一区二区三区免费视频 | 中文字幕在线看视频 | 欧美日韩精品在线免费观看 | 久久久91精品国产一区二区精品 | 中文字幕精品久久 | 亚洲精品一区二区18漫画 | 国产精品久久久久一区二区三区 | 色网站视频 | 久久国产精品第一页 | 婷婷丁香在线观看 | 911久久 | 中文字幕资源在线 | 亚洲综合激情小说 | 国产成年人av| 久久精品这里热有精品 | 日本中文字幕系列 | 亚洲天堂精品视频在线观看 | 亚洲精品五月 | 亚洲最新视频在线播放 | 美女黄频在线观看 | 欧美一区二区三区激情视频 | 成人在线免费观看网站 | 色偷偷88欧美精品久久久 | 国产美女久久久 | www.久久免费 | 久久成人麻豆午夜电影 | 手机在线视频福利 | 欧美成人h版在线观看 | 精品国产乱码 | 亚州精品在线视频 | 国产精品99精品久久免费 | 成年一级片 | 国产一级大片免费看 | 在线观看黄网站 | 国语黄色片 | 国产精品都在这里 | 在线中文字幕网站 | 精品久久久久久亚洲综合网站 | 99久久精品久久久久久动态片 | 日免费视频 | 超碰在线日本 | 亚洲综合小说 | 成人精品视频 | 亚洲成人免费在线 | 手机av在线免费观看 | 天天操天天干天天综合网 | 亚洲乱码久久久 | 99久久www免费| 亚州精品国产 | 99c视频在线 | 伊人成人激情 | 久久久国产影院 | 黄色美女免费网站 | 麻豆小视频在线观看 | 四虎在线免费观看视频 | 午夜av剧场 | 最近免费观看的电影完整版 | 精品国产美女 | 欧美久久影院 | 中文字幕一区二区三区四区 | 九七视频在线观看 | 最近最新最好看中文视频 | 天天摸天天操天天舔 | 国产亚洲va综合人人澡精品 | 国产高清视频免费在线观看 | 黄网av在线 | 欧美美女一级片 | 久久99精品国产91久久来源 | 99精品国产99久久久久久97 | 国产xvideos免费视频播放 | 97av视频在线观看 | 欧美另类网站 | 欧美激情综合色综合啪啪五月 | av免费片 | 欧美乱码精品一区 | 国产精品国产三级国产不产一地 | 成年人视频在线免费 | 亚洲黄色av网址 | 综合久久2023 | 国产精品99免视看9 国产精品毛片一区视频 | 最近日韩免费视频 | 精品在线视频一区二区三区 | 亚洲国产一区二区精品专区 | 99在线精品视频 | 97人人模人人爽人人喊网 | 日韩免费视频观看 | 久草网在线 | 国产精品一区在线 | 亚洲一区二区黄色 | 91在线观看欧美日韩 | 伊人射 | 91九色蝌蚪国产 | 爱情影院aqdy鲁丝片二区 | www.香蕉视频在线观看 | 91久久爱热色涩涩 | 在线成人小视频 | 国产a级免费 | 日韩一区二区三区不卡 | 久久久午夜精品福利内容 | 中文字幕在线成人 | 丰满少妇高潮在线观看 | 色综合天天狠天天透天天伊人 | 午夜影视一区 | 一级精品视频在线观看宜春院 | 夜夜看av | 国产一级免费在线 | 国产九九精品视频 | 国产女教师精品久久av | 欧美午夜久久 | 91亚洲精品国偷拍自产在线观看 | 激情影院在线观看 | 日韩网站免费观看 | 中文字幕在线观看第二页 | 免费av一级电影 | 毛片3| 国产日韩在线一区 | 黄色免费视频在线观看 | 国产无套精品久久久久久 | 中文免费观看 | 永久免费在线 | 国产精品日韩 | 欧美国产高清 | 波多野结衣在线播放一区 | 久久国产免 | 亚洲极色| 97精产国品一二三产区在线 | 狠狠色香婷婷久久亚洲精品 |