RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

開源軟件opencores I2C master控制器控制I2C接口操作原理

YCqV_FPGA_EETre ? 來源:FPGA開發(fā)圈 ? 作者:FPGA開發(fā)圈 ? 2020-11-26 14:30 ? 次閱讀

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ā)圈】歡迎添加關注!文章轉載請注明出處。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 控制器
    +關注

    關注

    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ā)圈】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    實現(xiàn)I2C總線控制器的VHDL源代碼

    I2C總線控制器 altera提供 The I2C Controller was designed for the MC68307 uC, provides a simplified
    發(fā)表于 05-20 10:25 ?251次下載

    I2C總線接口模塊設計

    本實驗是基于EasyFPGA030的I2C總線接口模塊設計,用EasyFPGA030開發(fā)套件通過I2C協(xié)議實現(xiàn)對二線制I2C串行EEPROM的讀寫
    發(fā)表于 11-02 17:01 ?41次下載

    LM3S系列微控制器I2C應用文檔

    LM3S系列微控制器I2C應用文檔基于LM5749的I2C從機功能,模擬24C02傳輸協(xié)議操作
    發(fā)表于 04-03 14:29 ?52次下載

    I2C總線在Linux系統(tǒng)中的驅動設計

    介紹I2C總線的基本概念和工作原理,敘述I2C總線擴展器件ZLG7290的功能特點。在以S3C2410為微控制器,ZLG7290為I2C總線
    發(fā)表于 12-29 16:52 ?40次下載

    I2C控制lP在成像系統(tǒng)中的應用

    1 IP的硬件結構及寄存 1.1 IP硬件結構 IP內部結構如圖1所示。主要由波特率時鐘寄存、寄存控制器、并行I/O
    發(fā)表于 07-01 09:10 ?1422次閱讀
    <b class='flag-5'>I2C</b><b class='flag-5'>控制</b>lP在成像系統(tǒng)中的應用

    基于CPLD的I2C總線接口設計

    在電路設計中,I2C總線是比較常用的兩線式串行通信方式,大多數(shù)的CPU都擅長于并口操作,不具備直接操作I2C總線接口的能力。為了使不具備
    發(fā)表于 02-12 16:11 ?95次下載
    基于CPLD的<b class='flag-5'>I2C</b>總線<b class='flag-5'>接口</b>設計

    基于Verilog的I2C控制器的設計與綜合

    為滿足嵌入式系統(tǒng)中專用芯片功能不能達到系統(tǒng)要求的現(xiàn)狀,設計出一種功能可擴展的I2C slave控制器,這種控制器與傳統(tǒng)的專用I2C芯片不同。專用的I
    發(fā)表于 10-25 16:58 ?60次下載
    基于Verilog的<b class='flag-5'>I2C</b><b class='flag-5'>控制器</b>的設計與綜合

    i2c

    單片機i2c總線操作;單片機i2c總線操作;單片機i2c總線操作
    發(fā)表于 05-17 11:09 ?35次下載

    I2C總線控制器的工作原理及EEPROM的Linux驅動程序的設計

    、器件封裝形式小、通信速率較高等優(yōu)點。在主從通信中,可有多個I2C總線器件同時接到I2C總線上,通過地址來識別通信對象。筆者在開發(fā)基于MPC8250的嵌入式Linux系統(tǒng)的過程中發(fā)現(xiàn)I2C總線在嵌入式系統(tǒng)中應用廣泛,
    發(fā)表于 10-26 15:37 ?7次下載
    <b class='flag-5'>I2C</b>總線<b class='flag-5'>控制器</b>的工作原理及EEPROM的Linux驅動程序的設計

    i2c總線用來做什么_i2c總線數(shù)據(jù)傳輸過程

    I2C總線控制器為微控制器或微處理提供控制I2C總線的接口
    發(fā)表于 11-24 14:16 ?7258次閱讀

    硬件I2C與模擬I2C

    配置;而軟件I2C是沒有寄存這個概念的。 軟件I2C一般是使用GPIO管腳,用軟件
    發(fā)表于 12-28 19:14 ?81次下載
    硬件<b class='flag-5'>I2C</b>與模擬<b class='flag-5'>I2C</b>

    Gowin I2C Master/Slave用戶指南

    Gowin I2C Master 和 Slave 用戶指南主要包括功能簡介、信號定義、工 作原理、實例化等,旨在幫助用戶快速了解 Gowin I2C Master IP 和 Slav
    發(fā)表于 09-15 10:07 ?1次下載
    Gowin <b class='flag-5'>I2C</b> <b class='flag-5'>Master</b>/Slave用戶指南

    Linux I2C驅動入門知識科普

    I2C 總線驅動, I2C總線驅動就是SOC的 I2C控制器驅動,也叫做 I2C適配器驅動。
    的頭像 發(fā)表于 12-29 13:59 ?1678次閱讀

    I2C控制器驅動介紹

    (控制器)抽象成 i2c_adapter。 對于一個 I2C 適配器,肯定要對外提供讀寫 API 函數(shù),設備驅動程序可以使用這些 API 函數(shù)來完成讀寫操作。
    的頭像 發(fā)表于 07-22 15:38 ?1480次閱讀
    <b class='flag-5'>I2C</b><b class='flag-5'>控制器</b>驅動介紹

    I2C子系統(tǒng)SW Architecture

    適配器(控制器)驅動,這里用到兩個重要的數(shù)據(jù)結構:i2c_adapter 和 i2c_algorithm。其中,Linux 內核將 SOC 的 I2C 適配器(
    的頭像 發(fā)表于 07-22 16:01 ?945次閱讀
    <b class='flag-5'>I2C</b>子系統(tǒng)SW Architecture
    RM新时代网站-首页