Драйвер Atmel Dataflash (at45)

Опубликовано в рубрике "Исходники", 1 ноября, 2009.

В “любительском” проекте, над которым я сейчас работаю, понадобилось хранить довольно большое количество данных. Выбор пал на память atmel dataflash, как на одну из самых распространенных и легкодоставаемых памятей. Под эту память был написан драйвер. Предлагаю его и вам.

image

Драйвер написан под семейство at45 в восьми-ножечном SOIC корпусе, но его легко можно будет поправить под микрухи в любом другом корпусе. Драйвер умеет сам определять тип подключенной микросхемы (автоопределение можно отключить), и имеет довольно простой интерфейс (суть функций ясна из названия).

Но самой козырной фишкой, в этом драйвере все-же является класс df_LinearSpace, который представляет флэшку в виде линейного пространства без страниц, блоков итп.

Пример тестового кода:

__root uint8 buff[100];
__root uint32 writes;
__root uint32 reads;

writes = 0;
reads = 0;
df_LinearSpace ls;    // класс линейного пространства

while( ls.SpaceToEnd()>=5 )    // Записываем "hello" до конца флэшки
{
    ls.UnsafeWrite((uint8*)"hello", 5);
    writes++;
}
ls.Finalize();    // Сохраняем буффер во флэш ( см. описание класса )

ls.GoToZero(); // Возвращаемся в нулевую точку
while(ls.SpaceToEnd()>=5)    // и читаем флэшку
{
    ls.Read(buff, 5);
    if ( memcmp(buff, "hello", 5) != 0 ) while(1); // если хотябы одно "hello" не совпадает, повисаем.
    reads++;
}

if ( reads != writes ) while(1); // Если количество "hello" не совпадает, повисаем.

 

Остальное описано в самом драйвере, пользуйтесь.




Комментарии
  1. Snaky написал(а) 2 ноября, 2009 в 1:02

    Гут! Но я как всегда с конструктивной критикой :>
    1) Используемые команды флеш-памяти для новых дивайсов уже помечены как Legacy (т.е. оставлены для совместимости). Лучше, наверное, использовать новые.
    2) Русские комменты в коде не вижу — т.к. кодировка системы по дефолту English. :> Хорошая практика писать все комменты на аглицком — будут читабельны всегда, везде и для всех. :>

    BSVi Reply:

    1) Не лучше. С legacy-командами с драйвером будут работать и старые и новые микрухи, с новыми — только новые.
    2) Про комменты ты в чем-то прав, но русские читаются проще для меня.

    Snaky Reply:

    Старые уже не выпускаются и почти не продаются, а вот среди новых команд есть новые возможности. Хотя можно для универсальности через #define сделать выбор набора команд или еще круче — через автодетект типа микросхемы :>

  2. yakuza написал(а) 1 марта, 2010 в 20:46

    спасибо огромное! очень нестандартное решение для ДФ ))

    BSVi Reply:

    Незачто, обращайтесь еще ))

  3. Slav11 написал(а) 8 июля, 2010 в 21:40

    Я так понял, драйвер предназначен для работы с МК по SPI. Возможно ли АТ45 превратить в нечто вроде SD карты? (Понятно, что протоколы несколько рознятся) Как поставить на неё FAT?

    BSVi Reply:

    У атмела есть специальная версия ФАТ’а, для АТ45, котоая учитывает их размер блока. Вот, налетай — http://www.onlinedisk.ru/file/473027/

    Slav11 Reply:

    Спасибо. Вот еще подобие ФАТа для АТ45 http://movilavn.narod.ru/index.html
    Смотреть раздел Статьи.( Библиотека последова-тельного доступа для AT45DB161) Может кому будет полезно.

    spectral Reply:

    обновите плз ссылку, нужна файловая система для AT45

  4. a9d написал(а) 30 января, 2012 в 1:16

    За идею 5. А за исполнение 2.
    1) не соблюдаются какие либо тайминги. В итоге код работает не правильно.
    2) SeekForward и SeekBackward неправильно рассчитывают адрес.

    Не знаю как код проверялся. Но в тааком виде он не рабочий. Пришлось допиливать до адекватного состояния.

  5. a9d написал(а) 15 февраля, 2012 в 0:13

    Пля. Не сразу заметил. В функциях read/write смещение страницы рассчитывается неверно. В общем код глючный чуть ли не полностью.
    На него не стоит обращать внимание. В сети полно других правильных вариантов.

    BSVi Reply:

    У меня он работает и работает нормально. Если вы нашли ошибки, поделитесь патчами.

    a9d Reply:

    1)Snaky написал правильно по поводу команд. Atmel уже прославился в избавлении от «старья». Есть хорошая вероятность, что эти команды скоро выпилят. В тоже время старые микросхемы памяти хрен купишь.
    2)Код не рабочий. В таблице «Table 16-3. AC Characteristics – Atmel RapidS / Serial Interface» указаны тайминги. Без их соблюдения никуя хорошего не будет. Код работать правильно и пройти испытания не мог. К тому же я его проверил и убедился в этом.
    3) SeekForward и SeekBackward не правильно рассчитывают адрес. Правильные формулы легко выводятся из «перейти на заданный адрес» (код дропнул, уже не помню название этой функции)
    4) Игнорится второй буфер. А это, при потоковой записи, дает выигрыш в 20-30%.
    5) Мелкий недостаток. Если уже используется ООП, то уже стоит использовать наследование. Т.е. SPI -> AT45DB -> Линейный класс.

    Ну а со смещением страниц это уже я ошибся. Перепутал длину номера страницы и длину адреса.

    BSVi Reply:

    1. А я ему правильно ответил :) Не видел еще микрух с выпеленными старыми командами.
    2. Соблюдать тайминги у меня всегад получалоось автоматом, если вы исользуете настолько быстрый процессор, что с короткими тайменгами беда — просто поправте код, как вам нужно. Я не ставил цели сделать мега-универсальную-библиотеку, которая работает на всем что считает.

    Длинные таймегни проверяются по BUSY биту.

    3. Тут согласен, поправлю.

    4. Это уже скорее хотелка. У меня небыло потребности в такой скорости.

    5. Это не ООП, а «Си с классами»

  6. a9d написал(а) 15 февраля, 2012 в 16:32

    2) Там задержки 30 мс! Как в них можно вписаться автоматом? Ваш код в них никак не может вписаться. Это же очевидно. Даже предоставленный пример не рабочий.
    4) Там достаточно добавить пару строк кода. Или их можно взять из либы LUFA. Но уже от туда можно взять и полностью рабочий код для AT45DB.

    Ну и если его еще немного доработать, то скорость записи увеличивается раз в десять.

Создать новую ветку комментариев


Вы должны войти или зарегистрироваться чтобы оставить комментарий.