Изменение порта SPI библиотеки Arduino SD library на Arduino Zero (ATSAMD21G18A)

Я пытался изменить порт SPI для SD-библиотеки на Arduino Zero с стандартного (MISO: PA12, MOSI: PB10 и SCK PB11) на следующий: (MISO: PA19(D12), MOSI: PA16(D11) и SCK PA17(D13)).

Я нашел в Интернете несколько руководств, самое полезное из которых-вот это.

Прочитав это, я изменил вариант.h для Arduino Zero на следующий:

/*
 * SPI Interfaces
 */
#define SPI_INTERFACES_COUNT 1

#define PIN_SPI_MISO         (34u)
#define PIN_SPI_MOSI         (35u)
#define PIN_SPI_SCK          (37u)
#define PERIPH_SPI           sercom1
#define PAD_SPI_TX           SPI_PAD_2_SCK_3
#define PAD_SPI_RX           SERCOM_RX_PAD_0

а потом я захотел изменить тип мультиплексора для входящих контактов variant.cpp но я запутался; В какой-то момент в файле он указывает связанные контакты как следующие, а позже как SPI-контакты.

Устанавливает MUX в качестве ТАЙМЕРА и ШИМ здесь:

{ PORTA, 16, PIO_TIMER, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM2_CH0, TCC2_CH0, EXTERNAL_INT_0 }, // TCC2/WO[0]
  { PORTA, 19, PIO_TIMER_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), No_ADC_Channel, PWM0_CH3, TCC0_CH3, EXTERNAL_INT_3 }, // TCC0/WO[3]

  // 13 (LED)
  { PORTA, 17, PIO_PWM, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM2_CH1, TCC2_CH1, EXTERNAL_INT_1 }, // TCC2/WO[1]

Затем он также описывает их следующим образом:

 // 34..37 - EDBG/SPI
  { PORTA, 19, PIO_SERCOM, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // MISO: SERCOM1/PAD[3]
  { PORTA, 16, PIO_SERCOM, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // MOSI: SERCOM1/PAD[0]
  { PORTA, 18, PIO_SERCOM, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // SS: SERCOM1/PAD[2]
  { PORTA, 17, PIO_SERCOM, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // SCK: SERCOM1/PAD[1]

Я закончил тем, что прокомментировал первый набор и заменил их следующими строками:

 { PORTA, 16, PIO_SERCOM, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM2_CH0, TCC2_CH0, EXTERNAL_INT_0 }, // TCC2/WO[0]
 { PORTA, 19, PIO_SERCOM, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), No_ADC_Channel, PWM0_CH3, TCC0_CH3, EXTERNAL_INT_3 }, // TCC0/WO[3]

  // 13 (LED)
  { PORTA, 17, PIO_SERCOM, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM2_CH1, TCC2_CH1, EXTERNAL_INT_1 }, // TCC2/WO[1]

и не притронулся ко второму набору.

Я хотел просто изменить основной SPI и не добавлять другой порт SPI, чтобы мне не пришлось изменять библиотеку SD.

Я попробовал их с примером SD CardInfo, и он всегда говорит мне, что инициализация не удалась, а также я проверил SD-карту и модуль с портом SPI по умолчанию, и он работает нормально.

Вы также можете посмотреть немодифицированные файлы здесь: variant.h variant.cpp

, 👍1