mrengineer (02.05.2012 10:34, просмотров: 3799) MBedder
Ускорение работы с SD-картой Товарищи, выскажитесь по следующему поводу. Мне надо ускорить работу с SD-картой. Вернее, перераспределить время. Запись блока 512 байт 5-ю структурами по 90 байт занимает 2 мс. А мне надо читать данные с датчика через АЦП каждую 1 мс и в зависимости от данных писать их на карточку или нет. Сразу оговорюсь, с небольшим буфером в ОЗУ МК (MSP430) пропускной способности карточки хватит т.к. данные пишутся редко.
Поскольку процессы эти (запись и чтение АЦП) не асинхронные, я получаю проблемы - АЦП читается реже чем с периодом 1 мс если случается запись на карту...
Я вижу следующие варианты что мне делать:
1. Сделать процесс записи асинхронным, т.е. обеспечить выполнение основной программы пока идет запись на карту. Для этого надо научиться возвращаться в точку кода где у меня mmcCheckBusy(); Т.е. пока busy - выполняется main.
char mmcWriteBlock (const unsigned long address){
unsigned long i = 0;
char rvalue = MMC_RESPONSE_ERROR; // MMC_SUCCESS;
// Set the block length to read
if (mmcSetBlockLength (512) == MMC_SUCCESS) // block length could be set
{
// SS = LOW (on)
CS_LOW;
// send write command
mmcSendCmd (24,address, 0xFF);
// check if the MMC acknowledged the write block command
// it will do this by sending an affirmative response
// in the R1 format (0x00 is no errors)
if (mmcGetXXResponse(MMC_R1_RESPONSE) == MMC_R1_RESPONSE)
{
spiSendByte(0xff);
// send the data token to signify the start of the data
spiSendByte(0xfe);
// clock the actual data transfer and transmitt the bytes
for (i = 0; i < 512; i++)
spiSendByte(mmc_buffer[i]); // mmc_buffer[i]; Test: i & 0xff
// put CRC bytes (not really needed by us, but required by MMC)
spiSendByte(0xff);
spiSendByte(0xff);
// read the data response xxx0<status>1 : status 010: Data accected, status 101: Data
// rejected due to a crc error, status 110: Data rejected due to a Write error.
mmcCheckBusy();
}
else
{
// the MMC never acknowledge the write command
rvalue = MMC_RESPONSE_ERROR; // 2
}
}
else
{
rvalue = MMC_BLOCK_SET_ERROR; // 1
}
// give the MMC the required clocks to finish up what ever it needs to do
// for (i = 0; i < 9; ++i)
// spiSendByte(0xff);
CS_HIGH;
// Send 8 Clock pulses of delay.
spiSendByte(0xff);
return rvalue;
} // mmc_write_block
2. Пересадить как-то АЦП на прерывания (как?!). Например, в таймер. Но я намеренно перенес чтение АЦП и обработку данных в main() т.к. после этого я сразу перевожу проц в сон LPM4. А из прерываний этого делать не рекомендуется...
3. Уменьшить размер блока до 90 байт. Т.е. вместо mmcSetBlockLength (512) поставить mmcSetBlockLength (90). Это вообще поможет?
4. Другие идеи?