реклама на сайте
подробности

 
 
> Помехоустойчивая работа с SD-картой
ГУ-49А
сообщение Aug 3 2009, 14:28
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 26-11-07
Пользователь №: 32 699



Есть устройство с ARM7, которое общается с SD-картой по SPI. На карте - файловая система, и файлы пишутся/читаются. Код работы с SD/MMC взят "стандартный" (IAR'овский), в котором повсюду конструкции вида
Код
while(!SSPSR_bit.TNF)
;
...
while(!SSPSR_bit.RNE)
;

Т.е. они расчитаны на штатную работу, когда все нужные биты выставляются как надо. Однако стоит поднести к устройству с картой работающую электродрель rolleyes.gif, как этот код перестаёт работать (спотыкается на этих ожиданиях и не может из них выйти). К сожалению, такое может произойти и от других внешних факторов.
Интересует программное решение данного вопроса. Т.е. хотелось бы иметь более надёжный robust код, который мог бы восстанавливаться после любой ситуации на шине. Чтобы не изобретать велосипед, поделитесь, пожалуйста, ссылкой на надёжную реализацию MMC/SD или расскажите, как её сделать?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Faradey
сообщение Aug 5 2009, 11:23
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 127
Регистрация: 31-05-06
Из: Belarus, Minsk
Пользователь №: 17 638



ГУ-49А вам все правильно сказали aaarrr и jorikdima при разработке драйвера нельзя полагаться на 100% устройчивость переферии
и как следствие интсрукций вида
Цитата
while(!SSPSR_bit.TNF);
не применять вовсе.

вот например мой кусочек драйвера MMC/SD:
Код
/**
* @brief Читаем заданное количество секторов
* @param card  указатель на исп. карту
* @param buf    указатель на буфер-приемник
* @param sector адресс сектора с которого начинаем чтение
* @param count  количество читаемых секторов
*
* @return int !=0 означает ошибку
*         1 - send command error
*         2 - wait data
*/
int MSC_ReadSectors( volatile MSC_CardType *card, u8 *buf, u32 sector, u32 count )
{
    ASSERT_MSC( IS_NOT_NULL( card ) );
    ASSERT_MSC( IS_NOT_NULL( card->platform ) );
    ASSERT_MSC( IS_NOT_NULL( buf ) );
    
    if( card->shared_spi )
    {
        _MSC_SPI_TakeMutex( card->platform );
        _MSC_SPI_HighSpeedInit( card->platform );
    }
    
    int r = 0;
    int j;
    
    for( int i = 0; i < count; i++ )
    {
        if( MSC_SendCommand( card,
                             cmdREAD_SINGLE_BLOCK,
                             ( sector + i ) * card->block_len ) )
        {
            r = 1;
            break;
        }
        for( j = card->config->wait_data;
           j && ( MSC_START_SINGLE_BLOCK != _MSC_SPI_ByteWR( card->platform, 0xff ) ); j-- )
        {
            _MSC_DelayMS( card->platform, 1 );
        }
        if( !j )
        {
            card->last_err = mscERR_LONG_RDATA;
            r = 2;
            break;
        }
        u16 size = card->block_len;
        if( _MSC_SPI_ReadBuffer( card->platform, buf, size ) )
        {
            // timeout error
            card->last_err = mscERR_LONG_RDATA;
            r = 3;
            break;
        }
        // CRC
        _MSC_SPI_ByteWR( card->platform, 0xff );
        _MSC_SPI_ByteWR( card->platform, 0xff );
        _MSC_SPI_ByteWR( card->platform, 0xff );
    }
    
    _MSC_ResetCS( card->platform );
    
    if( card->shared_spi )
    {
        _MSC_SPI_GiveMutex( card->platform );
    }
    
    return r;
}


--------------------
Завтра пойму, что нужно было сделать вчера...
Go to the top of the page
 
+Quote Post
ГУ-49А
сообщение Aug 6 2009, 09:36
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 26-11-07
Пользователь №: 32 699



Спасибо всем, кто ответил!

Цитата(Faradey @ Aug 5 2009, 14:23) *
вот например мой кусочек драйвера MMC/SD:

Можно ли увидеть кусочек _MSC_SPI_ReadBuffer()?
Интересует, прежде всего, логика генерации ошибки таймаута.

И как система восстанавливается после подобных ошибок?
Попадает ли эта ошибка сразу на application level или всё исправляется ещё на уровне драйверов? (Filesystem? MMC? SPI?)
В каких случаях делается полная переинициализация карты памяти?
Go to the top of the page
 
+Quote Post
ГУ-49А
сообщение Aug 11 2009, 11:36
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 26-11-07
Пользователь №: 32 699



Проблему решил грубо: при малейшей ошибке в любом из драйверов высокоуровневая операция с файлом прерывается, карта переинициализируется, файловая система перемонтируется, файлы переоткрываются и операция с файлом повторяется. Вроде работает.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 22:55
Рейтинг@Mail.ru


Страница сгенерированна за 0.01403 секунд с 7
ELECTRONIX ©2004-2016