Изменить контакты SPI MKR Zero SD

spi sd-card samd21g

Я пытаюсь узнать больше об использовании микроконтроллера ATSAMD21 с Arduino. Я разработал и собрал простую плату расширения, успешно прошил загрузчик MKR Zero и загрузил скетчи на SD-карту с помощью библиотеки SDU.

Было бы неплохо иметь возможность менять контакты, используемые для SD-карты, но все мои попытки (с помощью руководства Adafruit по добавлению нового SPI) безуспешны. Вот что я делаю:

  1. Загрузите скетч, скомпилированный с использованием исходных файлов вариантов.
  2. Измените файлы вариантов.
  3. Перезапустите IDE (я также пробовал перезагружать машину).
  4. Скомпилируйте скетч, скопируйте двоичный файл на SD-карту.
  5. Загрузите с SD-разъемом, подключенным к оригинальным контактам SD SPI.

На этом этапе я ожидаю, что выводы SD SPI обновятся до PA20, PA21, PA22, PA23, как показано в изменённом коде ниже. Однако скетч не загружается, если я не оставлю вывод SD подключённым к исходным выводам SD SPI.

MKR Zero Original Variant.h:

// SPI1: Connected to SD
#define PIN_SPI1_MISO (29u)
#define PIN_SPI1_MOSI (26u)
#define PIN_SPI1_SCK  (27u)
#define PIN_SPI1_SS   (28u)
#define PERIPH_SPI1   sercom4
#define PAD_SPI1_TX   SPI_PAD_0_SCK_1
#define PAD_SPI1_RX   SERCOM_RX_PAD_3

MKR Zero Modified Variant.h:

// SPI1: подключен к SD
#define PIN_SPI1_MISO (6u) //PA20
#define PIN_SPI1_MOSI (0u) //PA22
#define PIN_SPI1_SCK  (7u) //PA21
#define PIN_SPI1_SS   (1u) //PA23
#define PERIPH_SPI1   sercom3
#define PAD_SPI1_TX   SPI_PAD_0_SCK_3
#define PAD_SPI1_RX   SERCOM_RX_PAD_2

MKR Zero Original Variant.cpp:

  { PORTA, 12, PIO_SERCOM_ALT, (PIN_ATTR_NONE), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // MOSI: SERCOM4/PAD[0]
  { PORTA, 13, PIO_SERCOM_ALT, (PIN_ATTR_NONE), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // SCK:  SERCOM4/PAD[1]
  { PORTA, 14, PIO_DIGITAL,    (PIN_ATTR_NONE), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // SS:   as GPIO
  { PORTA, 15, PIO_SERCOM_ALT, (PIN_ATTR_NONE), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // MISO: SERCOM4/PAD[3]

MKR Zero Modified Variant.cpp:

  { PORTA, 22, PIO_SERCOM,     (PIN_ATTR_NONE), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // MOSI: SERCOM3/PAD[0]
  { PORTA, 21, PIO_SERCOM_ALT, (PIN_ATTR_NONE), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // SCK:  SERCOM3/PAD[3]
  { PORTA, 23, PIO_DIGITAL,    (PIN_ATTR_NONE), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // SS:   as GPIO
  { PORTA, 20, PIO_SERCOM_ALT, (PIN_ATTR_NONE), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // MISO: SERCOM3/PAD[2]

Я что-то делаю не так? Связаны ли изменения с загрузчиком? Буду благодарен за любую помощь.

, 👍0


1 ответ


0

Библиотека SDU содержит двоичные файлы скетча SDUBoot, созданного для конкретных плат.

Поскольку скетч SDUBoot был создан для конкретной платы с ее выводами SPI по умолчанию и выбранным выводом CS, невозможно изменить выводы SPI или вывод CS в скетче, который использует библиотеку SDU.

,

Просматривая скетч SDUBoot, я не вижу никаких указаний на используемые пины. Есть ли определённый процесс, которому можно следовать, чтобы изменить пины? Может быть, изменить файлы вариантов, как я, открыть скетч SDUBoot в среде Arduino IDE, скомпилировать и что-то сделать с выходными файлами?, @SolveEtCoagula07

@SolveEtCoagula07, каждая плата имеет контакты SPI по умолчанию, определенные так, как они обозначены на схеме расположения выводов платы., @Juraj

Разве build.sh не будет использоваться для генерации двоичных файлов для скетча SDUBoot? Я внёс изменения и сравнил выходной заголовочный файл с заголовочным файлом для той же платы на GitHub. Казалось, это сработает, но при попытке скомпилировать новый скетч, включающий SDU.h, возникает ошибка «слишком много инициализаторов для 'unsigned char [16384]»., @SolveEtCoagula07

@SolveEtCoagula07 размер вашего bin-файла SDUBoot превышает пространство, зарезервированное для загрузочного двоичного файла SDU (0x4000). Включена ли у вас отладка?, @Juraj

Исходный файл mkrzero.h весит 91,4 КБ, а файл, который я генерирую при запуске build.sh, — 106,5 КБ. Нужно ли добавить какие-либо параметры в команду, чтобы уменьшить размер? Я ничего не менял в файлах вариантов или SDUBoot.ino., @SolveEtCoagula07