FPGA的I2C的原理及应用(含有源码)

I2C总线与协议原理

     I2C作为串行通信总线主要有以下特点:

1、连接简单:I2C主要有两条串行总线线路,分别是SCL(串行时钟线)、SDA(串行数据线)。

2、双向通信:虽然只有两根信号线,但是可以实现数据的传入传出。

3、多主多从:I2C总线支持多主多从模式,即一个I2C总线可以连接多个I2C主机和I2C从机。

4、传输速度快:I2C总线的传输速率标准模式下可以达到100kb/s,快速模式下可以达到400kb/s,高速模式下可达3.4Mbit/s。

5、唯一ID:I2C总线上的每一个器件都有唯一一个器件ID,只有总线上的传输与该器件地址ID匹配时,该器件才会对总线上的传输做出相应的回应。所以不用担心传输时各个器件之间产生冲突。

 

    需要注意的是,虽然I2C总线上可以存在多个主机和多个从机,但是同一时刻,只能有一个主机向总线发起传输,如果有多个主机同时发起传输,则会根据I2C总线的总裁机制,最终只给一个主机授权,没有授权的主机停止传输。相较于从机与从机之间无法直接传输数据。

     可以看出I2C总线上,总共有4个器件分别是EEPROM存储器、RCT时钟芯片、音频解码芯片、FPGA,其中FPGA是主机器件,EEPROM存储器、RCT时钟芯片、音频解码芯片属于从机芯片。

 I2C协议介绍

   对于I2C协议来说,完成一次完整的传输包括起始位、停止位、控制字段、地址字段、读写数据字段。

  1、在时钟(SCL)为高电平的时候,数据总线(SDA)必须保持稳定,所以数据总线(SDA)在时钟(SCL)为低电平时候才能改变,数据稳定和变化的波形如下:

                    

2、在时钟(SCL)为高电平的时候,数据总线(SDA)有高变低的跳变为总线的起始信号

在时钟(SCL)为高电平的时候,数据总线(SDA)由低变高的跳变为总线的停止信号

       

3、应答:当数据发出方(不一定是主机或者从机)将8位数据或命令传出后,会将数据总线(SDA)释放,即设置为输入,然后等待数据接收方将SDA信号拉低以作为成功接收的应答信号。无论是什么状态,I2C总线的SCL信号始终由I2C主机驱动,应答位的波形:

4、数据帧格式,I2C器件通信的时候首先是要发送“起始信号”,紧跟着就是七位器件地址,第八位是数据传送的方向(0:代表写,1:代表读),再后面就是等待从机的应答,当然传送结束后,“终止信号”也是由主机产生的。发送数据时是高位先发送。

I2C器件地址

  每个I2C器件地址都有一个器件地址,有的器件地址在出厂时地址就已经设置好了,用可以不用更改(例如OV7670器件地址为固定0x42),有的确定了几位,剩下的由硬件自己设定(比如常见的I2C接口的EEPROM存储器,预留了3个空地址的引脚,由用户自己在硬件设定时确定)。

 严格来讲,主机并不是直接向从机发送地址,而是主机网数据总线上发送地址数据,所有的从机都能接收主机发送的地址数据,然而每个从机都将主机发出的地址与自己固有的地址比较,如果匹配上了,该从机就会向总线上发出响应信号(在应答位时拉低SDA信号线)。主机收到响应信号后,主机开始向总线发送其他数据,这样主机与从机的通信就建立起来了,如果主机没有收到响应信号,则表示寻址失败。

  通常情况下,主从器件的角色就被确定,也就是从机一直工作在从机模式下,不同的器件定义的地址的方式是不同的,有的软件定义,有的软件定义,比如一些单片机的I2C接口作为从机时,其器件地址可以通过软件定义。比如CMOS图像传感器,EEPROM存储器,其器件地址在出厂时就已经设定好,可以查找对应器件数据手册来查找器件地址。

I2C存储器地址

  每个支持I2C协议的器件,内部总会有一些可供读写的寄存器或存储器,例如,EEPROM存储器,内部就是顺序编址的一系列存储单元:OV7670的CMOS摄像头(OV7670的该叫SCCB接口,其实质也是一种特殊的I2C协议,可直接兼容I2C协议)。因此,我们要对一个器件中的存储单元进行读写,就必须要能够指定存储单元的地址。I2C协议设计了有从机存储单元寻址地址段,该地址段为一个字节或者两个字节长度,在主机确认收到从机返回控制字节响应后由主机发出,地址段长度视不同的器件类型而有所差异,例如同是EEPROM存储器,AT24C04的地址长度为一个字节,而AT24C64的地址长度为两个字节。

I2C数据读写字段

一、1字节地址器件单字节写操作时序

二、2字节地址器件单字节写操作时序

根据时序图,从主机角度来描述一次写入单字节数据过程:

单字节地址写单字节数据过程

1、主机设置SDA为输出;

2、主机发起起始信号;

3、主机传输器件地址字节,其最低位为0,表明为写操作;

4、主机设置SDA为三态门输入,读取从机应答信号;

5、读取应答信号成功,主机设置SDA为输出,传输1字节地址数据;

6、主机设置SDA为三态门输入,读取从机应答信号;

7、读取应答信号成功,主机设置SDA为输出,传输代写入数据;

8、主机设置SDA为三态门输入,读取从机应答信号;

9、读取应答信号成功,主机产生STOP位,终止传输。

双字节地址写单字节数据过程

1、主机设置SDA为输出;

2、主机发起起始信号;

3、主机传输器件地址字节,其最低位为0,表明为写操作;

4、主机设置SDA为三态门输入,读取从机应答信号;

5、读取应答信号成功,主机设置SDA为输出,传输地址数据高字节;

6、主机设置SDA为三态门输入,读取从机应答信号;

7、读取应答信号成功,主机设置SDA为输出,传输地址数据低字节;

8、主机设置SDA为三态门输入,读取从机应答信号;

9、读取应答信号成功,主机设置SDA为输出,传输代写入数据;

10、主机设置SDA为三态门输入,读取从机应答信号;

11、读取应答信号成功,主机产生STOP位,终止传输。

I2C读时序

一、单字节读时序

二、双字节地址读取单字节时序

根据时序图,从主机角度来描述一次读取单字节数据过程:

单字节地址读取单字节数据过程:

1、主机设置SDA为输出;

2、主机发起起始信号;

3、主机传输器件地址字节,其中最低位为0表示为写操作;

4、主机设置SDA为三态门输入,读取从机应答信号;

5、读取应答信号成功,主机设置SDA为输出,传输1字节地址数据;

6、主机设置SDA为三态门输入,读取从机应答信号;

7、读取应答信号成功,主机发起起始信号;

8、主机传输器件地址字节,其中最低位为1表示为读操作;

9、主机设置SDA为三态门输入,读取从机应答信号;

10、读取应答信号成功,主机设置SDA为三态门输入,读取SDA总线上的一个字节的数据;

11、产生无应答信号(高电平)(无需设置为输出高电平,因为总线会被自动拉高);

12、主机产生STOP位,终止传输。

双字节地址读取单字节数据过程

 

1、主机设置SDA为输出;

2、主机发起起始信号;

3、主机传输器件地址字节,其中最低位为0表示为写操作;

4、主机设置SDA为三态门输入,读取从机应答信号;

5、读取应答信号成功,主机设置SDA为输出,传输地址数据高字节;

6、主机设置SDA为三态门输入,读取从机应答信号;

7、读取应答信号成功,主机设置SDA为输出,传输地址数据低字节;

8、主机设置SDA为三态门输入,读取从机应答信号;

9、读取应答信号成功,主机发起起始信号;

10、主机传输器件地址字节,其中最低位为1表示为读操作;

11、主机设置SDA为三态门输入,读取从机应答信号;

12、读取应答信号成功,主机设置SDA为三态门输入,读取SDA总线上的一个字节的数据;

13、产生无应答信号(高电平)(无需设置为输出高电平,因为总线会被自动拉高);

14、主机产生STOP位,终止传输。

I2C总结

重点掌握内容如下:

1、I2C总线结构和主从概念;

2、I2C协议中起始位、结束完的时序特征;

3、I2C协议中器件地址字段(控制字段)中每一位的功能定义

4、I2C协议中应答位的产生者;

5、I2C总线上主机从指定从机的指定存储地址读取一个字节数据的完整时序;

6、I2C总线上主机从指定从机的指定存储地址读取多个字节数据的完整时序;

7、I2C总线上主机写入一个指定数据到指定从机的指定存储地址的完整时序;

8、I2C总线上主机写入多个指定数据到指定从机的指定存储地址的完整时序;

 

未完续(请看代码篇)。。。。。

  • 7
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr~康

你们的鼓励,是我继续创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值