赞
踩
ESP32有两个I2C控制器(也称为端口),负责处理两条I2C总线上的通信。每个I2C控制器都可以作为主机或从机运行。引脚21 默认的SDA, 引脚22是默认的SCL
IIC需要引入自带库 Wire.h Wire继承steam类 steam类有的他都有。
#include "Wire.h"
Wire.begin();
void requestFrom(uint16_t address, uint8_t size, bool sendStop)
参数:
address : 从机地址
size: 请求字节数
sendStop : 是否发送停止 , 如果为true, 释放IIC总线. 如果为false, 发送一个重新开始的信息, 并继续保持IIC总线的连接.
请求完成后 主机可以用 Wire.available()和Wire.read()等函数等待并获取从机的回答
示例:
Wire.requestFrom(adress,10,true);
void beginTransmission(int address)
参数:
address : 从机地址
随后, 主机可以使用Wire.write();写数据并使用Wire.endTransmission();结束传输
示例:
Wire.beginTransmission(120);
Wire.endTransmission();
返回值: uint8_t 类型
返回值对于数值含义:
值 | 含义 |
0 | 成功 |
1 | 数据过长,超出发送缓冲区 |
2 | 在地址发送时接收到NACK信号 |
3 | 在数据发送时接收到NACK信号 |
4 | 其他错误 |
示例:
Wire.endTransmission(false);
Wire.write();
当作为主机时: 主机将要发送的数据加入发送队列;
当作为从机时: 从机发送的数据给主机;
参数:
Wire.write(value); //单字节发送
Wire.write(string); //以一系列字节发送
Wire.write(data,length); //以字节形式发送,指定长度
返回值: byte类型,输入的字节数
Wire.available();
功能:返回接收到的字节数
返回值: byte类型
可读字节数
Wire.read()
当作为主机时: 主机使用requestFrom()后 要使用此函数获取数据;
当作为从机时: 从机读取主机给的数据;
返回值: 读到的字节数据 byte
size_t readBytes(char *buffer, size_t length)
参数:
buffer: 接收缓冲区, 一个char型指针
length: 数据长度
返回值: 数据长度
size_t readBytesUntil(char terminator, char *buffer, size_t length)
参数:
terminator : 终结字符 char类型
buffer: 接收缓冲区, 一个char型指针
length: 数据长度
返回值: 数据长度
Wire.busy();
返回布尔值
继承自steam类, 个人感觉iic不会用到的
parseFloat
parseInt
find
findUntil
setTimeout
这些都是steam继承来的 大家灵活应用
从机有些函数和主机是一样的, 一样的那些请看上面,这里我只讲解一些不一样的部分
Wire.begin(120);
参数:adress (取值0~127)
void onRequest(void (*)())
参数:
回调函数
void onReceive(void (*)(int))
参数:
回调函数 (接收一个int类型的参数,代表接收的字节数)
ESP32有四个SPI外设,分别为SPI0、SPI1、HSPI和VSPI。
SPI0是专用于Flash的缓存,ESP32将连接的SPI Flash设备映射到内存中。
SPI1和SPI0 使用相同的硬件线,SPI1用于写入flash芯片。
HSPI和VSPI可以任意使用。
SPI1、HSPI和VSPI共有三条片选线,因此作为SPI主机允许ESP32 至多驱动三个SPI设备
SPI名 | MOSI | MISO | SCLK | SS |
VSPI | 23 | 19 | 18 | 5 |
HSPI | 13 | 12 | 14 | 15 |
SPI.begin();
SPI接口默认VSPI. 接口频率1 000 000, 数据默认采用MSBFIRST(低有效位优先), 时钟模式:SPI_MODE0(SCLK闲置为0, SCLK上升沿采样)
SPI.setBitOrder(LSBFIRST);
参数:
bitOrder : 传输方式, 可选: LSBFIRST 低有效位先传 ; HSBFIRST 高有效位先传
SPI.setFrequency(1000000);
参数:
freq 频率
SPI.setDataMode(SPI_MODE0);
参数:
dataMode: 时钟模式, 可以取以下值
模式 | 说明 |
SPI_MODE0 | SCLK闲置为低电平,上升沿采样(默认) |
SPI_MODE1 | SCLK闲置为低电平,下降沿采样 |
SPI_MODE2 | SCLK闲置为高电平,上升沿采样 |
SPI_MODE3 | SCLK闲置为高电平,下降沿采样 |
采用该函数,可以代替上面三个函数了.
SPI.beginTransaction(setting);
参数:
setting 设置. 是SPISettings类型的对象, 有_bitOrder ,_clock ,_dataMode 这三个属性.
示例:
- setting1._bitOrder = LSBFIRST;
- setting1._clock = 1000000;
- setting1._dataMode = SPI_MODE0;
- SPI.beginTransaction(setting1);
SPI.endTransaction();
功能:结束SPI通信
uint8_t SPIClass::transfer(uint8_t data)
参数:
data: 要发送的数据
返回值: 接收到的数据
这里我们可以选择发送数据的长度,如下:
示例:
- SPI.transfer(0x01);
- SPI.transfer16(0x0102);
- SPI.transfer32(0x01020304);
-
- uint8_t byte1;
- uint16_t bytes2;
- uint32_t bytes3;
- byte1 = SPI.transfer();
- bytes2 = SPI.transfer16();
- bytes3 = SPI.transfer32();
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。