====== 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".