Table of Contents

SPI

Different variants exist. Usually SPI refers to the Motorola Serial Peripheral Interface. Other variants are the Texas Instruments Serial protocol (SSP) and the National Instruments Microwire.

Protocol

Most significant bit first

Modes

There are 4 Modes. Defied by the two settings “clock polarity” CPOL and “clock phase” CPHA.

“clock polarity” CPOL = 0:

  1. Clock line is low when idle.

“clock polarity” CPOL = 1:

  1. Clock line is high when idle.

“clock phase” CPHA = 0:

  1. first data bit is output on /CS activating (going low).
  2. data bits change when clock goes to idle level.
  3. data bits are read when clock comes from idle level.

“clock phase” CPHA = 1:

  1. first data bit starts on first edge after /CS activates.
  2. data bits change when clock comes from idle level.
  3. data bits are read when clock goes to idle level.
mode CPOL CPHA write bit read bit
0 0 0 clock goes low, and when /CS activates clock goes high
1 0 1 clock goes high clock goes low
2 1 0 clock goes high, and when /CS activates clock goes low
3 1 1 clock goes low clock goes high

SPI group

This group defines all used Serial Peripheral Interface (SPI) interfaces.

Each SPI interface is a sub group with the SPI name as the group name.

    "SPI": {
        "encoder_spi": {
            "pad_sck": "PA5",
            "pad_miso": "PA6",
            "pad_mosi": "PA7",
            "pad_ncs": "PA15",
            "peripheral" : "SPI0",
            "role": "master",
            "communication_mode": "duplex",
            "frame_format": "motorola",
            "clock_polarity": "idle_low",
            "clock_phase": "sample_on_leading_edge",
            "bit_order": "msb_first",
            "baud_rate": "10 MHz",
        }
    }

pad_sck

Serial Clock.

type: String

pad_mosi

“Master Out Slave In” data signal.

type: String

pad_miso

“Master In Slave Out” data signal.

type: String

pad_ncs

Chip Select signal (Low active).

type: String

peripheral

name of the SPI peripheral to use.

type: String

role

Is either master(host) or slave(device).

type: enum

default: master

communication_mode

Describes the communication. Possible values are:

type: enum

default: duplex

frame_format

Describes the communication. Possible values are:

type: enum

default: motorola

clock_polarity

Also often called CPOL. Describes the communication. Possible values are:

type: enum

default: idle_low

clock_phase

Also often called CPHA. Describes the communication. Possible values are:

type: enum

default: sample_on_leading_edge

SPI Mode

Sometimes the documentation talks about a SPI Mode with the value of 0 to 3. This mode maps to the phase and polarity as described in the following table:

Mode CPOL CPHA description
0 0 0 clock: idle_low, phase: sample_on_leading_edge
1 0 1 clock: idle_low, phase: sample_on_trailing_edge
2 1 0 clock: idle_high, phase: sample_on_leading_edge
3 1 1 clock: idle_high, phase: sample_on_trailing_edge

bit_order

Describes the communication. Possible values are:

type: enum

default: msb_first

baud_rate

Is the number of bits per second exchanged on the data lines. Expressed as frequency of the clock line.

type: int (Hz)

API

The part “signal_name” in the described functions will be replaced by the name of the signal. E.g. if your signal is called “audio” then the API function “signal_name_transfer” will become “audio_transfer”.

void signal_name_transfer(const uint8_t *data_send, 
                          const uint8_t *data_receive, 
                          const uint32_t length )

Will send “length” bytes from the buffer “data_send” out on MOSI and will receive the same amount of bytes from MISO into the buffer “data_receive”.