Estoy ejecutando un ATMega88A a 8MHz y tengo el SPI configurado para ejecutarse en Fosc / 2 = 4MHz.
En teoría, desplazar 5000 bytes sobre SPI debería tomar 1/4000000 * 8 * 5000 = 10ms . Pero de acuerdo con el temporizador interno, está tomando solo 19ms . Esto parece una tonelada de sobrecarga. ¿Es esto típico?
Código de muestra:
#include <avr/io.h>
#define set_output(portdir,pin) portdir |= (1<<pin)
void init() {
// Set MOSI, SCK, SS as Output
set_output(DDRB, DDB5);
set_output(DDRB, DDB3);
set_output(DDRB, DDB2);
// Enable SPI, Set as Master, Set CPOL & CPHA to 1 (SPI mode 3)
SPCR = (1 << SPE) | (1 << MSTR) | (1 << CPOL) | (1 << CPHA);
SPSR = (1 << SPI2X); // Enable SPI clock doubler
DDRD = 0xff; // Set PORTD as output
TCCR1B |= (1 << CS12) | (1 << CS10); // Setup Timer with 1024 prescaling
}
int main(void) {
unsigned int i;
init();
TCNT1 = 0; //zero the timer
for (i = 0; i < 5000; i++) {
SPDR = 0; // Load data into the SPI data reg
while (!(SPSR & (1 << SPIF))); //Wait until transmission complete
}
PORTD = (unsigned char) TCNT1; // Display the timer on PORTD
for (;;) {}
return 0;
}