SPI Slave on mkr gsm 1400

Hi everyone, i'm trying to set up the mkr gsm 1400 to be a slave on an spi network with a stm8l as the master.
I have tried to set up the SPI periheral on the SAMD21 microcontroller with ss mapped to pin B22 however the ss low interrupt always fires regardless on whats on the line.

Hopefully someone can see an issue in my setup, Thanks!

void setup()
{
  Serial.begin(9600);           // start serial for output

  while (!Serial) {  }
  Serial.println("Starting setup");

  SERCOM5->SPI.CTRLA.bit.ENABLE = 0;

  SERCOM5->SPI.CTRLA.bit.MODE = 0x2;    // SPI Slave Mode
  SERCOM5->SPI.CTRLA.bit.CPOL = 1;      // clock idle high
  SERCOM5->SPI.CTRLA.bit.CPHA = 0;      // on falling edge
  SERCOM5->SPI.CTRLA.bit.FORM = 0;      // NO ADDRESS
  SERCOM5->SPI.CTRLA.bit.DORD = 1;      // data order: LSB first
  SERCOM5->SPI.CTRLB.bit.CHSIZE = 0x0;  // 8-bit character

  PORT->Group[PORTB].PINCFG[22].bit.PMUXEN = 1;
  PORT->Group[PORTB].PMUX[11].reg |= 0x03; //set ss to be pin b22

  SERCOM5->SPI.CTRLB.bit.RXEN = 1;      // enable receiver
  SERCOM5->SPI.CTRLB.bit.SSDE = 1;      // wake up on ss low detect
  SERCOM5->SPI.INTENSET.bit.RXC = 1;   // enable receive complete interrupt

  SERCOM5->SPI.CTRLA.bit.ENABLE = 1;
}


void loop()
{
  delay(1000);
  if (SERCOM5->SPI.INTFLAG.bit.RXC == 1) {      // wait for a character in the receive buffer
    Serial.print("got data");
    Serial.println(SERCOM5->SPI.DATA.reg);
  }
  if (SERCOM5->SPI.INTFLAG.bit.ERROR == 1) {      // wait for a character in the receive buffer
    Serial.println("got error");
  }
  if (SERCOM5->SPI.INTFLAG.bit.SSL == 1) {      // wait for a character in the receive buffer
    Serial.println("got ssl");
  }
}

If anyones interested the key points to get this working were:
Used an unused sercom, set up all pins, common gnd

SERCOM3->SPI.CTRLA.bit.ENABLE = 0;

  SERCOM3->SPI.CTRLA.bit.MODE = 0x2;    // SPI Slave Mode
  SERCOM3->SPI.CTRLA.bit.CPOL = 0;      // clock idle high - have to upll down
  SERCOM3->SPI.CTRLA.bit.CPHA = 0;      // on falling edge
  SERCOM3->SPI.CTRLA.bit.FORM = 0;      // NO ADDRESS
  SERCOM3->SPI.CTRLA.bit.DORD = 0;      // data order: LSB first
  SERCOM3->SPI.CTRLA.bit.DOPO = 0;      // do on pad 0, clk on pad 1, ss on pad 2
  SERCOM3->SPI.CTRLA.bit.DIPO = 3;      // set di on pad3
  SERCOM3->SPI.CTRLB.bit.CHSIZE = 0x0;  // 8-bit character

  //setting pins a20, a21, a22, a23 to be pads 2, 3, 0 and 1 respectivcely 
  //and therefore ss, di, do and clk when DOPO reg is 0x00 and DIPO is 0x03
  PORT->Group[PORTA].PINCFG[20].bit.PMUXEN = 1;
  PORT->Group[PORTA].PINCFG[21].bit.PMUXEN = 1;
  PORT->Group[PORTA].PINCFG[22].bit.PMUXEN = 1;
  PORT->Group[PORTA].PINCFG[23].bit.PMUXEN = 1;
  PORT->Group[PORTA].PMUX[10].reg = 0x33 ; //set ss to be pin A20 and di to be pin A21
  PORT->Group[PORTA].PMUX[11].reg = 0x22; //set do to be pin A22, set clk to be pin A23

  SERCOM3->SPI.CTRLB.bit.RXEN = 1;      // enable receiver
  SERCOM3->SPI.CTRLB.bit.MSSEN = 1;
  SERCOM3->SPI.CTRLB.bit.SSDE = 1;      // wake up on ss low detect
  SERCOM3->SPI.INTENSET.bit.RXC = 1;   // enable receive complete interrupt

  SERCOM3->SPI.CTRLA.bit.ENABLE = 1;

Please find a repository I have created for using an SAMD21 microcontroller as a Sercom SPI Slave: GitHub - lenvm/SercomSPISlave: Sercom SPI library for ATSAMD21 boards such as Arduino Zero and Adafruit Feather M0

I hope it helps!

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.