ATMEL SAMD11 SPI (ведомый) с Arduino (главный)

spi

Я пытаюсь заставить свой Atmel SAMD11 XPLAINED PRO и Arduino взаимодействовать друг с другом с помощью SPI. Я установил Arduino в качестве ведущего устройства, а SAMD11 — в качестве ведомого устройства. В ATMEL у меня есть следующий код:

http://asf.atmel.com/docs/latest/samd21/html/asfdoc_sam0_sercom_spi_slave_callback_use .html

По сути, он ждет, пока мастер отправит данные, сравнивает данные с ожидаемыми и соответствующим образом обновляет светодиод. На стороне Arduino у меня есть следующее:

#include <SPI.h>

#define BUF_LENGTH 20
int slave_select = 10;

void setup (void)
{
  // Инициализируем последовательный порт для DEBUG.
  Serial.begin(9600);
  pinMode (slave_select, OUTPUT);
  digitalWrite(slave_select, HIGH);  // обеспечиваем, чтобы SS оставался высоким на данный момент
  // Переводим выводы SCK, MOSI, SS в режим вывода
  // также переводим SCK, MOSI в состояние LOW и SS в состояние HIGH.
  // Затем переводим оборудование SPI в режим Master и включаем SPI
  SPI.beginTransaction (SPISettings (4000000, MSBFIRST, SPI_MODE0));  // тактовая частота 4 МГц, сначала старший разряд, режим 0
  // Мастер инициализирован.
  Serial.println("Master Initialized");
}  // конец настройки

void loop (void)
{
  static uint8_t buffer_expect[BUF_LENGTH] = {
    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
     0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13
  };
  // включаем выбор подчиненного
  digitalWrite(slave_select, LOW);    // SS — это контакт 10

  //записываем 20 байт
  for (int I=0;I<20;I++)
  {
    SPI.transfer(buffer_expect[I]); //записываем байт данных
    delay(20);
  }

  // отключаем выбор подчиненного
  digitalWrite(slave_select, HIGH);

  delay (1000);  // задержка 1 секунда
}  // конец цикла

Когда я запускаю код, светодиод на SAMD11 не обновляется, а это означает, что он ожидает отправки данных и не получил их, несмотря на то, что пишет код Arduino. Что касается аппаратного обеспечения, у меня есть GND, подключенный к обеим платам, VCC на SAM к 5 В на Arduino, а SPI_SS_A, MOSI, MISO и SCK подключены к контактам 10, 11, 12 и 13 на Arduino соответственно.

, 👍0

Обсуждение

Я не вижу оператора «pinMode» нигде в вашем коде. Где вы устанавливаете SS в качестве выхода?, @brhans


1 ответ


1

Вы не установили свой вывод SS в качестве выхода нигде в своем коде.

На странице arduino, на которую вы ссылаетесь, внизу есть примечание:

Примечание о контакте выбора ведомого устройства (SS) на платах на базе AVR

Все платы на базе AVR имеют контакт SS, который полезен, когда они действуют как ведомое устройство, управляемое внешним мастером. Поскольку эта библиотека поддерживает только в режиме мастера, этот вывод всегда должен быть установлен как ВЫХОД, в противном случае интерфейс SPI может быть автоматически переведен в подчиненный режим с помощью оборудование, что делает библиотеку неработоспособной. Однако возможно использовать любой контакт в качестве выбора подчиненного устройства (SS) для устройств. Например, шилд Arduino Ethernet использует контакт 4 для управления соединением SPI к встроенной SD-карте и контакту 10 для управления подключением к Ethernet-контроллер.

Пример кода, приведенный для платы Teensy на другой странице, на которую вы ссылаетесь, имеет:

pinMode (slaveSelectPin, OUTPUT);

в функции setup().

Так вот чего вам не хватает.
Установка высокого или низкого уровня на выводе ничего не даст, если это не выход.

Помните, что SPI может получить доступ ко многим различным устройствам, используя одни и те же контакты MOSI/MISO/SCK, но каждое подчиненное устройство имеет свой собственный контакт выбора подчиненного устройства, который должен индивидуально управляться ведущим.
Таким образом, ваш мастер может иметь множество различных контактов SS, и все они настроены как выходы, и для этого не существует единого стандартного контакта.

,

Кажется, это не так, я обновил код, и у меня та же проблема: у SAMD11 не горит светодиод, что означает, что он ожидает чего-то., @trset test