Una hoja de datos AVR típica contiene el siguiente ejemplo de una configuración del modo SPI Master (aquí, desde la página 164 de la hoja de datos ATmega128 / L ):
void SPI_MasterInit(void)
{
/* Set MOSI and SCK output, all others input */
DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK);
/* Enable SPI, Master, set clock rate fck/16 */
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}
void SPI_MasterTransmit(char cData)
{
/* Start transmission */
SPDR = cData;
/* Wait for transmission complete */
while (!(SPSR & (1<<SPIF)))
;
}
Tenga en cuenta que la inicialización del registro de dirección de los datos, aquí como DDR_SPI, establece el pin SS en entrada (implícito en "todos los demás en entrada").
Sin embargo, la sección sobre la funcionalidad del pin SS (que sigue al código, en la página 166) indica para el Modo maestro :
Si SS se configura como una salida, el pin es un pin de salida general Lo que no afecta al sistema SPI. Normalmente, el pin será conduciendo el pin SS del esclavo SPI.
Si SS está configurado como una entrada, debe mantenerse alto para garantizar la operación del SPI maestro . Si el pin SS es conducido bajo por los circuitos periféricos cuando el SPI está configurado como un maestro con el pin SS definido como una entrada, el sistema SPI interpreta esto como otro maestro seleccionando el SPI como esclavo y comenzando a enviar datos a ella Para evitar la contención del bus, el sistema SPI realiza las siguientes acciones:
- El bit MSTR en SPCR se borra y el sistema SPI se convierte en esclavo . Como resultado de que el SPI se convierte en esclavo, los pines MOSI y SCK se convierten en entradas.
- Se establece el indicador SPIF en SPSR, y si la interrupción SPI está habilitada, y se establece el bit I en SREG, se ejecutará la rutina de interrupción.
Por lo tanto, cuando la transmisión SPI controlada por interrupciones se utiliza en modo maestro, y existe la posibilidad de que los SS sean bajos, la interrupción Siempre se debe verificar que el bit MSTR todavía está establecido. Si el bit MSTR ha sido borrado por una selección de esclavos, debe ser configurado por el usuario para volver a habilitar el modo maestro SPI.
(Énfasis mío).
Ahora, el código funciona bien para mí, pero no entiendo por qué. La dirección del pin SS del Maestro se establece en entrada, pero ¿qué es lo que lo mantiene alto? El código no activa el pull-up. Me parece que un alfiler flotante podría desencadenar las consecuencias 1. y 2., lo que hace que el maestro se convierta en esclavo. Pero me parece difícil creer que los ejemplos de código emplearían un escenario tan impredecible.