Отправка команды через 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); 
}

, 👍0

Обсуждение

передача отправляет только один байт. См. раздел " SPI.transfer16(intval);", если это необходимо., @DataFiddler


1 ответ


1

Не уверен насчет внутреннего выражения и использования функции SPI.transfer ().

Несколько вещей, которые нужно знать:

  1. Вы сохраняете 16-разрядный литерал без знака в 16-разрядной переменной со знаком. Вы должны использовать значение uint16_t1 = 0x8026; и т.д. Кроме того, если вы не планируете изменять значения, они должны быть постоянными.
  2. Функция 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