I’m using FEZ Spider and a SD card reader along with GPS and temperature modules. The attached camera takes 320x240 bitmaps and I wish to save these images to the SD card as often as possible. At the moment, I have set it to save two images per minute.
The problem is that it’s super slow. The function
takes about 6 to 10 seconds to complete on a class 6 Transcend SD HC SD card. These cards are meant to write atleast at 6 MB/s. So it shouldn't take very long to write the 226KB .bmp file to disk.
Here is the relavent code:
// writes camera picture to SD card. File names are incremented
// to ensure no duplicates over-write existing pictures
void writeImage(GT.Picture picture)
GT.StorageDevice SDCARD = sdCard.GetStorageDevice();
int imageNumber = SDCARD.ListFiles(Constants.DATA_DIRECTORY).Length;
string pathFileName = Constants.DATA_DIRECTORY +
"img" + (imageNumber++).ToString() + " " +
g_data[(int)Constants.titles.TIME] + ".bmp";
Debug.Print("Write image to SD card...");
Debug.Print("SD Card is not mounted. Could not save image.");
Is there anyway to speed up the write time of the bitmaps? Is this typical performance of the FEZ Spider?? I’m pretty sure it’s not a hardware problem because of the minimum write speed of the card.
have you timed the relevant portions of your code to see if the byte write is the long part ? String ops and directory ops will all take a non-trivial amount of time, but at the end of the day these devices are somewhat restricted in data throughput rates - they are in no way optimised for the kind of data rates needed for sustained rates of data with cameras, so maybe you’re just seeing the natural limit of the entire system.
What camera are you using too btw, you didn’t mention that ?
I recently had a similar problem.
Sd card writing was very slow with G120 module, 1 Mb file writing time was ~60 sec. I use a custom pcb and found that sd card data line pull up resistors (10K) are too big, after trying 4.7K resistors, writing speed was ~10 sec, it was six times faster!
Soon I will try with 1K resistors and I think that writing speed will be much better.
So if you have a soldering station and you know how to solder then you can try to change resistors. Otherwise please, do not try this - you can even break your board
But if you check card pin capacitance (typical is 10pF) and check capacitor resistance vs frequenc chart you see that if frequency is 10MHz, 10pF capacitor gives you a 5Kohm. So if you using 10Kohm pullup resistor and clock frequency is 10MHz then maximum pin logical voltage level is 1.1V assuming that sd card data pin input resistance is 1Mohm, higher frequency means lower impedance.
Now add pcb track capacitance or wire capacitance and you get even worst voltage levels and you can see voltage drop using ossiloscope with low capacitance probes
Now comes another question - does sd card internally has open collector or push-pull?
And processor side too, what technology is used?
If both cpu and sd card uses push-pulloutputs , then 10K pullup, even 100K pullup is ok, pullup resistor only prevents pin floating.
But if one side or both sides uses open collector connection then you are in trouble getting higher clock and data speeds because higher frequency needs higher current to drive logic signals propertly.
I think that open collector technology is used because lowering resistor resistance actually gives a faster writing and reading speed. 1Kohm resistor gives 3.3mA current and I don’t belive that 3.3mA can fry output mosfet, 10mA or 30mA current can cause some damage, but not a 3mA.
Maybe ssomeone can test and check my theory - and sorry for offtopic.
I mostly use LRCF chart to check values but getting better values I use PSpice Student simulator.
And I can answer to my own question, sdcard module uses push-pull output type and simulation proves that open collector can not work.
I also checked processor registers and sdcard is configured to 4 bit mode, I think everything is correct but something makes is slow, maybe it is a filesystem? But this is software side not hardware, but different resisor values can affect speed. I even tried to remove all resistors and effect was terrible - writing speed drops drastically and G120 SOM has onboard pullups or uses cpu weak pullup resistors…
My first sdcard project was implemented with Pic24 (16bit, 24MHz , 4Kbytes ram) works with SPI mode (1bit) 4MHz sdcard clock has 100KB/sec writing speed, same as G120 module.
Next thing is check real communication between cpu and card, maybe this can give some explanation.
And guys, I don’t belive that netmf is so slow - at least framework internal modules can work pretty fast I think.
@ Ermo - Can you post the write code that you used that took 60 seconds to write to the SD card so I can try a few experiments here? If you do not want to post it publicly, you can post it to me directly. Also, what firmware version were you using if it was not previously mentioned?