SDHC over SPI performance

I’m hacking on adding SDHC over SPI block device support to the Zephyr Project RTOS.

I’m currently getting 224 KiB/s on an Arduino Zero with a 4 MHz bus and 1 KiB read size, which is an OK-ish 46 % of the top bus capacity.

Here’s where the time goes:

  • 4550 us - total time to read 2x 512 byte blocks from the card
  • 80 us - time spent in ELM FS (impressive!) and timing code
  • 330 us - time for the no-name SD card to make the sector ready
  • 1500 us - time to transfer 512 bytes over SPI
  • 330 us - time to calculate the CRC to check the sector

The SPI transfer itself is done in bursts of 16 bytes (~32 us) and the SPI driver has a turn-around time of 16 us.

Turning that into percentages,

  • 4 % is in core code
  • 15 % is in the SD card
  • 67 % is in the SPI transfer
  • 15 % is in the CRC

The next steps are to optimise the SPI driver and use the hardware CRC unit. That could bring the time per block down to (80 + 330 + 1000 + 100) = ~1500 us and the transfer rate up to 332 KiB/s / 67 % utilisation.