====== 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:
- Clock line is low when idle.
"clock polarity" CPOL = 1:
- Clock line is high when idle.
"clock phase" CPHA = 0:
- first data bit is output on /CS activating (going low).
- data bits change when clock goes to idle level.
- data bits are read when clock comes from idle level.
"clock phase" CPHA = 1:
- first data bit starts on first edge after /CS activates.
- data bits change when clock comes from idle level.
- 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:
* duplex : the traditional mode using MISO and MOSI to transmit and receive at the same time.
* half-duplex : meaning the same wire between master and slave is used for both directions.
* receive-only : send line is not used
* send-only : receive Line is not used.
**type**: enum
**default**: duplex
=== frame_format ===
Describes the communication. Possible values are:
* motorola : the "normal" SPI.
* ti :
**type**: enum
**default**: motorola
=== clock_polarity ===
Also often called CPOL. Describes the communication. Possible values are:
* idle_low
* idle_high
**type**: enum
**default**: idle_low
=== clock_phase ===
Also often called CPHA. Describes the communication. Possible values are:
* sample_on_leading_edge : samples the data on the edge from idle value to non-idle value.
* sample_on_trailinging_edge : samples the data on the edge from non-idle value to idle value.
**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:
* msb_first : most significant bit first (bits on the line : 76543210 )
* lsb_first : least significant bit first (bits on the line: 01234567 )
**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".