Импульсы SCLK не видны при использовании SPI на ESP32

Я использую следующий код в своем esp32 используя arduino IDE для spi связи который является примером кода -

#include <SPI.h>

static const int spiClk = 1000000; // 1 MHz

//неинициализированные указатели на объекты SPI
SPIClass * vspi = NULL;
SPIClass * hspi = NULL;

void setup() {
  /инициализировать два экземпляра SPIClass, присоединенных к VSPI и HSPI соответственно
  vspi = new SPIClass(VSPI);
  hspi = new SPIClass(HSPI);

  //clock miso mosi ss

  //initialise vspi with default pins
  //SCLK = 18, MISO = 19, MOSI = 23, SS = 5
  vspi->begin();
  //альтернативный маршрут через контакты GPIO по вашему выбору
  //hspi->begin(0, 2, 4, 33); //SCLK, MISO, MOSI, SS

  //initialise hspi with default pins
  //SCLK = 14, MISO = 12, MOSI = 13, SS = 15
  hspi->begin(); 
  //alternatively route through GPIO pins
  //hspi->begin(25, 26, 27, 32); //SCLK, MISO, MOSI, SS

  //настройка slave select pins в качестве выходов в качестве Arduino API
  //не обрабатывает автоматическое вытягивание SS low
  pinMode(5, OUTPUT); //VSPI SS
  pinMode(15, OUTPUT); //HSPI SS

}

// функция loop выполняется снова и снова, пока не отключится питание или не сбросится
void loop() {
  //use the SPI buses
  vspiCommand();
  hspiCommand();
  delay(100);
}

void vspiCommand() {
  byte data = 0b01010101; // junk data to illustrate usage

  //use it as you would the regular arduino SPI API
  vspi->beginTransaction(SPISettings(spiClk, MSBFIRST, SPI_MODE0));
  digitalWrite(5, LOW); //pull SS slow to prep other end for transfer
  vspi->transfer(data);  
  delay(500);
  digitalWrite(5, HIGH); //pull ss high для обозначения конца передачи данных
  vspi->endTransaction();
}

void hspiCommand() {
  byte stuff = 0b11001100;

  hspi->beginTransaction(SPISettings(spiClk, MSBFIRST, SPI_MODE0));
  digitalWrite(15, LOW);
  hspi->transfer(stuff);
  delay(500);
  digitalWrite(15, HIGH);
  hspi->endTransaction();
}

Я вижу, как переключается вывод SS, но вывод SCLK не показывает никаких импульсов на осциллографе. Это постоянный минимум. Следует ли подавать импульсы от внешнего источника? Если да, то какова цель этой линии - статический const int spiClk = 1000000; // 1 МГц?

, 👍2

Обсуждение

Какое устройство вы используете? Некоторые поставщики плат печатают GPIOnum (который отличается от pin num) на шелковом экране, иногда поставщик использует другой макет, чем эталонный дизайн, поэтому вам нужно посмотреть на принципиальную схему (если вы ее получите/получите) - Я знаю "поиск" для pin SCLK и других отображений; -), @Codebreaker007

Я использую esp32 wroom. Да, я знаю, что gpio 5 (pin 29) - это измельчитель чипов, gpio 18(pin 30) - это тактовые импульсы и т. Д. С помощью vspi Я получаю эти переключающие импульсы на gpio5, но не вижу никакой передачи данных. То есть тактовые импульсы на gpio18 или выводе 30, @blazingcannon


1 ответ


1

Попробуйте явно установить контакты для вывода
ИЗМЕНЕНИЕразличных проблем с тестовыми программами указывает на то, что для восстановления контакта необходимо явно установить значение high, что не выполняется методом libs begin (начиная с ядра 1.04)

  digitalWrite(30, HIGH); // включить импульсные резисторы
  digitalWrite(xxx, HIGH); // включить контакт импульсных резисторов
  pinMode(30, OUTPUT); //VSPI SLCK
  pinMode(XX, OUTPUT); //HSPI SCLK

В документах ESP32 говорится:

gpio18 выведет низкий уровень(поскольку gpio18 по умолчанию является режимом ввода). Если вы не хотите такого поведения, вам следует настроить gpio18 в качестве режима вывода и установить его на высокий уровень перед вызовом

Поскольку это не проблема - модули Wroom 32 v1-3 имеют проблемы с SPI при прошивке в определенных режимах с частотой 80 МГц, поэтому попробуйте прошить с частотой 40 МГц. Тем временем я проверяю свою тестовую программу.

Итак, вот рабочая процедура тестирования:

/* SPI Test routine for Wroom32  
Connect the MISO with  the MOSI pin*/
#include<SPI.h>       //Библиотека для SPI

#define SPI_SCK 18 // Последовательные часы (Основной выход)
#define SPI_MOSI 23 // Главный выход,Ведомый вход
#define SPI_MISO 19 // Главный вход,Ведомый выход
#define SPI_CS 5 // Выбор микросхемы, Включение подчиненной передачи (активный низкий уровень, Главный выход)
#define SS 5

char returnStr[40] = {'\0'};
char returnChr;

void setup () {
  Serial.begin(115200); // Установите скорость передачи данных на 115200 для
PIN usart
  pinMode(SPI_CS, OUTPUT);
  pinMode(SPI_SCK, OUTPUT);
  pinMode(SPI_MOSI, OUTPUT);
  pinMode(SPI_MISO, INPUT);

  digitalWrite(SS, HIGH); // отключить ведомый выбор
  SPI.begin (SPI_SCK, SPI_MISO, SPI_MOSI);
  SPI.setBitOrder(MSBFIRST);
  SPI.setDataMode(SPI_MODE0);
  SPI.setClockDivider(SPI_CLOCK_DIV8); // разделить частоту на 8=2 МГц @ESP32
}

void loop () {
  char c;
  digitalWrite(SS, LOW); // включить ведомый выбор
  /* Send test string in a loop */
  for (const char *p = "ТЕСТ SPI! Мы подключены через SPI\n\r" ; (c = *p); p++)  {
    returnChr = SPI.transfer (c);
    Serial.print(c);
    Serial.print(returnChr); // Ссылка MOSI MISO отправляет эхо обратно
  }
  digitalWrite(SS, HIGH); // отключить ведомый выбор
  delay(500);
}

Чтобы измерить сигналы, которые вы должны запустить до падающего края SS/CS и установить разрешение 2 мкм на поле сетки (примерно). Я протестировал модуль AIThinker (ESP32), и все работало с этим скетчем.

,

попробовал то же самое, но это не сработало. Я даже изменил синтаксис на pinMode(18, ВЫВОД) как pin 30 gpio 18. Если у вас есть ESP32, можете ли вы тоже попробовать его?, @blazingcannon

спасибо - я тоже пытался менять тактовую частоту, но безуспешно. Вам удалось это попробовать?, @blazingcannon