ATMEL SAMD11 SPI (Slave) met Arduino (Master)

Ik probeer mijn Atmel SAMD11 XPLAINED PRO en arduino met elkaar te laten praten met behulp van SPI. Ik heb de Arduino als de meester opgezet, met de SAMD11 als de slaaf. Op ATMEL heb ik de volgende code:

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

In wezen wacht het totdat de master gegevens verzendt, de gegevens vergelijkt met wat het verwacht en een LED overeenkomstig bijwerkt. Aan de zijde van Arduino, heb ik het volgende:

#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

Wanneer ik de code uitvoer, wordt de LED op de SAMD11 niet bijgewerkt, wat betekent dat deze wacht op het verzenden van gegevens en deze niet heeft ontvangen, ondanks wat de arduino-code schrijft. Aan de hardware kant, heb ik GND verbonden op beide kaarten, VCC op de SAM tot 5V op de Arduino, en SPI_SS_A, MOSI, MISO en SCK verbonden met respectievelijk pennen 10, 11, 12 en 13 op de Arduino.

1
Ik zie geen "pinMode" -instructie ergens in uw code. Waar stel je SS in als uitvoer?
toegevoegd de auteur DaffyDuc, de bron

1 antwoord

U hebt uw SS-pincode niet ingesteld als uitvoer overal in uw code.

De arduino-pagina waarnaar je hebt gelinkt heeft onderaan een notitie met de tekst:

Opmerking over Slave Select (SS) -pin op AVR-gebaseerde kaarten

     

Alle op AVR gebaseerde kaarten hebben een SS-pin die handig is als ze als een   slaaf gecontroleerd door een externe meester. Omdat deze bibliotheek ondersteunt   alleen master-modus, deze pin moet altijd anders worden ingesteld als OUTPUT   de SPI-interface kan automatisch in de slavemodus worden gezet   hardware, waardoor de bibliotheek niet meer werkt. Het is echter mogelijk   om elke pin te gebruiken als Slave Select (SS) voor de apparaten. Bijvoorbeeld,   het Arduino Ethernet-schild gebruikt pin 4 om de SPI-verbinding te besturen   naar de ingebouwde SD-kaart en pin 10 om de verbinding met de   Ethernet-controller.

De voorbeeldcode die is gegeven voor het teensy-bord op de andere pagina die u hebt gekoppeld, heeft:

pinMode (slaveSelectPin, OUTPUT); 

in de setup() functie.

Dus dat is wat je mist.
Het hoog of laag instellen van de pen zal niets bereiken als het geen uitvoer is.

Onthoud dat SPI toegang heeft tot veel verschillende apparaten met dezelfde MOSI/MISO/SCK-pinnen, maar elk slaafapparaat heeft zijn eigen Slave-Select-pen die afzonderlijk door de master moet worden bestuurd.
Uw master kan daarom veel verschillende SS-pinnen hebben, allemaal ingesteld als outputs - en daarvoor is er geen standaardpin.

0
toegevoegd
Het lijkt dit niet te zijn, ik heb de code bijgewerkt en ik heb hetzelfde probleem, waarbij de SAMD11 geen verlichte LED heeft, wat betekent dat hij wacht om iets te ontvangen.
toegevoegd de auteur keif, de bron