ESP32 SPI 与第三方硬件通信

问题描述 投票:0回答:1

我有一个 CERES PCB,我需要使用 SPI 总线作为从属设备与该 PCB 进行通信。问题是我对任何类型的沟通的了解都非常少。以下是我需要执行的命令列表。我已经练习了 SPI 代码,仅将 1 个数据传输到从机。但是,当我尝试在实际项目中执行此操作时,我对地址、MOSI cmd+add 感到困惑。我不知道需要发送哪些数据以及如何发送。

我尝试玩玩,但我不断收到垃圾数据

Command Reference Command List

下面是我的代码

#include <SPI.h>

// SPI pins
#define SCK 18
#define MISO 19
#define MOSI 23
#define SS 5

// SPI settings 
const int responseSize = 4;  

void setup() {
  Serial.begin(115200);
  pinMode(SS, OUTPUT);
  SPI.begin(SCK, MISO, MOSI, SS);
  
  SPI.beginTransaction(SPISettings(20000000, MSBFIRST, SPI_MODE0));
  
  byte commandSelAdc2Vdd[] = {0x21, 0x40, 0x84, 0x00, 0x00, 0x02, 0x00};
  byte commandEnAcd2[] = {0x09, 0x40, 0x24, 0x00, 0x20, 0x00, 0x00};
  byte commandReadAcd2[] = {0x05, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00};

  byte* commands[] = {commandSelAdc2Vdd, commandEnAcd2, commandReadAcd2};

  for (int i = 0; i < 3; i++) {

    digitalWrite(SS, LOW);

    SPI.transfer(commands[i], sizeof(commandSelAdc2Vdd)); 

    digitalWrite(SS, HIGH);
    delay(100);
    digitalWrite(SS, LOW); 

    byte response[4]; 
    SPI.transfer(response, sizeof(response)); 
    digitalWrite(SS, HIGH); 

    Serial.print("Response for ");
    if (i == 0) 
    {
      Serial.print("commandSelAdc2Vdd: ");
    } else if (i == 1) 
    {
      Serial.print("commandEnAcd2: ");
    }else{
      Serial.print ("commandReadAcd2: ");
    }
    for (int j = 0; j < 4; j++) {
      Serial.print(response[j],HEX);
      Serial.print(" ");
    }
    Serial.println();
    delay(500);
  }
}

void loop() {

}

spi arduino-esp32
1个回答
0
投票

根据数据表的附加部分,它提供了重要信息来展示 SPI 应如何与器件配合使用。

  1. 仔细阅读时序图,过度切换CS引脚,并检查tStart是否真的需要100ms,如您的延迟代码(100)?
  2. MOSI+Addr 已经包含从第 2 位开始的 Addr,因此要运行
    ReadSerialNo
    命令,您只需发送 6 个字节作为
    uint8_t readSerCmd[] = {0x00, 0x08, 0x00, 0x00, 0x00, 0x00}

这里是一个示例,说明如何根据提供的有限信息读取设备的序列号。

#include <SPI.h>

void setup() {
  Serial.begin(115200);

  digitalWrite(SS, HIGH);
  pinMode(SS, OUTPUT);
  SPI.begin();
  
  uint8_t readSerCmd[] = {0x00, 0x08, 0x00, 0x00, 0x00, 0x00};
  uint8_t reBuff[6]{0};

  SPI.beginTransaction(SPISettings(20000000, MSBFIRST, SPI_MODE0));
  digitalWrite(SS, LOW);
  for (int i=0; i<sizeof(readSerCmd); i++) {
    rxBuff++ = SPI.transfer(commands[i]);
  }
  digitalWrite(SS, HIGH);
  SPI.endTransaction();

  // first two bytes as status, followed by 4-byte serial no
  for (i=0; i<sizeof(rebuff); i++) {
    Serial.print(rebuff[i], HEX);
    Serial.print(" ");
  }

}

void loop() {

}
© www.soinside.com 2019 - 2024. All rights reserved.