ATMEL SAMD11 SPI (подчиненный) с Arduino (Master)

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

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

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

#include 

#define BUF_LENGTH 20
int slave_select = 10;

void setup (void)
{
 //Initialize serial for DEBUG.
  Serial.begin(9600);
  pinMode (slave_select, OUTPUT);
  digitalWrite(slave_select, HIGH); //ensure SS stays high for now
 //Put SCK, MOSI, SS pins into output mode
 //also put SCK, MOSI into LOW state, and SS into HIGH state.
 //Then put SPI hardware into Master mode and turn SPI on
  SPI.beginTransaction (SPISettings (4000000, MSBFIRST, SPI_MODE0)); //4 MHz clock, MSB first, mode 0
 //Master initialized.
  Serial.println("Master Initialized");
} //end of setup

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
  };
 //enable Slave Select
  digitalWrite(slave_select, LOW);   //SS is pin 10

  //write the 20 bytes
  for (int I=0;I<20;I++)
  {
    SPI.transfer(buffer_expect[I]); //write data byte
    delay(20);
  }

 //disable Slave Select
  digitalWrite(slave_select, HIGH);

  delay (1000); //1 seconds delay 
} //end of loop

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

1
Я не вижу инструкции «pinMode» в любом месте вашего кода. Где вы устанавливаете SS как выход?
добавлено автор DaffyDuc, источник

1 ответы

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

На странице arduino, с которой вы связались, есть заметка внизу, которая гласит:

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

     

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

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

pinMode (slaveSelectPin, OUTPUT); 

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

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

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

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