0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

开源软件opencores I2C master控制器控制I2C接口操作原理

YCqV_FPGA_EETre 来源:FPGA开发圈 作者:FPGA开发圈 2020-11-26 14:30 次阅读

FPGA 芯片通过 I2C 总线连接 EEPROM 24LC04, I2C 的两根总线各上拉一个 4.7K的电阻到 3.3V,所以当总线上没有输出时会被拉高, 24LC04 的写保护没有使能,丌然 FPGA 会无法写入数据。因为在电路上 A0~A2 都为低,所以 24LC04 的设备地址为 0xA0。PGL12G 板子,是将FPGA芯片作为IIC 主站设备,将EEPROM作为了个从站设备;

原理图:

I2C 设备的操作可分为写单个存储字节,写多个存储字节,读单个存储字节和读多个存储字节。

①总线空闲状态
I2C 总线总线的 SDA 和 SCL 两条信号线同时处于高电平时,规定为总线的空闲状态。此时各个器件的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高。

②启动信号(Start)
时钟线 SCL 保持高电平期间,数据线 SDA 上的电平被拉低(即负跳变),定义为 I2C 总线总线的启动信号,它标志着一次数据传输的开始。启动信号是由主控器主动建立的,在建立该信号前 I2C 总线必须处于空闲状态,在时钟线 SCL 保持高电平期间,数据线 SDA 被释放,使得 SDA 返回高电平(即正跳变),称为 I2C 总线的停止信号,它标志着一次数据传输的终止。停止信号也是由主 控器主动建立的,建立该信号后, I2C 总线将返回空闲状态。

④数据位传送
在 I2C 总线上传送的每一位数据都有一个时钟脉冲相对应(戒同步控制),即在 SCL 串行时钟的配合下,在 SDA 上逐位地串行传送每一位数据。迚行数据传送时,在 SCL 呈现高电平期间,SDA 上的电平必须保持稳定,低电平为数据 0,高电平为数据 1。只有在 SCL 为低电平期间,才允许 SDA 上的电平改变状态。

⑤应答信号( ACK 和 NACK)
I2C 总线上的所有数据都是以 8 位字节传送的,収送器每収送一个字节,就在时钟脉冲 9 期间释放数据线,由接收器反馈一个应答信号。应答信号为低电平时,规定为有效应答位( ACK 简称应答位),表示接收器已经成功地接收了该字节;应答信号为高电平时,规定为非应答位( NACK),一般表示接收器接收该字节没有成功。对于反馈有效应答位 ACK 的要求是,接收器在第 9 个时钟脉冲乊前的低电平期间将 SDA 线拉低,并且确保在该时钟的高电平期间为稳定的低电平。如果接收器是主控器,则在它收到最后一个字节后,収送一个 NACK 信号,以通知被控収送器结束数据収送,并释放 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

原文标题:紫光同创PGL22G开发平台试用连载(4)——用开源软件 opencores 上的 I2C master控制器去控制I2C接口

文章出处:【微信公众号:FPGA开发圈】欢迎添加关注!文章转载请注明出处。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 控制器
    +关注

    关注

    112

    文章

    15223

    浏览量

    171159
  • 开源软件
    +关注

    关注

    0

    文章

    204

    浏览量

    15661
  • 接口
    +关注

    关注

    33

    文章

    7639

    浏览量

    148480
  • 操作
    +关注

    关注

    0

    文章

    43

    浏览量

    18796

原文标题:紫光同创PGL22G开发平台试用连载(4)——用开源软件 opencores 上的 I2C master控制器去控制I2C接口

文章出处:【微信号:FPGA-EETrend,微信公众号:FPGA开发圈】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    80 第23.1讲 I2C实验-I2C协议和6U的I2C控制器详解 - 第2

    程序代码I2C协议
    充八万
    发布于 :2023年08月17日 10:03:33

    I2C总线协议详解

    能够进行接收和发送的设备都可以成为主控制器,当然多个主控不能同一时间 工作。  I2C总线有两根信号线,一根为SDA(数据线),一根为SCL(时钟线)。任何时候时钟信号都是由主控器件产生。I2C总线
    发表于 02-01 09:56

    I2C接口

    本帖最后由 eehome 于 2013-1-5 09:56 编辑 现在设计有两个设备,主设备和从设备,通过I2C接口控制连接,由于距离可能距离较远50cm左右,请问这距离有问题吗?还有没有对
    发表于 11-08 09:34

    ST32的I2C接口问题

    我想用STM32F103VET6控制 I2C接口的数字电位 X9119 。不知道怎么控制,谁可以帮我下。主要是时序我都知道,我也看了野火的
    发表于 06-06 21:01

    STM32的 I2C接口问题

    我想用STM32F103VET6控制 I2C接口的数字电位 X9119 。不知道怎么控制,谁可以帮我下。主要是时序我都知道,我也看了野火的
    发表于 06-06 21:05

    pyboardCN V2 使用I2C接口驱动I2C外设DS3231

    ,I2C.MASTER)#新建一个I2C类的对象i2c,调用类的构造函数,设置I2C2接口的模式为Mas
    发表于 08-17 16:53

    I2C MasterMaster通信可能吗?

    嗨,我有一个项目,一个PIC24FJ256GB210是一个I2C主控,一个PIC16F18326,一个I2C从机和一个I2C EEPROM。所以,在特殊情况下,必须有可能PIC16给
    发表于 12-27 16:04

    到底什么是I2C

    之间的通信链路。这一解释已经很清楚了,但我还有更多的问题:它究竟是什么?什么类型的设备使用I2CI2C如何帮我解决系统中遇到的实际问题?I2C是使主设备(例如处理,微
    发表于 07-23 04:45

    能使用内置的I2C控制器或使用软件

    刚开始的时候,我有一个带有I2C接口的PIC12F1820。读取外部串行EEPROM的最好方法是什么?1)我应该使用内置的I2C控制器或使用软件
    发表于 05-14 08:14

    HarmonyOS 驱动平台---I2C

    设备地址写到总线上,如果某个从设备符合此地址,将会发出应答信号,建立传输。I2C接口定义了完成I2C传输的通用方法集合,包括:I2C控制器
    发表于 09-16 18:54

    I2C简介

    一.I2C 简介I2C(内部集成电路)总线接口用作微控制器I2C 串行总线之间的接口。它提供
    发表于 08-10 08:10

    什么是软件I2C和硬件I2C

    学习I2C总线通信协议,完成基于I2C硬件协议的AHT20温湿度传感的数据采集,并将采集的温度-湿度值通过串口输出。具体任务:1)解释什么是“软件
    发表于 08-23 06:19

    Rockchip I2C控制器支持哪些功能?

    Rockchip I2C控制器支持哪些功能?
    发表于 03-02 09:56

    Gowin I2C Master Slave参考设计

    本次发布 Gowin I2C Master IP 和 Slave 参考设计。Gowin I2C Master IP 和 Slave 参考设计可在高云官网下载,参考设计可用于仿真,实例化
    发表于 10-09 07:58

    OpenHarmony:如何使用HDF平台驱动控制I2C

    I2C控制器管理:打开或关闭I2C控制器 I2C消息传输:通过消息传输结构体数组进行自定义传输 I2
    发表于 09-12 15:18