2-wire Bus Interface
5.1 Signal Interface
I2C组成由master和salve组成。固定侧为master,自由侧为slave。采用串行的方式来控制以及传输数据。
一定是由master开始数据传输。数据传输方向可以是master到slave,或者slave到master。I2C由SCL以及SDA组成。
master利用SCL对双线总线上的数据和控制信息进行时钟控制。master和slave应该在SCL上升沿的时候锁定数据。
SDA信号时双向的,在数据传输过程中,当SCL为低电平时,SDA电平进行转换。当SCL为高电平时时,SDA电平上的转换应表示停止或启动状态。
5.2 2-wire Bus Protocol
5.2.1操作状态和状态转换
5.2.1.1 Start信号
Start信号:SCL为高时,SDA从高到低进行转换。所有i2c操作必须在start信号开始之后。
5.2.1.2 Stop信号
Stop信号:SCL为高时,SDA从低到高进行转换。所有i2c操作必须在stop信号出现后结束。
5.2.1.3 Acknowledge信号
Acknowledge信号:在发送一个字节以后,持有sda信号的一侧应该释放sda线一段时间,在这个期间接收
方可以拉低sda发送应答信号。
master写数据到slave时,slave应该在每次接收到数据后发送应答信号。
master读数据slaver是,master 应该在最后一次接收数据之前都发送应答信号,在最后一个应该发送nack信号,并接着发送一个stop信号。
5.2.1.4 Clock Stretching
clock stretching通过将SCL线拉低来暂停一个传输.直到释放SCL线为高电平,传输才继续进行.
5.2.2 Reset (仅限管理界面)
5.2.2.1 Power On Reset
掉电时i2c应该进行复位,上电后应该复位完成。
5.2.2.2 Protocol Reset(协议复位)
同步问题可能导致master和slvae对当前正在传输的特定位位置、操作类型甚至正在进行的操作存在分歧。i2c没有明确定义的复位机制。以下步骤可能会强制完成当前操作,并使slave释放SDA。
- master应向slave提供多达9个SCL时钟周期(先低再高)
- 当每个周期SCL高时,master应监测SDA。
- 如果slave释放SDA,它将会拉高,并且master可以开始start操作。
- 如果SDA在整整9个时钟周期后保持低,则协议复位失败。
5.2.2.3 Reset Signal
如果实现了一个重置引脚。如果提供,在断言复位引脚时,自由侧应过渡到复位状态。状态过渡的延迟超出了本文件的范围。
5.2.3 Format
5.2.3.1 Control
在start信号后,i2c操作的前8位字应包括“1010000”,然后是一个读/写控制位。
1 | 0 | 1 | 0 | 0 | 0 | 0 | R/W |
---|---|---|---|---|---|---|---|
MSB | LSB |
lsb位表示操作是数据读取还是写。如果该位为高,则执行读取操作;如果该位被设置为低,则执行写操作;
在控制位传输完成后,slave应把sda信号拉低,确认接收成功。(发送应答)
5.2.3.2 Address and Data
在读/写控制位之后,地址和数据字以8位1 byte进行传输。数据首先用大端序进行传输。
5.3 Read/Write Operations
5.3.1 Slave Memory Address Counter (Read and Write Operations)
所有i2c slave都有一个内部的寄存器地址计数器,其中包含在最近一次读写操作中访问的最后一个地址,并增加1。
每当slave接收或发送数据字时,地址计数器就会递增。只要没有掉电,此地址应该保持有效。在对自由侧设备断电或复位时,从地址计数器的内容可能不确定。读写操作期间的地址滚动是从128字节内存页面的最后一个字节到同一页面的第一个字节。
5.3.2 Write Operations (BYTE Write)
在发送完设备地址(A0h)和确认之后的8位数据字地址之后才可以进行写操作。在收到这个地址(寄存器地址)后,slave应发送(ACK信号)来确认,然后记录第一个8位的数据。
在收到数据字后,slave应该发送ack信号进行应答,master如果想终止顺序写,应该发送一个stop信号。
如果发送start信号代替stop信号,那写入的数据应该丢弃。再接收到合法的stop信号后,salve写入数据到自己内部的内存上。slave在此写周期内禁用其管理接口输入,在内部内存写入完成之前,不得响应或确认后续命令
5.3.3 Write Operations (Sequential Write)
双线从应最多支持4个连续字节写入,不重复发送从地址和内存地址信息。顺序写入以与单字节写入相同的方式启动,但是主机主机在输入第一个字后不发送停止条件。相反,在slave确认接收到第一个数据字之后,master最多可以传输三个数据字。slave应在收到每个数据字后发送一个确认信号。master必须以STOP条件终止顺序写入序列,否则将中止写入操作并丢弃数据。
5.3.4 Write Operations (Acknowledge Polling)
一旦slave内部定时的写周期开始,就可以使用轮询来确定写操作何时完成。这涉及到发送一个启动条件,然后是设备地址字。只有当内部写周期完成时,从属才会响应出对后续命令的确认,表明读或写操作可以继续。
5.3.5 Read Operations (Current Address Read)
当前地址读操作只需要发送从地址读字(10100001),一旦slave发送ack确认,当前地址数据字将被连续选出。当master用NACK和STOP响应而不是确认时,传输将终止。
5.3.6 Read Operations (Random Read)
随机读操作需要在目标字节地址中加载一个虚拟写操作(也就是写设备地址和寄存器地址),这可以通过以下顺序来完成:
- 目标8位数据字地址在设备地址写入字(10100000)之后发送,并由从slave确认
- 然后master生成另一个开始条件(中止1010000写入)和通过发送设备读地址(10100001)读取的当前地址。
- slave确认设备地址,并连续呼出所请求的数据字。
- 当master用NACK和STOP响应而不是确认时,传输将终止。
5.3.7 Read Operations (Sequential Read)
- 顺序读取由当前地址读取或随机地址读取启动。
- 要指定顺序读取,master在每个数据字之后响应确认(而不是STOP)。
- 只要slave收到确认,它就应该连续发出顺序数据字。
- 当master用NACK和STOP响应而不是确认时,传输将终止。
5.4 2-wire Interface Timing
5.4.1 Timing Diagram
5.4.2 Timing Parameters
5.5 Write Operation Restrictions
1字节的位置应该用单字节写操作写入,而那些>1字节可以用多字节写操作写入。表5-3中定义的可写内存块的内容,除了第02h页之外,都是易失性的,在开机时所有位都设置为零。