Considere el siguiente ejemplo mínimo, donde configuré pinMode
antes de llamar a las funciones SPI:
#include <SPI.h>
void setup() {
pinMode(10, OUTPUT);
SPI.begin(10);
SPI.setDataMode(10,SPI_MODE1);
}
void loop() {
delay(1000);
SPI.transfer(10,1);
}
Ahora cuando SPI.transfer(10,1)
se llama loop()
, siempre veo que el pin esclavo seleccionado baja a 1.65V, ¡pero no a 0 como debería! (ver imagen a continuación)
Si no llamamos pinMode()
, así:
#include <SPI.h>
void setup() {
SPI.begin(10);
SPI.setDataMode(10,SPI_MODE1);
}
void loop() {
delay(1000);
SPI.transfer(10,1);
}
Obtenemos lo que esperaríamos al llamar SPI.transfer
:
¿Es eso un error o tienes una explicación para ese comportamiento?
¡Muchas gracias de antemano por su tiempo e interés!
arduino-due
spi
nuevo y perdido
fuente
fuente
SPI.setDataMode(10, SPI_MODE1);
? También solo el segundo es útil, ya quebegin()
llama a setDataMode. Al mirar el código fuente , parece que la biblioteca SPI no altera el pin que especificó (aunque no conozco ARM).Respuestas:
Puede tener algo que ver con la resistencia interna pull-up. De acuerdo con la hoja de datos SAM3X / A,
Si busca en todos los archivos de inclusión que encuentre:
La línea 124 define la
pinMode(uint32_t ulPin, uint32_t ulMode)
función. Al examinar la declaración de cambio / caso para INPUT vs INPUT_PULLUP vs OUTPUT, verá lo siguiente:reg = PORT_PINCFG_INEN
.reg = (PORT_PINCFG_INEN | PORT_PINCFG_PULLEN)
reg &= ~PORT_PINCFG_INEN
.El 'registro' en cada caso es el mismo. Por mi vida no puedo encontrar qué valor se define como PORT_PINCFG_INEN o PORT_PINCFG_PULLEN, pero sin duda son solo máscaras de 8 bits (se envían a uint8_t cuando se asignan al 'registro'). Por lo tanto, podemos suponer que cualquier bit que controla la entrada / salida está activo cuando se afirma, como es el bit pullup. Por ejemplo:
Si los pull-ups están habilitados después del reinicio, podemos decir que en el reinicio:
El punto (3) anterior implica fuertemente que la instrucción es:
Por lo tanto, si llama a pinMode (X, OUTPUT) antes que nada , terminará con la resistencia pullup habilitada. Establecer el pin en una entrada borrará el bit de activación de pullup, después de lo cual puede configurar el pin en una salida y el bit permanecerá limpio.
Sin embargo, todo el argumento se cae con el simple hecho de que si usted no llama pinMode () en absoluto , el problema no se produce ...
fuente