AT45DB321D_GLOB.h 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758
  1. // Файл с основными определениями для AT45DB321D.
  2. // v 1.11 от 20/07/15
  3. // Автор: Сычев А.
  4. // используйте следующие макросы перед подключением этого заголовочного файла
  5. // AT45DB321D_APILEVEL - для доступа к структурам и типам низокуровневых функций
  6. // AT45DB321D_LOWLEVEL - для доступа ко всем низкоуровневым определениям
  7. //
  8. // например: # файл c API для работы с флешкой использует
  9. // только интерфейсы, ему достаточно только AT45DB321D_APILEVEL
  10. // # файл, который реализует низкоуровневые команды требует AT45DB321D_LOWLEVEL
  11. // # пользовательский файл высокоуровневой программы вообще не требует этих макросов
  12. #ifndef AT45DB321D_H
  13. #define AT45DB321D_H
  14. // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
  15. // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ВВЕДЕНИЕ №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
  16. // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
  17. // Чип состоит из 65 секторов, в т.ч. 2 уникальных и 63 обычных. Первые 2 считаются за 1.
  18. // Уникальные сектора - это разбитый на 2 части обычные, он меньше обычного по размеру.
  19. // В даташите эти секторы называются sector 0a и sector 0b. Остальные
  20. // секторы нумеруются как обычно, 1...63.
  21. //
  22. // Сектор содержит от 1 до 16 блоков, обычный всегда содержит 16 блоков
  23. // Блок содержит всегда 8 страниц по 512+16 байт.
  24. // Первые 2 сектора - подсекторы 0го, 0a и 0b - уникальные. Первый (сектор 0a) содержит один блок (8страниц)
  25. // Второй уникальный (сектор 0b) - 15 блоков. Остальные сектора (1,3,4...63) - содержат
  26. // по 16 блоков
  27. // Чип позволяет хранить дополнительные 16 байт на каждые 512 байт в каждой странице
  28. // Это используется, например, для хранения контрольных сумм и кодов исправления ошибок.
  29. // Эти данные доступны при простом чтении страницы или последовательном чтении.
  30. // Однако можно запретить доступ к этим данным: программная эмуляция и аппаратная эмуляция
  31. // Программная эмуляция - эмуляция программными средствами API драйвера памяти. Она заключается
  32. // в том, что при чтении страницы читаются только первые 512 байт. Внимание! В этом режиме
  33. // недоступна команда последовательного чтения! Аппаратная эмуляция - использование
  34. // опции power of two чипа памяти, опция включается один раз, и более не выключается.
  35. // В этом режиме команда последовательного чтения работает.
  36. // Для того, чтобы включить программную эмуляцию 512 байтной страницы
  37. // объявите макрос AT45DB321D_EMU512=1
  38. // Для того, чтобы использовать опцию Power of two и навсегда установить
  39. // размер страницы 512 байт, объявите макрос AT45DB321D_PRM512
  40. // Используйте только один из макросов!
  41. // Чип позволяет прогаммно защищать секторы от стирания/записи. Для этого используются
  42. // команды снятия/установки защиты на выбранные секторы. При этом выбор секторов для защиты
  43. // осуществляется через специальный регистр защиты, содержимое которого определяет, какие
  44. // секторы будут защищены. Сам регистр защиты можно защитить только аппарано (пин WP).
  45. // Т.О. защита осуществляется в 2 этапа: изменение регистра защиты (стирание+запись) и
  46. // включение защиты. Причем не обязательно в этом порядке: можно не снимая защиты модифицировать
  47. // содержимое регистра не снимая защиты. Именно так рекомендуют действовать Atmel.
  48. // При стирании регистра защиты все секторы становятся защищены. Количество операций
  49. // записи/стирания регистра ограничено числом
  50. #define __FLASH_PROTECTREGISTER_WRITECYCLES 10000
  51. /* <CONFIG> */
  52. //#define AT45DB321D_EMU512 // включение/выключение сервисных байтов
  53. //#define AT45DB321D_PRM512 // запрещение сервисных байтов
  54. #include "drivers\flash\config\AT45DB321D_CONF.h"
  55. #ifndef FLASH_API_TIMEOUT
  56. #define FLASH_API_TIMEOUT _TIME_FLASHAPI_TIMEOUT
  57. #endif
  58. /* </CONFIG> */
  59. // Библиотека позволяет исключить циклы ожидания после
  60. // длительных команд, переложив ожидание ПОСЛЕ команды
  61. // в ожидание ПЕРЕД командой - активное ожидание освобождения
  62. // устройства через сканирования флага BUSY в статусном регистре.
  63. // Библиотека в любом случае использует чтение флага перед
  64. // каждой низкоуровневой командой, но делает это обычно 1 раз,
  65. // возвращая ошибку после неудачи. Используйте макрос AT45DB321D_BKGOPERATIONS=1,
  66. // для того, чтобы использовать постоянное сканирование флага
  67. // перед командой вместо ожидания в конце команды. Используя данный режим,
  68. // будьте внимательны при сохранении данных перед выключением питания.
  69. // Библиотека позволяет использовать "умные" задержки после длительных
  70. // операций. Это означает, что ожидание после команды представляет собой
  71. // периодическое сканирование флага BUSY. Заданная в спецификации задержка
  72. // разбивается на квантованные промежутки времени, через которые происходит
  73. // опрос занятости устройства. Так предположительно длительная задержка
  74. // может быть сокращена при досрочном освобождении устройства. По умолчанию
  75. // режим "умных" задержек включен. Для выключения объявите макрос AT45DB321D_DONTUSESMARTDELAY=1
  76. // Режим "умных" задержек используется для обеспечения МИЛЛИСЕКУНДНЫХ задержек более __FLASH_SMART_WAIT_THRESHOLD миллисекунд
  77. /* <CONFIG> */
  78. //#define AT45DB321D_DONTUSESMARTDELAY 0 // отключение "умной" задержки
  79. //#define AT45DB321D_BKGOPERATIONS 0 // отключение задержек операций | ВНИМАНИЕ! Только для ОПЫТНЫХ пользователей (-: !!!
  80. /* </CONFIG> */
  81. //--------------------------------------------------------------
  82. // Иерархия распределения секторов, блоков и страниц.
  83. // Номера блоков - отнисительно сектора
  84. // Номера страниц - отнисительно блока
  85. //--------------------------------------------------------------
  86. // AT45DB321D
  87. // _________
  88. // |
  89. // |-[-] Сектор 0a / Уникальный сектор, содержит только 1 блок
  90. // | |
  91. // | |-[-] Блок 0
  92. // | |___ Страница 0, блок 0 сектора 0
  93. // | .
  94. // | .
  95. // | .
  96. // | |___ Страница 7, блок 0 сектора 0
  97. // |
  98. // |
  99. // |-[-] Сектор 0b / Уникальный сектор, содержит только 63 блока
  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. // | |-[-] Блок 14
  117. // | |
  118. // | |___ Страница 0, блок 62 сектора 1
  119. // | .
  120. // | .
  121. // | .
  122. // | |___ Страница 7, блок 62 сектора 1
  123. // |
  124. // |
  125. // |-[-] Сектор 1 / Обычный сектор, содержит 64 блока
  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. // | |-[+] Блок 14
  148. // | |-[+] Блок 15
  149. // |
  150. // |-[+] Сектор 2 / Обычный сектор, содержит 16 блоков
  151. // |-[+] Сектор 3 / Обычный сектор, содержит 16 блоков
  152. // .
  153. // .
  154. // .
  155. // |-[+] Сектор 63 / Обычный сектор, содержит 16 блоков
  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(AT45DB321D_EMU512) || defined(AT45DB321D_PRM512)
  173. #ifdef AT45DB321D_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. // Сектора разного размера: всего их 65 (1+1+63)
  189. // Первый и второй - имеют хитрый размер, остальные - одинаковые, по 16 блоков, т.е. по 128 страниц
  190. #define __SECTORS_FULL 65 // полное количество секторов (нулевой состоит из двух)
  191. #define __SECTORS_TYPICAL 64 // типовое количество секторов
  192. #define __SECTORS __SECTORS_TYPICAL
  193. #define __BLOCKS 1024 // полное количество блоков
  194. #define __BLOCKS_PER_SECTOR 16 // количество блоков в секторе
  195. #define __FULL_PAGES (__BLOCKS * __PAGES_PER_BLOCK)
  196. #define __PAGES_PER_SECTOR (__BLOCKS_PER_SECTOR * __PAGES_PER_BLOCK )
  197. // размеры секторов
  198. #if defined(AT45DB321D_PRM512) || defined(AT45DB321D_EMU512)
  199. #define __SECTOR_STD_SIZE 0x10000 // 64K
  200. #define __SECTOR0_A_SIZE 0x1000 // 4K
  201. #define __SECTOR0_B_SIZE 0xF000 // 60K
  202. #else
  203. #define __SECTOR_STD_SIZE 0x10800 // 64K + 2K
  204. #define __SECTOR0_A_SIZE 0x1080 // 4K + 128
  205. #define __SECTOR0_B_SIZE 0xF780 // 60K + 1920
  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 __SECTOR16_SIZE __SECTOR_STD_SIZE
  223. #define __SECTOR17_SIZE __SECTOR_STD_SIZE
  224. #define __SECTOR18_SIZE __SECTOR_STD_SIZE
  225. #define __SECTOR19_SIZE __SECTOR_STD_SIZE
  226. #define __SECTOR20_SIZE __SECTOR_STD_SIZE
  227. #define __SECTOR21_SIZE __SECTOR_STD_SIZE
  228. #define __SECTOR22_SIZE __SECTOR_STD_SIZE
  229. #define __SECTOR23_SIZE __SECTOR_STD_SIZE
  230. #define __SECTOR24_SIZE __SECTOR_STD_SIZE
  231. #define __SECTOR25_SIZE __SECTOR_STD_SIZE
  232. #define __SECTOR26_SIZE __SECTOR_STD_SIZE
  233. #define __SECTOR27_SIZE __SECTOR_STD_SIZE
  234. #define __SECTOR28_SIZE __SECTOR_STD_SIZE
  235. #define __SECTOR29_SIZE __SECTOR_STD_SIZE
  236. #define __SECTOR30_SIZE __SECTOR_STD_SIZE
  237. #define __SECTOR31_SIZE __SECTOR_STD_SIZE
  238. #define __SECTOR32_SIZE __SECTOR_STD_SIZE
  239. #define __SECTOR33_SIZE __SECTOR_STD_SIZE
  240. #define __SECTOR34_SIZE __SECTOR_STD_SIZE
  241. #define __SECTOR35_SIZE __SECTOR_STD_SIZE
  242. #define __SECTOR36_SIZE __SECTOR_STD_SIZE
  243. #define __SECTOR37_SIZE __SECTOR_STD_SIZE
  244. #define __SECTOR38_SIZE __SECTOR_STD_SIZE
  245. #define __SECTOR39_SIZE __SECTOR_STD_SIZE
  246. #define __SECTOR40_SIZE __SECTOR_STD_SIZE
  247. #define __SECTOR41_SIZE __SECTOR_STD_SIZE
  248. #define __SECTOR42_SIZE __SECTOR_STD_SIZE
  249. #define __SECTOR43_SIZE __SECTOR_STD_SIZE
  250. #define __SECTOR44_SIZE __SECTOR_STD_SIZE
  251. #define __SECTOR45_SIZE __SECTOR_STD_SIZE
  252. #define __SECTOR46_SIZE __SECTOR_STD_SIZE
  253. #define __SECTOR47_SIZE __SECTOR_STD_SIZE
  254. #define __SECTOR48_SIZE __SECTOR_STD_SIZE
  255. #define __SECTOR49_SIZE __SECTOR_STD_SIZE
  256. #define __SECTOR50_SIZE __SECTOR_STD_SIZE
  257. #define __SECTOR51_SIZE __SECTOR_STD_SIZE
  258. #define __SECTOR52_SIZE __SECTOR_STD_SIZE
  259. #define __SECTOR53_SIZE __SECTOR_STD_SIZE
  260. #define __SECTOR54_SIZE __SECTOR_STD_SIZE
  261. #define __SECTOR55_SIZE __SECTOR_STD_SIZE
  262. #define __SECTOR56_SIZE __SECTOR_STD_SIZE
  263. #define __SECTOR57_SIZE __SECTOR_STD_SIZE
  264. #define __SECTOR58_SIZE __SECTOR_STD_SIZE
  265. #define __SECTOR59_SIZE __SECTOR_STD_SIZE
  266. #define __SECTOR60_SIZE __SECTOR_STD_SIZE
  267. #define __SECTOR61_SIZE __SECTOR_STD_SIZE
  268. #define __SECTOR62_SIZE __SECTOR_STD_SIZE
  269. #define __SECTOR63_SIZE __SECTOR_STD_SIZE
  270. #define __FULL_CHIP_SIZE (__BLOCKS * __PAGES_PER_BLOCK * __FULL_PAGE_SIZE)
  271. #define __FULL_DATA_SIZE (__BLOCKS * __PAGES_PER_BLOCK * __DATA_PAGE_SIZE)
  272. #include "drivers\flash\common\AT45DBXXX_TYP.h"
  273. #ifdef AT45DB321D_LOWLEVEL
  274. //---------------------------------------------------------------
  275. // Чип имеет 2 встроенных SRAM буфера по 528 байт для проведения
  276. // операций чтения/записи и сравнения. Чип позволяет читать
  277. // данные последовательно, страницу за страницей (послед. чтение).
  278. // Также возможна запись содержимого буфера в память со стиранием,
  279. // при этом стирание происходит автоматически.
  280. //---------------------------------------------------------------
  281. // ##__##__##__##__##__##__##__##__##__##__##__##__##__##__##__##
  282. // ## ##
  283. // ## команды обмена ##
  284. // ## ##
  285. // ##__##__##__##__##__##__##__##__##__##__##__##__##__##__##__##
  286. // чтение
  287. #define _RCMD_ARRYREAD 0xE8 // последовательное чтение
  288. #define _LCMD_ARRYREAD 0x03 // последовательное чтение (до 33MHz)
  289. #define _HCMD_ARRYREAD 0x0B // последовательное чтение (до 66MHz)
  290. #define _RCMD_PAGEREAD 0xD2 // чтение одной страницы
  291. #define _RCMD_BUF1READ 0xD4 // чтение содержимого буфера 1
  292. #define _RCMD_BUF2READ 0xD6 // чтение содержимого буфера 2
  293. #define _LCMD_BUF1READ 0xD1 // чтение содержимого буфера 1 (до 33MHz)
  294. #define _LCMD_BUF2READ 0xD3 // чтение содержимого буфера 2 (до 33MHz)
  295. // запись
  296. #define _WCMD_BUF1WRIT 0x84 // Запись в буфер 1
  297. #define _WCMD_BUF2WRIT 0x87 // Запись в буфер 2
  298. #define _WCMD_BUF1PROG 0x83 // Запись содержимого буфера 1 в страницу
  299. #define _WCMD_BUF2PROG 0x86 // Запись содержимого буфера 2 в страницу
  300. #define _WCMD_BUF1PRGx 0x88 // Запись содержимого буфера 1 в страницу БЕЗ стирания
  301. #define _WCMD_BUF2PRGx 0x89 // Запись содержимого буфера 2 в страницу БЕЗ стирания
  302. // можно писать в страницу без дополнительных буферных команд, пропуская данные через буфер 1 или 2
  303. #define _WCMD_PGB1WRIT 0x82 // Запись страницы через буфер 1 (Запись в буфер+Стирание страницы+Запись буфера)
  304. #define _WCMD_PGB2WRIT 0x85 // Запись страницы через буфер 2 (Запись в буфер+Стирание страницы+Запись буфера)
  305. // Стирание: Чип позволяет стирать память по-странично, и по-блочно
  306. #define _ECMD_PAGERASE 0x81 // Стирание страницы
  307. #define _ECMD_BLKERASE 0x50 // Стирание блока из 8 страниц (удобно использовать вместе с __CMD_PRGxBUF1 и __CMD_PRGxBUF2 )
  308. // по-секторнор
  309. #define _ECMD_SCTERASE 0x7C // Стирание сектора 0a,0b,1-63
  310. // или целиком (последовательность 4 команд-байт)
  311. #define _ECMD_CHPERAS0 0xC7 // Стрирание чипа, байт №0
  312. #define _ECMD_CHPERAS1 0x94 // Стрирание чипа, байт №1
  313. #define _ECMD_CHPERAS2 0x80 // Стрирание чипа, байт №2
  314. #define _ECMD_CHPERAS3 0x9A // Стрирание чипа, байт №3
  315. #define _ECMD_CHPERASE 0xC794809A // Стрирание чипа (обратный порядок байт)
  316. #define _ECMD_CHPERASE_DIRECT 0x9A8094C7 // Стрирание чипа
  317. // дополнительные команды
  318. // Можно сравнивать фрагменты в буферах со страницами в памяти
  319. #define _ACMD_BUF1LOAD 0x53 // Загрузка страницы в буфер 1 (предварительное чтение, используется, например, для сравнения)
  320. #define _ACMD_BUF2LOAD 0x55 // Загрузка страницы в буфер 2 (предварительное чтение, используется, например, для сравнения __CMD_BUF1CMPR/__CMD_BUF2CMPR)
  321. #define _ACMD_BUF1CMPR 0x60 // Сравнение содержимого буфера 1 со страницей
  322. #define _ACMD_BUF2CMPR 0x61 // Сравнение содержимого буфера 2 со страницей
  323. // Производитель требует хотябы однажды за каждые 20000 операций записи/стирания страницы
  324. // в секторе проводить перезапись всех остальных страниц в секторе. Для этого введена специальная
  325. // команда обновления страницы __CMD_PAGEREF1 (__CMD_PAGEREF2), использующая буфер 1 или 2 для
  326. // чтения страницы и записи ее на то же место (обновление страницы)
  327. /* <quote>To preserve data integrity, each page of an Atmel DataFlash sector must be updated/rewritten at least once within
  328. every 20,000 cumulative page erase and program operations. </quote> */
  329. #define _ACMD_PAGEREF1 0x58 // Обновление страницы через буфер 1
  330. #define _ACMD_PAGEREF2 0x59 // Обновление страницы через буфер 2
  331. // чип поддерживает энергосберегающий режим
  332. #define _ACMD_EPWRDOWN 0xB9 // переход в спящий режим
  333. #define _ACMD_LPWRDOWN 0xAB // выход их спящего режима
  334. #define _ACMD_STATREAD 0xD7 // чтение статусного регистра
  335. #define _ACMD_MFIDREAD 0x9F // чтение информации о производителе и ID микросхемы
  336. // команды совместимости со старыми чипами
  337. #define _OCMD_BUF1READ 0x54 // чтение содержимого буфера 1 (совместимость)
  338. #define _OCMD_BUF2READ 0x56 // чтение содержимого буфера 2 (совместимость)
  339. #define _OCMD_PAGEREAD 0x52 // чтение одной страницы (совместимость)
  340. #define _OCMD_ARRYREAD 0x68 // последовательное чтение (совместимость)
  341. #define _OCMD_STATREAD 0x57 // чтение статусного регистра (совместимость)
  342. // команды защиты
  343. #define _SCMD_4SCTPREN 0x3D2A7FA9 // включить защиту секторов (обратный порядок байт)
  344. #define _SCMD_4SCTPRDS 0x3D2A7F9A // выкючить защиту секторов (обратный порядок байт)
  345. #define _SCMD_4PRREGER 0x3D2A7FCF // стереть регистр защиты стирания (protect) (обратный порядок байт)
  346. #define _SCMD_4PRREGWR 0x3D2A7FFC // Записать регистр защиты стирания (protect) (обратный порядок байт)
  347. #define _SCMD_PRTREGRD 0x32 // прочитать регистр защиты стирания (protect)
  348. #define _SCMD_4SCTLKDN 0x3D2A7F30 // постоянная блокировка сектора (навсегда) (обратный порядок байт)
  349. #define _SCMD_LKDNRGRD 0x35 // прочитать регистр постоянной блокировки
  350. #define _SCMD_4SECRGWR 0x9B000000 // запись регистра безопасности (security) (обратный порядок байт)
  351. #define _SCMD_4SECRGRD 0x77000000 // чтение регистра безопасности (security) (обратный порядок байт)
  352. #define _PCMD_PGSZCNFG 0x3D2A80A6 // перепрограммирование размера страницы на 512 байт (НАВЕСГДА) (обратный порядок байт)
  353. #define _SCMD_4SCTPREN_DIRECT 0xA97F2A3D // включить защиту секторов
  354. #define _SCMD_4SCTPRDS_DIRECT 0x9A7F2A3D // выкючить защиту секторов
  355. #define _SCMD_4PRREGER_DIRECT 0xCF7F2A3D // стереть регистр защиты стирания (protect)
  356. #define _SCMD_4PRREGWR_DIRECT 0xFC7F2A3D // Записать регистр защиты стирания (protect)
  357. #define _SCMD_4SCTLKDN_DIRECT 0x307F2A3D // постоянная блокировка сектора (навсегда)
  358. #define _SCMD_4SECRGWR_DIRECT 0x0000009B // запись регистра безопасности (security)
  359. #define _SCMD_4SECRGRD_DIRECT 0x00000077 // чтение регистра безопасности (security)
  360. #define _PCMD_PGSZCNFG_DIRECT 0xA6802A3D // перепрограммирование размера страницы на 512 байт (НАВЕСГДА)
  361. #endif
  362. #if defined(AT45DB321D_APILEVEL) || defined(AT45DB321D_LOWLEVEL)
  363. // ##__##__##__##__##__##__##__##__##__##__##__##__##__##__##__##
  364. // ## ##
  365. // ## максимальные времена ##
  366. // ## ##
  367. // ##__##__##__##__##__##__##__##__##__##__##__##__##__##__##__##
  368. //
  369. // из колонки MAX таблицы временных характеристик чипа
  370. #define _TIME_CSSET_us 1 // время на установление CS в 1
  371. #define _TIME_CSCLR_us 1 // время на установление CS в 0
  372. #define _TIME_CSHLD_us 1 // минимальное время CS в неактивном состоянии м/у командами
  373. #define _TIME_EDPDM_us 3 // вход в спящий режим
  374. #define _TIME_RDPDM_us 35 // выход из спящего режима
  375. #define _TIME_BLDCM_us 300 // загрузка/сравнение буфера
  376. #define _TIME_RSTRC_us 1 // время восстановления после сброса
  377. #define _TIME_RSTWD_us 10 // время удержания сигнала сброса
  378. #define _TIME_STRUP_us 100 // время готовности после подачи питания (чип все еще не готов записывать данные)
  379. #define _TIME_PGPRG_ms 15/*6*/ // программирование страницы
  380. #define _TIME_START_ms 20 // ожидание запуска чипа до полной готовности
  381. #define _TIME_COOLDOWN_ms 20 // ожидание "остывания" чипа после выключения питания
  382. #define _TIME_PGERS_ms 35 // стирание страницы
  383. #define _TIME_PGEPR_ms 40 // стирание страницы + программирование страницы
  384. #define _TIME_BKERS_ms 100 // стирание блока
  385. #define _TIME_SCERS_ms 5000 // стирание сектора
  386. #define _TIME_FLASHAPI_TIMEOUT 10 // стандартный таймаут ожидания API-функций
  387. #endif
  388. #ifdef AT45DB321D_LOWLEVEL
  389. // ##__##__##__##__##__##__##__##__##__##__##__##__##__##__##__##
  390. // ## ##
  391. // ## ДРУГИЕ ОПРЕДЕЛЕНИЯ ##
  392. // ## ##
  393. // ##__##__##__##__##__##__##__##__##__##__##__##__##__##__##__##
  394. /* <CONFIG> */
  395. // положение всех используемых гломальных переменных в памяти RAM (секция)
  396. //#define FLASH_RAM_PLACE ".at45" // укажите имя секции в кавычках для размещения всех связанных с AT45DB321D данных в ней
  397. // ожидание освобождения устройства
  398. //#define __FLASH_SMART_WAIT_THRESHOLD 10 // порог в мс, выше которого функция __flash_smart_waitms начнет опрашивать чип на предмет его занятости.
  399. #include "drivers\flash\config\AT45DB321D_CONF.h"
  400. /* </CONFIG> */
  401. // чтение идентификатора
  402. #define __FLASH_MANIDEX_OPCODE 0x7F // Contunuation Code при чтении Manufacturer ID
  403. #define __FLASH_ATMEL_ID 0x001F // индентификатор фирмы Atmel в поле Manufacturer ID
  404. #define __FLASH_INVALID_ID 0x00FF // индентификатор фирмы Atmel в поле Manufacturer ID
  405. #define __FLASH_DENSITY_32MB 0x7 // Atmel' Density for 32Mbit: 00111
  406. #define __FLASH_FAMILY_DATAFLASH 0x1 // Atmel' Family for DataFlash: 001
  407. #define __FLASH_STATUS_DENSITY_SIGN 0xD // комбинационный код Density в регистре статуса
  408. #endif
  409. #if defined(AT45DB321D_APILEVEL) || defined(AT45DB321D_LOWLEVEL)
  410. // регистр защиты - байты защиты
  411. #define __FLASH_PROTECTION_REG_ENABLE 0xFF // байт регистра защиты - сектор защищен
  412. #define __FLASH_PROTECTION_REG_DISABLE 0x00 // байт регистра защиты - сектор НЕ защищен
  413. #define __FLASH_PROTECTION_REG_S0_ENABLE 0x3 // поле 0го байта регистра защиты - сектор 0 защищен
  414. #define __FLASH_PROTECTION_REG_S0_DISABLE 0x0 // поле 0го байта регистра защиты - сектор 0 НЕ защищен
  415. #endif
  416. #ifdef AT45DB321D_LOWLEVEL
  417. // оперативная память
  418. #define __FLASH_LL_COMMAND_MAXSIZE 8 // максимальное количество байт, выделяемое для буфера команд
  419. // максимальное количество байт, выделяемое для буфера команд + буфера страницы
  420. //#define __FLASH_LL_SVCMEM_SIZE ( __FULL_PAGE_SIZE + __FLASH_LL_COMMAND_MAXSIZE + __SECTORS_TYPICAL )
  421. #define __FLASH_LL_SVCMEM_SIZE ( __FLASH_LL_COMMAND_MAXSIZE + __SECTORS_TYPICAL )
  422. #endif
  423. #if defined(AT45DB321D_APILEVEL) || defined(AT45DB321D_LOWLEVEL)
  424. // регистр безопасности
  425. #define __FLASH_USER_SECURITY_BYTES 64 // количество байт, доступных для программирования в регистре безопасности
  426. #define __FLASH_FACT_SECURITY_BYTES 64 // количество байт, запрограммированых в регистре безопасности производиелем
  427. #endif
  428. // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
  429. // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ структуры и типы №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
  430. // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
  431. //
  432. #if defined(AT45DB321D_LOWLEVEL) || defined(AT45DB321D_APILEVEL)
  433. //-------------------------------------------
  434. #pragma pack( push, 1 )
  435. // РЕГИСТР СТАТУСА
  436. struct __flash_status_register_st
  437. {
  438. __FLASH_BYTE bPageSize : 1; // размер страницы 512(1)/528(0)
  439. __FLASH_BYTE bProtect : 1; // защита секторов установлена(1)/снята(0)
  440. __FLASH_BYTE cDensity : 4; // информация о размере памяти (устарело, см. даташит)
  441. __FLASH_BYTE bMismatch : 1; // бит "несовпадение" буфера и страницы (команда сравнения)
  442. __FLASH_BYTE bReady : 1; // бит занятости BUSY. занят(0)/свободен(1)
  443. };
  444. #pragma pack( pop )
  445. typedef struct __flash_status_register_st __flash_status_t;
  446. //-------------------------------------------
  447. #pragma pack( push, 1 )
  448. // ИНДЕТИФИКАТОР ПРОИЗВОДИТЕЛЯ
  449. struct __flash_deviceid_st
  450. {
  451. __FLASH_BYTE Density : 5; // вместимость чипа (32Mbit=00111)
  452. __FLASH_BYTE Family : 3; // семейство памяти (DataFlash=001)
  453. __FLASH_BYTE Revision: 5; // аппаратная версия
  454. __FLASH_BYTE CellType: 3; // тип ячейки памяти (SLC(single-level-cell),MLC(multi-level-cell),TLC(tripple-level-cell)); MLC: 000=1bit/cell
  455. };
  456. typedef struct __flash_deviceid_st flash_deviceid_t;
  457. struct __flash_manufacturerid_st
  458. {
  459. union {
  460. struct {
  461. __FLASH_BYTE LowId; // стандартный байт ID (не расширенный)
  462. __FLASH_BYTE HighId; // расширенный байт ID (количество 0x7F Continuation Code) (JEDEC JEP-106)
  463. };
  464. __FLASH_WORD FullId; // полный ID
  465. };
  466. __FLASH_WORD DevId; // код устройства
  467. __FLASH_BYTE ExtLen; // длинна расширенной информации
  468. __FLASH_BYTE * pExtBf; // указатель на буфер приемник расширенной информации
  469. };
  470. struct __flash_manufacturerid_ex_st
  471. {
  472. union {
  473. struct {
  474. __FLASH_BYTE LowId; // стандартный байт ID (не расширенный)
  475. __FLASH_BYTE HighId; // расширенный байт ID (количество 0x7F Continuation Code) (JEDEC JEP-106)
  476. };
  477. __FLASH_WORD FullId; // полный ID
  478. };
  479. flash_deviceid_t DevId; // код устройства
  480. __FLASH_BYTE ExtLen; // длинна расширенной информации
  481. __FLASH_BYTE * pExtBf; // указатель на буфер приемник расширенной информации
  482. };
  483. struct __flash_manufacturerid_returnvalue_st
  484. {
  485. union {
  486. struct {
  487. __FLASH_BYTE LowId; // стандартный байт ID (не расширенный)
  488. __FLASH_BYTE HighId; // расширенный байт ID (количество 0x7F Continuation Code) (JEDEC JEP-106)
  489. };
  490. __FLASH_WORD FullId; // полный ID
  491. };
  492. flash_deviceid_t DevId; // код устройства
  493. };
  494. typedef struct __flash_manufacturerid_returnvalue_st __flash_rvid_t;
  495. typedef struct __flash_manufacturerid_st __flash_id_t;
  496. typedef struct __flash_manufacturerid_ex_st __flash_exid_t;
  497. #pragma pack( pop )
  498. //-------------------------------------------
  499. #pragma pack( push, 1 )
  500. // РЕГИСТРЫ ЗАЩИТЫ/БЛОКИРОВКИ СЕКТОРОВ
  501. struct __flash_protect_register_sector0_st
  502. {
  503. __FLASH_BYTE prot_0a : 2; // секция защиты сектора 0A (0-7 pages)
  504. __FLASH_BYTE prot_0b : 2; // секция защиты сектора 0B (8-127 pages)
  505. __FLASH_BYTE reserved: 4; // не используется
  506. };
  507. typedef struct __flash_protect_register_sector0_st __flash_protreg_s0_t;
  508. union __flash_protect_register_st
  509. {
  510. __flash_protreg_s0_t Sector0; // байт защиты сектора 0 ( __FLASH_PROTECTION_REG_S0_ENABLE / __FLASH_PROTECTION_REG_S0_DISABLE )
  511. // байты защиты секторов 0-63 (__FLASH_PROTECTION_REG_ENABLE / __FLASH_PROTECTION_REG_DISABLE )
  512. __FLASH_BYTE Sectors[ __SECTORS_TYPICAL ];
  513. };
  514. typedef union __flash_protect_register_st __flash_protectionregister_t;
  515. typedef union __flash_protect_register_st __flash_lockdownregister_t;
  516. #pragma pack( pop )
  517. //-------------------------------------------
  518. // РЕГИСТРЫ БЕЗОПАСНОСТИ
  519. #pragma pack( push, 1 )
  520. struct __flash_usersecurity_register_st
  521. {
  522. __FLASH_BYTE UserId[ __FLASH_USER_SECURITY_BYTES ];
  523. };
  524. typedef struct __flash_usersecurity_register_st __flash_usersecurityregister_t;
  525. struct __flash_factorysecurity_register_st
  526. {
  527. __FLASH_BYTE UserId[ __FLASH_FACT_SECURITY_BYTES ];
  528. };
  529. typedef struct __flash_factorysecurity_register_st __flash_factorysecurityregister_t;
  530. struct __flash_security_register_st
  531. {
  532. __flash_usersecurityregister_t UserPart; // доступные для однократного программирования байты в регистре безопасности
  533. __flash_factorysecurityregister_t FactoryPart; // запрограммированные производителем байты в регистре безопасности
  534. };
  535. typedef struct __flash_security_register_st __flash_securityregister_t;
  536. #pragma pack( pop )
  537. //-------------------------------------------
  538. // РЕГИСТРЫ КОНФИГУРАЦИИ: бит
  539. enum __flash_enum_pagesize
  540. {
  541. __fps_528 = 0, // размер страницы - 528 байт (по умолчанию)
  542. __fps_512 = 1, // размер страницы - 512 байт (по умолчанию)
  543. __fps_default = __fps_528, // 528 bytes / размер по умолчанию (с завода)
  544. __fps_standart = __fps_512, // 512 байт / стандартный размер
  545. };
  546. typedef enum __flash_enum_pagesize __flash_pagesize_t;
  547. // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
  548. // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ преобразования адресов №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
  549. // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
  550. //
  551. #if defined(AT45DB321D_LOWLEVEL) || defined(AT45DB321D_APILEVEL)
  552. // На размер страницы влияет макрос AT45DB321D_PRM512
  553. // На размер страниые НЕ влияет макрос AT45DB321D_EMU512
  554. //#define __FLASH_ADDRESS2SECTOR(addr) ((addr)/__SECTOR_STD_SIZE) // __FLASH_ADDRESS2SECTOR - преобразует адрес в номер сектора с учетом используемого размера страницы
  555. #define __FLASH_ADDRESS2PAGE(addr) ((addr)/__PAGE_SIZE_USER) // __FLASH_ADDRESS2PAGE - преобразует адрес в номер страницы с учетом используемого размера страницы
  556. #define __FLASH_PAGE2BLOCK(page) ((page)/__PAGES_PER_BLOCK) // __FLASH_PAGE2BLOCK - преобразует номер страницы в номер блока
  557. #define __FLASH_ADDRESSOFFSETPAGE(addr) ((addr)%__PAGE_SIZE_USER) // __FLASH_ADDRESSOFFSETPAGE - получает смещение адреса относительно начала страницы
  558. // __FLASH_DATAREMAININGINPAGE - вычисляет, какое количество байт осталось до конца страницы
  559. #define __FLASH_DATAREMAININGINPAGE(addr) ( __PAGE_SIZE_USER - __FLASH_ADDRESSOFFSETPAGE( address ) )
  560. #define __FLASH_BASE_DENSITY 0x40000 // 256Kbit
  561. #define __FLASH_DENSITY2CAPACITY(density) (__FLASH_BASE_DENSITY << (density) )
  562. // __FLASH_PAGESINRANGE - вычисляет, какое количество страниц находится на промежутке длинной size начиная с адреса address
  563. #define __FLASH_PAGESINRANGE(address,size) \
  564. ((address+size)/__PAGE_SIZE_USER - \
  565. (address)/__PAGE_SIZE_USER + \
  566. (((address+size)%__PAGE_SIZE_USER)?1:0)) //
  567. // __FLASH_PAGE_ARRAGED_BY_BLOCK - проверяет, выровнена ли страница на размер блока
  568. #define __FLASH_PAGE_ARRAGED_BY_BLOCK(pg) (!( pg % AT45FLASH_PAGES_PER_BLOCK ))
  569. #endif
  570. // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
  571. // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ экпортируемые макросы №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
  572. // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
  573. //
  574. // для экспорта функций используйте заголовочный файл "AT45DB321D_LL_func.h"
  575. #define AT45FLASH_ATMEL_ID __FLASH_ATMEL_ID // Atmel' Manufacturer ID
  576. #define AT45FLASH_DENSITY_32MB __FLASH_DENSITY_32MB // Atmel' Density for 32Mbit
  577. #define AT45FLASH_FAMILY_DATAFLASH __FLASH_FAMILY_DATAFLASH // Atmel' Family code
  578. #define AT45FLASH_CHIP_SIZE __FULL_CHIP_SIZE // полный объем чипа
  579. #define AT45FLASH_DATA_SIZE __FULL_DATA_SIZE // полный объем данных (с учетом или без учета сервисных байтов)
  580. #define AT45FLASH_SECTORS __SECTORS // количество секторов
  581. #define AT45FLASH_PAGE_SIZE __PAGE_SIZE_USER // размер страницы (зависит от использования сервисных секторов)
  582. #define AT45FLASH_BLOCKS __BLOCKS // количество блоков
  583. #define AT45FLASH_BLOCK_SIZE __BLOCK_SIZE_USER // размер блока (зависит от использования сервисных секторов)
  584. #define AT45FLASH_PAGES __FULL_PAGES // количество страниц
  585. #define AT45FLASH_BLOCKS_PER_SECTOR __BLOCKS_PER_SECTOR // количество блоков в секторе
  586. #define AT45FLASH_PAGES_PER_SECTOR __PAGES_PER_SECTOR // количество страниц в стандартном секторе
  587. #define AT45FLASH_PAGES_PER_BLOCK __PAGES_PER_BLOCK
  588. //-------------------------------------------
  589. // размеры секторов
  590. #define AT45FLASH_SECTOR0_SIZE (__SECTOR0_A_SIZE + __SECTOR0_B_SIZE)
  591. #define AT45FLASH_SECTOR0A_SIZE __SECTOR0_A_SIZE
  592. #define AT45FLASH_SECTOR0B_SIZE __SECTOR0_B_SIZE
  593. #define AT45FLASH_SECTOR1_SIZE __SECTOR1_SIZE
  594. #define AT45FLASH_SECTOR2_SIZE __SECTOR2_SIZE
  595. #define AT45FLASH_SECTOR3_SIZE __SECTOR3_SIZE
  596. #define AT45FLASH_SECTOR4_SIZE __SECTOR4_SIZE
  597. #define AT45FLASH_SECTOR5_SIZE __SECTOR5_SIZE
  598. #define AT45FLASH_SECTOR6_SIZE __SECTOR6_SIZE
  599. #define AT45FLASH_SECTOR7_SIZE __SECTOR7_SIZE
  600. #define AT45FLASH_SECTOR8_SIZE __SECTOR8_SIZE
  601. #define AT45FLASH_SECTOR9_SIZE __SECTOR9_SIZE
  602. #define AT45FLASH_SECTOR10_SIZE __SECTOR10_SIZE
  603. #define AT45FLASH_SECTOR11_SIZE __SECTOR11_SIZE
  604. #define AT45FLASH_SECTOR12_SIZE __SECTOR12_SIZE
  605. #define AT45FLASH_SECTOR13_SIZE __SECTOR13_SIZE
  606. #define AT45FLASH_SECTOR14_SIZE __SECTOR14_SIZE
  607. #define AT45FLASH_SECTOR15_SIZE __SECTOR15_SIZE
  608. #define AT45FLASH_SECTOR16_SIZE __SECTOR16_SIZE
  609. #define AT45FLASH_SECTOR17_SIZE __SECTOR17_SIZE
  610. #define AT45FLASH_SECTOR18_SIZE __SECTOR18_SIZE
  611. #define AT45FLASH_SECTOR19_SIZE __SECTOR19_SIZE
  612. #define AT45FLASH_SECTOR20_SIZE __SECTOR20_SIZE
  613. #define AT45FLASH_SECTOR21_SIZE __SECTOR21_SIZE
  614. #define AT45FLASH_SECTOR22_SIZE __SECTOR22_SIZE
  615. #define AT45FLASH_SECTOR23_SIZE __SECTOR23_SIZE
  616. #define AT45FLASH_SECTOR24_SIZE __SECTOR24_SIZE
  617. #define AT45FLASH_SECTOR25_SIZE __SECTOR25_SIZE
  618. #define AT45FLASH_SECTOR26_SIZE __SECTOR26_SIZE
  619. #define AT45FLASH_SECTOR27_SIZE __SECTOR27_SIZE
  620. #define AT45FLASH_SECTOR28_SIZE __SECTOR28_SIZE
  621. #define AT45FLASH_SECTOR29_SIZE __SECTOR29_SIZE
  622. #define AT45FLASH_SECTOR30_SIZE __SECTOR30_SIZE
  623. #define AT45FLASH_SECTOR31_SIZE __SECTOR31_SIZE
  624. #define AT45FLASH_SECTOR32_SIZE __SECTOR32_SIZE
  625. #define AT45FLASH_SECTOR33_SIZE __SECTOR33_SIZE
  626. #define AT45FLASH_SECTOR34_SIZE __SECTOR34_SIZE
  627. #define AT45FLASH_SECTOR35_SIZE __SECTOR35_SIZE
  628. #define AT45FLASH_SECTOR36_SIZE __SECTOR36_SIZE
  629. #define AT45FLASH_SECTOR37_SIZE __SECTOR37_SIZE
  630. #define AT45FLASH_SECTOR38_SIZE __SECTOR38_SIZE
  631. #define AT45FLASH_SECTOR39_SIZE __SECTOR39_SIZE
  632. #define AT45FLASH_SECTOR40_SIZE __SECTOR40_SIZE
  633. #define AT45FLASH_SECTOR41_SIZE __SECTOR41_SIZE
  634. #define AT45FLASH_SECTOR42_SIZE __SECTOR42_SIZE
  635. #define AT45FLASH_SECTOR43_SIZE __SECTOR43_SIZE
  636. #define AT45FLASH_SECTOR44_SIZE __SECTOR44_SIZE
  637. #define AT45FLASH_SECTOR45_SIZE __SECTOR45_SIZE
  638. #define AT45FLASH_SECTOR46_SIZE __SECTOR46_SIZE
  639. #define AT45FLASH_SECTOR47_SIZE __SECTOR47_SIZE
  640. #define AT45FLASH_SECTOR48_SIZE __SECTOR48_SIZE
  641. #define AT45FLASH_SECTOR49_SIZE __SECTOR49_SIZE
  642. #define AT45FLASH_SECTOR50_SIZE __SECTOR50_SIZE
  643. #define AT45FLASH_SECTOR51_SIZE __SECTOR51_SIZE
  644. #define AT45FLASH_SECTOR52_SIZE __SECTOR52_SIZE
  645. #define AT45FLASH_SECTOR53_SIZE __SECTOR53_SIZE
  646. #define AT45FLASH_SECTOR54_SIZE __SECTOR54_SIZE
  647. #define AT45FLASH_SECTOR55_SIZE __SECTOR55_SIZE
  648. #define AT45FLASH_SECTOR56_SIZE __SECTOR56_SIZE
  649. #define AT45FLASH_SECTOR57_SIZE __SECTOR57_SIZE
  650. #define AT45FLASH_SECTOR58_SIZE __SECTOR58_SIZE
  651. #define AT45FLASH_SECTOR59_SIZE __SECTOR59_SIZE
  652. #define AT45FLASH_SECTOR60_SIZE __SECTOR60_SIZE
  653. #define AT45FLASH_SECTOR61_SIZE __SECTOR61_SIZE
  654. #define AT45FLASH_SECTOR62_SIZE __SECTOR62_SIZE
  655. #define AT45FLASH_SECTOR63_SIZE __SECTOR63_SIZE
  656. // количество циклов перезаписи регистра защиты
  657. #define AT45FLASH_PROTREG_WRITECOUNT __FLASH_PROTECTREGISTER_WRITECYCLES
  658. // зарезервированная область в начале адресного пространства
  659. #define AT45FLASH_MINIMUM_ADDRESS (AT45FLASH_SECTOR0_SIZE)
  660. // максимально возможный адрес
  661. #define AT45FLASH_MAXIMUM_ADDRESS (AT45FLASH_PAGES * __PAGE_SIZE_USER )
  662. //-------------------------------------------
  663. // блок проверки режима эмуляции
  664. #ifdef AT45DB321D_EMU512
  665. #ifdef AT45DB321D_PRM512
  666. #undef AT45DB321D_PRM512
  667. #error Внимание! Вы неправильно объявили режим эмуляции страницы 512 байт.
  668. #endif
  669. #endif
  670. #if defined( AT45DB321D_APILEVEL )
  671. #ifdef AT45DB321D_EMU512
  672. #warning Внимание! Выбран режим программной эмуляции страниц 512 байт
  673. #endif
  674. #ifdef AT45DB321D_PRM512
  675. #warning Внимание! Выбран режим аппаратной эмуляции страниц 512 байт
  676. #warning Будьте внимательны! После первого запуска отключить данный режим будет невозможно!
  677. #endif
  678. #endif
  679. #endif
  680. #endif