Драйвер Atmel Dataflash (at45)
В “любительском” проекте, над которым я сейчас работаю, понадобилось хранить довольно большое количество данных. Выбор пал на память atmel dataflash, как на одну из самых распространенных и легкодоставаемых памятей. Под эту память был написан драйвер. Предлагаю его и вам.
Драйвер написан под семейство 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) Используемые команды флеш-памяти для новых дивайсов уже помечены как Legacy (т.е. оставлены для совместимости). Лучше, наверное, использовать новые.
2) Русские комменты в коде не вижу — т.к. кодировка системы по дефолту English. :> Хорошая практика писать все комменты на аглицком — будут читабельны всегда, везде и для всех. :>
1) Не лучше. С legacy-командами с драйвером будут работать и старые и новые микрухи, с новыми — только новые.
2) Про комменты ты в чем-то прав, но русские читаются проще для меня.
Старые уже не выпускаются и почти не продаются, а вот среди новых команд есть новые возможности. Хотя можно для универсальности через #define сделать выбор набора команд или еще круче — через автодетект типа микросхемы :>
спасибо огромное! очень нестандартное решение для ДФ ))
Незачто, обращайтесь еще ))
Я так понял, драйвер предназначен для работы с МК по SPI. Возможно ли АТ45 превратить в нечто вроде SD карты? (Понятно, что протоколы несколько рознятся) Как поставить на неё FAT?
У атмела есть специальная версия ФАТ’а, для АТ45, котоая учитывает их размер блока. Вот, налетай — https://www.onlinedisk.ru/file/473027/
Спасибо. Вот еще подобие ФАТа для АТ45 https://movilavn.narod.ru/index.html
Смотреть раздел Статьи.( Библиотека последова-тельного доступа для AT45DB161) Может кому будет полезно.
обновите плз ссылку, нужна файловая система для AT45
За идею 5. А за исполнение 2.
1) не соблюдаются какие либо тайминги. В итоге код работает не правильно.
2) SeekForward и SeekBackward неправильно рассчитывают адрес.
Не знаю как код проверялся. Но в тааком виде он не рабочий. Пришлось допиливать до адекватного состояния.
Пля. Не сразу заметил. В функциях read/write смещение страницы рассчитывается неверно. В общем код глючный чуть ли не полностью.
На него не стоит обращать внимание. В сети полно других правильных вариантов.
У меня он работает и работает нормально. Если вы нашли ошибки, поделитесь патчами.
1)Snaky написал правильно по поводу команд. Atmel уже прославился в избавлении от «старья». Есть хорошая вероятность, что эти команды скоро выпилят. В тоже время старые микросхемы памяти хрен купишь.
2)Код не рабочий. В таблице «Table 16-3. AC Characteristics – Atmel RapidS / Serial Interface» указаны тайминги. Без их соблюдения никуя хорошего не будет. Код работать правильно и пройти испытания не мог. К тому же я его проверил и убедился в этом.
3) SeekForward и SeekBackward не правильно рассчитывают адрес. Правильные формулы легко выводятся из «перейти на заданный адрес» (код дропнул, уже не помню название этой функции)
4) Игнорится второй буфер. А это, при потоковой записи, дает выигрыш в 20-30%.
5) Мелкий недостаток. Если уже используется ООП, то уже стоит использовать наследование. Т.е. SPI -> AT45DB -> Линейный класс.
Ну а со смещением страниц это уже я ошибся. Перепутал длину номера страницы и длину адреса.
1. А я ему правильно ответил 🙂 Не видел еще микрух с выпеленными старыми командами.
2. Соблюдать тайминги у меня всегад получалоось автоматом, если вы исользуете настолько быстрый процессор, что с короткими тайменгами беда — просто поправте код, как вам нужно. Я не ставил цели сделать мега-универсальную-библиотеку, которая работает на всем что считает.
Длинные таймегни проверяются по BUSY биту.
3. Тут согласен, поправлю.
4. Это уже скорее хотелка. У меня небыло потребности в такой скорости.
5. Это не ООП, а «Си с классами»
2) Там задержки 30 мс! Как в них можно вписаться автоматом? Ваш код в них никак не может вписаться. Это же очевидно. Даже предоставленный пример не рабочий.
4) Там достаточно добавить пару строк кода. Или их можно взять из либы LUFA. Но уже от туда можно взять и полностью рабочий код для AT45DB.
Ну и если его еще немного доработать, то скорость записи увеличивается раз в десять.