当前位置:   article > 正文

【FPGA】IIC协议的应用实现_fpga 实现 iic

fpga 实现 iic

一.协议介绍

1.IIC

IIC是一种两线式串行总线,由数据线SDA和时钟线SCL构成通信线路,既可用于发送数据,也可接受数据,是一种半双工通信协议。
总线上的主设备和从设备之间以字节为单位进行双向的数据传输。
多用于主机和从机在数据量不大且传输距离短的场合下的主从通信。主机启动总线,并产生时钟用于传送数据,此时任何接收数据的器件均被认为是从机。I2C器件一般采用开漏结构与总线相连,所以I2C_SCL和I2C_SDA均需接上拉电阻,也正因此,当总线空闲时,这两条线路都处于高电平状态,当连到总线上的任一器件输出低电平,都将使总线拉低。
总线上的每一个设备都可以作为主设备或从设备,而且每一个设备都会对应一个唯一的地址(可以从12C器件数据手册得知),主从设备之间就是通过这个地址来确定与哪个器件进行通信。

I2C时序

①空闲状态:
I2C总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。此时各个器件的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高。
②起始信号:
在SCL保持高电平期间,SDA的电平被拉低,称为 I2C总线的起始信号,标志着一次数据传输的开始。起始信号由主机主动建立,在建立该信号之前I2C总线必须处于空闲状态。
③停止信号:
在SCL保持高电平期间,SDA被释放,返回高电平,称为I2C总线的停止信号,标志着一次数据传输的终止。停止信号由主机主动建立,建立该信号之后,I2C总线将返回空闲状态。
在这里插入图片描述
④数据传输:
在I2C总线上传送的每一位数据都有一个时钟脉冲相对应(或同步控制),即在SCL串行时钟的配合下,在SDA上逐位地串行传送每一位数据。进行数据传送时,在 SCL 的高电平期间,SDA上的电平必须保持稳定,只有在 SCL为低电平期间,才允许 SDA上的电平改变状态。即数据在SCL的上升沿到来之前就必须准备好,并在在下降沿到来之前必须保持稳定。
在这里插入图片描述
⑤应答信号:
12C总线上的所有数据都是以字节传送的,发送端每发送一个字节,就必须在第9个SCL脉冲期间释放SDA,由接收端反馈一个应答信号。应答信号为低电平时,称为有效应答位(ACK),表示接收端成功接收了该字节;应答信号为高电平时,称为非应答位(NACK),表示接收端接收该字节失败。对于反馈有效应答位ACK的要求是,接收端在第9个时钟脉冲之前的低电平期间将SDA拉低,并且确保在该时钟周期的高电平期间保持低电平。如果接收端是主控端,则在它收到最后一个字节后,发送一个NACK信号,以通知被控发送端结束数据发送,并释放SDA线,以便主控接收器发送停止信号。
在这里插入图片描述

2.SCCB

SCCB ( Serial Camera Control Bus)是 OmniVision公司公布的串行摄像机控制总线协议,相当于一个简易的I2C协议。SCCB有三线和两线之分,三线的是一主机多从机,两线的是一主机一从机。
在这里插入图片描述
SCCB时序
①起始信号:
当SCCB_E拉低之后,SIO_D在SIO_C为高电平期间拉低,表示一次数据传输开始。
在这里插入图片描述
②停止信号:
当SCCB_E拉高之前,SIO_D在SIO_C为高电平期间拉高,表示一次数据传输结束。

在这里插入图片描述
③数据传输:
在SCCB协议中,一个基本传输单元称作一个(phase),一个相包含总共9比特,前8比特为数据,它的响应信号ACK是一个传输单元的第9位,分为Don’t care和 NA(No ACK)。Don’t care位由从机产生;NA位由主机产生,由于SCCB不支持多字节的读写,NA位必须为高电平。SCCB没有重复起始的概念,因此在 SCCB的读周期中,当主机发送完片内寄存器地址后,必须发送总线停止条件。不然在发送读命令时,从机将不能产生 Don’t care 响应信号。
写数据到从机被定义为写传输,从从机中读数据被定义为读传输,每一个传输都要有开始位(start)和结束位(sotp);完整的数据传输包括两个或三个阶段,每一个阶段包含9位数据,其中高8位为所要传输的数据,最低位根据器件读写情况有不同的取值:
每一个阶段组成:8位数据+don’t care/NA
如果是主机发送数据,即进行写操作,第9位就为don’t care;
如果是从机发送数据,即为读操作,第九位就为NA。
三相写传输:
ID Address :表示从机器件地址以及读/写控制位;
Sub Address :表示从机的寄存器地址;
Write Data :表示写入的1字节数据;
3个相后面的的最后1位X都是 Don’t-Care bits。
在这里插入图片描述

两相写传输:(读数据的第一阶段)
ID Address :表示从机的器件地址以及写控制位;
Sub Address :表示从机的寄存器地址;
2个相后面的的最后1位X都是Don’t-Care bits;
在这里插入图片描述

两相读传输:(读数据的第二阶段)
ID Address :表示从机的器件地址以及读控制位;
Read Data:表示接收从机发送的数据;
X都是Don’t-Care bits;NA必须为1。
在这里插入图片描述

3.EEPROM

写操作时序
写操作:
发起始位->写写控制字->接收ACK->写字节地址->接收ACK->写数据接收ACK->发停止位。
写控制字:
{7’b101000,1’b0}

单字节写:一次只写一个字节。
在这里插入图片描述

页写:一次可以写16个字节。这个和内部buffer的大小有关。
在这里插入图片描述

读操作时序
从当前地址读:
发起始位->写写控制字->接收ACK->写读地址->接收读数据->发NACK->发停止位。
在这里插入图片描述
随机读:
随机读,发起始位->写控制字->写读地址->接收ACK->发起始位->写读控制字->接收读数据->发NACK->发停止位。
顺序读:
顺序读,发起始位->写控制字->写读地址->接收ACK->发起始位->写读控制字->接收读数据->发ACK->接收读数据->发NACK->发停止位。
在这里插入图片描述

二.状态机分析

分析上述协议,我们发现对EEPROM的数据操作只有读写两种,在分析时序可知,无论是哪种读写模式,无外乎都可以以9bit为单位划分一次,对该9bit数据的操作只有读写两种,因此,我们可以设计一个控制状态机,该状态机只关心操作类型,而不关心这9bit数据具体是怎么处理的。再设计一个命令执行的状态机,该状态机接收前面状态机的命令,对具体命令执行具体的操作。
状态机设计如下:
在这里插入图片描述
说明:
控制状态机上电复位后处于初始状态,当读写数据的信号来临时,状态机会跳转到发送写请求或发送读请求状态,然后开始依据上述协议给执行状态机发送相应的命令。以一次写数据为例:
控制状态机进入发送写请求状态后,在第一个字节:给执行状态机发送请求信号,起始位命令+写命令,寄存器地址以及读写控制字;第二个字节:给执行状态机发送请求信号,写命令,寄存器地址;最后一个字节:给执行状态机发送请求信号,写命令+停止位命令,数据;如果存在中间字节:给执行状态机发送请求信号,写命令,数据。每个字节以接收到执行状态机处理完毕信号为结束标志。

在这里插入图片描述
说明:
执行状态机上电复位后处于初始状态,当接受到读写信号时,状态机会跳转到相应状态进行具体的数据操作。以一次写数据为例:
当状态机接收到写请求时,第一次请求必然伴随起始位命令,状态机由初始状态进入起始位状态,在一个时钟周期内,状态机要在时钟脉冲电平为高的期间拉低sda总线产生起始位条件,该周期结束,进入写数据状态,该状态保持8个时钟周期用于传输数据,数据的传输需按照协议要求在时钟周期脉冲低电平期间改变数据,高电平期间保持稳定,8个时钟周期结束后,状态机进入接收应答状态,若接收命令中不含有停止位命令或接收应答为非应答的返回初始状态,再次接受命令后由初始化状态直接跳转到写数据状态(当前属于一次数据操作),其余操作同上;若接收命令中含有停止位命令,则状态机跳转到停止位状态,在该状态的一个时钟周期内,在时钟脉冲高电平期间拉高sda总线,产生停止位。至此,一次写操作结束。

三.模块设计

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/599779
推荐阅读
相关标签
  

闽ICP备14008679号