I²C和SPI这两个总线,相信玩电子的人都不陌生,具体怎么实现的我也就不多描述了。在这里,我就写一下在Nodemcu官网上这两个总线是怎么使用的和这两种总线的特点。供自己方便查阅。
I²C总线
I²C总线
(I²C bus,Inter-IC bus)是一个双向的两线连续总线,提供集成电路(ICs)之间的通信线路。I²C总线
是一种串行扩展技术,最早由Philips公司
推出,广泛应用于电视,录像机和音频设备。
特点:
- 只要求两条总线线路:一条串行数据线
SDA
,一条串行时钟线SCL
; - 每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机/从机关系软件设定地址,主机可以作为
主机发送器
或主机接收器
; - 它是一个真正的
多主机总线
,如果两个或更多主机同时初始化,数据传输可以通过冲突检测和仲裁防止数据被破坏; - 串行的8 位双向数据传输位速率在标准模式下可达
100kbit/s
,快速模式下可达400kbit/s
,高速模式下可达3.4Mbit/s
;
SPI总线
SPI
是串行外设接口
(Serial Peripheral Interface)的缩写。SPI是一种高速
的,全双工
,同步
的通信总线,并且在芯片的管脚上只占用四根线:一条时钟线SCK
,一条数据输出线MOSI
,一条数据输入线MISO
,一条片选线CS
。
SPI接口主要应用在 EEPROM
,FLASH
,实时时钟
,AD转换器
,还有数字信号处理器
和数字信号解码器
之间。用于CPU与各种外围器件进行全双工、同步串行通讯。
特点:
- 可以同时发出和接收串行数据;
- 可以当作主机或从机工作;
- 提供频率可编程时钟;
- 发送结束 中断标志;
- 写冲突保护;
- 总线竞争保护等。
函数使用
I²C函数
函数名 | 功能 |
---|---|
i2c.address() | 设置I²C地址和下一次传输的读/写模式。 |
i2c.read() | 读取可变字节数的数据。 |
i2c.setup() | 初始化I²C模块。 |
i2c.start() | 发送I²C启动条件。 |
i2c.stop() | 发送I²C停止条件。 |
i2c.write() | 将数据写入I²C总线。 |
i2c.address()
语法:i2c.address(id, device_addr, direction)
参数:
id
为0
device_addr
7位的设备地址
direction
:i2c.TRANSMITTER
(等待模式)或 i2c. RECEIVER
( 阅读模式)
返回值:true
:接收到,false
:没有接收到
i2c.read()
语法:i2c.read(id, len)
参数:
id
为0
len
为数据字节数
返回值:string
接收数据串
i2c.setup()
语法:i2c.setup(id, pinSDA, pinSCL, speed)
参数:
id
为0
pinSDA
sda所接的引脚
pinSCL
scl所接的引脚
speed
传送速率,只支持i2c.SLOW
低速
返回值:speed
选定的传送速率
例子:
id = 0
sda = 1
scl = 2
i2c.setup(id, sda, scl, i2c.SLOW)
i2c.start()
语法:i2c.start(id)
参数:id
为0
返回值:nil
i2c.stop()
语法:i2c.stop(id)
参数:id
为0
返回值:nil
i2c.write()
语法:i2c.write(id, data1, data2, ..., datan)
参数:
id
为0
data
数据可以是数字、字符串或Lua表
返回值:number
写入字节数
例子:
i2c.write(0, “hello”, “world”,"!!!")
SPI函数
注:
ESP硬件提供两个SPI总线,ID 0
和1
,它们映射到通常标记为SPI
和HSPI
的引脚。
函数名 | 功能 |
---|---|
spi.recv() | 从SPI接收数据 |
spi.send() | 以半双工模式通过SPI发送数据,在全双工模式下发送和接收数据. |
spi.setup() | 设置SPI配置 |
spi.recv()
语法:spi.recv(id, size, default_data)
参数:
id
:SPI ID号:0
表示SPI
,1
表示HSPI
size
要读取的数据项数目
default_data
在MOSI
上发送默认数据(如果省略,则全部-1)
返回值:从SPI读取的字节的字符串
spi.send()
语法:
- 半双工:
wrote = spi.send(id, data1, data2, ..., datan)
- 全双工:
wrote[, rdata1, ..., rdatan] = spi.send(id, data1, data2, ..., datan)
参数:
id
:SPI ID号:0
表示SPI
,1
表示HSPI
data
:发送的数据,数据可以是字符串、表或整数
返回值:wrote
:写的字节数,rdata
:使用spi.FULLDUPLEX
配置时收到数据
与相应数据参数相同的数据类型。
spi.setup()
语法:spi.setup(id, mode, cpol, cpha, databits, clock_div, duplex_mode)
参数:
id
:SPI ID号:0
表示SPI
,1
表示HSPI
mode
:模式选择主模式或从模式,spi.MASTER
(主)或spi.SLAVE
(从)
cpol
:时钟极性选择,spi.CPOL_LOW
或spi.CPOL_HIGH
cpha
:时钟相位选择,spi.CPHA_LOW
或spi.CPHA_HIGH
databits
:每个数据项的位数,1-32
clock_div
:时钟分频器,f(SPI)= 80 MHz / clock_div
,范围为(1 .. n
)(0默认为分频器8
)
duplex_mode
:模式选择,半双工 spi.HALFDUPLEX
(默认)或全双工 spi.FULLDUPLEX
返回值:数字1
例子:
spi.setup(1, spi.MASTER, spi.CPOL_LOW, spi.CPHA_LOW, 8, 8)
gpio.mode(8, gpio.INPUT, gpio.PULLUP)