USART en modo SPI frente a la velocidad del hardware SPI

1

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;
}
    
pregunta HaLailah HaZeh

1 respuesta

1

A menos que haya muchas interrupciones de la competencia, el método USART de sondeo sería el más rápido.

Para fast las transferencias SPI (con fosc/2 ) la entrada y salida de interrupción serían demasiado largas, y los métodos SPI tienen las brechas mencionadas en la pregunta.

    
respondido por el Turbo J

Lea otras preguntas en las etiquetas