¿Ayuda? Comunicación SPI lenta

1

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);

}
    
pregunta Paul Terwilliger

1 respuesta

1

Intente esto , no es necesario seleccionar el mismo esclavo y finalizar la transmisión para cada conteo , puede finalizarlo después de que se hayan completado todos los 10000 conteos

  mraa_gpio_write(ss_o, 0);  // ss_o is slave select one  
  for(i = 0; i < 10000; i++) 
    {
        mraa_spi_write(spi, 0x60); // transfer 1 byte via spi    
    }
mraa_gpio_write(ss_o, 1);  // end transmission

espero que esto ayude

    
respondido por el Lokanath

Lea otras preguntas en las etiquetas