LAB: SPI Protocol

āļˆāļļāļ”āļ›āļĢāļ°āļŠāļ‡āļ„āđŒ

āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļ‚āđ‰āļēāđƒāļˆāļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļĢāļ°āļŦāļ§āđˆāļēāļ‡ MCU āļāļąāļš MCU āļœāđˆāļēāļ™ āđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨSPI

LAB: Logic Analyzer with SPI Protocol

āļāļēāļĢāļ—āļ”āļĨāļ­āļ‡: āđƒāļŠāđ‰ Logic Analyzer āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļ‚āļ­āļ‡ SPI Protocol

āļ­āļļāļ›āļāļĢāļ“āđŒāļ—āļ”āļĨāļ­āļ‡

āļ­āļļāļāļ›āļĢāļ“āđŒāļāļēāļĢāļ—āļ”āļĨāļ­āļ‡

āđ‚āļ›āļĢāđāļāļĢāļĄ

  1. Arduino IDE

  2. āđ‚āļ›āļĢāđāļāļĢāļĄ KingstVIS

āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļē KingstVIS program

  • āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­ logic Analyzer āļāļąāļš āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ

  • āđ€āļ›āļīāļ”āđ‚āļ›āļĢāđāļāļĢāļĄ Kingst VIS

  • āđ„āļ›āļ—āļĩāđˆ Analyzers >> āļ„āļĨāļīāđŠāļ icon add(+) >> āđ€āļĨāļ·āļ­āļ SPI

  • āđ„āļ›āļ—āļĩāđˆ Analyzers >> āļ„āļĨāļīāđŠāļ icon setting >> Edit āļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ•āļēāļĄāļĢāļđāļ›āļ”āđ‰āļēāļ™āļĨāđˆāļēāļ‡ >> OK

  • āđ„āļ›āļ—āļĩāđˆ Analyzers āļ­āļĩāļāļ„āļĢāļąāđ‰āļ‡ >> āļ„āļĨāļīāđŠāļ icon setting >> Display Format >> ASCII āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāđāļŠāļ”āļ‡āļœāļĨāđ€āļ›āđ‡āļ™āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ

āļ•āļąāđ‰āļ‡āļ„āđˆāļē Display Format āđāļŠāļ”āļ‡ ASCII
  • āđ„āļ›āļ—āļĩāđˆ Channel 3 āđ€āļĨāļ·āļ­āļāļāļ” Indicates "rising edge trigger"

Trigger condition setting

Pin Connect

āļĢāļēāļĒāļŠāļ·āđˆāļ­ PIN āļ•āđˆāļ­āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļ™

M5Stack
Arduino UNO
Logic Analyzer

pin 18

pin 10

Channel 3

MO

pin 11

Channel 0

MI

pin 12

Channel 1

SCK

pin 13

Channel 2

GND

GND

GND

āļ•āļģāđāļŦāļ™āđˆāļ‡ SPI port āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ—āļ”āļĨāļ­āļ‡āļ™āļĩāđ‰āđāļŠāļ”āļ‡āļ”āļąāļ‡āļ āļēāļžāļ”āđ‰āļēāļ™āļĨāđˆāļēāļ‡

Code: SPI master (M5 stack)

// SPI master (M5 stack)
#include <SPI.h>
int ss = 18;
void setup (void) {
   Serial.begin(115200); //set baud rate to 115200 for usart
   pinMode(ss,OUTPUT);
   digitalWrite(ss, HIGH); // disable Slave Select
   SPI.begin ();
   SPI.setClockDivider(SPI_CLOCK_DIV8);//divide the clock by 8
}

void loop (void) {
   char c;
   digitalWrite(ss, LOW); // enable Slave Select
   // send test string
   for (const char * p = "Hello, world!\r" ; c = *p; p++) 
   {
      SPI.transfer (c);
      Serial.print(c);
   }
   digitalWrite(ss, HIGH); // disable Slave Select
   delay(2000);
}

Code: SPI slave Arduino UNO

// SPI slave Arduino UNO
#include <SPI.h>
char buff [50];
volatile byte indx;
volatile boolean process;


void setup (void) {
  Serial.begin (115200);
  pinMode(MISO, OUTPUT); // have to send on master in so it set as output
  SPCR |= _BV(SPE); // turn on SPI in slave mode
  indx = 0; // buffer empty
  process = false;
  SPI.attachInterrupt(); // turn on interrupt
}

ISR (SPI_STC_vect) // SPI interrupt routine
{
  byte c = SPDR; // read byte from SPI Data Register
  if (indx < sizeof buff) {
    buff [indx++] = c; // save data in the next index in the array buff
    if (c == '\r') //check for the end of the word
      process = true;
  }
}

void loop (void) {
  if (process) {
    process = false; //reset the process
    Serial.println (buff); //print the array on serial monitor
    indx = 0; //reset button to zero
  }
}

āļšāļąāļ™āļ—āļķāļāļœāļĨāļāļēāļĢāļ—āļ”āļĨāļ­āļ‡

  1. āļšāļąāļ™āļ—āļķāļāļœāļĨāļāļēāļĢāļ—āļ”āļĨāļ­āļ‡āļ—āļĩāđˆ logic analyzer āđāļŠāļ”āļ‡

Last updated

Was this helpful?