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

 
 
> Помехоустойчивая работа с 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
Ответов (1 - 8)
jorikdima
сообщение Aug 3 2009, 16:19
Сообщение #2


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



использовать таймауты в таких ожиданиях или если грубо действовать то watchdog
Go to the top of the page
 
+Quote Post
_3m
сообщение Aug 3 2009, 16:38
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 745
Регистрация: 28-12-06
Пользователь №: 23 960



Цитата(ГУ-49А @ Aug 3 2009, 18:28) *
Есть устройство с ARM7, которое общается с SD-картой по SPI.
...
они расчитаны на штатную работу, когда все нужные биты выставляются как надо. Однако стоит поднести к устройству с картой работающую электродрель rolleyes.gif, как этот код перестаёт работать

Сочуствую. У вас случилась jopa!
Вам придется медленно и печально перелопачивать весь код. Причем еще придется ломать голову над тем в какие состояниия попадает карта под воздействием помехи и как из этого корректно выйти. Кстати в спецификации sd о помехах, сбоях и некорректных состояниях нет ни слова, что там будет вытворять встроенный контроллер - хз cranky.gif
Еще и недокументированные "особенности" порта spi под воздействием помех вылезут.
Ей богу убиться ап стену и то будет не так мучительно.
Может вам подумать об использовании просто голых чипов памяти, хотя бы избавитесь от непредсказуемости?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 3 2009, 16:50
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(_3m @ Aug 3 2009, 20:38) *
Кстати в спецификации sd о помехах, сбоях и некорректных состояниях нет ни слова, что там будет вытворять встроенный контроллер - хз cranky.gif

В спецификации SD все замечательно прописано - таймауты, ошибки и т.п. Если аккуратно и внимательно ей следовать, то проблем не будет. Другое дело, что какие-то действия в случае отказа карты должен предпринимать верхний уровень - пользователю пожаловаться, переинициализировать/питание передернуть и т.д.
Ну и конечно бороться программными методами с аппаратными проблемами совершенно бесполезно.
Go to the top of the page
 
+Quote Post
_3m
сообщение Aug 3 2009, 17:29
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 745
Регистрация: 28-12-06
Пользователь №: 23 960



Цитата(aaarrr @ Aug 3 2009, 20:50) *
В спецификации SD все замечательно прописано - таймауты, ошибки и т.п. Если аккуратно и внимательно ей следовать, то проблем не будет.

Сразу видно что вы даже не задумывались о проблеме.
Какова должна быть реакция системы на бит 19 (ERROR - A general or an unknown error occurred during the operation) в Card Status ???
Или вы подаете заведомо корректную команду а в ответ неожиданно получаете ILLEGAL_COMMAND ???
И что делать если карта показывает busy гораздо дольше паспортного времени выполнения команды ?
В общем все это хотя бы перечислить на бумаге с указанием возможных путей разруливания - уже сизифов труд.
А мы еще не дошли до
Цитата
какие-то действия в случае отказа карты должен предпринимать верхний уровень - пользователю пожаловаться, переинициализировать/питание передернуть и т.д.

Встраиваеое устройство часто работает в автономном полете, жаловаться ему некому. Переинициализация как и ватчдог прервет нормальную работу системы, к чему объект управления или мониторинга может быть в данный момент не готов (проще говоря взорвется нафиг если им внезапно перестать управлять).
Цитата
Ну и конечно бороться программными методами с аппаратными проблемами совершенно бесполезно.

с проблемами нужно бороться на всех уровнях
Рано или поздно найдется такая помеха которая пролезет через самые эффективные фильтры и уложит вашу систему. Как назло это случится в самый неподходящий момент. Поэтому пытаться выжить надо до конца, а не как в усб: единичный сбой->прекращение обмена
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 3 2009, 17:37
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(_3m @ Aug 3 2009, 21:29) *
Сразу видно что вы даже не задумывались о проблеме.

Не делайте поспешных выводов.

Цитата(_3m @ Aug 3 2009, 21:29) *
Какова должна быть реакция системы на бит 19 (ERROR - A general or an unknown error occurred during the operation) в Card Status ???
Или вы подаете заведомо корректную команду а в ответ неожиданно получаете ILLEGAL_COMMAND ???
И что делать если карта показывает busy гораздо дольше паспортного времени выполнения команды ?

Во всех случаях, кроме ошибок CRC - переинициализация карты после нескольких попыток.

Цитата(_3m @ Aug 3 2009, 21:29) *
Переинициализация как и ватчдог прервет нормальную работу системы, к чему объект управления или мониторинга может быть в данный момент не готов (проще говоря взорвется нафиг если им внезапно перестать управлять).

Переинициализация карты объект взорвет? Ну-ну.

Цитата(_3m @ Aug 3 2009, 21:29) *
Рано или поздно найдется такая помеха которая пролезет через самые эффективные фильтры и уложит вашу систему. Как назло это случится в самый неподходящий момент. Поэтому пытаться выжить надо до конца, а не как в усб: единичный сбой->прекращение обмена

Да, рано или поздно в ваш объект попадет молния. "Пытаться выжить до конца" есть глупость несусветная, сами же писали:
Цитата
что там будет вытворять встроенный контроллер - хз
Go to the top of the page
 
+Quote Post
Faradey
сообщение Aug 5 2009, 11:23
Сообщение #7


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

Группа: Свой
Сообщений: 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
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 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
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 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 June 2025 - 20:45
Рейтинг@Mail.ru


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