Цифровой потенциометр SPI не работает на ESP32

У меня есть микросхема цифрового потенциометра MCP4151. Мне удалось заставить его работать с помощью и Arduino Uno, используя приведенный ниже код:

#include <SPI.h>

byte address = 0x00;
int CS= 5;

void setup()
{
  pinMode (CS, OUTPUT);
  SPI.begin();
}

void loop()
{
  for (int i = 0; i <= 128; i++)
  {
    digitalPotWrite(i);
    delay(10);
  }
  delay(500);
  for (int i = 128; i >= 0; i--)
  {
    digitalPotWrite(i);
    delay(10);
  }
}

int digitalPotWrite(int value)
{
  digitalWrite(CS, LOW);
  SPI.transfer(address);
  SPI.transfer(value);
  digitalWrite(CS, HIGH);
}

Но когда я пытаюсь заставить его работать с помощью ESP32, запрограммированного на языке Arduino, это не так. У меня есть такая связь

  • SCK -> 18
  • MOSI -> 23
  • СС -> 5>

Я также использовал потенциометр внутри, как делитель напряжения, для целей тестирования. GND на одной ножке, 3,3 В на другой и светодиод на стеклоочистителе. Существуют ли другие настройки, которые я должен реализовать, чтобы SPI ESP32 работал как SPI Arduino? Я что-то пропустил?

, 👍0

Обсуждение

Если я использую значения по умолчанию SPI (Serial.begin()) и печатаю переменные на последовательном мониторе Serial.println(MOSI); Serial.println(SCK); Serial.println(SS); Я получил эти значения по умолчанию MOSI 23, SCLK 18 и SS 5 (VSPI)., @Chris_hro


3 ответа


Лучший ответ:

2

Мне удалось заставить его работать странным образом. Я открыл пример, включенный в библиотеку SPI ESP32, и скопировал оттуда некоторые моменты.

Сначала я инициализирую указатель на класс SPI, затем вызываю begin() по этому указателю и внутри функции digitalPotWrite вызываю beginTransaction(10000,MSBFIRST,SPI_MODE0) и завершаю транзакцию до завершения digitalPotWrite. Полный код здесь:

#include <SPI.h>

static const int spiClk = 1000000;
byte address = 0x00;
SPIClass * hspi = NULL;

void setup()
{
  pinMode(15, OUTPUT);
  hspi = new SPIClass(HSPI);
  hspi->begin(); 
}

void loop()
{
  for (int i = 0; i <= 128; i++)
  {
    digitalPotWrite(i);
    delay(10);
  }
  delay(500);
  for (int i = 128; i >= 0; i--)
  {
    digitalPotWrite(i);
    delay(10);
  }
}

int digitalPotWrite(int value)
{
  hspi->beginTransaction(SPISettings(spiClk, MSBFIRST, SPI_MODE0));
  digitalWrite(15, LOW);
  hspi->transfer(address);
  hspi->transfer(value);
  digitalWrite(15, HIGH);
  hspi->endTransaction();
}
,

0

Библиотека SPI ESP32 имеет значения по умолчанию для контактов HSPI (14, 12, 13, 15). Для контактов VSPI необходимо указать контакты в begin().

SPI.begin(18, 19, 23, 5);
,

Я оба раза пытался использовать контакты HSPI с помощью SPI.begin(); и эти контакты с помощью SPI.begin(18, 19, 23, 5); но ничего не помогало. Может быть, ESP32 использовал несовместимую частоту для SPI?, @Christos Mitsis


-1

Измените значение int на пустое в функции... Это оно. Когда вы вызываете эту функцию, она никогда не возвращается, все еще ожидая возврата.

int digitalPotWrite(int value)
{
  digitalWrite(CS, LOW);
  SPI.transfer(address);
  SPI.transfer(value);
  digitalWrite(CS, HIGH);
}
,