Estoy usando un Intel Edison con Arduino Breakout Board para comunicarme a través de SPI con un < a href="http://cdn.usdigital.com/assets/general/LS7366R.pdf"> Buffer de codificador de cuadratura LS7366R . Estoy usando el QEB como un temporizador: un pulso que ingresa al índice cambiará el registro del contador a un registro OTR para la lectura.
Mi problema es con la velocidad de la comunicación SPI de IE a QEB. Estoy programando IE con una mraa library para comunicarme a través de SPI en C . De acuerdo con una velocidad de reloj de 6.25 MHz, debería tomar 1.28 microsegundos para transferir 1 byte. En su lugar, toma 60 microsegundos. No sé por qué mi comunicación SPI es lenta. Ya me he asegurado de que la comunicación funcione correctamente, aunque sea lenta.
Prueba: el siguiente código tarda en promedio .61 segundos en ejecutarse. Si quito la línea 3, toma en promedio .005 segundos para ejecutarse.
1. for(i = 0; i < 10000; i++) {
2. mraa_gpio_write(ss_o, 0); // ss_o is slave select one
3. mraa_spi_write(spi, 0x60); // transfer 1 byte via spi
4. mraa_gpio_write(ss_o, 1); // end transmission
5. }
Mi pregunta: ¿Cómo puedo acelerar mis comunicaciones spi?
Estoy usando la versión mraa: v0.6.1
EDITAR: Después de transmitir 5 bytes de datos a la vez, encontré que la inicialización puede tardar mucho tiempo. Reemplazando la línea 3 arriba con ...
3. mraa_spi_write_buf(spi, write_buf, 5);
... resulta en .65 segundos, un minuto de aumento de tiempo por 5 veces los datos enviados. No soy un experto en el análisis de bibliotecas, ¿puede alguien ayudarme a encontrar el cuello de botella en la biblioteca de mraa spi? Quiero ver si puedo editarlo para acelerar las llamadas SPI.
EDITAR: ACLARACIÓN: Tengo la intención de usar el contador como un temporizador; cada vez que entra un pulso quiero saber cuándo entró. Por lo tanto, necesito lecturas rápidas y repetidas del registro OTR.
EDITAR: código completo añadido:
#include <stdio.h>
#include <time.h>
#include "mraa.h"
int i = 0;
mraa spi_context spi;
mraa_gpio_context ss_o; // ss_o is slave select one
clock_t start, end;
int main(void) {
spi = mraa_spi_init(0);
mraa_spi_frequency(spi, 6250000); // Set frequency to 6.25 MHz
mraa_spi_mode(spi, 0);
ss_o = mraa_gpio_init(10); // ss_o is pin 10)
mraa_gpio_dir(ss_o, MRAA_GPIO_OUT);
mraa_gpio_use_mmaped(ss_o, 1);
mraa_gpio_write(ss_o, 1);
// Initialize counters
mraa_gpio_write(ss_o, 0); // Begin SPI conversation
mraa_spi_write(spi, 0x90);
mraa_spi_write(spi, 0x1);
mraa_gpio_write(ss_o, 1); // Terminate SPI conversation
mraa_gpio_write(ss_o, 0); // Begin SPI conversation
mraa_spi_write(spi, 0x88);
mraa_spi_write(spi, 0x30);
mraa_gpio_write(ss_o, 1); // Terminate SPI conversation
start = clock(); // For measuring time
for(i = 0; i < 10000; i++) {
mraa_gpio_write(ss_o, 0); // ss_o is slave select one
mraa_spi_write(spi, 0x60); // transfer 1 byte via spi
mraa_gpio_write(ss_o, 1); // end transmission
}
end = clock();
double diff = (double)(end - start) / (CLOCKS_PER_SEC);
printf("Time elapsed: %f\n", diff);
}