36 lines
1.5 KiB
Plaintext
36 lines
1.5 KiB
Plaintext
|
SD cards have very complex controllers and they are evolving in a manner that
|
||
|
make them difficult to use with the Arduino.
|
||
|
|
||
|
Higher end cards often perform poorly on the Arduino. Here is a bit of
|
||
|
background.
|
||
|
|
||
|
|
||
|
First, SPI mode is not used in most devices so the SPI controller is not
|
||
|
very good.
|
||
|
|
||
|
The flash erase groups in SD cards are very large, 128 KB is common. This
|
||
|
means that rewriting file structures can result in a huge amount of data
|
||
|
being moved.
|
||
|
|
||
|
This is what is happening when you see long clock activity. The card
|
||
|
indicates busy by holding data out low. The spec allow a card to go busy
|
||
|
for up to 250 ms.
|
||
|
|
||
|
Cards have two write modes, single block random mode and multiple block
|
||
|
sequential mode. For file writes I must use single block mode. This is
|
||
|
always slow but often extremely slow in high end cards. microSD cards also
|
||
|
have poor support for this mode.
|
||
|
|
||
|
I have several applications that use multiple block mode and they run much
|
||
|
faster. The binaryLogger.pde example can log 40,000 16-bit samples per
|
||
|
second without dropping data on a good SanDisk video card.
|
||
|
|
||
|
Looks like I should develop a Serial logger using this method. It requires
|
||
|
allocating a huge contiguous file and writing it using the multiple block
|
||
|
sequential mode. This makes the app more complex and not so easy to
|
||
|
understand.
|
||
|
|
||
|
The write time for a 512 byte block in sequential mode is about 850
|
||
|
microseconds with occasional busy times of 2 - 3 ms on a SanDisk Extreme
|
||
|
30 MB/sec card. In random mode this card is often slower than five year
|
||
|
old class 2 cards.
|