Отправка команды через SPI на Arduino UNO
Я предполагаю, что конфигурация pin по умолчанию-это pin 10(SS), 11(MOSI), 12(MISO), 13(CLK) из настройки по умолчанию, SPI.begin(). Код компилируется нормально. Не уверен в int valuex и использовании функции SPI.transfer ().
#include <SPI.h>
int value1 = 0x8026;
int value2 = 0x0801;
int value3 = 0x8027;
int value4 = 0x0000;
void setup (void)
{
Serial.begin (9600);
Serial.println ("Starting");
digitalWrite(SS, HIGH); // убедитесь, что SS пока остается высоким
// Перевести контакты SCK, MOSI, SS в режим вывода
// также поместите SCK, MOSI в низкое состояние и SS в ВЫСОКОЕ состояние.
// Затем поместите аппаратное обеспечение SPI в основной режим и включите SPI
SPI.begin ();
// Притормози немного
SPI.setClockDivider(SPI_CLOCK_DIV4);
} // конец настройки
void loop (void)
{
// включить Slave Select
digitalWrite(SS, LOW);
SPI.transfer (1); // инициировать передачу
SPI.transfer (value1);
SPI.transfer (value2);
SPI.transfer (value3);
SPI.transfer (value4);
// отключить Slave Select
digitalWrite(SS, HIGH);
delay (1000);
}
@howdyrichard, 👍0
Обсуждение1 ответ
Не уверен насчет внутреннего выражения и использования функции SPI.transfer ().
Несколько вещей, которые нужно знать:
- Вы сохраняете 16-разрядный литерал без знака в 16-разрядной переменной со знаком. Вы должны использовать
значение uint16_t1 = 0x8026; и т.д.
Кроме того, если вы не планируете изменять значения, они должны бытьпостоянными.
Функция SPI.transfer()
передает только 8 бит данных. Вы отправляете только самый младший байт вашихпеременных valuex.
Функция SPI.transfer16()
отправляет 16-битное значение без знака.
Чтобы проиллюстрировать это, вот как должна выглядеть ваша программа:
#include <SPI.h>
const uint16_t value1 = 0x8026;
const uint16_t value2 = 0x0801;
const uint16_t value3 = 0x8027;
const uint16_t value4 = 0x0000;
void setup(void) {
Serial.begin(9600);
Serial.println("Starting");
digitalWrite(SS, HIGH); // убедитесь, что SS пока остается высоким
// Переведите контакты SCK, MOSI, SS в режим вывода
// также переведите SCK, MOSI в НИЗКОЕ состояние и SS в ВЫСОКОЕ состояние.
// Затем переведите аппаратное обеспечение SPI в основной режим и включите SPI
SPI.begin();
// Немного замедлите мастера
SPI.setClockDivider(SPI_CLOCK_DIV4);
} // завершение настройки
void loop(void) {
// включить Ведомый Выбор
digitalWrite(SS, LOW);
SPI.transfer(1); // инициирование передачи
SPI.transfer16(value1);
SPI.transfer16(value2);
SPI.transfer16(value3);
SPI.transfer16(value4);
// отключить Ведомый Выбор
digitalWrite(SS, HIGH);
Delay(1000);
}
Это передаст поток 8-разрядных значений:
0x01 0x80 0x26 0x08 0x01 0x80 0x27 0x00 0x00
Привет и спасибо тебе. Я считаю, что код правильный, но я не получаю никакой сигнализации от контакта MOSI 11; он переходит от высокого уровня к низкому. Я могу "видеть" (с помощью осциллографа), что вывод 10 выходит из строя, я вижу только 3 тактовых импульса на выводе 13. Меня не волнуют никакие входящие данные., @howdyrichard
Кроме того, когда я добавил 16 в SPI.transfer, передача изменилась с синего на черный цвет., @howdyrichard
Код работает идеально! Спасибо вам, и я жалею, что не отправил это раньше. Еще раз спасибо!, @howdyrichard
@howdyrichard Прими ответ, если он сработал для тебя, @SoreDakeNoKoto
- Как использовать SPI на Arduino?
- OVF в последовательном мониторе вместо данных
- Как отправить строку с подчиненного устройства Arduino с помощью SPI?
- Проблема совместного использования MISO с несколькими RFID-считывателями RC522
- Программирование ведомого SPI для Arduino
- Последовательная связь между несколькими устройствами (или ардуино)
- Максимальная скорость SPI для ведомого Uno/clone?
- SPI.transfer(buffer, size) не отправляет данные из буфера
передача отправляет только один байт. См. раздел " SPI.transfer16(intval);", если это необходимо., @DataFiddler