Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AT45DB081D to AT45DB081Е
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Vitaliy_ARM
Доброе время!

Было в свое время разработано устройство на микроконтроллере LPC1778 и флешке AT45DB081D-SSU. Последняя использовалась для хранения таблиц с коэффициентами. Эту флешку постранично могло обновлять программное обеспечение. Запись во флешку делается при помощи команды 0x82 (Main Memory Page Program through Buffer 1 with Built-In Erase), для чтения использую 0xD2 (Main Memory Page Read). Все работало замечательно, пока AT45DB081D-SSU не сняли с производства. На замену ей пришла AT45DB081E от Adesto, которую мы установили в новую партию. И тут начались чудеса. После создания тестовых программ, выяснилось, что данные записываются некорректно, причем может во всей памяти записаться некорректно один байт, а может и вся страница, а может и все нормально записаться. Причем это не от чего не зависит, глючит спонтанно. Даже ввели верификацию страниц и повторную запись. Однако выяснилось, что контрольная сумма данных не совпадала, даже когда постраничная верификация и перезаписть проходила на ОК. Т.е. запись одной страницы может убить данных в другой. Думали, что флешки бракованные. Купили в проверенном месте - тоже самое.

Подскажите, в чем может быть причина?

Функция записи страницы приведена ниже. (используется 264 байтная страница)

Код
BOOL at45db081d::write264(WORD page, BYTE *pBuf)
{
    unsigned int i;

    if(page > MAX_PAGES)
        return FALSE;// FALSE;
    
    SET_AT45D_CS();
    reg[0] = 0x82;
    reg[1] = page >> 7;
    reg[2] = page << 1;        
    reg[3] = 0x00;
    pSpi->transfer(reg, 4);
    pSpi->transfer(buf, 264);
    CLR_AT45D_CS();
    for(i = 0xFFFFFFFF; i > 0; i--)
    {
        if(status() & 0x80)
            break;                
    }
    if(i == 0)
        return FALSE;
    if(status() & 0x20)       // EPE bit
        return FALSE;
    return TRUE;
}
Altemir
CS после записи отпускали? Бит EPE смотрели в статусном регистре? Пока на E-серию не переходили, сидим на D, но весьма заинтересовался таким багом.
Сюда заглядывали? http://www.adestotech.com/wp-content/uploads/081E.pdf
Vitaliy_ARM
Цитата(Altemir @ Mar 27 2015, 16:32) *
CS после записи отпускали? Бит EPE смотрели в статусном регистре? Пока на E-серию не переходили, сидим на D, но весьма заинтересовался таким багом.


Да, конечно. CS опускаю перед записью и поднимаю после окончания. Я привел пример кода записи в первом посте. Привожу код функции status() ниже. Если впаять 081D, то глюки пропадают принципиально. Что только не делал, не могу добиться 100% нормальной записи. Если запись была совершена некорректно, бит EPE взводится и бывает, что я эту же страницу не могу перезаписать, при попытки использовать 82-ю команду, данные не записываются корректно и взводится этот бит. Что делать, если он взводится, в мануале не написано ...

Цитата(Altemir @ Mar 27 2015, 16:32) *

Документ этот видел. Эти команды (0x82 и 0xD2) у них не отличаются. Должно все работать одинаково, но не работает.

P.S.: У меня напряжение питания флешки 3,3В, но не думаю, что это причина.

Код
/**************************************************************
* чтение регистра статуса
*************************************************************/
BYTE at45db081d::status()
{
    // Status Register Read
    SET_AT45D_CS();                  // set CS to LOW
    reg[0] = 0xD7;
    reg[1] = 0x00;
    pSpi->transfer(reg, 2);
    CLR_AT45D_CS();                  // set CS to HIGH
    return reg[1];
}


P.S.2: Сейчас есть более дешевая альтернатива этой флешки: http://www.spansion.com/Support/Applicatio..._S25FL-K_AN.pdf , но тут другая распиновка.
Устройства уже выпущены и радикально переделывать что-то не особо хочется.
alag57
Цитата(Vitaliy_ARM @ Mar 27 2015, 17:43) *
Документ этот видел.


Код
    reg[0] = 0xD7;
    reg[1] = 0x00;
    pSpi->transfer(reg, 2);


AT45DB081E – New 2-byte Status Register.
MobyDick
На всякий случай отмечу, что в том документе они умалчивают об ещё одном различии:
- в ревизии "D" было "All inputs (SI, SCK, CS#, WP#, and RESET#) are guaranteed by design to be 5-Volt tolerant" (-0.6V to +6.25V);
- в ревизии "E" стало "-0.6V to VCC + 0.6V"
mcheb
Я на какой то флэшке так делал после посылки буфера
// read status register проверка окончания записи
// nop();
// printf("WR\n");
CS_SST25_L;
SpiMaster(0x05);
while(SpiMaster(0x00) & (WIP | WEL) )
{
nop();
};
CS_SST25_H;
нужен тайм-аут для окончания процесса записи
Vitaliy_ARM
Цитата(alag57 @ Mar 27 2015, 17:58) *
Код
    reg[0] = 0xD7;
    reg[1] = 0x00;
    pSpi->transfer(reg, 2);


AT45DB081E – New 2-byte Status Register.


Спасибо, заменил. Но это никак на ситуацию не повлияло. Глючит также. У них первый регистр статуса совместимый, наверное, теоретически, должен быть совместим и по коду.


Цитата(MobyDick @ Mar 27 2015, 18:34) *
На всякий случай отмечу, что в том документе они умалчивают об ещё одном различии:
- в ревизии "D" было "All inputs (SI, SCK, CS#, WP#, and RESET#) are guaranteed by design to be 5-Volt tolerant" (-0.6V to +6.25V);
- в ревизии "E" стало "-0.6V to VCC + 0.6V"

Это хорошее замечание, если у кого-то используется с AVR, могут наступить на грабли.

Цитата(mcheb @ Mar 27 2015, 19:25) *
Я на какой то флэшке так делал после посылки буфера
// read status register проверка окончания записи
// nop();
// printf("WR\n");
CS_SST25_L;
SpiMaster(0x05);
while(SpiMaster(0x00) & (WIP | WEL) )
{
nop();
};
CS_SST25_H;
нужен тайм-аут для окончания процесса записи


Это немного другая флешка, фирмы SST. Похоже на чтение регистра статуса. У меня также функция ожидает завершения операции записи при помощи чтения регистра статуса и проверки соответствующего бита.
alag57
Цитата(Vitaliy_ARM @ Mar 27 2015, 21:55) *
У них первый регистр статуса совместимый, наверное, теоретически, должен быть совместим и по коду.

Код
    if(status() & 0x20)       // EPE bit
        return FALSE;


EPE бит о втором байте однако.
jcxz
У нас также выпускаются несколько устройств на LPC1778 + какая-то из AT45D (только на 16 или 32 Мбита).
В более старом устройстве на LPC2378 также используются эти же AT45D. Правда мы используем насколько помню страницы 528байт (писал уже давно, несколько лет назад).
О проблемах с ними ничего не слышал, а раз выпускаются каждый месяц сотнями шт., а я - писал для них драйвера для системы хранения, то думаю - услышал бы о проблемах первый. Если конечно наши снабженцы не нашли где-то запасы старых ИС. :-)
В пн, как появлюсь на работе, надо глянуть - какие мелкосхемки стоят в последних экземплярах....
Altemir
Vitaliy_ARM
Код
pSpi->transfer(buf, 264);

Можете пояснить? Всегда записывается буфер длиной 264 Байта? А не пробовали протестировать с записью 4, 128, 250 Байт, к примеру? Ошибка повторяется?
jcxz
Цитата(Altemir @ Mar 30 2015, 12:09) *
Можете пояснить? Всегда записывается буфер длиной 264 Байта? А не пробовали протестировать с записью 4, 128, 250 Байт, к примеру? Ошибка повторяется?

Прежде чем что-то советовать, хоть даташит откройте. В AT45D невозможно записать меньше страницы.
Altemir
Цитата(jcxz @ Mar 30 2015, 15:26) *
Прежде чем что-то советовать, хоть даташит откройте. В AT45D невозможно записать меньше страницы.

Ступил. Предполагал то, что не могло ли писаться 264 байта при организации страниц флэшки по 256, но здесь не тот случай.

Цитата
В пн, как появлюсь на работе, надо глянуть - какие мелкосхемки стоят в последних экземплярах....

Так что там в "последних экземплярах"?
Vitaliy_ARM
Код чтения статуса я исправил на двухбайтовый и исправил проверку EPE бита. Но результат записи с флешкой тот-же. Сегодня утром я пришел и начал тестировать эту флешку, первые 10 раз зашилась без проблем. Потом начала глючить один раз из 5 записей, потом чаще. И в итоге после записи 40 раз она сходит с ума и уже не пишется без ошибок. Если прибор полежит без питания несколько часов, она опять начинает шиться без ошибок. Какая-то ерунда ...
Первый раз такое встречаю за 10 лет работы. Одна партия была куплена на DigiKey, вторая в Компеле. Ведут себя примерно одинаково.

В общем вопрос работы флешки AT45DB081E в корпусе SO-8 пока открыт.

P.S.: Мы нашли уже другой способ избавиться от проблемы. Применили алгоритм сжатия данных и запихнули коэффициенты в сжатом виде в микроконтроллер. Это решение даже лучше, чем применять внешнюю микросхему. Но вопрос глючности флешки это не решает.
alag57
Цитата(Vitaliy_ARM @ Mar 27 2015, 17:19) *
Код
write264(WORD page, BYTE *pBuf)
{
.....
    pSpi->transfer(buf, 264);
}


Передаете указатель pBuf, а используете buf. Может где-то портится буфер записи?
Например в функции transfer.
aaarrr
Цитата(Vitaliy_ARM @ Mar 30 2015, 22:24) *
Если прибор полежит без питания несколько часов, она опять начинает шиться без ошибок. Какая-то ерунда ...

А охладить её в процессе тестов не пробовали?
jcxz
Цитата(Altemir @ Mar 30 2015, 18:32) *
Так что там в "последних экземплярах"?

Посмотрел. В разных экземплярах разные микросхемы стоят. Кое-где - ATMEL, кое-где - adesto.
Маркировка: adesto1411 45DB321D, температурный диапазон должен быть industrial.
Ставят у нас их в несколько разных устройств, выпускают сотнями шт. в месяц. В некоторых устройствах - по 2 шт.
Ни о каких проблемах в последнее время мне не известно.
Да и когда заменяли на них - тоже ничего не случилось. Я даже не узнал о данной замене.
Так что у Вас или партию глючную купили или с ПО что-то не комильфо или ...

PS: Заглянул в свои исходники - я для записи нигде не использую команды 0x82/0x85. Только эти определены:
CDF_PROG1 = 0x88, //запись без стирания буфера1
CDF_PROG2 = 0x89, //запись без стирания буфера2
CDF_EPROG1 = 0x83, //запись со стиранием буфера1
CDF_EPROG2 = 0x86, //запись со стиранием буфера2

И вообще - что-то исходники ТС слишком примитивны.
У меня собственно запись страницы занимает несколько экранов текста (со всеми ожиданиями, проверками статуса, определением свободного буфера, загрузкой его, программированием DMA и т.п.) - всё в соответствии с даташитом.
Может всё-таки автор плохо читал документацию и реализовывал как попало (судя по стилю исходника). sm.gif
Altemir
Нашли у себя AT45DB041E. На корпусе сверху маркировка:
Код
adesto1421
45DB041E
SHN

Получили в начале февраля 2015г, Аргуссофт.
Протестировал полчаса в изделии многократной записью/чтением порядка 87КБ, ни одного сбоя не зафиксировал. Проверял чтением после записи и сравнением контрольной суммы. Код был написан ещё в 2008-ом году для AT45DB "D"-серии, с тех пор не менялся. Использовались эти две команды:
Код
#define cmdContArrLFRead           0x03    // Continuous Array Read (Low Frequency)
#define cmdFlashProgBuf1          0x82    // Main memory page program through buffer 1 with Built-in Erase


AT45DB081D пока старых запасов, "E" не поступали.
aaarrr
Хм, а с режимом SPI не напутано? По симптомам похоже.
esaulenka
Много лет назад наступил на грабли с AT45DBxxxD.

Проблема в том, что для этих микросхем критично время фронтов на линии CLK.
В принципе, эта цифирка указана в даташите, но среди всех остальных параметров её легко пропустить.

Выглядит это как совершенно неадекватное поведение в зависимости от фазы луны, у меня даже регистр статуса не всегда корректно читался.
Вылечилось отпаиванием отладочных проводов (там полметра было. так надо :-) ) от линии SPI.
uriy
У нас в изделии заменена 161D на 161E. Уже несколько тысяч отгружено с новой микросхемой.
Никаких доработок кода не производилось и никакой разницы в поведении не обнаружено.

На микросхемах с буквой D тоже встречался с проблемой с фронтами.
Но тогда из микросхемы читалась полная чушь. Запись наверно вовсе не работала.

Velund
С этими чипами (только АТ45DB161 а не 081) один раз поимели проблемы, докупив у какого то из московских дилеров несколько сотен которых не хватало на очередную партию к остаткам бывшим в наличии. Получили какую то смесь чипов с разными date code, часть из которых как позже выяснилось была изначально переключена на 512 байт страницу (необратимо). Софт такой вариант не поддерживал, и было несколько неприятных дней, пока не разобрались и не "выцедили" из пришедшего с монтажа проблемные изделия. Пришлось дописывать автоопределение и нормальную работу с любым возможным вариантом из Page Erasable флешек, под которые сделаны посадки на плате (когда были перебои с Атмелем заложили еще Numonyx).

Но с переходом с D на E собственно проблем не было. Прошивка сама определяет количество страниц, размер страницы и производителя (Atmel/Adesto либо ST/Numonyx) и работает с ними в качестве кольцевого буфера используя максимальную емкость. Жалоб не поступало.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.