目录
介绍
I2C(Inter Integrated Circuit)是串行总线接口连接协议。它也被称为TWI(双线接口),因为它只使用两根电线进行通信。这两条线是SDA(串行数据)和SCL(串行时钟)。
I2C是基于确认的通信协议,即发送器在发送数据之后等待来自接收器的确认以知道接收器是否成功接收到数据。
I2Cworks有两种模式,
- 主模式
- 从模式
SDA(串行数据)线用于主设备和从设备之间的数据交换。SCL(串行时钟)用于主设备和从设备之间的同步时钟。
主设备启动与从设备的通信。主设备需要从设备地址启动与从设备的对话。从设备在主设备寻址时响应主设备。
NodeMCU的GPIO引脚具有I2C功能支持。由于ESP-12E的内部功能,我们无法将其所有GPIO用于I2C功能。因此,在将任何GPIO用于I2C应用程序之前,请先进行测试。
NodeMCU I2C功能
让我们看一下NodeMCU中可用于I2C接口的功能。
i2c.setup()
该功能用于初始化I2C模块。
句法: i2c.setup(id, SDApin, SCLpin, speed)
参数:
id
:总是0SDApin
: 1到12,IO索引SCLpin
: 1到12,IO索引speed
:i2c.SLOW
支持。它大约是100KHz
返回:它返回在参数中选择的SCL时钟速度。
i2c.address()
该功能用于设置I2C地址和读/写操作模式。
句法: i2c.address(id, device_addr, direction)
参数:
id
:总是0device_addr
: 7位从设备地址。I2C器件地址是高7位,后跟单向(读/写)位。direction
: i2c.TRANSMITTER用于写入模式,i2c。RECEIVER用于阅读模式
返回: true
如果收到ack(确认),false
如果没有收到确认。
i2c.start()
此函数用于发送I2C启动条件。
句法:i2c.start(id)
参数:
id
:总是0
返回: null
i2c.write()
该功能用于将数据写入I2C总线。数据项可以是多个数字,字符串或lua表。
句法: i2c.write(id, data1[, data2[, ..., datan]])
参数:
id
:总是0data
:数据可以是数字,字符串或lua表。
返回:返回写入的字节数。
i2c.read()
此功能用于读取数据。
句法: i2c.read(id, len)
参数:
id
:总是0len
: length即数据字节数
返回:接收数据的字符串
i2c.stop()
该功能用于发送I²C停止条件。
句法: i2c.stop(id)
参数:
id
:总是0
返回: null
例
让我们编写lua脚本,使用I2C协议在NodeMCU和Arduino Uno之间建立通信。
这里,NodeMCU充当I2C主设备,而Arduino Uno充当从设备。
主设备将向从设备发送hello字符串,从设备将响应主设备发送hello字符串。
在这里,我们正在使用
主设备: NodeMCU
从设备: Arduino Uno
从设备地址: 8
接口图如下图所示
NodeMCU和Arduino I2C接口
NodeMCU的Lua脚本(主I2C设备)
id = 0 -- always 0 sda = 1 -- set pin 1 as sda scl = 2 -- set pin 2 as scl i2c.setup(id, sda, scl, i2c.SLOW) -- initialize i2c i2c.start(id) -- send start condition if (i2c.address(id, 8, i2c.TRANSMITTER))-- set slave address and transmit direction then i2c.write(id, 'Hello Arduino') -- write string to slave arduino i2c.stop(id) -- send stop condition i2c.start(id) -- send start condition i2c.address(id, 8, i2c.RECEIVER)-- set slave address and receive direction response = i2c.read(id, 13) -- read defined length response from slave i2c.stop(id) -- send stop condition print('Arduino responds with:',response) -- print response received from slave else print('Arduino Not responding..!') end
适用于Arduino Uno的Arduino程序(从 I2C设备)
输出结果
从设备(Arduino Uno)串行监视器的输出窗口
主设备(NodeMCU)上串行监视器的输出窗口