I2C协议,是同步的,串行通信方式。有两个线,一根SCLOCK时钟线,一根SDA数据线,时钟是右SOC提供的,SOC和外设用I2C通信时,使用的是一个时钟,数据线是两者传输信息用的。一般在通信的过程中,分为主设备和从设备,如果主设备要向从设备发送信息时,从设备不可以发送东西。
可以一对一进行I2C通信,也可以一对多进行I2C通信,在一对多I2C通信时,主设备像往常一样先把SDA,SCL拉高,SCL维持高电平的这一段时间里,SDA产生了一个由高电平到低电平的变化,就成功发送了一个起始位,这时,所有的从设配都开始把自己的耳朵竖起来听了, 因为所有从设备都是连接在这两条总线上的。发送完起始位后,主设备开始发送八位数据了,分别在SCL的每一个上升沿读取SDA数据线的高电平和低电平对应的0和1,这八位数据包括七位的从设备的地址,和一位(0或1)代表读或者写。当从设备发现发送过来的地址后,就赶紧把这个地址和自己的地址进行对比(每个从设备都有一个自己固定的地址(在一个电路板上)),如果从设备发现发送过来的地址和自己的地址相符合,就知道这时主设备就要开始和自己进行通信了。如果发现发送过来的地址和自己的地址不符合,那么从设备就不给予理会,因为它知道不是在叫他。当发现地址和自己的地址一样时,这个设备就开始读取了第八位,从而知道主设备是要跟它进行写还是读,确认是读或者写后,接收方要给发送发一个应答信号ACK,来告诉一声发送放,证明它收到了,它知道了。当接收方看见这个ACK信号后,就知道他已经应答了,回复了,接着就开始发送真正的数据了。也是八位的数据,因为I2C在通信时,一次传输的数据是一个字节。接收方接受到这些数据后,也要发送一位应答信号,来告诉发送方我已经接收完毕了。接着发送方就可以发送一个停止位,证明这次通信结束了。停止位是SCL维持在一个高电平的时间段内,SDA由一个低电平到一个高电平的变化。
在两个设备在进行I2C通信时,主设备发完起始位后,就要开始发送地址,去寻找要进行通信的那个从设备,这个地址一共由八位组成,其中高7位是地址,低一位是R/W,读或者写,一般如果主设备要接收从设备的数据时,低一位为1,反之为0.
一般是发送一个起始信号,在发送一个字节的地址信息,包括RW位,一共八位,接着等从设备发送ACK响应,我们在接收一个字节的数据,这八位就是我们要读的数据。读完后,我们要给从设备发送一个ACK,告诉它我们读完了,接着我们在给发送一个停止位,或者不发送停止位,继续读。
代码的框架:
整个代码的框架包括两部分,一部分是I2C的代码,称为物理层,就负责I2C的时序,起始位,发送数据,接受数据应答的时序等。
另一份部分是G - secsor传感器的代码,这部分代码称为应用层,协议层,传输层,负责控制自己内部的寄存器,如果是通过总线给自己写数据的话,也就是说如果是SOC控制I2C的物理层给Gsensor的数据的话,就是在Gsensor协议层去操作,去调用I2C的发送数据的函数,将数据写入到自己的相应的寄存器中。
如果是SOC控制Gsensor通过I2C总线读取数据到SOC的话,就是在Gsensor的协议层代码中通过调用I2C的接收
函数,将寄存器中的数据通过I2C的总线传输到SOC中去。
所以整个代码框架是分两个部分的,一部分是I2C的代码叫做物理层,一部分是Gsensor的代码,叫做协议层,或者应用层,或者传输层。
在协议层写代码时,只要知道自己的工作流程即可,不用去关心I2C物理层的代码是怎么实现的。