1
\$\begingroup\$

I am using an Intel Edison with Arduino Breakout Board to communicate via SPI to a LS7366R Quadrature Encoder Buffer. I am using the QEB as a timer: a pulse that enters the index will shift the counter register to an OTR register for reading.

My problem is with the speed of SPI communication from IE to QEB. I am programming IE with a mraa library to communicate via SPI in C. According to a clock speed of 6.25 MHz, it should take 1.28 microseconds to transfer 1 byte. Instead, it takes 60 microseconds. I do not know why my SPI communication is slow. I have already ensured that communication is working properly, albeit slow.

Proof: The following code takes on average .61 seconds to execute. If I remove line 3, it takes on average .005 seconds to execute.

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. }

My question: How can I speed up my spi communications?

I am using mraa version: v0.6.1

EDIT: After transmitting 5 bytes of data at a time, I found that the initialization may be taking a long time. Replacing line 3 above with...

3.    mraa_spi_write_buf(spi, write_buf, 5);

... results in .65 seconds, a minute increase of time for 5 times the data sent. I am not an expert on parsing libraries, so can anyone help me find the bottleneck in the mraa spi library? I want to see if I can edit it to speed up the SPI calls.

EDIT: CLARIFICATION: I am intending to use the counter as a timer; every time a pulse comes in I want to know when it came in. Therefore, I need fast repeated reads of the OTR register.

EDIT: added full code:

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

}
\$\endgroup\$
7
  • \$\begingroup\$ What is the data rate? \$\endgroup\$
    – MathieuL
    Commented Aug 17, 2015 at 16:00
  • \$\begingroup\$ where is the piece that initializes SPI peripheral? \$\endgroup\$ Commented Aug 17, 2015 at 16:08
  • \$\begingroup\$ I have omitted the initialization code. I can add that. \$\endgroup\$ Commented Aug 17, 2015 at 16:17
  • \$\begingroup\$ I'd suggest to try mraa_spi_write_buf, doing a large enough block transfer and comparing the results. Possibly the time to setup the SPI port over and over to transfer each byte is eating a lot of time. \$\endgroup\$
    – fceconel
    Commented Aug 17, 2015 at 16:32
  • \$\begingroup\$ @fceconel I will try that and post results, thanks! \$\endgroup\$ Commented Aug 17, 2015 at 16:59

1 Answer 1

1
\$\begingroup\$

Try this,,,,there is no need to select same slave and end transmission for every count,,,,you can end it after all 10000 counts are finished

  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

hope this helps

\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.