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

Опубликовано в рубрике "Исходники", 01.11.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 написал(а) 2nd Ноябрь, 2009 в 1:02

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

  2. BSVi написал(а) 2nd Ноябрь, 2009 в 9:20

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

  3. Snaky написал(а) 3rd Ноябрь, 2009 в 9:03

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

  4. yakuza написал(а) 1st Март, 2010 в 20:46

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

  5. BSVi написал(а) 1st Март, 2010 в 20:47

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

  6. Slav11 написал(а) 8th Июль, 2010 в 21:40

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

  7. BSVi написал(а) 8th Июль, 2010 в 22:00

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

  8. Slav11 написал(а) 9th Июль, 2010 в 12:34

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

  9. spectral написал(а) 6th Ноябрь, 2012 в 11:24

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

  10. a9d написал(а) 30th Январь, 2012 в 1:16

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

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

  11. a9d написал(а) 15th Февраль, 2012 в 0:13

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

  12. BSVi написал(а) 15th Февраль, 2012 в 8:40

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

  13. a9d написал(а) 15th Февраль, 2012 в 11:28

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

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

  14. BSVi написал(а) 15th Февраль, 2012 в 16:13

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

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

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

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

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

  15. a9d написал(а) 15th Февраль, 2012 в 16:32

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

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *


Срок проверки reCAPTCHA истек. Перезагрузите страницу.