En los dispositivos AVR ATmega, el USART tiene la capacidad de funcionar en modo SPI (es decir, síncrono sin bits de inicio o parada). La principal diferencia operativa es que la línea TX (es decir, MOSI) tiene un búfer, mientras que la MOSI de hardware SPI no tiene búfer. De acuerdo con esta nota de la aplicación Atmel ( enlace ), este búfer hace posible la transmisión continua de datos. Esto contrasta con el hardware SPI, donde SCK debe detenerse mientras se carga un nuevo byte en SPDR.
Teniendo esto en cuenta, ¿cuál de los siguientes programas para transmitir 200 bytes desde un búfer buf[200]
se completaría en el menor tiempo posible? (Suponga que todos están configurados en fosc / 2
.)
SPI encuestado:
for(int B = 0; B < 200; ++B)
{
SPDR = buf[B]; // Load next byte into SPDR
while(!(SPSR & (1 << SPIF))); // Wait for SPIF to be set
(int)SPDR; // Read SPDR to clear SPIF
}
SPI impulsado por interrupción:
ISR(SPI_STC_vect)
{
if(B < 200)
{
SPDR = buf[B]; // Load next byte into SPDR
++B;
}
else
{
SPCR &= ~(1 << SPIE); // Disable SPI interrupts
}
return;
}
USART encuestado en modo SPI:
for(int B = 0; B < 200; ++B)
{
UDR0 = buf[B]; // Load next byte into UDR
while(!(UCSR0A & (1 << UDRE))); // Wait for UDR empty
}
USART controlado por interrupción en modo SPI:
ISR(USART0_UDRE_vect)
{
if(B < 200)
{
UDR0 = buf[B]; // Load next byte into SPDR
++B;
}
else
{
UCSR0B &= ~(1 << UDRIE); // Disable UDRE interrupt
}
return;
}