ESP32 Arduino (八) IIc和SPI |
您所在的位置:网站首页 › arduino自定义函数 › ESP32 Arduino (八) IIc和SPI |
IIC
一、简介:
ESP32有两个I2C控制器(也称为端口),负责处理两条I2C总线上的通信。每个I2C控制器都可以作为主机或从机运行。引脚21 默认的SDA, 引脚22是默认的SCL IIC需要引入自带库 Wire.h Wire继承steam类 steam类有的他都有。 #include "Wire.h" 二、IIC相关函数(主机): 1. 初始化IIC (以主机身份) :begin Wire.begin(); 2. 以主机身份像从机请求数据: requestFrom 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); 3. 主机开始传输 beginTransmission() void beginTransmission(int address)参数: address : 从机地址 随后, 主机可以使用Wire.write();写数据并使用Wire.endTransmission();结束传输示例: Wire.beginTransmission(120); 4. 结束数据传输 endTransmission() Wire.endTransmission(); 5. 结束数据传输但不释放IIC占用 endTransmission(false)返回值: uint8_t 类型 返回值对于数值含义: 值 含义 0 成功 1 数据过长,超出发送缓冲区 2 在地址发送时接收到NACK信号 3 在数据发送时接收到NACK信号 4 其他错误 示例: Wire.endTransmission(false); 6. 写 write() Wire.write(); 当作为主机时: 主机将要发送的数据加入发送队列; 当作为从机时: 从机发送的数据给主机;参数: Wire.write(value); //单字节发送 Wire.write(string); //以一系列字节发送 Wire.write(data,length); //以字节形式发送,指定长度 返回值: byte类型,输入的字节数 7. 接收数据寄存器有值 available() Wire.available();功能:返回接收到的字节数 返回值: byte类型 可读字节数 8. 读取1byte数据 read() Wire.read() 当作为主机时: 主机使用requestFrom()后 要使用此函数获取数据; 当作为从机时: 从机读取主机给的数据;返回值: 读到的字节数据 byte 9.读取多个字节的数据 readBytes() size_t readBytes(char *buffer, size_t length)参数: buffer: 接收缓冲区, 一个char型指针 length: 数据长度 返回值: 数据长度 10. 读取直到遇到某字符 size_t readBytesUntil(char terminator, char *buffer, size_t length)参数: terminator : 终结字符 char类型 buffer: 接收缓冲区, 一个char型指针 length: 数据长度 返回值: 数据长度 11. 当前IIC忙线中? Wire.busy();返回布尔值 12. 读取字符串 readString() readStringUntil()继承自steam类, 个人感觉iic不会用到的 13. 其他parseFloat parseInt find findUntil setTimeout 这些都是steam继承来的 大家灵活应用 三、IIC相关函数(从机)从机有些函数和主机是一样的, 一样的那些请看上面,这里我只讲解一些不一样的部分 1. 初始化IIC (以从机身份) begin(adress) Wire.begin(120);参数:adress (取值0~127) 2. 当从机被请求时触发函数onRequest() void onRequest(void (*)())参数: 回调函数 3. 当从机收到数据时触发函数 void onReceive(void (*)(int))参数: 回调函数 (接收一个int类型的参数,代表接收的字节数) SPI 一、简介ESP32有四个SPI外设,分别为SPI0、SPI1、HSPI和VSPI。 SPI0是专用于Flash的缓存,ESP32将连接的SPI Flash设备映射到内存中。 SPI1和SPI0 使用相同的硬件线,SPI1用于写入flash芯片。 HSPI和VSPI可以任意使用。 SPI1、HSPI和VSPI共有三条片选线,因此作为SPI主机允许ESP32 至多驱动三个SPI设备 1. HSPI和VSPI的接口及引脚SPI名 MOSI MISO SCLK SS VSPI 23 19 18 5 HSPI 13 12 14 15 2.SPI通讯流程如下: 二、SPI相关函数 1.SPI初始化 :SPI.begin() SPI.begin(); SPI接口默认VSPI. 接口频率1 000 000, 数据默认采用MSBFIRST(低有效位优先), 时钟模式:SPI_MODE0(SCLK闲置为0, SCLK上升沿采样) 2. 设置数据在SPI上的传输方式 :SPI.setBitOrder(bitOrder); SPI.setBitOrder(LSBFIRST);参数: bitOrder : 传输方式, 可选: LSBFIRST 低有效位先传 ; HSBFIRST 高有效位先传 3. 设置SPI频率 SPI.setFrequency(freq) SPI.setFrequency(1000000);参数: freq 频率 4. 设置SPI的时钟模式 SPI.setDataMode(dataMode); SPI.setDataMode(SPI_MODE0);参数: dataMode: 时钟模式, 可以取以下值 模式 说明 SPI_MODE0 SCLK闲置为低电平,上升沿采样(默认) SPI_MODE1 SCLK闲置为低电平,下降沿采样 SPI_MODE2 SCLK闲置为高电平,上升沿采样 SPI_MODE3 SCLK闲置为高电平,下降沿采样 5. 按照setting的设置启动SPI通信: SPI.beginTransaction(setting); 采用该函数,可以代替上面三个函数了. SPI.beginTransaction(setting);参数: setting 设置. 是SPISettings类型的对象, 有_bitOrder ,_clock ,_dataMode 这三个属性. 示例: setting1._bitOrder = LSBFIRST; setting1._clock = 1000000; setting1._dataMode = SPI_MODE0; SPI.beginTransaction(setting1); 6. 结束SPI通信 SPI.endTransaction(); SPI.endTransaction();功能:结束SPI通信 7. 接收/发送一个字节的数据 SPI.transfer(data); 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 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |