【转】I2C总线相关知识

1. I2C access

1.1. I2C introduction

I2C(Inter-Integrated Circuit)总线是由NXP恩智浦半导体公司在80年代开发的两线式串行总线,用来进行主控器与被控器的通信。I2C总线具有接口线少,控制方式简单,器件封装形式小,通信速率较高等优点,是微电子通信控制领域广泛采用的一种总线标准。

I2C总线由两根信号线构成,一根是串行数据线SDA,一根是串行时钟线SCL,这两根信号线都是双向的,SDA的传输与SCL同步。Figure 1中,连接到总线的器件为漏极开路输出结构,各器件之间执行线与的功能。当总线空闲时,SDASCL必须接上拉电阻至高电平来省电。串行的8 位双向数据传输位速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s

I2C总线上可同时挂接多个器件,器件之间靠不同的编址来进行区分,每个连接到总线上的期间都可以通过唯一的地址与主机进行通信。由于I2C是双向传输的总线,每个器件都可能成为主机(发送器)或者从机(接收器),时钟信号SCL由主机产生。

 

Figure 1  开漏输出

RLXXXA支持一组I2C接口,I2C 工作在master mode情况下可完成上电后EEPROM auto-download动作。而I2C工作在Slave mode时支持external CPU通过I2C access internal Switch core register.

 

Figure 2  RLXXXAI2C总线

如果external cpu访问I2C,同时internal 8051通过I2C access eeprom,此时内部会错开,前者优先做动作。

1.2. I2C Transferring Data

数据的有效性:SDA 线上的数据必须在时钟的高电平周期保持稳定。只有在SCL 线的时钟信号为低电平时,才允许数据线的电平改变状态。(起始时和结束时例外)

 

Figure 3  I2C位传输数据有效性

起始条件(S)SCL 线是高电平时,SDA 线从高电平向低电平切换,之后被认为处于忙的状态;

结束条件(P)SCL 线是高电平时,SDA 线由低电平向高电平切换,之后被认为返回空闲状态。若不产生结束信号而产生重复起始条件(Sr),则总线会一直处于忙的状态,此时的起始条件与重复起始条件在功能上是一样的。

 

Figure 4  起始条件和结束条件

应答信号(ACK)I2C总线上的所有数据都是以8位字节传送的,发送器每发送一个字节,就在时钟脉冲9期间释放数据线(拉高SDA),由接收器反馈一个应答信号,表示接收器已经成功地接收了该字节。应答位的时钟脉冲仍由主机产生,而应答位的数据状态则遵循“谁接受谁产生”的原则,即总是由接收器产生应答位。主机向从机发送数据时,应答位由从机产生;主机从从机接受数据时,应答位由主机产生。I2C总线标准规定:应答位为0表示接收器应答(ACK),为1表示非应答(NACK)。对于反馈有效应答位ACK的要求是,接收器在第9个时钟脉冲之前的低电平期间将SDA线拉低,并且确保在该时钟的高电平期间为稳定的低电平。

 

Figure 5  I2C总线的响应

1.3. I2C Slave for External CPU Access

工作在slave mode情况下,I2C支持一次Read/Writesequential Read/Write一笔4N Byte data的方式,由control byte(1) + address bytes(3) + data bytes(4N, N: integer, N0)组合而成。

主机发送一个起始条件后开始帧的发送,发送到SDA 线上的每个字节必须为8 位,每次传输可以发送的字节数量不受限制。每成功发送1Byte字节数据都会产生一个ACK信号。首先传输的是数据的最高位(MSB),如果从机要完成一些其他功能后(例如一个内部中断服务程序)才能接收或发送下一个完整的数据字节,可以使时钟线SCL保持低电平,迫使主机进入等待状态,当从机准备好接收下一个数据字节并释放时钟线SCL后数据传输继续。

I2C总线上传输帧的首字节control byte主要用来寻址以及决定数据传输方向。其中高4位是device type identifier,用来标识器件类型,固定为1010(一般为EEPROM)。接下来的三位A2A1A0为器件的片选地址Device address,因为EEPROMI2C会共享SCK/SDA的接口, 所以两者必须用Device address来分出外部的I2C Master所要access的是EEPROM还是RLxxx。一般来说, EEPROM会排在Device address 0-3的位置, Device会从4开始排. 目前规划RL6xxxA support最多4Device addressEEPROM使用,default值为000,为避免在进行auto-download动作时与其它deviceaddress发生冲突,可以通过烧写EFUSE来修改RLxxx Device address default订在4的地方, 但可以通过I2C_Device_Addr[2:0]来修改其device address,也可以通过烧写EFUSE来修改。control byteLSB为数据传输方向位,write时写0read时写1.

 

Figure 6  External CPU Access control byte Sequence

External CPU通过I2C方式access内部register,Control Byte部分设置对应的RL6xxxA Devices addressR/W command,3byte address部分设置要访问的register address

A. 如果是read命令,在standard模式下,format改为进行两次start,第一次表示下register地址,第二次为read dataStandard mode也就是首先执行一个伪写操作(R/W位置写0),ASIC在读到3byte地址后,重新发送起始信号和ASIC地址,此时R/W位置写1,然后会送出对应地址的4byte register值,如图6所示。如果master在得到4byte register 值后,不产生应答信号同时送出stop,就表示完成一次read操作;如果master继续输出SCL,而不输出stopASIC在内部自动进行地址的increment(每次+4),输出该register的值,完成sequential read操作,master需要保证SCL4byte的整数倍输出。

 

Standard mode

Figure 7  External CPU Access Data Sequence (read)

B. 如果是write命令,ASIC在得到3byte地址后,会读取后面连续的4byte data并将其写到对应的register,如图7所示。Master可以支持single writesequential write,在single write时,只对一个register进行write操作后,输出stop;在burst write操作时,可以连续写入4N整数倍的dataregister,中间不产生停止信号,ASIC内部自动进行地址的increment操作。

 

Figure 8  External CPU Access Data Sequence (write)

当需要对同一个table的连续entry进行read/write操作的时候,为了提高table access的速度,结合I2Cburst访问,在table accessINDIRECT_CONTROL_FOR_CPU中增加bit Table_Burst(0b0: standard burst way 0b1: special burst way for sequential table access),用来选择burst方式。

I2C提供burst方式2:初始操作和burst方式1一致,read操作时,先control-addr-control-4N bytes data,之后addr+4,继续read/write后续的data. 两种方式的区别就在于前者只能对一条entry的连续对写,而后者可以对连续entry进行读写操作。当需要进行Sequential读取table entry时,将该bit1I2C就会切换成burst2sequence方式。

Standard burst way: control byte +3 address bytes +某一条entry4N data bytes

Special burst way: control byte +3 address bytes +第一条entryTableDataNumdata bytes +第二条entryTableDataNumdata bytes +……+EntryNumentryTableDataNumdata bytes.

此时可通过table access BURST_OPERATIONbit[4:0] TableDataNum来设置burst连续操作的data register数目,bit[14:5] EntryNum用来设置连续访问的entry的数目。完成TableDataNumdataread/write操作后,I2C会返回到初始addr处,重新从写入的addrread/write, 操作下面连续TableDataNumdata. 每次操作完成一条entryread/write. 每次读出一条entry存在该组indirect data register, read后自动填入下条entry. Write时会自动填入下条entry需要写的值,entry数目自动加1,自动写入下条entry. eg:需要访问L2 table, 只想获得entry中前2data register中的参数,那就可以设置TableDataNum=2,那burst操作中返回的就是所有访问的entry中前2data register中的值。

I2C处所写的entry数小于EntryNum时,待I2C写完相应的entry后,softwareexecute写为0.

Table 1  I2C External Access Status Register

Reg.bit

Name

Mode

Description

Default

n.31-n.22

Reserved

RO

Reserved

0x0

n.21-n.0

I2C_dataLen

RO

Record the data length

When read this field ,return the last time burst operation length

0x0

dataLen记录上次read/Writeburst length,如果是single read/write,会返回1,如果是burst操作,返回burst操作的length.

Table 2  I2C External Access Address Register

Reg.bit

Name

Mode

Description

Default

n.31-n.24

Reserved

RO

Reserved

0x0

n.23-n.0

I2C_EAAR

RO

Latch I2C external access address

0x0

I2C_EAAR栏位记录上次I2C操作时address栏位里面提供的address

1.4. I2C Master for EEPROM Auto-Download

工作在master mode情况下,Device address A2A1A0 default值为000RLxxx只支持大sizeEEPROM: 32~128Kb/256 Kb /512Kb. size的有分Word-high address and Word-low address16 bit,如Figure 9所示(address byte 1所占用的bitEEPROMsize决定)EEPROM size则会定义在SEL_EEPROM_RANGE[2:0]中,由EEPROM 将信息传递给switch. I2C进行EEPROM auto-download的速率定义在EEPROM_AUTO_DOWNLOAD_CONTROL中的SEL_SCK_FREQ.

 

Figure 9  Large Size (32Kb) EEPROM address byte

 

Figure 10  EEPROM Write Timing

 

Figure 11  EEPROM Read Timing

NOTE:

1. EEPROM第一次download过程中被打断(pin reset拉低或者power off), 为了保证EEPROM在我们做auto load时已经reset ok,再次load时需要以下步骤:

Step 1. SCL输出9 clock,同时SDA保持为high

Step 2. 输出start condition

Step 3. 再重新输出一个start condition开始download过程

前两个步骤是为了EEPROM reset,这样start就一定能正确认到,后续download过程也能正常进行。若不按照该步骤做,会导致第二次downloadfail:因为第二次download2s左右时间内开始进行,此时ASIC开始吐clock,但eeprom会按照上次被打断的地方开始向外drive data,导致第二次downloadstart信号被drive坏,不能正常开始第二次download.

2. 为了保证I2C的访问速度,在slave时,如果输出高电平,应该输出高电平,如果输出低电平的时候应该输出低电平;Master时由于速度不高,不存在上诉问题的考虑,但也希望能做到一致。这样做并不符合standard的做法(如果输出高电平,应该推高阻),原因是:第一,推高阻影响速度,无法达到要求的10MHz的速度;第二,即使做了推高阻,但是没有做arbitration其实也不符合standard。考虑到本Project的应用场合不会有两个master,所以不符合standard不会有问题。

原文地址:https://www.cnblogs.com/uiojhi/p/7582291.html