Это может быть связано с внутренним подтягивающим резистором. Согласно данным SAM3X / A,
Управление подтягивающим резистором возможно независимо от конфигурации линии ввода / вывода.
После сброса все подтягивания включены.
Если вы перебираете все найденные файлы включения:
../Arduino/hardware/arduino/samd/cores/arduino/wiring_digtal.c
Линия 124 определяет pinMode(uint32_t ulPin, uint32_t ulMode)
функцию. Изучая инструкцию switch / case для INPUT против INPUT_PULLUP против OUTPUT, вы видите следующее:
- INPUT устанавливает регистр в
reg = PORT_PINCFG_INEN
.
- INPUT_PULLUP устанавливает регистр в
reg = (PORT_PINCFG_INEN | PORT_PINCFG_PULLEN)
- OUTPUT устанавливает регистр в
reg &= ~PORT_PINCFG_INEN
.
«Регистр» в каждом случае одинаков. Я не могу на всю жизнь найти, какое значение PORT_PINCFG_INEN или PORT_PINCFG_PULLEN определены как, но они, без сомнения, просто 8-битные маски (они приводятся к uint8_t, когда они назначаются в «регистр»). Таким образом, мы можем предположить, что любой бит, управляющий вводом / выводом, активен при подтверждении, как и бит подтягивания. Например:
PORT_PINCFG_INEN = b'00000001';
PORT_PINCFG_PULLEN = b'00000010';
~PORT_PINCFG_INEN = b'11111110';
Если подтяжки активируются после сброса, мы можем сказать, что при сбросе:
reg = b'xxxxxx1x';
Пункт 3 выше строго подразумевает, что инструкция:
reg = b'xxxxxx1x' & 'b11111110';
so
reg = b'xxxxxx10'; // pull-up is enabled!
Поэтому, если вы вызываете pinMode (X, OUTPUT) раньше, чем-либо еще, вы в конечном итоге получите включенный нагрузочный резистор. Установка вывода на вход очистит бит включения подтягивания, после чего вы можете установить вывод на выход, и этот бит останется чистым.
Тем не менее, вся arguement падает с простым фактом , что , если вы не вызываете pinMode () вообще , проблема не возникает ...
SPI.setDataMode(10, SPI_MODE1);
? Также полезен только второй, так какbegin()
вызывает setDataMode. Глядя на исходный код, похоже, что библиотека SPI не меняет указанный вами вывод (хотя я не знаю ARM).