ESP32集成了4个SPI外设,你知道多少?

ESP32是一款集成了Wi-Fi和蓝牙功能的芯片,它有四个SPI(串行外设接口)外设,分别是SPI0、SPI1、SPI2(通常称为HSPI)和SPI3(通常称为VSPI)。SPI是一种同步串行数据协议,用于微控制器与一个或多个外设之间的通信。例如,ESP32可以与支持SPI的传感器或另一个微控制器通信。

SPI通信中,总是有一个控制器(也称为主机)来控制外设(也称为从机)。数据可以同时发送和接收。这意味着主机可以向从机发送数据,从机也可以向主机发送数据。只能有一个主机,它是一个微控制器(ESP32),但可以有多个从机。从机可以是传感器、显示器、microSD卡等,或者另一个微控制器。可以将ESP32连接到多个传感器,但同一个传感器不能同时连接到多个ESP32板。

SPI通信需要四条线:

在只有从机的设备上,比如传感器、显示器等上

ESP32的SPI外设

ESP32集成了4个SPI外设:SPI0、SPI1、SPI2(通常称为HSPI)和SPI3(通常称为VSPI)。SP0和SP1用于内部访问ESP32的内置闪存。两个控制器共享相同的SPI总线信号,并且有一个仲裁器来确定哪个可以访问总线。在使用SPI1总线上的SPI主驱动程序时有很多限制。

可以使用HSPI和VSPI与其他设备通信。HSPI和VSPI具有独立的总线信号,名称相同。每条总线有三条CS线,可以驱动多达三个SPI从机。

与温度温度传感器SPI通信的代码

// 引入了SPI库
#include 

//定义SPI引脚
#define CS_PIN 5 // Chip select pin
#define SCK_PIN 18 // Serial clock pin
#define MISO_PIN 19 // Master in slave out pin
#define MOSI_PIN 23 // Master out slave in pin

// 定义读取温度命令e
#define READ_TEMP 0x05 // 读取温度命令
#define READ_CONFIG 0x01 // 读取配置命令

// 定义变量存储温度
float temperature = 0;

void setup() {
  // 初始化串口速率
  Serial.begin(115200);

  // I初始化SPI串口
  SPI.begin(SCK_PIN, MISO_PIN, MOSI_PIN, CS_PIN);

  //设置SPI时钟
  SPI.setClockDivider(SPI_CLOCK_DIV16);

  // 设置SPI模式o MODE0
  SPI.setDataMode(SPI_MODE0);

  // 设置SPI位顺序 MSB f
  SPI.setBitOrder(MSBFIRST);

  // 读和打印传感器的配置寄存器的值,以检查是否正确连接
  byte config = readRegister(READ_CONFIG);
  Serial.print("Configuration register: ");
  Serial.println(config, BIN);
}

void loop() {
  // 每隔一秒读取并打印一次温度值,调用了readTemperature函数。
  temperature = readTemperature();
  Serial.print("Temperature: ");
  Serial.print(temperature);
  Serial.println(" C");
  delay(1000);
}

//从传感器读取两个字节的原始温度数据,并将其转换为摄氏度
byte readRegister(byte reg) {
  byte data = 0; 

  // CS 低电平选中传感器
  digitalWrite(CS_PIN, LOW);

  // 发送传感器寄存器的地址
  SPI.transfer(reg);

  // 读取寄存器数值
  data = SPI.transfer(0x00);

  //  拉高CS_PIN来取消选择传感器
  digitalWrite(CS_PIN, HIGH);

  return data; 
}

// 从传感器读取一个字节的数据
float readTemperature() {
  float temp = 0; // 

  // 读取温度寄存器中两个字节
  byte msb = readRegister(READ_TEMP); // Most significant byte
  byte lsb = readRegister(READ_TEMP + 1); // Least significant byte

  // 组成一个16位的无符号数
  uint16_t rawTemp = ((uint16_t)msb <<8) | lsb;

  
  
   temp = (rawTemp &0x0FFF) *0.0625 -256; 

   return temp; // 
}
展开阅读全文

页面更新:2024-04-15

标签:外设   寄存器   总线   字节   传感器   温度   命令   主机   通信   数据

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top