Цифровой потенциометр 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? Я что-то пропустил?
@Christos Mitsis, 👍0
Обсуждение3 ответа
Лучший ответ:
Мне удалось заставить его работать странным образом. Я открыл пример, включенный в библиотеку 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();
}
Библиотека 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
Измените значение int на пустое в функции... Это оно. Когда вы вызываете эту функцию, она никогда не возвращается, все еще ожидая возврата.
int digitalPotWrite(int value)
{
digitalWrite(CS, LOW);
SPI.transfer(address);
SPI.transfer(value);
digitalWrite(CS, HIGH);
}
- Импульсы SCLK не видны при использовании SPI на ESP32
- ESP32: spi_master: check_trans_valid(801) при использовании SPI
- Библиотека esp32 spi, как читать регистр mcp23s08
- Не удалось установить SD-карту с Waveshare ESP32 с использованием Arduino IDE
- Использование внутренней памяти ESP32 Cam
- ESP32-CAM не читает BME680
- Взаимная связь ESP32 SPI
- Функция библиотеки SD не работает при использовании второго порта SPI с ESP32
Если я использую значения по умолчанию SPI (Serial.begin()) и печатаю переменные на последовательном мониторе Serial.println(MOSI); Serial.println(SCK); Serial.println(SS); Я получил эти значения по умолчанию MOSI 23, SCLK 18 и SS 5 (VSPI)., @Chris_hro