Pode ter algo a ver com o resistor pull up interno. De acordo com a folha de dados SAM3X / A,
O controle do resistor de pull-up é possível independentemente da configuração da linha de E / S.
Após a redefinição, todas as pull-ups são ativadas.
Se você pesquisar em todos os arquivos de inclusão, encontrará:
../Arduino/hardware/arduino/samd/cores/arduino/wiring_digtal.c
A linha 124 define a pinMode(uint32_t ulPin, uint32_t ulMode)
função. Examinando a instrução switch / case para INPUT vs INPUT_PULLUP vs OUTPUT, você vê o seguinte:
- INPUT define um registro para
reg = PORT_PINCFG_INEN
.
- INPUT_PULLUP define um registro para
reg = (PORT_PINCFG_INEN | PORT_PINCFG_PULLEN)
- OUTPUT define um registro para
reg &= ~PORT_PINCFG_INEN
.
O 'registro' em cada caso é o mesmo. Eu não consigo encontrar o valor PORT_PINCFG_INEN ou PORT_PINCFG_PULLEN definido, mas sem dúvida são apenas máscaras de 8 bits (elas são convertidas em uint8_t quando atribuídas ao 'registrador'). Portanto, podemos assumir que qualquer bit que controla a entrada / saída está ativo quando afirmado, assim como o bit pullup. Por exemplo:
PORT_PINCFG_INEN = b'00000001';
PORT_PINCFG_PULLEN = b'00000010';
~PORT_PINCFG_INEN = b'11111110';
Se as pull-ups estiverem ativadas após a redefinição, podemos dizer que na redefinição:
reg = b'xxxxxx1x';
O ponto (3) acima implica fortemente que a instrução é:
reg = b'xxxxxx1x' & 'b11111110';
so
reg = b'xxxxxx10'; // pull-up is enabled!
Portanto, se você chamar pinMode (X, OUTPUT) antes de qualquer outra coisa , acabará com o resistor de pullup ativado. Definir o pino como uma entrada limpará o bit de ativação de pullup, após o qual você poderá definir o pino para uma saída e o bit permanecerá limpo.
No entanto, todo o argumento cai com o simples fato de que se você não chamar pinMode () em tudo , o problema não ocorre ...
SPI.setDataMode(10, SPI_MODE1);
? Além disso, apenas o segundo é útil, comobegin()
chama setDataMode. Observando o código - fonte , parece que a biblioteca SPI não altera o pino especificado (embora eu não conheça o ARM).