AT45DB161E_GLOB.h 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662
  1. // Файл с основными определениями для AT45DB161E.
  2. // v 1.11 от 20/07/15
  3. // Автор: Сычев А.
  4. // используйте следующие макросы перед подключением этого заголовочного файла
  5. // AT45DB161E_APILEVEL - для доступа к структурам и типам низокуровневых функций
  6. // AT45DB161E_LOWLEVEL - для доступа ко всем низкоуровневым определениям
  7. //
  8. // например: # файл c API для работы с флешкой использует
  9. // только интерфейсы, ему достаточно только AT45DB161E_APILEVEL
  10. // # файл, который реализует низкоуровневые команды требует AT45DB161E_LOWLEVEL
  11. // # пользовательский файл высокоуровневой программы вообще не требует этих макросов
  12. #ifndef AT45DB161E_H
  13. #define AT45DB161E_H
  14. // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
  15. // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ВВЕДЕНИЕ №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
  16. // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
  17. // Чип состоит из 17 секторов, в т.ч. 2 уникальных и 15 обычных. Первые 2 считаются за 1.
  18. // Уникальные сектора - это разбитый на 2 части обычные, он меньше обычного по размеру.
  19. // В даташите эти секторы называются sector 0a и sector 0b. Остальные
  20. // секторы нумеруются как обычно, 1...15.
  21. //
  22. // Сектор содержит от 1 до 32 блоков, обычный всегда содержит 32 блоков
  23. // Блок содержит всегда 8 страниц по 512+16 байт.
  24. // Первые 2 сектора - подсекторы 0го, 0a и 0b - уникальные. Первый (сектор 0a) содержит один блок (8страниц)
  25. // Второй уникальный (сектор 0b) - 31 блок. Остальные сектора (1,3,4...63) - содержат
  26. // по 32 блока
  27. // Чип позволяет хранить дополнительные 16 байт на каждые 512 байт в каждой странице
  28. // Это используется, например, для хранения контрольных сумм и кодов исправления ошибок.
  29. // Эти данные доступны при простом чтении страницы или последовательном чтении.
  30. // Однако можно запретить доступ к этим данным: программная эмуляция и аппаратная эмуляция
  31. // Программная эмуляция - эмуляция программными средствами API драйвера памяти. Она заключается
  32. // в том, что при чтении страницы читаются только первые 512 байт. Внимание! В этом режиме
  33. // недоступна команда последовательного чтения! Аппаратная эмуляция - использование
  34. // опции power of two чипа памяти, опция включается один раз, и более не выключается.
  35. // В этом режиме команда последовательного чтения работает.
  36. // Для того, чтобы включить программную эмуляцию 512 байтной страницы
  37. // объявите макрос AT45DB161E_EMU512=1
  38. // Для того, чтобы использовать опцию Power of two и навсегда установить
  39. // размер страницы 512 байт, объявите макрос AT45DB161E_PRM512
  40. // Используйте только один из макросов!
  41. // Чип позволяет прогаммно защищать секторы от стирания/записи. Для этого используются
  42. // команды снятия/установки защиты на выбранные секторы. При этом выбор секторов для защиты
  43. // осуществляется через специальный регистр защиты, содержимое которого определяет, какие
  44. // секторы будут защищены. Сам регистр защиты можно защитить только аппарано (пин WP).
  45. // Т.О. защита осуществляется в 2 этапа: изменение регистра защиты (стирание+запись) и
  46. // включение защиты. Причем не обязательно в этом порядке: можно не снимая защиты модифицировать
  47. // содержимое регистра не снимая защиты. Именно так рекомендуют действовать Atmel.
  48. // При стирании регистра защиты все секторы становятся защищены. Количество операций
  49. // записи/стирания регистра ограничено числом
  50. #define __FLASH_PROTECTREGISTER_WRITECYCLES 10000
  51. /* <CONFIG> */
  52. //#define AT45DB161E_EMU512 // включение/выключение сервисных байтов
  53. //#define AT45DB161E_PRM512 // запрещение сервисных байтов
  54. #include "drivers\flash\at45\config\AT45DB161E_CONF.h"
  55. #ifndef AT45DBXXX_API_TIMEOUT
  56. #define AT45DBXXX_API_TIMEOUT _TIME_FLASHAPI_TIMEOUT
  57. #endif
  58. /* </CONFIG> */
  59. // Библиотека позволяет исключить циклы ожидания после
  60. // длительных команд, переложив ожидание ПОСЛЕ команды
  61. // в ожидание ПЕРЕД командой - активное ожидание освобождения
  62. // устройства через сканирования флага BUSY в статусном регистре.
  63. // Библиотека в любом случае использует чтение флага перед
  64. // каждой низкоуровневой командой, но делает это обычно 1 раз,
  65. // возвращая ошибку после неудачи. Используйте макрос AT45DB161E_BKGOPERATIONS=1,
  66. // для того, чтобы использовать постоянное сканирование флага
  67. // перед командой вместо ожидания в конце команды. Используя данный режим,
  68. // будьте внимательны при сохранении данных перед выключением питания.
  69. // Библиотека позволяет использовать "умные" задержки после длительных
  70. // операций. Это означает, что ожидание после команды представляет собой
  71. // периодическое сканирование флага BUSY. Заданная в спецификации задержка
  72. // разбивается на квантованные промежутки времени, через которые происходит
  73. // опрос занятости устройства. Так предположительно длительная задержка
  74. // может быть сокращена при досрочном освобождении устройства. По умолчанию
  75. // режим "умных" задержек включен. Для выключения объявите макрос AT45DB161E_DONTUSESMARTDELAY=1
  76. // Режим "умных" задержек используется для обеспечения МИЛЛИСЕКУНДНЫХ задержек более AT45DBXXX_SMART_WAIT_THRESHOLD миллисекунд
  77. /* <CONFIG> */
  78. //#define AT45DB161E_DONTUSESMARTDELAY 0 // отключение "умной" задержки
  79. //#define AT45DB161E_BKGOPERATIONS 0 // отключение задержек операций | ВНИМАНИЕ! Только для ОПЫТНЫХ пользователей (-: !!!
  80. /* </CONFIG> */
  81. //--------------------------------------------------------------
  82. // Иерархия распределения секторов, блоков и страниц.
  83. // Номера блоков - отнисительно сектора
  84. // Номера страниц - отнисительно блока
  85. //--------------------------------------------------------------
  86. // AT45DB161E
  87. // _________
  88. // |
  89. // |-[-] Сектор 0a / Уникальный сектор, содержит только 1 блок
  90. // | |
  91. // | |-[-] Блок 0
  92. // | |___ Страница 0, блок 0 сектора 0
  93. // | .
  94. // | .
  95. // | .
  96. // | |___ Страница 7, блок 0 сектора 0
  97. // |
  98. // |
  99. // |-[-] Сектор 0b / Уникальный сектор, содержит только 31 блок
  100. // | |
  101. // | |-[-] Блок 0
  102. // | | |___ Страница 0, блок 0 сектора 1
  103. // | | .
  104. // | | |___ Страница 7, блок 0 сектора 1
  105. // | |
  106. // | |-[-] Блок 1
  107. // | | |___ Страница 0, блок 1 сектора 1
  108. // | | |___ Страница 1, блок 1 сектора 1
  109. // | | .
  110. // | | .
  111. // | | .
  112. // | | |___ Страница 7, блок 1 сектора 1
  113. // | .
  114. // | .
  115. // | .
  116. // | |-[-] Блок 30
  117. // | |
  118. // | |___ Страница 0, блок 30 сектора 1
  119. // | .
  120. // | .
  121. // | .
  122. // | |___ Страница 7, блок 30 сектора 1
  123. // |
  124. // |
  125. // |-[-] Сектор 1 / Обычный сектор, содержит 32 блока
  126. // | |
  127. // | |-[-] Блок 0
  128. // | | |
  129. // | | |___ Страница 0, блок 0 сектора 2
  130. // | | .
  131. // | | .
  132. // | | .
  133. // | | |___ Страница 7, блок 0 сектора 2
  134. // | |
  135. // | |-[-] Блок 1
  136. // | | |
  137. // | | |___ Страница 0, блок 1 сектора 2
  138. // | | .
  139. // | | .
  140. // | | .
  141. // | | |___ Страница 7, блок 1 сектора 2
  142. // | |
  143. // | |-[+] Блок 2
  144. // | .
  145. // | .
  146. // | .
  147. // | |-[+] Блок 30
  148. // | |-[+] Блок 31
  149. // |
  150. // |-[+] Сектор 2 / Обычный сектор, содержит 32 блока
  151. // |-[+] Сектор 3 / Обычный сектор, содержит 32 блока
  152. // .
  153. // .
  154. // .
  155. // |-[+] Сектор 15 / Обычный сектор, содержит 32 блока
  156. //
  157. //----------------------------------------------------------------------------------------------------------
  158. // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
  159. // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ Внутренние определения №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
  160. // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
  161. // ##__##__##__##__##__##__##__##__##__##__##__##__##__##__##__##
  162. // ## ##
  163. // ## Распределение памяти ##
  164. // ## ##
  165. // ##__##__##__##__##__##__##__##__##__##__##__##__##__##__##__##
  166. // размер страницы
  167. #define __FULL_PAGE_SIZE 528 // размер страницы дополнен 16-ю байтами для служебной информации
  168. #define __DATA_PAGE_SIZE 512
  169. // страницы не совсем стандартные - каждая страница имеет 512 байт данных и 16 байт служебной информации
  170. // Все эти байты читаются и пишутся обычным образом. Но для замены стандартных решений (вроде AT25XXX), удобнее
  171. // эмулировать наличие 512 байт в странице, отбросив 16 служебных.
  172. #if defined(AT45DB161E_EMU512) || defined(AT45DB161E_PRM512)
  173. #ifdef AT45DB161E_PRM512
  174. #define __PAGE_SIZE __DATA_PAGE_SIZE // размер страницы: для API
  175. #else
  176. #define __PAGE_SIZE __FULL_PAGE_SIZE // размер страницы: для API
  177. #endif
  178. #define __PAGE_SIZE_USER __DATA_PAGE_SIZE // размер страницы: для пользователя
  179. #else
  180. #define __PAGE_SIZE __FULL_PAGE_SIZE // размер страницы: для API
  181. #define __PAGE_SIZE_USER __FULL_PAGE_SIZE // размер страницы: для пользователя
  182. #endif
  183. // размер блока
  184. #define __PAGES_PER_BLOCK 8
  185. #define __BLOCK_SIZE ( __PAGES_PER_BLOCK * __PAGE_SIZE )
  186. #define __BLOCK_SIZE_USER ( __PAGES_PER_BLOCK * __PAGE_SIZE_USER )
  187. // Количество секторов, блоков
  188. // Сектора разного размера: всего их 17 (1+1+15)
  189. // Первый и второй - имеют хитрый размер, остальные - одинаковые, по 32 блока, т.е. по 256 страниц
  190. #define __SECTORS_FULL 17 // полное количество секторов (нулевой состоит из двух)
  191. #define __SECTORS_TYPICAL 16 // типовое количество секторов
  192. #define __SECTORS __SECTORS_TYPICAL
  193. #define __BLOCKS 512 // полное количество блоков
  194. #define __BLOCKS_PER_SECTOR 32 // количество блоков в секторе
  195. #define __FULL_PAGES (__BLOCKS * __PAGES_PER_BLOCK)
  196. #define __PAGES_PER_SECTOR (__BLOCKS_PER_SECTOR * __PAGES_PER_BLOCK )
  197. // размеры секторов
  198. #if defined(AT45DB161E_PRM512) || defined(AT45DB161E_EMU512)
  199. #define __SECTOR_STD_SIZE 0x20000 // 128K
  200. #define __SECTOR0_A_SIZE 0x1000 // 4K
  201. #define __SECTOR0_B_SIZE 0x1F000 // 124K
  202. #else
  203. #define __SECTOR_STD_SIZE 0x21000 // 128K + 4K
  204. #define __SECTOR0_A_SIZE 0x1080 // 4K + 128
  205. #define __SECTOR0_B_SIZE 0x1FF80 // 124K + 3968
  206. #endif
  207. #define __SECTOR1_SIZE __SECTOR_STD_SIZE
  208. #define __SECTOR2_SIZE __SECTOR_STD_SIZE
  209. #define __SECTOR3_SIZE __SECTOR_STD_SIZE
  210. #define __SECTOR4_SIZE __SECTOR_STD_SIZE
  211. #define __SECTOR5_SIZE __SECTOR_STD_SIZE
  212. #define __SECTOR6_SIZE __SECTOR_STD_SIZE
  213. #define __SECTOR7_SIZE __SECTOR_STD_SIZE
  214. #define __SECTOR8_SIZE __SECTOR_STD_SIZE
  215. #define __SECTOR9_SIZE __SECTOR_STD_SIZE
  216. #define __SECTOR10_SIZE __SECTOR_STD_SIZE
  217. #define __SECTOR11_SIZE __SECTOR_STD_SIZE
  218. #define __SECTOR12_SIZE __SECTOR_STD_SIZE
  219. #define __SECTOR13_SIZE __SECTOR_STD_SIZE
  220. #define __SECTOR14_SIZE __SECTOR_STD_SIZE
  221. #define __SECTOR15_SIZE __SECTOR_STD_SIZE
  222. #define __FULL_CHIP_SIZE (__BLOCKS * __PAGES_PER_BLOCK * __FULL_PAGE_SIZE)
  223. #define __FULL_DATA_SIZE (__BLOCKS * __PAGES_PER_BLOCK * __DATA_PAGE_SIZE)
  224. #include "drivers\flash\base\flash_api_types.h"
  225. #ifdef AT45DB161E_LOWLEVEL
  226. //---------------------------------------------------------------
  227. // Чип имеет 2 встроенных SRAM буфера по 528 байт для проведения
  228. // операций чтения/записи и сравнения. Чип позволяет читать
  229. // данные последовательно, страницу за страницей (послед. чтение).
  230. // Также возможна запись содержимого буфера в память со стиранием,
  231. // при этом стирание происходит автоматически.
  232. //---------------------------------------------------------------
  233. // ##__##__##__##__##__##__##__##__##__##__##__##__##__##__##__##
  234. // ## ##
  235. // ## команды обмена ##
  236. // ## ##
  237. // ##__##__##__##__##__##__##__##__##__##__##__##__##__##__##__##
  238. // чтение
  239. #define _RCMD_ARRYREAD 0xE8 // последовательное чтение
  240. #define _LCMD_ARRYREAD 0x03 // последовательное чтение (до 33MHz)
  241. #define _HCMD_ARRYREAD 0x0B // последовательное чтение (до 66MHz)
  242. #define _RCMD_PAGEREAD 0xD2 // чтение одной страницы
  243. #define _RCMD_BUF1READ 0xD4 // чтение содержимого буфера 1
  244. #define _RCMD_BUF2READ 0xD6 // чтение содержимого буфера 2
  245. #define _LCMD_BUF1READ 0xD1 // чтение содержимого буфера 1 (до 33MHz)
  246. #define _LCMD_BUF2READ 0xD3 // чтение содержимого буфера 2 (до 33MHz)
  247. // запись
  248. #define _WCMD_BUF1WRIT 0x84 // Запись в буфер 1
  249. #define _WCMD_BUF2WRIT 0x87 // Запись в буфер 2
  250. #define _WCMD_BUF1PROG 0x83 // Запись содержимого буфера 1 в страницу
  251. #define _WCMD_BUF2PROG 0x86 // Запись содержимого буфера 2 в страницу
  252. #define _WCMD_BUF1PRGx 0x88 // Запись содержимого буфера 1 в страницу БЕЗ стирания
  253. #define _WCMD_BUF2PRGx 0x89 // Запись содержимого буфера 2 в страницу БЕЗ стирания
  254. // можно писать в страницу без дополнительных буферных команд, пропуская данные через буфер 1 или 2
  255. #define _WCMD_PGB1WRIT 0x82 // Запись страницы через буфер 1 (Запись в буфер+Стирание страницы+Запись буфера)
  256. #define _WCMD_PGB2WRIT 0x85 // Запись страницы через буфер 2 (Запись в буфер+Стирание страницы+Запись буфера)
  257. // Стирание: Чип позволяет стирать память по-странично, и по-блочно
  258. #define _ECMD_PAGERASE 0x81 // Стирание страницы
  259. #define _ECMD_BLKERASE 0x50 // Стирание блока из 8 страниц (удобно использовать вместе с __CMD_PRGxBUF1 и __CMD_PRGxBUF2 )
  260. // по-секторнор
  261. #define _ECMD_SCTERASE 0x7C // Стирание сектора 0a,0b,1-63
  262. // или целиком (последовательность 4 команд-байт)
  263. #define _ECMD_CHPERAS0 0xC7 // Стрирание чипа, байт №0
  264. #define _ECMD_CHPERAS1 0x94 // Стрирание чипа, байт №1
  265. #define _ECMD_CHPERAS2 0x80 // Стрирание чипа, байт №2
  266. #define _ECMD_CHPERAS3 0x9A // Стрирание чипа, байт №3
  267. #define _ECMD_CHPERASE 0xC794809A // Стрирание чипа (обратный порядок байт)
  268. #define _ECMD_CHPERASE_DIRECT 0x9A8094C7 // Стрирание чипа
  269. // дополнительные команды
  270. // Можно сравнивать фрагменты в буферах со страницами в памяти
  271. #define _ACMD_BUF1LOAD 0x53 // Загрузка страницы в буфер 1 (предварительное чтение, используется, например, для сравнения)
  272. #define _ACMD_BUF2LOAD 0x55 // Загрузка страницы в буфер 2 (предварительное чтение, используется, например, для сравнения __CMD_BUF1CMPR/__CMD_BUF2CMPR)
  273. #define _ACMD_BUF1CMPR 0x60 // Сравнение содержимого буфера 1 со страницей
  274. #define _ACMD_BUF2CMPR 0x61 // Сравнение содержимого буфера 2 со страницей
  275. // Производитель требует хотябы однажды за каждые 20000 операций записи/стирания страницы
  276. // в секторе проводить перезапись всех остальных страниц в секторе. Для этого введена специальная
  277. // команда обновления страницы __CMD_PAGEREF1 (__CMD_PAGEREF2), использующая буфер 1 или 2 для
  278. // чтения страницы и записи ее на то же место (обновление страницы)
  279. /* <quote>To preserve data integrity, each page of an Atmel DataFlash sector must be updated/rewritten at least once within
  280. every 20,000 cumulative page erase and program operations. </quote> */
  281. #define _ACMD_PAGEREF1 0x58 // Обновление страницы через буфер 1
  282. #define _ACMD_PAGEREF2 0x59 // Обновление страницы через буфер 2
  283. // чип поддерживает энергосберегающий режим
  284. #define _ACMD_EPWRDOWN 0xB9 // переход в спящий режим
  285. #define _ACMD_LPWRDOWN 0xAB // выход их спящего режима
  286. #define _ACMD_STATREAD 0xD7 // чтение статусного регистра
  287. #define _ACMD_MFIDREAD 0x9F // чтение информации о производителе и ID микросхемы
  288. // команды совместимости со старыми чипами
  289. #define _OCMD_BUF1READ 0x54 // чтение содержимого буфера 1 (совместимость)
  290. #define _OCMD_BUF2READ 0x56 // чтение содержимого буфера 2 (совместимость)
  291. #define _OCMD_PAGEREAD 0x52 // чтение одной страницы (совместимость)
  292. #define _OCMD_ARRYREAD 0x68 // последовательное чтение (совместимость)
  293. #define _OCMD_STATREAD 0x57 // чтение статусного регистра (совместимость)
  294. // команды защиты
  295. #define _SCMD_4SCTPREN 0x3D2A7FA9 // включить защиту секторов (обратный порядок байт)
  296. #define _SCMD_4SCTPRDS 0x3D2A7F9A // выкючить защиту секторов (обратный порядок байт)
  297. #define _SCMD_4PRREGER 0x3D2A7FCF // стереть регистр защиты стирания (protect) (обратный порядок байт)
  298. #define _SCMD_4PRREGWR 0x3D2A7FFC // Записать регистр защиты стирания (protect) (обратный порядок байт)
  299. #define _SCMD_PRTREGRD 0x32 // прочитать регистр защиты стирания (protect)
  300. #define _SCMD_4SCTLKDN 0x3D2A7F30 // постоянная блокировка сектора (навсегда) (обратный порядок байт)
  301. #define _SCMD_LKDNRGRD 0x35 // прочитать регистр постоянной блокировки
  302. #define _SCMD_4SECRGWR 0x9B000000 // запись регистра безопасности (security) (обратный порядок байт)
  303. #define _SCMD_4SECRGRD 0x77000000 // чтение регистра безопасности (security) (обратный порядок байт)
  304. #define _PCMD_PGSZCNFG 0x3D2A80A6 // перепрограммирование размера страницы на 512 байт (НАВЕСГДА) (обратный порядок байт)
  305. #define _SCMD_4SCTPREN_DIRECT 0xA97F2A3D // включить защиту секторов
  306. #define _SCMD_4SCTPRDS_DIRECT 0x9A7F2A3D // выкючить защиту секторов
  307. #define _SCMD_4PRREGER_DIRECT 0xCF7F2A3D // стереть регистр защиты стирания (protect)
  308. #define _SCMD_4PRREGWR_DIRECT 0xFC7F2A3D // Записать регистр защиты стирания (protect)
  309. #define _SCMD_4SCTLKDN_DIRECT 0x307F2A3D // постоянная блокировка сектора (навсегда)
  310. #define _SCMD_4SECRGWR_DIRECT 0x0000009B // запись регистра безопасности (security)
  311. #define _SCMD_4SECRGRD_DIRECT 0x00000077 // чтение регистра безопасности (security)
  312. #define _PCMD_PGSZCNFG_DIRECT 0xA6802A3D // перепрограммирование размера страницы на 512 байт (НАВЕСГДА)
  313. #endif
  314. #if defined(AT45DB161E_APILEVEL) || defined(AT45DB161E_LOWLEVEL)
  315. // ##__##__##__##__##__##__##__##__##__##__##__##__##__##__##__##
  316. // ## ##
  317. // ## максимальные времена ##
  318. // ## ##
  319. // ##__##__##__##__##__##__##__##__##__##__##__##__##__##__##__##
  320. //
  321. // из колонки MAX таблицы временных характеристик чипа
  322. #define _TIME_CSSET_us 1 // время на установление CS в 1
  323. #define _TIME_CSCLR_us 1 // время на установление CS в 0
  324. #define _TIME_CSHLD_us 1 // минимальное время CS в неактивном состоянии м/у командами
  325. #define _TIME_EDPDM_us 3 // вход в спящий режим
  326. #define _TIME_RDPDM_us 35 // выход из спящего режима
  327. #define _TIME_BLDCM_us 300 // загрузка/сравнение буфера
  328. #define _TIME_RSTRC_us 1 // время восстановления после сброса
  329. #define _TIME_RSTWD_us 10 // время удержания сигнала сброса
  330. #define _TIME_STRUP_us 100 // время готовности после подачи питания (чип все еще не готов записывать данные)
  331. #define _TIME_PGPRG_ms 15/*6*/ // программирование страницы
  332. #define _TIME_START_ms 20 // ожидание запуска чипа до полной готовности
  333. #define _TIME_COOLDOWN_ms 20 // ожидание "остывания" чипа после выключения питания
  334. #define _TIME_PGERS_ms 35 // стирание страницы
  335. #define _TIME_PGEPR_ms 40 // стирание страницы + программирование страницы
  336. #define _TIME_BKERS_ms 100 // стирание блока
  337. #define _TIME_SCERS_ms 5000 // стирание сектора
  338. #define _TIME_FLASHAPI_TIMEOUT 10 // стандартный таймаут ожидания API-функций
  339. #endif
  340. #ifdef AT45DB161E_LOWLEVEL
  341. // ##__##__##__##__##__##__##__##__##__##__##__##__##__##__##__##
  342. // ## ##
  343. // ## ДРУГИЕ ОПРЕДЕЛЕНИЯ ##
  344. // ## ##
  345. // ##__##__##__##__##__##__##__##__##__##__##__##__##__##__##__##
  346. /* <CONFIG> */
  347. // положение всех используемых гломальных переменных в памяти RAM (секция)
  348. //#define FLASH_RAM_PLACE ".at45" // укажите имя секции в кавычках для размещения всех связанных с AT45DB161E данных в ней
  349. // ожидание освобождения устройства
  350. //#define AT45DBXXX_SMART_WAIT_THRESHOLD 10 // порог в мс, выше которого функция __flash_smart_waitms начнет опрашивать чип на предмет его занятости.
  351. #include "drivers\flash\at45\config\AT45DB161E_CONF.h"
  352. /* </CONFIG> */
  353. // чтение идентификатора
  354. #define __FLASH_MANIDEX_OPCODE 0x7F // Contunuation Code при чтении Manufacturer ID
  355. #define __FLASH_ATMEL_ID 0x001F // индентификатор фирмы Atmel в поле Manufacturer ID
  356. #define __FLASH_INVALID_ID 0x00FF // индентификатор фирмы Atmel в поле Manufacturer ID
  357. #define __FLASH_DENSITY_16MB 0x6 // Atmel' Density for 16Mbit: 00110
  358. #define __FLASH_FAMILY_DATAFLASH 0x1 // Atmel' Family for DataFlash: 001
  359. #define __FLASH_STATUS_DENSITY_SIGN 0xB // комбинационный код Density в регистре статуса
  360. #endif
  361. #if defined(AT45DB161E_APILEVEL) || defined(AT45DB161E_LOWLEVEL)
  362. // регистр защиты - байты защиты
  363. #define __FLASH_PROTECTION_REG_ENABLE 0xFF // байт регистра защиты - сектор защищен
  364. #define __FLASH_PROTECTION_REG_DISABLE 0x00 // байт регистра защиты - сектор НЕ защищен
  365. #define __FLASH_PROTECTION_REG_S0_ENABLE 0x3 // поле 0го байта регистра защиты - сектор 0 защищен
  366. #define __FLASH_PROTECTION_REG_S0_DISABLE 0x0 // поле 0го байта регистра защиты - сектор 0 НЕ защищен
  367. #endif
  368. #ifdef AT45DB161E_LOWLEVEL
  369. // оперативная память
  370. #define __FLASH_LL_COMMAND_MAXSIZE 8 // максимальное количество байт, выделяемое для буфера команд
  371. // максимальное количество байт, выделяемое для буфера команд + буфера страницы
  372. //#define __FLASH_LL_SVCMEM_SIZE ( __FULL_PAGE_SIZE + __FLASH_LL_COMMAND_MAXSIZE + __SECTORS_TYPICAL )
  373. #define __FLASH_LL_SVCMEM_SIZE ( __FLASH_LL_COMMAND_MAXSIZE + __SECTORS_TYPICAL )
  374. #endif
  375. #if defined(AT45DB161E_APILEVEL) || defined(AT45DB161E_LOWLEVEL)
  376. // регистр безопасности
  377. #define __FLASH_USER_SECURITY_BYTES 64 // количество байт, доступных для программирования в регистре безопасности
  378. #define __FLASH_FACT_SECURITY_BYTES 64 // количество байт, запрограммированых в регистре безопасности производиелем
  379. #endif
  380. // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
  381. // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ структуры и типы №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
  382. // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
  383. //
  384. #if defined(AT45DB161E_LOWLEVEL) || defined(AT45DB161E_APILEVEL)
  385. //-------------------------------------------
  386. #pragma pack( push, 1 )
  387. // РЕГИСТР СТАТУСА
  388. struct __flash_status_register_st
  389. {
  390. __FLASH_BYTE bPageSize : 1; // размер страницы 512(1)/528(0)
  391. __FLASH_BYTE bProtect : 1; // защита секторов установлена(1)/снята(0)
  392. __FLASH_BYTE cDensity : 4; // информация о размере памяти (устарело, см. даташит)
  393. __FLASH_BYTE bMismatch : 1; // бит "несовпадение" буфера и страницы (команда сравнения)
  394. __FLASH_BYTE bReady : 1; // бит занятости BUSY. занят(0)/свободен(1)
  395. };
  396. #pragma pack( pop )
  397. typedef struct __flash_status_register_st __flash_status_t;
  398. //-------------------------------------------
  399. #pragma pack( push, 1 )
  400. // ИНДЕТИФИКАТОР ПРОИЗВОДИТЕЛЯ
  401. struct __flash_deviceid_st
  402. {
  403. __FLASH_BYTE Density : 5; // вместимость чипа (16Mbit=01011)
  404. __FLASH_BYTE Family : 3; // семейство памяти (DataFlash=001)
  405. __FLASH_BYTE Revision: 5; // аппаратная версия
  406. __FLASH_BYTE CellType: 3; // тип ячейки памяти (SLC(single-level-cell),MLC(multi-level-cell),TLC(tripple-level-cell)); MLC: 000=1bit/cell
  407. };
  408. typedef struct __flash_deviceid_st flash_deviceid_t;
  409. struct __flash_manufacturerid_st
  410. {
  411. union {
  412. struct {
  413. __FLASH_BYTE LowId; // стандартный байт ID (не расширенный)
  414. __FLASH_BYTE HighId; // расширенный байт ID (количество 0x7F Continuation Code) (JEDEC JEP-106)
  415. };
  416. __FLASH_WORD FullId; // полный ID
  417. };
  418. __FLASH_WORD DevId; // код устройства
  419. __FLASH_BYTE ExtLen; // длинна расширенной информации
  420. __FLASH_BYTE * pExtBf; // указатель на буфер приемник расширенной информации
  421. };
  422. struct __flash_manufacturerid_ex_st
  423. {
  424. union {
  425. struct {
  426. __FLASH_BYTE LowId; // стандартный байт ID (не расширенный)
  427. __FLASH_BYTE HighId; // расширенный байт ID (количество 0x7F Continuation Code) (JEDEC JEP-106)
  428. };
  429. __FLASH_WORD FullId; // полный ID
  430. };
  431. flash_deviceid_t DevId; // код устройства
  432. __FLASH_BYTE ExtLen; // длинна расширенной информации
  433. __FLASH_BYTE * pExtBf; // указатель на буфер приемник расширенной информации
  434. };
  435. struct __flash_manufacturerid_returnvalue_st
  436. {
  437. union {
  438. struct {
  439. __FLASH_BYTE LowId; // стандартный байт ID (не расширенный)
  440. __FLASH_BYTE HighId; // расширенный байт ID (количество 0x7F Continuation Code) (JEDEC JEP-106)
  441. };
  442. __FLASH_WORD FullId; // полный ID
  443. };
  444. flash_deviceid_t DevId; // код устройства
  445. };
  446. typedef struct __flash_manufacturerid_returnvalue_st __flash_rvid_t;
  447. typedef struct __flash_manufacturerid_st __flash_id_t;
  448. typedef struct __flash_manufacturerid_ex_st __flash_exid_t;
  449. #pragma pack( pop )
  450. //-------------------------------------------
  451. #pragma pack( push, 1 )
  452. // РЕГИСТРЫ ЗАЩИТЫ/БЛОКИРОВКИ СЕКТОРОВ
  453. struct __flash_protect_register_sector0_st
  454. {
  455. __FLASH_BYTE prot_0a : 2; // секция защиты сектора 0A (0-7 pages)
  456. __FLASH_BYTE prot_0b : 2; // секция защиты сектора 0B (8-127 pages)
  457. __FLASH_BYTE reserved: 4; // не используется
  458. };
  459. typedef struct __flash_protect_register_sector0_st __flash_protreg_s0_t;
  460. union __flash_protect_register_st
  461. {
  462. __flash_protreg_s0_t Sector0; // байт защиты сектора 0 ( __FLASH_PROTECTION_REG_S0_ENABLE / __FLASH_PROTECTION_REG_S0_DISABLE )
  463. // байты защиты секторов 0-63 (__FLASH_PROTECTION_REG_ENABLE / __FLASH_PROTECTION_REG_DISABLE )
  464. __FLASH_BYTE Sectors[ __SECTORS_TYPICAL ];
  465. };
  466. typedef union __flash_protect_register_st __flash_protectionregister_t;
  467. typedef union __flash_protect_register_st __flash_lockdownregister_t;
  468. #pragma pack( pop )
  469. //-------------------------------------------
  470. // РЕГИСТРЫ БЕЗОПАСНОСТИ
  471. #pragma pack( push, 1 )
  472. struct __flash_usersecurity_register_st
  473. {
  474. __FLASH_BYTE UserId[ __FLASH_USER_SECURITY_BYTES ];
  475. };
  476. typedef struct __flash_usersecurity_register_st __flash_usersecurityregister_t;
  477. struct __flash_factorysecurity_register_st
  478. {
  479. __FLASH_BYTE UserId[ __FLASH_FACT_SECURITY_BYTES ];
  480. };
  481. typedef struct __flash_factorysecurity_register_st __flash_factorysecurityregister_t;
  482. struct __flash_security_register_st
  483. {
  484. __flash_usersecurityregister_t UserPart; // доступные для однократного программирования байты в регистре безопасности
  485. __flash_factorysecurityregister_t FactoryPart; // запрограммированные производителем байты в регистре безопасности
  486. };
  487. typedef struct __flash_security_register_st __flash_securityregister_t;
  488. #pragma pack( pop )
  489. //-------------------------------------------
  490. // РЕГИСТРЫ КОНФИГУРАЦИИ: бит
  491. enum __flash_enum_pagesize
  492. {
  493. __fps_528 = 0, // размер страницы - 528 байт (по умолчанию)
  494. __fps_512 = 1, // размер страницы - 512 байт (по умолчанию)
  495. __fps_default = __fps_528, // 528 bytes / размер по умолчанию (с завода)
  496. __fps_standart = __fps_512, // 512 байт / стандартный размер
  497. };
  498. typedef enum __flash_enum_pagesize __flash_pagesize_t;
  499. // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
  500. // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ преобразования адресов №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
  501. // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
  502. //
  503. #if defined(AT45DB161E_LOWLEVEL) || defined(AT45DB161E_APILEVEL)
  504. // На размер страницы влияет макрос AT45DB161E_PRM512
  505. // На размер страниые НЕ влияет макрос AT45DB161E_EMU512
  506. //#define __FLASH_ADDRESS2SECTOR(addr) ((addr)/__SECTOR_STD_SIZE) // __FLASH_ADDRESS2SECTOR - преобразует адрес в номер сектора с учетом используемого размера страницы
  507. #define __FLASH_ADDRESS2PAGE(addr) ((addr)/__PAGE_SIZE_USER) // __FLASH_ADDRESS2PAGE - преобразует адрес в номер страницы с учетом используемого размера страницы
  508. #define __FLASH_PAGE2BLOCK(page) ((page)/__PAGES_PER_BLOCK) // __FLASH_PAGE2BLOCK - преобразует номер страницы в номер блока
  509. #define __FLASH_ADDRESSOFFSETPAGE(addr) ((addr)%__PAGE_SIZE_USER) // __FLASH_ADDRESSOFFSETPAGE - получает смещение адреса относительно начала страницы
  510. // __FLASH_DATAREMAININGINPAGE - вычисляет, какое количество байт осталось до конца страницы
  511. #define __FLASH_DATAREMAININGINPAGE(addr) ( __PAGE_SIZE_USER - __FLASH_ADDRESSOFFSETPAGE( address ) )
  512. #define __FLASH_BASE_DENSITY 0x40000 // 256Kbit
  513. #define __FLASH_DENSITY2CAPACITY(density) (__FLASH_BASE_DENSITY << (density) )
  514. // __FLASH_PAGESINRANGE - вычисляет, какое количество страниц находится на промежутке длинной size начиная с адреса address
  515. #define __FLASH_PAGESINRANGE(address,size) \
  516. ((address+size)/__PAGE_SIZE_USER - \
  517. (address)/__PAGE_SIZE_USER + \
  518. (((address+size)%__PAGE_SIZE_USER)?1:0)) //
  519. // __FLASH_PAGE_ARRAGED_BY_BLOCK - проверяет, выровнена ли страница на размер блока
  520. #define __FLASH_PAGE_ARRAGED_BY_BLOCK(pg) (!( pg % AT45FLASH_PAGES_PER_BLOCK ))
  521. #endif
  522. // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
  523. // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ экпортируемые макросы №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
  524. // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
  525. //
  526. // для экспорта функций используйте заголовочный файл "AT45DB161E_LL_func.h"
  527. #define AT45FLASH_ATMEL_ID __FLASH_ATMEL_ID // Atmel' Manufacturer ID
  528. #define AT45FLASH_DENSITY_16MB __FLASH_DENSITY_16MB // Atmel' Density for 32Mbit
  529. #define AT45FLASH_FAMILY_DATAFLASH __FLASH_FAMILY_DATAFLASH // Atmel' Family code
  530. #define AT45FLASH_CHIP_SIZE __FULL_CHIP_SIZE // полный объем чипа
  531. #define AT45FLASH_DATA_SIZE __FULL_DATA_SIZE // полный объем данных (с учетом или без учета сервисных байтов)
  532. #define AT45FLASH_SECTORS __SECTORS // количество секторов
  533. #define AT45FLASH_PAGE_SIZE __PAGE_SIZE_USER // размер страницы (зависит от использования сервисных секторов)
  534. #define AT45FLASH_BLOCKS __BLOCKS // количество блоков
  535. #define AT45FLASH_BLOCK_SIZE __BLOCK_SIZE_USER // размер блока (зависит от использования сервисных секторов)
  536. #define AT45FLASH_PAGES __FULL_PAGES // количество страниц
  537. #define AT45FLASH_BLOCKS_PER_SECTOR __BLOCKS_PER_SECTOR // количество блоков в секторе
  538. #define AT45FLASH_PAGES_PER_SECTOR __PAGES_PER_SECTOR // количество страниц в стандартном секторе
  539. #define AT45FLASH_PAGES_PER_BLOCK __PAGES_PER_BLOCK
  540. //-------------------------------------------
  541. // размеры секторов
  542. #define AT45FLASH_SECTOR0_SIZE (__SECTOR0_A_SIZE + __SECTOR0_B_SIZE)
  543. #define AT45FLASH_SECTOR0A_SIZE __SECTOR0_A_SIZE
  544. #define AT45FLASH_SECTOR0B_SIZE __SECTOR0_B_SIZE
  545. #define AT45FLASH_SECTOR1_SIZE __SECTOR1_SIZE
  546. #define AT45FLASH_SECTOR2_SIZE __SECTOR2_SIZE
  547. #define AT45FLASH_SECTOR3_SIZE __SECTOR3_SIZE
  548. #define AT45FLASH_SECTOR4_SIZE __SECTOR4_SIZE
  549. #define AT45FLASH_SECTOR5_SIZE __SECTOR5_SIZE
  550. #define AT45FLASH_SECTOR6_SIZE __SECTOR6_SIZE
  551. #define AT45FLASH_SECTOR7_SIZE __SECTOR7_SIZE
  552. #define AT45FLASH_SECTOR8_SIZE __SECTOR8_SIZE
  553. #define AT45FLASH_SECTOR9_SIZE __SECTOR9_SIZE
  554. #define AT45FLASH_SECTOR10_SIZE __SECTOR10_SIZE
  555. #define AT45FLASH_SECTOR11_SIZE __SECTOR11_SIZE
  556. #define AT45FLASH_SECTOR12_SIZE __SECTOR12_SIZE
  557. #define AT45FLASH_SECTOR13_SIZE __SECTOR13_SIZE
  558. #define AT45FLASH_SECTOR14_SIZE __SECTOR14_SIZE
  559. #define AT45FLASH_SECTOR15_SIZE __SECTOR15_SIZE
  560. // количество циклов перезаписи регистра защиты
  561. #define AT45FLASH_PROTREG_WRITECOUNT __FLASH_PROTECTREGISTER_WRITECYCLES
  562. // зарезервированная область в начале адресного пространства
  563. #define AT45FLASH_MINIMUM_ADDRESS (AT45FLASH_SECTOR0_SIZE)
  564. // максимально возможный адрес
  565. #define AT45FLASH_MAXIMUM_ADDRESS (AT45FLASH_PAGES * __PAGE_SIZE_USER )
  566. //-------------------------------------------
  567. // блок проверки режима эмуляции
  568. #ifdef AT45DB161E_EMU512
  569. #ifdef AT45DB161E_PRM512
  570. #undef AT45DB161E_PRM512
  571. #error Внимание! Вы неправильно объявили режим эмуляции страницы 512 байт.
  572. #endif
  573. #endif
  574. #if defined( AT45DB161E_APILEVEL )
  575. #ifdef AT45DB161E_EMU512
  576. #warning Внимание! Выбран режим программной эмуляции страниц 512 байт
  577. #endif
  578. #ifdef AT45DB161E_PRM512
  579. #warning Внимание! Выбран режим аппаратной эмуляции страниц 512 байт
  580. #warning Будьте внимательны! После первого запуска отключить данный режим будет невозможно!
  581. #endif
  582. #endif
  583. #endif
  584. #endif