Импульсы 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 МГц?
@blazingcannon, 👍2
Обсуждение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
- Взаимная связь ESP32 SPI
- FreeRTOS не решает мою проблему с параллельным выполнением задач
- ESP32 в Arduino-IDE с FS.h и SPIFFS
- Программаторы для этой платы отсутствуют - Программирование ESP32 Cam с помощью Ardunio IDE
- Установка значения float до двух знаков после запятой
- ESP32-CAM первый: 0x8 TG1WDT_SYS_RESET загрузочный цикл
- esp32 Stack canary watchpoint срабатывает
- Проверка размера во флэш-памяти Esp32
Какое устройство вы используете? Некоторые поставщики плат печатают GPIOnum (который отличается от pin num) на шелковом экране, иногда поставщик использует другой макет, чем эталонный дизайн, поэтому вам нужно посмотреть на принципиальную схему (если вы ее получите/получите) - Я знаю "поиск" для pin SCLK и других отображений; -), @Codebreaker007
Я использую esp32 wroom. Да, я знаю, что gpio 5 (pin 29) - это измельчитель чипов, gpio 18(pin 30) - это тактовые импульсы и т. Д. С помощью vspi Я получаю эти переключающие импульсы на gpio5, но не вижу никакой передачи данных. То есть тактовые импульсы на gpio18 или выводе 30, @blazingcannon