IIC

http://www.arduino.cn/thread-18135-1-1.html

各位聪明的人类很快就想出了2个办法:

  1 限定每个信号的时间,比如规定高低电平持续时间为1ms,那么2ms低电平就代表2个0.   (UART基本是用的这个原理)

  2 多添加一个信号线,当这个信号线上的电平发生变化的时候读入之前信号线上的信号(后来这个新加的信号线就叫时钟线,大部分协议都是用的这种方式)

这两种方式各有利弊,第一种只需要1根线,同样由于只有一根线,那么为了减少误传输只能降低传输速度,第二个需要2根线,但可以以很快的速度进行数据传输。也可以再加一组线组成全双工模式(发送数据的同时还可以接收数据)。

IIC是以第二种方式运行的一套协议。他由3根线组成分别叫SDA,SCL,GND,SDA为数据线,SCL为时钟线,GND为参考电平,就是0电平,这个线的主要功能是提供一个参考的电压,告诉IC到底多少为0V电势(通常我们说的多少V是说的电势差及电压)。

我们想到一个方法,以后每次敲门都先敲1下,然后连续敲3下,以此表示我要进来这个信号,这样里面的人听到有人敲门后再听到3次短促的敲门才去开门,这样外因或者内因产生的错误都将大大减少,我认为这是发明协议的最初原因。

IIC协议:

这种总线类型是由飞利浦半导体公司在八十年代初设计出来的,主要是用来连接整体电路,IIC是一种多向控制总线,也就是说多个芯片可以连接在一起,同时每个芯片都可以对其他的芯片进行数据传输。这种方式简化了信号传输总线。但是这种方式也增加了一个传送数据的步骤,就是需要对信号线上的每个芯片定义一个逻辑地址,让芯片知道这个信息是发给他的(类似电话号码的功能),这个之后再说。

  IIC

协议包含

START(类似于第一下敲门)、

ACK(里面的人给予回应)、

NACK(另一种回答)、

STOP(表示数据发送结束)

这几个东西,当然还少不了普通的数据发送。尽管协议中规定START必须,其他几个非必须,但实际上其他三个仍旧非常重要。

IIC发送数据是8位数据(即8个0或1)为一个小单元一起发送。整个协议发送的顺序如下:

通常我们为了方便把设备分为主设备和从设备,我的划分方法是谁控制时钟线(即控制SCL的电平高低变换),谁就是主设备。。。。

  • 主发从收:

主机发送 START 信号->

主机发送地址 ->

从机发送ACK应答 -> (主机发送数据 -> 从机发送ACK应答 (循环)) ->

主机发送STOP信号 或 主机发送 START 信号启动下一次传输

  • 主收从发:

    主机发送 START 信号->

    从机发送发地址 ->

主机发送ACK应答 ->(从机发送数据 ->主机发送ACK应答 (循环)) ->

接受至最后一个字节时,主机发送NACK ->

主机发送 STOP 信号或 主机发送START信号 启动下一次传输

还是回到大家熟悉的Arduino编程,看下面一段代码:

  Wire.beginTransmission\(0x04\);

  Wire.write\(0xaa\);               

  Wire.endTransmission\(\);

0x代表的是16进制数转换为2进制为 0x04=0100b 0xaa=10101010b

以上是一段主发从收的代码。

  Wire.beginTransmission\(0x04\);

执行了3步: 主机发送 START信号 ->主机发送地址->从机发送 ACK应答 后面的0x04就是从机的地址

  Wire.write\(0xaa\);

执行了2步 主机发数据 ->从机 发送ACK应答 (循环) 参数0xaa就是发送的数据

  Wire.endTransmission\(\);

执行了最后一步 主发送STOP信号

results for ""

    No results matching ""