Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/development/msp/format.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
**variable_len**: Optional boolean, if true, message does not have a predefined fixed length and needs appropriate handling\
**variants**: Optional special case, message has different cases of reply/request. Key/description is not a strict expression or code; just a readable condition\
**not_implemented**: Optional special case, message is not implemented (never or deprecated)\
**replaced_by**: Optional array of MSP message names that replace this command. Present when a command is deprecated and scheduled for removal. Empty array if no replacement is needed\
**notes**: String with details of message

## Data dict fields:
Expand Down
21 changes: 20 additions & 1 deletion docs/development/msp/msp_messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -673,6 +673,7 @@
"MSP_POSITION_ESTIMATION_CONFIG": {
"code": 16,
"mspv": 1,
"replaced_by": ["MSP2_COMMON_SETTING"],
"request": null,
"reply": {
"payload": [
Expand Down Expand Up @@ -727,6 +728,7 @@
"MSP_SET_POSITION_ESTIMATION_CONFIG": {
"code": 17,
"mspv": 1,
"replaced_by": ["MSP2_COMMON_SET_SETTING"],
"request": {
"payload": [
{
Expand Down Expand Up @@ -2360,6 +2362,7 @@
"MSP_BLACKBOX_CONFIG": {
"code": 80,
"mspv": 1,
"replaced_by": ["MSP2_BLACKBOX_CONFIG"],
"request": null,
"reply": {
"payload": [
Expand Down Expand Up @@ -2399,6 +2402,7 @@
"MSP_SET_BLACKBOX_CONFIG": {
"code": 81,
"mspv": 1,
"replaced_by": ["MSP2_SET_BLACKBOX_CONFIG"],
"not_implemented": true,
"request": null,
"reply": null,
Expand Down Expand Up @@ -2426,6 +2430,7 @@
"MSP_OSD_CONFIG": {
"code": 84,
"mspv": 1,
"replaced_by": ["MSP2_INAV_OSD_LAYOUTS", "MSP2_INAV_OSD_ALARMS", "MSP2_INAV_OSD_PREFERENCES"],
"request": null,
"reply": {
"payload": [
Expand Down Expand Up @@ -2504,6 +2509,7 @@
"MSP_SET_OSD_CONFIG": {
"code": 85,
"mspv": 1,
"replaced_by": ["MSP2_INAV_OSD_SET_LAYOUT_ITEM", "MSP2_INAV_OSD_SET_ALARMS", "MSP2_INAV_OSD_SET_PREFERENCES"],
"request": null,
"reply": null,
"notes": "Requires `USE_OSD`. Distinguishes formats based on the first byte. Format 1 requires at least 10 bytes. Format 2 requires 3 bytes. Triggers an OSD redraw. See `MSP2_INAV_OSD_SET_*` for more advanced control.",
Expand Down Expand Up @@ -3134,6 +3140,7 @@
"MSP_FILTER_CONFIG": {
"code": 92,
"mspv": 1,
"replaced_by": ["MSP2_COMMON_SETTING"],
"request": null,
"reply": {
"payload": [
Expand Down Expand Up @@ -3217,6 +3224,7 @@
"MSP_SET_FILTER_CONFIG": {
"code": 93,
"mspv": 1,
"replaced_by": ["MSP2_COMMON_SET_SETTING"],
"request": {
"payload": [
{
Expand Down Expand Up @@ -3293,6 +3301,7 @@
"MSP_PID_ADVANCED": {
"code": 94,
"mspv": 1,
"replaced_by": ["MSP_INAV_PID"],
"request": null,
"reply": {
"payload": [
Expand Down Expand Up @@ -3370,6 +3379,7 @@
"MSP_SET_PID_ADVANCED": {
"code": 95,
"mspv": 1,
"replaced_by": ["MSP_SET_INAV_PID"],
"request": {
"payload": [
{
Expand Down Expand Up @@ -3599,6 +3609,7 @@
"MSP_STATUS": {
"code": 101,
"mspv": 1,
"replaced_by": ["MSP2_INAV_STATUS"],
"request": null,
"reply": {
"payload": [
Expand Down Expand Up @@ -3914,6 +3925,7 @@
"MSP_ANALOG": {
"code": 110,
"mspv": 1,
"replaced_by": ["MSP2_INAV_ANALOG"],
"request": null,
"reply": {
"payload": [
Expand Down Expand Up @@ -4039,6 +4051,7 @@
"MSP_MISC": {
"code": 114,
"mspv": 1,
"replaced_by": ["MSP2_INAV_MISC"],
"request": null,
"reply": {
"payload": [
Expand Down Expand Up @@ -4168,6 +4181,7 @@
"MSP_PIDNAMES": {
"code": 117,
"mspv": 1,
"replaced_by": [],
"request": null,
"reply": {
"payload": [
Expand Down Expand Up @@ -4644,6 +4658,7 @@
"MSP_STATUS_EX": {
"code": 150,
"mspv": 1,
"replaced_by": ["MSP2_INAV_STATUS"],
"request": null,
"reply": {
"payload": [
Expand Down Expand Up @@ -4701,7 +4716,7 @@
}
]
},
"notes": "Superseded by `MSP2_INAV_STATUS` which provides the full 32-bit `armingFlags` and other enhancements.",
"notes": "Superseded by `MSP2_INAV_STATUS` which provides the full 32-bit `armingFlags` and other enhancements. The `accCalibAxisFlags` field is not present in `MSP2_INAV_STATUS` but is available via `MSP_CALIBRATION_DATA`.",
"description": "Provides extended flight controller status, including CPU load, arming flags, and calibration status, in addition to `MSP_STATUS` fields."
},
"MSP_SENSOR_STATUS": {
Expand Down Expand Up @@ -5135,6 +5150,7 @@
"MSP_SET_MISC": {
"code": 207,
"mspv": 1,
"replaced_by": ["MSP2_INAV_SET_MISC"],
"request": {
"payload": [
{
Expand Down Expand Up @@ -5588,6 +5604,7 @@
"MSP_SERVO_MIX_RULES": {
"code": 241,
"mspv": 1,
"replaced_by": ["MSP2_INAV_SERVO_MIXER"],
"request": null,
"reply": {
"payload": [
Expand Down Expand Up @@ -5644,6 +5661,7 @@
"MSP_SET_SERVO_MIX_RULE": {
"code": 242,
"mspv": 1,
"replaced_by": ["MSP2_INAV_SET_SERVO_MIXER"],
"request": {
"payload": [
{
Expand Down Expand Up @@ -5803,6 +5821,7 @@
"MSP_DEBUG": {
"code": 254,
"mspv": 1,
"replaced_by": ["MSP2_INAV_DEBUG"],
"request": null,
"reply": {
"payload": [
Expand Down
164 changes: 107 additions & 57 deletions src/main/drivers/bus_spi_hal_ll.c
Original file line number Diff line number Diff line change
Expand Up @@ -89,109 +89,159 @@ static const uint32_t spiDivisorMapSlow[] = {
#endif

#if defined(STM32H7)
static spiDevice_t spiHardwareMap[SPIDEV_COUNT] = {
#include "bus_spi_stm32h7xx.h"

// Auto-resolve SPI AF per pin from the lookup table in bus_spi_stm32h7xx.h.
// Targets may still define individual SPI*_SCK/MISO/MOSI_AF values in target.h
// to override; explicit defines take priority via these #ifndef guards.
#ifdef USE_SPI_DEVICE_1
#if defined(SPI1_SCK_AF) || defined(SPI1_MISO_AF) || defined(SPI1_MOSI_AF)
#if !defined(SPI1_SCK_AF) || !defined(SPI1_MISO_AF) || !defined(SPI1_MOSI_AF)
#error SPI1: SCK, MISO and MOSI AFs should be defined together in target.h!
#ifndef SPI1_SCK_AF
#define SPI1_SCK_AF SPI_PIN_AF_HELPER(1, SPI1_SCK_PIN)
#endif
{ .dev = SPI1, .nss = IO_TAG(SPI1_NSS_PIN), .sck = IO_TAG(SPI1_SCK_PIN), .miso = IO_TAG(SPI1_MISO_PIN), .mosi = IO_TAG(SPI1_MOSI_PIN), .rcc = RCC_APB2(SPI1), .sckAF = SPI1_SCK_AF, .misoAF = SPI1_MISO_AF, .mosiAF = SPI1_MOSI_AF, .divisorMap = spiDivisorMapFast },
#else
{ .dev = SPI1, .nss = IO_TAG(SPI1_NSS_PIN), .sck = IO_TAG(SPI1_SCK_PIN), .miso = IO_TAG(SPI1_MISO_PIN), .mosi = IO_TAG(SPI1_MOSI_PIN), .rcc = RCC_APB2(SPI1), .sckAF = GPIO_AF5_SPI1, .misoAF = GPIO_AF5_SPI1, .mosiAF = GPIO_AF5_SPI1, .divisorMap = spiDivisorMapFast },
#ifndef SPI1_MISO_AF
#define SPI1_MISO_AF SPI_PIN_AF_HELPER(1, SPI1_MISO_PIN)
#endif
#ifndef SPI1_MOSI_AF
#define SPI1_MOSI_AF SPI_PIN_AF_HELPER(1, SPI1_MOSI_PIN)
#endif
#else
{ .dev = NULL }, // No SPI1
#endif

#ifdef USE_SPI_DEVICE_2
#if defined(SPI2_SCK_AF) || defined(SPI2_MISO_AF) || defined(SPI2_MOSI_AF)
#if !defined(SPI2_SCK_AF) || !defined(SPI2_MISO_AF) || !defined(SPI2_MOSI_AF)
#error SPI2: SCK, MISO and MOSI AFs should be defined together in target.h!
#ifndef SPI2_SCK_AF
#define SPI2_SCK_AF SPI_PIN_AF_HELPER(2, SPI2_SCK_PIN)
#endif
{ .dev = SPI2, .nss = IO_TAG(SPI2_NSS_PIN), .sck = IO_TAG(SPI2_SCK_PIN), .miso = IO_TAG(SPI2_MISO_PIN), .mosi = IO_TAG(SPI2_MOSI_PIN), .rcc = RCC_APB1L(SPI2), .sckAF = SPI2_SCK_AF, .misoAF = SPI2_MISO_AF, .mosiAF = SPI2_MOSI_AF, .divisorMap = spiDivisorMapSlow },
#ifndef SPI2_MISO_AF
#define SPI2_MISO_AF SPI_PIN_AF_HELPER(2, SPI2_MISO_PIN)
#endif
#ifndef SPI2_MOSI_AF
#define SPI2_MOSI_AF SPI_PIN_AF_HELPER(2, SPI2_MOSI_PIN)
#endif
#endif

#ifdef USE_SPI_DEVICE_3
#ifndef SPI3_SCK_AF
#define SPI3_SCK_AF SPI_PIN_AF_HELPER(3, SPI3_SCK_PIN)
#endif
#ifndef SPI3_MISO_AF
#define SPI3_MISO_AF SPI_PIN_AF_HELPER(3, SPI3_MISO_PIN)
#endif
#ifndef SPI3_MOSI_AF
#define SPI3_MOSI_AF SPI_PIN_AF_HELPER(3, SPI3_MOSI_PIN)
#endif
#endif

#ifdef USE_SPI_DEVICE_4
#ifndef SPI4_SCK_AF
#define SPI4_SCK_AF SPI_PIN_AF_HELPER(4, SPI4_SCK_PIN)
#endif
#ifndef SPI4_MISO_AF
#define SPI4_MISO_AF SPI_PIN_AF_HELPER(4, SPI4_MISO_PIN)
#endif
#ifndef SPI4_MOSI_AF
#define SPI4_MOSI_AF SPI_PIN_AF_HELPER(4, SPI4_MOSI_PIN)
#endif
#endif

static spiDevice_t spiHardwareMap[SPIDEV_COUNT] = {
#ifdef USE_SPI_DEVICE_1
{ .dev = SPI1, .nss = IO_TAG(SPI1_NSS_PIN), .sck = IO_TAG(SPI1_SCK_PIN), .miso = IO_TAG(SPI1_MISO_PIN), .mosi = IO_TAG(SPI1_MOSI_PIN), .rcc = RCC_APB2(SPI1), .sckAF = SPI1_SCK_AF, .misoAF = SPI1_MISO_AF, .mosiAF = SPI1_MOSI_AF, .divisorMap = spiDivisorMapFast },
#else
{ .dev = SPI2, .nss = IO_TAG(SPI2_NSS_PIN), .sck = IO_TAG(SPI2_SCK_PIN), .miso = IO_TAG(SPI2_MISO_PIN), .mosi = IO_TAG(SPI2_MOSI_PIN), .rcc = RCC_APB1L(SPI2), .sckAF = GPIO_AF5_SPI2, .misoAF = GPIO_AF5_SPI2, .mosiAF = GPIO_AF5_SPI2, .divisorMap = spiDivisorMapSlow },
{ .dev = NULL }, // No SPI1
#endif

#ifdef USE_SPI_DEVICE_2
{ .dev = SPI2, .nss = IO_TAG(SPI2_NSS_PIN), .sck = IO_TAG(SPI2_SCK_PIN), .miso = IO_TAG(SPI2_MISO_PIN), .mosi = IO_TAG(SPI2_MOSI_PIN), .rcc = RCC_APB1L(SPI2), .sckAF = SPI2_SCK_AF, .misoAF = SPI2_MISO_AF, .mosiAF = SPI2_MOSI_AF, .divisorMap = spiDivisorMapSlow },
#else
{ .dev = NULL }, // No SPI2
#endif

#ifdef USE_SPI_DEVICE_3
#if defined(SPI3_SCK_AF) || defined(SPI3_MISO_AF) || defined(SPI3_MOSI_AF)
#if !defined(SPI3_SCK_AF) || !defined(SPI3_MISO_AF) || !defined(SPI3_MOSI_AF)
#error SPI3: SCK, MISO and MOSI AFs should be defined together in target.h!
#endif
{ .dev = SPI3, .nss = IO_TAG(SPI3_NSS_PIN), .sck = IO_TAG(SPI3_SCK_PIN), .miso = IO_TAG(SPI3_MISO_PIN), .mosi = IO_TAG(SPI3_MOSI_PIN), .rcc = RCC_APB1L(SPI3), .sckAF = SPI3_SCK_AF, .misoAF = SPI3_MISO_AF, .mosiAF = SPI3_MOSI_AF, .divisorMap = spiDivisorMapSlow },
#else
{ .dev = SPI3, .nss = IO_TAG(SPI3_NSS_PIN), .sck = IO_TAG(SPI3_SCK_PIN), .miso = IO_TAG(SPI3_MISO_PIN), .mosi = IO_TAG(SPI3_MOSI_PIN), .rcc = RCC_APB1L(SPI3), .sckAF = GPIO_AF6_SPI3, .misoAF = GPIO_AF6_SPI3, .mosiAF = GPIO_AF6_SPI3, .divisorMap = spiDivisorMapSlow },
#endif
#else
{ .dev = NULL }, // No SPI3
#endif

#ifdef USE_SPI_DEVICE_4
#if defined(SPI4_SCK_AF) || defined(SPI4_MISO_AF) || defined(SPI4_MOSI_AF)
#if !defined(SPI4_SCK_AF) || !defined(SPI4_MISO_AF) || !defined(SPI4_MOSI_AF)
#error SPI4: SCK, MISO and MOSI AFs should be defined together in target.h!
#endif
{ .dev = SPI4, .nss = IO_TAG(SPI4_NSS_PIN), .sck = IO_TAG(SPI4_SCK_PIN), .miso = IO_TAG(SPI4_MISO_PIN), .mosi = IO_TAG(SPI4_MOSI_PIN), .rcc = RCC_APB2(SPI4), .sckAF = SPI4_SCK_AF, .misoAF = SPI4_MISO_AF, .mosiAF = SPI4_MOSI_AF, .divisorMap = spiDivisorMapSlow }
#else
{ .dev = SPI4, .nss = IO_TAG(SPI4_NSS_PIN), .sck = IO_TAG(SPI4_SCK_PIN), .miso = IO_TAG(SPI4_MISO_PIN), .mosi = IO_TAG(SPI4_MOSI_PIN), .rcc = RCC_APB2(SPI4), .sckAF = GPIO_AF5_SPI4, .misoAF = GPIO_AF5_SPI4, .mosiAF = GPIO_AF5_SPI4, .divisorMap = spiDivisorMapSlow }
#endif
#else
{ .dev = NULL } // No SPI4
#endif
};
#else
static spiDevice_t spiHardwareMap[] = {
#elif defined(STM32F7)
#include "bus_spi_stm32f7xx.h"

// Auto-resolve SPI AF per pin from the lookup table in bus_spi_stm32f7xx.h.
// Targets may still define individual SPI*_SCK/MISO/MOSI_AF values in target.h
// to override; explicit defines take priority via these #ifndef guards.
#ifdef USE_SPI_DEVICE_1
#if defined(SPI1_SCK_AF) || defined(SPI1_MISO_AF) || defined(SPI1_MOSI_AF)
#if !defined(SPI1_SCK_AF) || !defined(SPI1_MISO_AF) || !defined(SPI1_MOSI_AF)
#error SPI1: SCK, MISO and MOSI AFs should be defined together in target.h!
#ifndef SPI1_SCK_AF
#define SPI1_SCK_AF SPI_PIN_AF_HELPER(1, SPI1_SCK_PIN)
#endif
{ .dev = SPI1, .nss = IO_TAG(SPI1_NSS_PIN), .sck = IO_TAG(SPI1_SCK_PIN), .miso = IO_TAG(SPI1_MISO_PIN), .mosi = IO_TAG(SPI1_MOSI_PIN), .rcc = RCC_APB2(SPI1), .sckAF = SPI1_SCK_AF, .misoAF = SPI1_MISO_AF, .mosiAF = SPI1_MOSI_AF, .divisorMap = spiDivisorMapFast },
#else
{ .dev = SPI1, .nss = IO_TAG(SPI1_NSS_PIN), .sck = IO_TAG(SPI1_SCK_PIN), .miso = IO_TAG(SPI1_MISO_PIN), .mosi = IO_TAG(SPI1_MOSI_PIN), .rcc = RCC_APB2(SPI1), .sckAF = GPIO_AF5_SPI1, .misoAF = GPIO_AF5_SPI1, .mosiAF = GPIO_AF5_SPI1, .divisorMap = spiDivisorMapFast },
#ifndef SPI1_MISO_AF
#define SPI1_MISO_AF SPI_PIN_AF_HELPER(1, SPI1_MISO_PIN)
#endif
#ifndef SPI1_MOSI_AF
#define SPI1_MOSI_AF SPI_PIN_AF_HELPER(1, SPI1_MOSI_PIN)
#endif
#else
{ .dev = NULL }, // No SPI1
#endif

#ifdef USE_SPI_DEVICE_2
#if defined(SPI2_SCK_AF) || defined(SPI2_MISO_AF) || defined(SPI2_MOSI_AF)
#if !defined(SPI2_SCK_AF) || !defined(SPI2_MISO_AF) || !defined(SPI2_MOSI_AF)
#error SPI2: SCK, MISO and MOSI AFs should be defined together in target.h!
#ifndef SPI2_SCK_AF
#define SPI2_SCK_AF SPI_PIN_AF_HELPER(2, SPI2_SCK_PIN)
#endif
{ .dev = SPI2, .nss = IO_TAG(SPI2_NSS_PIN), .sck = IO_TAG(SPI2_SCK_PIN), .miso = IO_TAG(SPI2_MISO_PIN), .mosi = IO_TAG(SPI2_MOSI_PIN), .rcc = RCC_APB1(SPI2), .sckAF = SPI2_SCK_AF, .misoAF = SPI2_MISO_AF, .mosiAF = SPI2_MOSI_AF, .divisorMap = spiDivisorMapSlow },
#ifndef SPI2_MISO_AF
#define SPI2_MISO_AF SPI_PIN_AF_HELPER(2, SPI2_MISO_PIN)
#endif
#ifndef SPI2_MOSI_AF
#define SPI2_MOSI_AF SPI_PIN_AF_HELPER(2, SPI2_MOSI_PIN)
#endif
#endif

#ifdef USE_SPI_DEVICE_3
#ifndef SPI3_SCK_AF
#define SPI3_SCK_AF SPI_PIN_AF_HELPER(3, SPI3_SCK_PIN)
#endif
#ifndef SPI3_MISO_AF
#define SPI3_MISO_AF SPI_PIN_AF_HELPER(3, SPI3_MISO_PIN)
#endif
#ifndef SPI3_MOSI_AF
#define SPI3_MOSI_AF SPI_PIN_AF_HELPER(3, SPI3_MOSI_PIN)
#endif
#endif

#ifdef USE_SPI_DEVICE_4
#ifndef SPI4_SCK_AF
#define SPI4_SCK_AF SPI_PIN_AF_HELPER(4, SPI4_SCK_PIN)
#endif
#ifndef SPI4_MISO_AF
#define SPI4_MISO_AF SPI_PIN_AF_HELPER(4, SPI4_MISO_PIN)
#endif
#ifndef SPI4_MOSI_AF
#define SPI4_MOSI_AF SPI_PIN_AF_HELPER(4, SPI4_MOSI_PIN)
#endif
#endif

static spiDevice_t spiHardwareMap[] = {
#ifdef USE_SPI_DEVICE_1
{ .dev = SPI1, .nss = IO_TAG(SPI1_NSS_PIN), .sck = IO_TAG(SPI1_SCK_PIN), .miso = IO_TAG(SPI1_MISO_PIN), .mosi = IO_TAG(SPI1_MOSI_PIN), .rcc = RCC_APB2(SPI1), .sckAF = SPI1_SCK_AF, .misoAF = SPI1_MISO_AF, .mosiAF = SPI1_MOSI_AF, .divisorMap = spiDivisorMapFast },
#else
{ .dev = SPI2, .nss = IO_TAG(SPI2_NSS_PIN), .sck = IO_TAG(SPI2_SCK_PIN), .miso = IO_TAG(SPI2_MISO_PIN), .mosi = IO_TAG(SPI2_MOSI_PIN), .rcc = RCC_APB1(SPI2), .sckAF = GPIO_AF5_SPI2, .misoAF = GPIO_AF5_SPI2, .mosiAF = GPIO_AF5_SPI2, .divisorMap = spiDivisorMapSlow },
{ .dev = NULL }, // No SPI1
#endif

#ifdef USE_SPI_DEVICE_2
{ .dev = SPI2, .nss = IO_TAG(SPI2_NSS_PIN), .sck = IO_TAG(SPI2_SCK_PIN), .miso = IO_TAG(SPI2_MISO_PIN), .mosi = IO_TAG(SPI2_MOSI_PIN), .rcc = RCC_APB1(SPI2), .sckAF = SPI2_SCK_AF, .misoAF = SPI2_MISO_AF, .mosiAF = SPI2_MOSI_AF, .divisorMap = spiDivisorMapSlow },
#else
{ .dev = NULL }, // No SPI2
#endif

#ifdef USE_SPI_DEVICE_3
#if defined(SPI3_SCK_AF) || defined(SPI3_MISO_AF) || defined(SPI3_MOSI_AF)
#if !defined(SPI3_SCK_AF) || !defined(SPI3_MISO_AF) || !defined(SPI3_MOSI_AF)
#error SPI3: SCK, MISO and MOSI AFs should be defined together in target.h!
#endif
{ .dev = SPI3, .nss = IO_TAG(SPI3_NSS_PIN), .sck = IO_TAG(SPI3_SCK_PIN), .miso = IO_TAG(SPI3_MISO_PIN), .mosi = IO_TAG(SPI3_MOSI_PIN), .rcc = RCC_APB1(SPI3), .sckAF = SPI3_SCK_AF, .misoAF = SPI3_MISO_AF, .mosiAF = SPI3_MOSI_AF, .divisorMap = spiDivisorMapSlow },
#else
{ .dev = SPI3, .nss = IO_TAG(SPI3_NSS_PIN), .sck = IO_TAG(SPI3_SCK_PIN), .miso = IO_TAG(SPI3_MISO_PIN), .mosi = IO_TAG(SPI3_MOSI_PIN), .rcc = RCC_APB1(SPI3), .sckAF = GPIO_AF6_SPI3, .misoAF = GPIO_AF6_SPI3, .mosiAF = GPIO_AF6_SPI3, .divisorMap = spiDivisorMapSlow },
#endif
#else
{ .dev = NULL }, // No SPI3
#endif

#ifdef USE_SPI_DEVICE_4
#if defined(SPI4_SCK_AF) || defined(SPI4_MISO_AF) || defined(SPI4_MOSI_AF)
#if !defined(SPI4_SCK_AF) || !defined(SPI4_MISO_AF) || !defined(SPI4_MOSI_AF)
#error SPI3: SCK, MISO and MOSI AFs should be defined together in target.h!
#endif
{ .dev = SPI4, .nss = IO_TAG(SPI4_NSS_PIN), .sck = IO_TAG(SPI4_SCK_PIN), .miso = IO_TAG(SPI4_MISO_PIN), .mosi = IO_TAG(SPI4_MOSI_PIN), .rcc = RCC_APB2(SPI4), .sckAF = SPI4_SCK_AF, .misoAF = SPI4_MISO_AF, .mosiAF = SPI4_MOSI_AF, .divisorMap = spiDivisorMapSlow }
#else
{ .dev = SPI4, .nss = IO_TAG(SPI4_NSS_PIN), .sck = IO_TAG(SPI4_SCK_PIN), .miso = IO_TAG(SPI4_MISO_PIN), .mosi = IO_TAG(SPI4_MOSI_PIN), .rcc = RCC_APB2(SPI4), .sckAF = GPIO_AF5_SPI4, .misoAF = GPIO_AF5_SPI4, .mosiAF = GPIO_AF5_SPI4, .divisorMap = spiDivisorMapSlow }
#endif
#else
{ .dev = NULL } // No SPI4
#endif
Expand Down
Loading
Loading