Изменить контакты SPI MKR Zero SD
Я пытаюсь узнать больше об использовании микроконтроллера ATSAMD21 с Arduino. Я разработал и собрал простую плату расширения, успешно прошил загрузчик MKR Zero и загрузил скетчи на SD-карту с помощью библиотеки SDU.
Было бы неплохо иметь возможность менять контакты, используемые для SD-карты, но все мои попытки (с помощью руководства Adafruit по добавлению нового SPI) безуспешны. Вот что я делаю:
- Загрузите скетч, скомпилированный с использованием исходных файлов вариантов.
- Измените файлы вариантов.
- Перезапустите IDE (я также пробовал перезагружать машину).
- Скомпилируйте скетч, скопируйте двоичный файл на SD-карту.
- Загрузите с 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]
Я что-то делаю не так? Связаны ли изменения с загрузчиком? Буду благодарен за любую помощь.
1 ответ
Библиотека SDU содержит двоичные файлы скетча SDUBoot, созданного для конкретных плат.
Поскольку скетч SDUBoot был создан для конкретной платы с ее выводами SPI по умолчанию и выбранным выводом CS, невозможно изменить выводы SPI или вывод CS в скетче, который использует библиотеку SDU.
- Как увеличить скорость записи на SD-карту в Ардуино
- Какие контакты можно использовать для выбора микросхемы (CS, CC) на Arduino Nano Every?
- Сделать CS (chip select) для работаты в SPI (для и SD карты и OLED)
- Использование экрана SD-карты на Arduino Due
- Загрузить сайт с SD-карты
- Отобразить изображение с SD-карты на ЖК-дисплей ILI9486
- Аппаратный SPI Arduino NANO не работает
- Не удалось установить SD-карту с Waveshare ESP32 с использованием Arduino IDE
Просматривая скетч 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