Arduino IIC协议笔记

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Arduino IIC协议笔记相关的知识,希望对你有一定的参考价值。

参考技术A

他由3根线组成分别叫SDA,SCL,GND,SDA为数据线,SCL为时钟线,GND为参考电平,就是0电平

通信原理是通过对SCL和SDA线高低电平时序的控制,来产生I2C总线协议所需要的信号进行数据的传递。在总线空闲状态时,这两根线一般被上面所接的上拉电阻拉高,保持着高电平

I2C总线上的每一个设备都可以作为主设备或者从设备,而且每一个设备都会对应一个唯一的地址**(可以从I2C器件的数据手册得知),主从设备之间就通过这个地址来确定与哪个器件进行通信,在通常的应用中,我们把CPU带I2C总线接口的模块作为主设备,把挂接在总线上的其他设备都作为从设备。

I2C总线上的主设备与从设备之间 以字节(8位)为单位 进行双向的数据传输

总线上数据的传输必须以一个起始信号作为开始条件,以一个结束信号作为传输的停止条件

数据的传输

主设备在传输有效数据之前要先指定从设备的地址,地址指定的过程和上面数据传输的过程一样,只不过大多数从设备的地址是7位的,然后协议规定再给地址添加一个最低位用来表示接下来数据传输的方向,0表示主设备向从设备写数据,1表示主设备向从设备读数据

第一,主设备往从设备中写数据。数据传输格式如下:

第二,主设备从从设备中读数据。数据传输格式如下:

第三,主设备往从设备中写数据,然后重启起始条件,紧接着从从设备中读取数据;或者是主设备从从设备中读数据,然后重启起始条件,紧接着主设备往从设备中写数据。数据传输格式如下:

第三种操作在单个主设备系统中,重复的开启起始条件机制要比用STOP终止传输后又再次开启总线更有效率。

Arduino的IIC通信使用wire库,该库包含以下方法:

begin()

requestFrom()

beginTransmission()

endTransmission()

write()

available()

read()

onReceive()

onRequest()

Wire.begin() 建立连接

(1)要在 setup( ) 内用Wire.begin( ) 加入 IIC 通讯
(A)Master 只要这样Wire.begin( );
(B)Slave 要用一个 1 到 127 的整数当作参数, 代表 Slave 的address,
例如
Wire.begin(2); // 我是2 号地址

(2)要由 Master 下命令要求Slave 送数据过来,
例如:
Wire.requestFrom(2,6); // 要求 2号透过Wire 送 6 个char 过来
但是, 请注意, 这里的 6 其实只是一个byte 的命令, 只是"希望"从机送 6 byte (最多只可要求32 byte)
这里的 6 到底是啥意思是由Master 和 Slave 的程序设计者自己约定好即可

Wire.requestFrom(); 只是送个命令(一个 byte)给某个Slave,
然后等着,直到至少一个char 送过来或 time out 才会往下做下一行
所以, 这时 Master 在这句下方要用Wire.read( ) 读取数据

Wire.requestFrom(); 会回传一个整数, intkkk = Wire.requestFrom(2, 6);
然后检查实际收到几个 byte 的kkk 是否为 0, 是表示 timeout 都没收到任何 byte

(3) Slave 应该如何响应主人Master的命令
官网的范例不管 Master 送过来是啥, 直接用 requestEvent() 函数送回6 bytes
比较正确的方法应该是:
(A) Master 在下达命令.requestFrom(从机地址, 几byte); 之前:

(B)在Slave 这边相对应于 (A)Master 的动作如下:

(C)在 Master 这边于.requestFrom( ); 之后用 while 检查Wire.available( ) 并用 Wire.read( ) 接收数据

IIC总线协议——esp32学习笔记

IIC总线协议——esp32学习笔记

零、前言

学习esp32时了解到了IIC总线,写一个学习笔记记录一下。

IIC总线(Inter-Integrated Circuit)是串行、半双工总线主要用于近距离、低速的芯片之间的通信;IIC总线有两根双向的信号线,一根数据线SDA用于收发数据(只收不发或者只发不收),一根时钟线SCL用于通信双方的时钟同步;IIC总线硬件结构简单,成本较低。

一、IIC总线

IIC是一种多主机总线,连接在IIC总线上的器件分为主机和从机,主机有权发起和结束一次通信,而从机只能被主机呼叫;当总线上有多个主机同时启用总线时,IIC也具备冲突检测和仲裁的功能来防止错误的产生;每个连接到IIC总线上的器件都有一个唯一的地址(7bit),且每个器件都可以作为主机也可以作为从机(同一时刻只能有一个主机),总线上的器件增加和删除都不会影响其他器件正常工作;IIC总线在通信时总线上发送数据的器件叫做发送器,接收数据的器件为接收器

二、IIC总线的通信过程

1.主机发送起始信号启用总线

主机A发送起始信号,其他主机与从机都会接受到起始信号,类似于=广播,此时其他主机不会再使用主线,主线被占用

2.主机发送一个字节数据指明从机地址和后续字节的传送方向

前7bit对应的时从机的地址,最后1bit对应是确定后续的数据是主机发给从机(最后一位为0)或者从机发给主机(最后一位是1),然后从机会先提取高7bit数据于自己的地址进行比较,确定是否与主机通信;然后提取最后一位数据,确定通信类型

3.被寻址的从机发送应答信号回应主机()

主从机通信时,被寻址的从机接收到主机的呼叫,就会发送应答信号,告诉主机已经接收

4.发送器发送一个字节数据

5.接收器发送应答信号回应发送器

发送器和接收器既有可能是主机也有可能时从机,只有第一个byte是主机发送给从机,后面的就不一定,要看第一个byte的最后一位。

注意:不管发送多少个字节,主从机的通信方向都不能改变

… …(循环步骤4、5)

n.通信完成后主机发送停止信号释放总线

停止信号以广播的形式发送后,其他主机也能接收到,此时总线就空闲了。

三、IIC总线的寻址方式

1.IIC总线上传送的数据是广义的,既有地址(主机发送的第一个字节),又有数据。

2.主机再发送完起始信号后必须先发送一个字节的数据,该数据的高7位为从机地址,最低位表示后续字节的传送方向,’0‘表示主机发送数据,’1‘表示主机接收数据;总线上所有的从机接收到该字节数据后都将这7bit地址与自己的地址作比较,如果相同,则认为自己被主机寻址,然后再根据第8位将自己定为发送器和接收器。

四、IIC总线信号的实现

1.起始信号和停止信号

SCL与SDA在空闲时都是处于高电平的

SCL为高电平时,SDA由高变低表示起始信号

SCL为高电平时,SDA由低变高表示终止信号

起始信号和终止信号都由主机发出,起始信号产生后总线处于占用状态,停止信号产生后总线处于空闲状态。

2.字节传送和应答

IIC总线通信时每个字节为8bit*(类比于uart可以为4,5bit或其他,IIC总线通信是每个字节只能是8bit)*,数据传输时,先传输最位,后传送低位,发送器发送完一个字节数据后接收器必须发送1位应答位(应答数据为低电平)来回应发送器(不会丢包),即一帧共有9位。数据线上高电平时表示为1,低电平时表示为0。

3.同步信号

首先,通信的过程会存在两个基本的问题:

1、什么时候发送和接收数据?(由于主机与从机是两个不同的器件,为了确定同时收发数据,必须保证接收器知道发送器要发送数据)IIC使用起始信号来解决。

2、对于高电平信号或者低电平信号如何确定为1个还是多个?

串口通过波特率来解决(时间),SPI通过时钟线SCLK来解决这两个问题。

此时就要来聊一下IIC解决这两个问题的方式:

IIC总线在进行数据传输时,时钟线SCL为低电平期间发送器向数据线上发送一bit数据,在此期间数据线上的信号允许发生变化,时钟线SCL为高电平期间接收器从数据线上读取一位数据(上升沿采样),在此期间数据线上的信号不允许发生变化,必须保持稳定。可以发送任意多个byte。

注意最后还有一个电平变化,用于接收器应答。(此时SCL处于高电位SDA处于低电位,如果不想应答那就处于高电位)

4.典型IIC时序

主机向从机发送数据

主机发完最后一个字节后,不想再次发送时,主机就可以直接发送停止信号

当从机不想接收信号时,主机没有收到信号就会直接发送终止信号,结束通信。

从机向主机发送数据(寻址之后)

当从机发完最后一节数据时,主机就会拒绝应答,此时主机会发送终止信号,结束通信。

主机先向从机发送数据,然后从机再向主机发送数据(这种情况在一次IIC通信中不可能完成)

如果第二次通信时,发送停止信号,此时总线就处于空闲状态,使用权可能被其他主机所占。

所以在主机开始第二次通信时,没有发送停止信号,不会释放总线。

注:阴影部分表示数据由主机向从机传送,无阴影部分则表示数据由从机向主机传送;A表示应答信号(ACK),A非表示非应答,S表示起始信号,P表示终止信号。

5.Exynos4412下的IIC控制器

1、寄存器

control register - I2CCON 设置IIC功能时主要来设置这个寄存器

control/status register - I2CSTAT 控制IIC功能以及显示IIC的一些状态的寄存器

Tx/Rx data shift register - I2CDS 用于发送和接收数据的寄存器

address register - I2CADD 地址寄存器,用于设置I2C的地址

2、Exynos4412 IIC控制器的特点

地址都为7位

标准模式下通信速度可达100kbit/s;极限模式下通信速度可达400kbit/s。

支持主机发送,主机接收,从机发送,从机接收。

支持(中断发送一个数据后都会产生中断信号)和轮循的方式

3.使用IIC控制器

需要先向I2CCON和IICSTAT设置这两个寄存器的值,通过他们来确定工作状态。

利用IICDS发送数据时,先向IICDS写入数据,然后IICDS会写入到Shift Register(移位寄存器)中,这个Shift Register再通过移位的方式通过SDA,一位一位的发出去,当IICDS接收数据时,会通过SDA先接收数据(一位一位的)到Shift Register中,再拷贝到IICDS中

当IIC控制器作为从机的时候,主机需要对他进行寻址。从机寻址时线通过Shift Register接收到主机发送的地址,然后通过Comparator(比较器)与自身的地址进行一个比较

4.仲裁机制

当有多个主机使用总线时,就需要用到仲裁机制来判定哪一个主机来使用这个主线。

5.当工作在不同模式时,IIC控制器的工作逻辑

主机发送(Master/Transmitter mode)模式的工作流程

写程序时,需先配置成主机发送(Tx)模式,写一个从机地址到IICDS寄存器中,然后向IICSTAT寄存器中写入0xF0(产生起始信号),然后从机的地址会发出去,然后要等待从机的应答,应答后,interrupt is pending(中断位会自动挂起,变成1),接下来就要根据自己的需求来确定是否继续通信 。

if N线:向寄存器IICDS中写入想要发送给从机的数据,然后会清理中断挂起位(重新变为低电平,resume),此时IICDS中的数据被发送。

if Y线:向IICSTAT中写入0xD0(停止信号),清理中断挂起位,等待停止信号结束,此时整个通信结束

主机接收(Master/Receiver Mode)模式的工作流程

不同:将IIC控制器配置成主机接收模式,起始信号和终止信号不同,从IICDS中读取数据

从机发送数据(Slave/Transmitter mode)模式的工作流程

从机接收数据(Slave/Receiver Mode)模式的工作流程

一般来说4412很少作为从机。

6.4412IIC的引脚

6.IIC寄存器详解(基于Exynos4412)

**
**

IICCON 控制IIC控制器的一些功能

整个寄存器共有32位,但第8位到第31位没有用(Reserved)。

第7位,当将它设置为1就会发送应答信号,设置为0,就不会发送应答信号(接收数据时有意义)

第6位,时钟源的分频,如果将这一位设置成0,就会对这个时钟进行16倍的分频,设置为1进行512倍的分频,分频越高,通信速度会慢一些。

第5位,发送和接收的中断,如果设置成0就是关闭这个功能,设置为1就是开启这个功能(IIC控制器当他发送或者接受完一个数据时都会产生中断信号来通知主机)

第4位,中断挂起标志位,用来显示中断有没有发生,这一位是建立在第5位的基础上的。当第五位打开时,产生中断后,第4位的值会自动变成1(中断产生)。SDA接收玩完数据时,还应该将第4位清零

第零到三位,影响时钟频率,进而影响通信速率。

IICSTAT 控制IIC控制器的一些功能,以及显示IIC控制器的状态

整个寄存器共有32位,但第8位到第31位没有用(Reserved)。

第7:6位是模式的选择:

00 = Slave receive mode

01 = Slave transmit mode

10 = Master receive mode

11 = Master transmit mode

第5位,产生起始和停止信号,1:起始(主线繁忙),0:停止(主线空闲)。想看主线是否繁忙只需看第5位的状态就行

第4位,0:关闭数据的接收和发送;1:使能数据的接收和发送

第3:0位,都是状态值

IICADD 设置IIC控制器的地址(一般作为从机时才会使用)

第7:0位,写入地址

IICDS 对外进行发送和接收数据(由于是半双工,发送和接受不能同时使用)

第7:0位,存储接收或者发送的数据。

IICLC 滤波器相关

产生起始和停止信号,1:起始(主线繁忙),0:停止(主线空闲)。想看主线是否繁忙只需看第5位的状态就行

第4位,0:关闭数据的接收和发送;1:使能数据的接收和发送

第3:0位,都是状态值

IICADD 设置IIC控制器的地址(一般作为从机时才会使用)

第7:0位,写入地址

IICDS 对外进行发送和接收数据(由于是半双工,发送和接受不能同时使用)

第7:0位,存储接收或者发送的数据。

IICLC 滤波器相关

以上是关于Arduino IIC协议笔记的主要内容,如果未能解决你的问题,请参考以下文章

IIC协议学习笔记

Arduino AT24C02写数据时使用示波器捕获IIC波形

通信协议:IIC协议的原理和模拟IIC的实现

IIC协议

FPGA基础设计:IIC协议

模拟IIC协议时序