W25Q16JV_LL.c 71 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695
  1. // Ôàéë ñ íèçêîóðîâíåâûìè êîììàíäàìè äëÿ W25Q16JV.
  2. // v 1.0 îò 09/10/20
  3. // Àâòîð: Ñû÷åâ À.
  4. // ¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹
  5. // ¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹ ÍÈÇÊÎÓÐÎÂÍÅÂÛÅ ÍÅÁÅÇÎÏÀÑÍÛÅ ÔÓÍÊÖÈÈ ¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹
  6. // ¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹
  7. #define W25Q16JV_LOWLEVEL
  8. #include "drivers\flash\base\flash_api_types.h"
  9. #include "drivers\flash\w25q\common\W25Q_HAL.h" // àïïàðàòíàÿ àáñòðàöèÿ îò SSP
  10. #include "drivers\flash\w25q\lowlevel\W25Q16JV_LL.h" // îïðåäåëåíèÿ äëÿ W25Q16JV
  11. #include "drivers\flash\w25q\lowlevel\W25Q16JV_LL_func.h" // ïðîòîòèïû LL-ôóíêöèé
  12. // ########################################################################################################
  13. static union
  14. {
  15. __flash_protectionregister_t protSectorFlagsBuffer;
  16. struct
  17. {
  18. __flash_sectorprotectionregister_t sectorFlagsBuffer1; // îñíîâíîé
  19. __flash_sectorprotectionregister_t sectorFlagsBuffer2; // êîïèÿ
  20. };
  21. __FLASH_BYTE pageBuffer[ __PAGE_SIZE ];
  22. }
  23. flash_hal_Buffer;
  24. // __flash_hal__getBuffer - çàïðîñèòü âíóòðåííèé áóôåð íèçêîãî óðîâíÿ
  25. static void * __flash_hal__getBuffer( __flash_internal_buffer_type_t type, size_t * pRetBufSize )
  26. {
  27. void * rValue = NULL; *pRetBufSize = 0;
  28. switch( type )
  29. {
  30. case fibufSectorFlags: *pRetBufSize = sizeof(flash_hal_Buffer.sectorFlagsBuffer1); rValue = &flash_hal_Buffer.sectorFlagsBuffer1;
  31. case fibufSectorFlags_2: *pRetBufSize = sizeof(flash_hal_Buffer.sectorFlagsBuffer2); rValue = &flash_hal_Buffer.sectorFlagsBuffer2;
  32. case fibufProtSectorFlags: *pRetBufSize = sizeof(flash_hal_Buffer.protSectorFlagsBuffer); rValue = &flash_hal_Buffer.protSectorFlagsBuffer;
  33. case fibufPageIO: *pRetBufSize = sizeof(flash_hal_Buffer.pageBuffer); rValue = &flash_hal_Buffer.pageBuffer[0];
  34. }
  35. // îáíóëåíèå áóôåðà
  36. if( NULL != rValue && 0 != *pRetBufSize )
  37. {
  38. __imp_sys_memzero( rValue, *pRetBufSize );
  39. }
  40. return rValue;
  41. }
  42. // ########################################################################################################
  43. // __flash_hal__writeDisable - çàïðåùåíèå çàïèñè â ÷èï
  44. static void __flash_hal__writeDisable();
  45. // __flash_hal__writeEnable - ðàçðåøåíèå çàïèñè â ÷èï
  46. static void __flash_hal__writeEnable();
  47. // __flash_hal__statusRead1 - ÷òåíèå ðåãèñòðà ñòàòóñà 1
  48. static void __flash_hal__statusRead1( __flash_status1_t * pcReadRegister ); // áóôåð äëÿ ÷òåíèÿ ñòàòóñ-ðåãèñòðà
  49. // __flash_hal__statusRead2 - ÷òåíèå ðåãèñòðà ñòàòóñà 3
  50. static void __flash_hal__statusRead2( __flash_status2_t * pcReadRegister ); // áóôåð äëÿ ÷òåíèÿ ñòàòóñ-ðåãèñòðà
  51. // __flash_hal__statusRead3 - ÷òåíèå ðåãèñòðà ñòàòóñà 3
  52. static void __flash_hal__statusRead3( __flash_status3_t * pcReadRegister ); // áóôåð äëÿ ÷òåíèÿ ñòàòóñ-ðåãèñòðà
  53. // __flash_hal__statusWrite1 - çàïèñü ðåãèñòðà ñòàòóñà 1
  54. static void __flash_hal__statusWrite1( __flash_status1_t * pcWriteRegister ); // áóôåð äëÿ çàïèñè ñòàòóñ-ðåãèñòðà
  55. // __flash_hal__statusWrite2 - çàïèñü ðåãèñòðà ñòàòóñà 3
  56. static void __flash_hal__statusWrite2( __flash_status2_t * pcWriteRegister ); // áóôåð äëÿ çàïèñè ñòàòóñ-ðåãèñòðà
  57. // __flash_hal__statusWrite3 - çàïèñü ðåãèñòðà ñòàòóñà 3
  58. static void __flash_hal__statusWrite3( __flash_status3_t * pcWriteRegister ); // áóôåð äëÿ çàïèñè ñòàòóñ-ðåãèñòðà
  59. // __flash_hal__pageErase - ñòèðàíèå ñòðàíèöû
  60. static void __flash_hal__pageErase( __FLASH_WORD wPageNum ); // íîìåð ñòèðàåìîé ñòðàíèöû
  61. // __flash_hal__blockErase - ñòèðàíèå áëîêà
  62. // static void __flash_hal__blockErase( __FLASH_WORD wBlockNum ); // íîìåð ñòèðàåìîãî áëîêà
  63. // __flash_hal__sectorErase - ñòèðàíèå ñåêòîðîâ ñ íîìåðîì 1 è âûøå
  64. static void __flash_hal__sectorErase( __FLASH_WORD wSector ); // íîìåð ñåêòîðà 1-63
  65. // __flash_hal__sleepMode - ïåðåõîä â ðåæèì ïîíèæåííîãî ýíåðãîïîòðåáëåíèÿ
  66. static void __flash_hal__sleepMode();
  67. // __flash_hal__wakeUp - âûõîä èç ðåæèìà ïîíèæåííîãî ýíåðãîïîòðåáëåíèÿ
  68. static void __flash_hal__wakeUp();
  69. // __flash_hal__arrayRead - ïîñëåäîâàòåëüíîå ÷òåíèå (ìàññèâ)
  70. static void __flash_hal__arrayRead ( __FLASH_DWORD w24Address, // àäðåñ íà÷àëà ÷òåíèÿ
  71. __FLASH_BYTE * pDataRead, // óêàçàòåëü íà áóôåð-ïðèåìíèê äàííûõ
  72. __FLASH_WORD wCntToRead ); // êîëè÷åñòâî äàííûõ íà ÷òåíèå
  73. // __flash_hal__chunkProgram - ïðîãðàììèðîâàíèå ñòðàíèöû áåç ñòèðàíèÿ áëîêà/ñòðàíèöû
  74. static void __flash_hal__chunkProgram( __flash_pageprogramptr_t pdata,
  75. __FLASH_DWORD w24Address ); // àäðåñ íà÷àëà çàïèñè
  76. // __flash_hal__securityRegister1Erase - ñòèðàåò ðåãèñòð áåçîïàñíîñòè
  77. static void __flash_hal__securityRegister1Erase();
  78. // __flash_hal__securityRegister2Erase - ñòèðàåò ðåãèñòð áåçîïàñíîñòè
  79. static void __flash_hal__securityRegister2Erase();
  80. // __flash_hal__securityRegister3Erase - ñòèðàåò ðåãèñòð áåçîïàñíîñòè
  81. static void __flash_hal__securityRegister3Erase();
  82. // __flash_hal__securityRegister1Write - çàïèñûâàåò ðåãèñòð áåçîïàñíîñòè
  83. static void __flash_hal__securityRegister1Write( __flash_securityregister_t * contents ); // ñîäåðæèìîå ðåãèñòðà áåçîïàñíîñòè
  84. // __flash_hal__securityRegister2Write - çàïèñûâàåò ðåãèñòð áåçîïàñíîñòè
  85. static void __flash_hal__securityRegister2Write( __flash_securityregister_t * contents ); // ñîäåðæèìîå ðåãèñòðà áåçîïàñíîñòè
  86. // __flash_hal__securityRegister3Write - çàïèñûâàåò ðåãèñòð áåçîïàñíîñòè
  87. static void __flash_hal__securityRegister3Write( __flash_securityregister_t * contents ); // ñîäåðæèìîå ðåãèñòðà áåçîïàñíîñòè
  88. // __flash_hal__securityRegister1Read - ïðî÷èòûâàåò ðåãèñòð áåçîïàñíîñòè
  89. static void __flash_hal__securityRegister1Read( __flash_securityregister_t * contents ); // áóôåð-ïðèåìíèê ñîäåðæèìîãî ðåãèñòðà áëîêèðîâêè
  90. // __flash_hal__securityRegister2Read - ïðî÷èòûâàåò ðåãèñòð áåçîïàñíîñòè
  91. static void __flash_hal__securityRegister2Read( __flash_securityregister_t * contents ); // áóôåð-ïðèåìíèê ñîäåðæèìîãî ðåãèñòðà áëîêèðîâêè
  92. // __flash_hal__securityRegister3Read - ïðî÷èòûâàåò ðåãèñòð áåçîïàñíîñòè
  93. void __flash_hal__securityRegister3Read( __flash_securityregister_t * contents ); // áóôåð-ïðèåìíèê ñîäåðæèìîãî ðåãèñòðà áëîêèðîâêè
  94. // __flash_hal__manufacturerIdRead - ÷òåíèå èäåíòèôèêàòîðà ïðîèçâîäèòåëÿ
  95. static __FLASH_DWORD __flash_hal__manufacturerIdRead( __flash_id_t * pManufacturerID );// íåîáÿçàòåëüíûé ïàðàìåòð-áóôåð äëÿ ïðèåìà ðàñøèðåííîé èíôîðìàöèè
  96. // __flash_hal__uniqueIdRegisterRead -
  97. static void __flash_hal__uniqueIdRegisterRead( __flash_uniqueidregister_t * contents ); // áóôåð-ïðèåìíèê ñîäåðæèìîãî ðåãèñòðà UniqueID
  98. // __flash_hal__uniqueIdRegisterValidate - ïðî÷èòûâàåò ðåãèñòð UniqueID è âûïîëíÿåò
  99. static bool __flash_hal__uniqueIdRegisterValidate( __flash_uniqueidregister_t * contents ); // áóôåð-ïðèåìíèê ñîäåðæèìîãî ðåãèñòðà UniqueID
  100. #if W25QXXX_POWER_MANAGEMENT > 0
  101. // __flash_hal__powerOn - ðåàëèçóåò óïðàâëåíèå ïèòàíèåì ìèêðîñõåìû ïàìÿòè (ïîäàåò ïèòàíèå)
  102. static void __flash_hal__powerOn();
  103. // __flash_hal__powerOff - ðåàëèçóåò óïðàâëåíèå ïèòàíèåì ìèêðîñõåìû ïàìÿòè (ñíèìàåò ïèòàíèå)
  104. static void __flash_hal__powerOff();
  105. // __flash_hal__powerPulse - ðåàëèçóåò óïðàâëåíèå ïèòàíèåì ìèêðîñõåìû - ôîðìèðóåò èìïóëüñ ïåðåçàãðóçêè
  106. static void __flash_hal__powerPulse( __FLASH_WORD nCooldownTime_ms, __FLASH_WORD nStartupTime_ms );
  107. #endif
  108. #if W25QXXX_RESET_MANAGEMENT > 0
  109. // __flash_hal__resetAssert - ðåàëèçóåò óïðàâëåíèå ñèãíàëîì ñáðîñà ìèêðîñõåìû ïàìÿòè (óñòàíàâëèâàåò ñèãíàë ñáðîñà)
  110. static void __flash_hal__resetAssert();
  111. // __flash_hal__resetRelease - ðåàëèçóåò óïðàâëåíèå ñèãíàëîì ñáðîñà ìèêðîñõåìû ïàìÿòè (ñíèìàåò ñèãíàë ñáðîñà)
  112. static void __flash_hal__resetRelease();
  113. // __flash_hal__resetPulse - ðåàëèçóåò óïðàâëåíèå ñèãíàëîì ñáðîñà ìèêðîñõåìû ïàìÿòè (ïîäàåò çàêîí÷åííûé èìïóëüñ ñáðîñà)
  114. static void __flash_hal__resetPulse();
  115. #endif
  116. // __flash_hal__initialize - Íèçêîóðîâíåâàÿ èíèöèàëèçàöèÿ ôëåøïàìÿòè
  117. // # âîçâðàùàåò 0, åñëè âñå óñïåøíî, èëè êîä îøèáêè
  118. static flash_err_t __flash_hal__initialize();
  119. // __flash_hal__finalizePrepare - Íèçêîóðîâíåâàÿ ôóíêöèÿ äëÿ ïîäãîòîâêè ôëåøïàìÿòè ê äåèíèöèàëèçàöèè äðàéâåðà
  120. static flash_err_t __flash_hal__finalizePrepare();
  121. // __flash_hal__dirtyDetect - Íèçêîóðîâíåâîå îïðåäåëåíèå íàëè÷èÿ ÷èïà (äîñòóïíîñòè)
  122. // Èñïîëüçóåòñÿ âî âðåìÿ ïåðâè÷íîé èíèöèàëèçàöèè â flash_initialize().
  123. static flash_err_t __flash_hal__dirtyDetect();
  124. // __flash_hal__startupDetect - Íèçêîóðîâíåâîå îïðåäåëåíèå íàëè÷èÿ ÷èïà (äîñòóïíîñòè)
  125. // Èñïîëüçóåòñÿ âåðõíèì óðîâíåì API äëÿ îïðåäåëåíèÿ ìîäåëè óñòàíîâëåííîãî ÷èïà ïàìÿòè
  126. static flash_err_t __flash_hal__startupDetect();
  127. // __flash_hal__getReadyFast - ïðîâåðêà çàíÿòîñòè áåç îæèäàíèÿ
  128. static flash_err_t __flash_hal__getReadyFast( );
  129. // ñëóæåáíàÿ ôóíêöèÿ äëÿ ïðîâåðêè ãîòîâíîñòè ÷èïà
  130. static int __flash_smartWaitms( __FLASH_WORD wTimems );
  131. // __flash_hal__globalLock - óñòàíîâèòü áëîêèðîâêó çàïèñè íà âñå ñåêòîðà/áëîêè
  132. static void __flash_hal__globalLock(); // [W25Q OK]
  133. // __flash_hal__globalUnlock - ñíÿòü áëîêèðîâêó çàïèñè ñî âñåõ ñåêòîðîâ/áëîêîâ
  134. static void __flash_hal__globalUnlock(); // [W25Q OK]
  135. // __flash_hal__protectStateWrite - çàïèñûâàåò èíäèâèäóàëüíóþ áëîêèðîâêó ñåêòîðà/áëîêà
  136. static void __flash_hal__protectStateWrite( size_t nProtSector, bool protectState );
  137. // __flash_hal__protectStateRead - ñ÷èòûâàåò èíäèâèäóàëüíóþ áëîêèðîâêó ñåêòîðà/áëîêà
  138. static bool __flash_hal__protectStateRead( size_t nProtSector );
  139. // __flash_hal__protectregister_write - çàïèñûâàåò ðåãèñòð çàùèòû (áèòû èíäèâèäóàëüíîé çàùèòû ñåêòîðîâ/áëîêîâ)
  140. // void __flash_hal__protectregister_write( __flash_protectionregister_t * contents );
  141. // __flash_hal__protectregister_read - ïðî÷èòûâàåò ðåãèñòð çàùèòû (áèòû èíäèâèäóàëüíîé çàùèòû ñåêòîðîâ/áëîêîâ)
  142. // void __flash_hal__protectregister_read( __flash_protectionregister_t * contents );
  143. // ########################################################################################################
  144. const W25Q_LL_Routines_t W25Q_LL_Routines =
  145. {
  146. .operations =
  147. {
  148. .writeDisable = __flash_hal__writeDisable,
  149. .writeEnable = __flash_hal__writeEnable,
  150. },
  151. .status =
  152. {
  153. .statusRead1 = __flash_hal__statusRead1,
  154. .statusRead2 = __flash_hal__statusRead2,
  155. .statusRead3 = __flash_hal__statusRead3,
  156. .statusWrite1 = __flash_hal__statusWrite1,
  157. .statusWrite2 = __flash_hal__statusWrite2,
  158. .statusWrite3 = __flash_hal__statusWrite3,
  159. },
  160. .security =
  161. {
  162. .securityRegister1Erase = __flash_hal__securityRegister1Erase,
  163. .securityRegister2Erase = __flash_hal__securityRegister2Erase,
  164. .securityRegister3Erase = __flash_hal__securityRegister3Erase,
  165. .securityRegister1Write = __flash_hal__securityRegister1Write,
  166. .securityRegister2Write = __flash_hal__securityRegister2Write,
  167. .securityRegister3Write = __flash_hal__securityRegister3Write,
  168. .securityRegister1Read = __flash_hal__securityRegister1Read,
  169. .securityRegister2Read = __flash_hal__securityRegister2Read,
  170. .securityRegister3Read = __flash_hal__securityRegister3Read,
  171. },
  172. .protection =
  173. {
  174. .globalLock = __flash_hal__globalLock,
  175. .globalUnlock = __flash_hal__globalUnlock,
  176. .protectStateWrite = __flash_hal__protectStateWrite,
  177. .protectStateRead = __flash_hal__protectStateRead,
  178. //.readState = __flash_hal__protectregister_read,
  179. //.writeState = __flash_hal__protectregister_write,
  180. },
  181. .sleep =
  182. {
  183. .sleepMode = __flash_hal__sleepMode,
  184. .wakeUp = __flash_hal__wakeUp,
  185. },
  186. .data =
  187. {
  188. .arrayRead = __flash_hal__arrayRead,
  189. .chunkProgram = __flash_hal__chunkProgram,
  190. .pageErase = __flash_hal__pageErase,
  191. .sectorErase = __flash_hal__sectorErase,
  192. },
  193. .id =
  194. {
  195. .manufacturerIdRead = __flash_hal__manufacturerIdRead,
  196. .uniqueIdRegisterRead = __flash_hal__uniqueIdRegisterRead,
  197. .uniqueIdRegisterValidate = __flash_hal__uniqueIdRegisterValidate,
  198. },
  199. .service =
  200. {
  201. .startupDetect = __flash_hal__startupDetect,
  202. .initialize = __flash_hal__initialize,
  203. .finalizePrepare = __flash_hal__finalizePrepare,
  204. .dirtyDetect = __flash_hal__dirtyDetect,
  205. .getBuf = __flash_hal__getBuffer,
  206. },
  207. #if W25QXXX_POWER_MANAGEMENT > 0
  208. .power =
  209. {
  210. .powerOn = __flash_hal__powerOn,
  211. .powerOff = __flash_hal__powerOff,
  212. .powerPulse = __flash_hal__powerPulse,
  213. },
  214. #endif
  215. #if W25QXXX_RESET_MANAGEMENT > 0
  216. .reset =
  217. {
  218. .resetAssert = __flash_hal__resetAssert,
  219. .resetRelease = __flash_hal__resetRelease,
  220. .resetPulse = __flash_hal__resetPulse,
  221. },
  222. #endif
  223. .ready =
  224. {
  225. .getReadyFast = __flash_hal__getReadyFast,
  226. .smartWaitms = __flash_smartWaitms,
  227. }
  228. };
  229. // ########################################################################################################
  230. // Ãëîáàëüíûå ïåðåìåííûå
  231. #pragma pack( push, 1 )
  232. #ifdef W25QXXX_FLASH_RAM_PLACE
  233. _PLACEIN( W25QXXX_FLASH_RAM_PLACE )
  234. #endif
  235. static union /* __flash_global */
  236. {
  237. __FLASH_BYTE alloc_place[ __FLASH_LL_SVCMEM_SIZE ];
  238. struct /* __flash_var */
  239. {
  240. // __FLASH_BYTE pagebuffer[ __FULL_PAGE_SIZE ]; // ÍÅ ÒÐÅÁÓÅÒÑß! áóôåð ïîä ÷òåíèå/çàïèñü ñòðàíèö
  241. __FLASH_BYTE cmdbuffer [ __FLASH_LL_COMMAND_MAXSIZE ]; // áóôåð äëÿ âûïîëåíèÿ êîìàíä
  242. };
  243. };
  244. #pragma pack( pop )
  245. //__flash_protectionregister_t * __flash_internal_getbuffer_protect() { return &protectionregister; }
  246. // ########################################################################################################
  247. // ########################################################################################################
  248. // ########################################################################################################
  249. // ########################################################################################################
  250. // ########################################################################################################
  251. // ########################################################################################################
  252. // ñëóæåáíûå ôóíêöèè óïðàâëåíèÿ CS
  253. // óñòàíîâêà ñèãíàëà ChipSelect â àêòèâíîå ñîñòîÿíèå
  254. static inline void chip_sel_active() // [W25Q OK]
  255. {
  256. __FLASH_HAL_CS_LO();
  257. __FLASH_WAITus(_TIME_CSCLR_us);
  258. }
  259. // óñòàíîâêà ñèãíàëà ChipSelect â íåàêòèâíîå ñîñòîÿíèå
  260. static inline void chip_sel_inactive() // [W25Q OK]
  261. {
  262. __FLASH_WAITus(_TIME_CSSET_us);
  263. __FLASH_HAL_CS_HI();
  264. __FLASH_WAITus(_TIME_CSHLD_us); // ìèíèìàëüíîå âðåìÿ ìåæäó êîìàíäàìè
  265. }
  266. #if W25QXXX_NO_MS_DELAYS == 1
  267. // ¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹
  268. // __int_sys_delayms - ñëóæåáíàÿ ôóíêöèÿ îæèäàíèÿ â ìñ, åñëè àíàëîã îòñóòñòâóåò ó ïîëüçîâàòåëÿ.
  269. // Îïöèÿ W25QXXX_NO_MS_DELAYS ïîçâîëÿåò çàìåíèòü çàäåðæêó â ìñ íà çàäåðæêó â ìêñ.
  270. static inline void __int_sys_delayms( __FLASH_WORD timeout ) // [W25Q OK]
  271. {
  272. __imp_sys_delayus( timeout * 1000 );
  273. }
  274. #endif
  275. // --------------------------------------------------------------------------------------------------------
  276. // __flash_smartWaitms - êîìáèíèðîâàíàÿ ôóíêöèÿ îæèäàíèÿ çàäàííîãî êîëè÷åñòâà ìèëëèñåêóíä ñ
  277. // ïðîâåðêîé ñîñòîÿíèÿ ÷èïà íà ïðåäìåò òîãî, çàíÿò îí, èëè íåò. Åñëè íå çàíÿò,
  278. // ôóíêöèÿ âîçâðàùàåò óïðàâëåíèå ñðàçó æå. Åñëè çàíÿò âñå óêàçàííîå âðåìÿ,
  279. // ôóíêöèÿ âîçâðàòèò óïðàâëåíèå ÷åðåç óêàçàííûé òàéìàóò (íå ìåíüøèé, íî, âîçìîæíî, áîëüøèé).
  280. //
  281. // * íå èçìåíÿåò ñîäåðæèìîå âíóòðåííèõ SRAM áóôåðîâ
  282. // * èñïîëüçóåò ñèñòåìíûå âûçîâû äëÿ îïðåäåëåíèÿ êîëè÷åñòâà ïðîøåäøåãî âðåìåíè
  283. // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
  284. // * ïðîèçâîäèò îïðîñ ÷èïà êîìàíäîé "Çàïðîñ ñòàòóñíîãî ðåãèñòðà" (Status Register Read)
  285. // * ôóíêöèÿ èñïîëüçóåò âûçîâ ôóíêöèé áåñêîíå÷íîãî ÷òåíèÿ ñòàòóñà
  286. //
  287. static void __flash_hal__part_statusread_stage1( __flash_status1_t * pcReadRegister );
  288. static void __flash_hal__part_statusread_stage2( __flash_status1_t * pcReadRegister );
  289. static void __flash_hal__part_statusread_stage3( __flash_status1_t * pcReadRegister );
  290. //
  291. // * ôóíêöèÿ âîçâðàùàåò 1, åñëè äîñòîâåðíî èçâåñòíî, ÷òî ôëàã BUSY ñáðîøåí (óñòðîéñòâî ãîòîâî), èíà÷å 0 (òðåáóåòñÿ ïîâòîðíàÿ ïðîâåðêà)
  292. //
  293. static int __flash_smartWaitms( __FLASH_WORD wTimems ) // [W25Q OK]
  294. {
  295. __flash_status1_t r_status; // ñòàòóñ-ðåãèñòð
  296. __flash_hal__part_statusread_stage1( &r_status ); // íà÷èíàåì ñ÷èòûâàòü
  297. // -- -- -- -- -- -- äëÿ êîðîòêèõ çàäåðæåê -- -- -- -- -- -- -- -- -- --
  298. if ( !r_status.bBusy ) // ñðàçó ïðîâåðÿåì, åñëè óñòðîéñòâî ñâîáîäíî, âîçâðàùàåì óïðàâëåíèå
  299. {
  300. __flash_hal__part_statusread_stage3( 0 ); // çàâåðøàåì ÷òåíèå ðåãèñòðà
  301. return 1;
  302. }
  303. if ( wTimems < W25QXXX_SMART_WAIT_THRESHOLD ) // äëÿ ìàëûõ âðåìåí îæèäàíèÿ íàêëàäíî îïðàøèâàòü ÷èï ïîñòîÿííî
  304. {
  305. __FLASH_WAITms(wTimems); // âûæèäàåì óêàçàííîå âðåìÿ
  306. __flash_hal__part_statusread_stage3( &r_status ); // ïðîâåðÿåì ðåãèñòð
  307. if ( !r_status.bBusy ) // åñëè ñâîáîäíî - âåðíåì 1
  308. return 1;
  309. return 0; // åñëè çàíÿòî - âåðíåì 0
  310. }
  311. // -- -- -- -- -- -- äëÿ äëèííûõ çàäåðæåê -- -- -- -- -- -- -- -- -- --
  312. __FLASH_DWORD dwStartCounter = __FLASH_SMART_GETTIMER(); // ïîëó÷àåì îòìåòêó âðåìåíè
  313. for(/*|*/ __FLASH_DWORD dwDeltaCounter = 0; // ñ÷åò÷èê çàäåðæêè
  314. /*|*/ dwDeltaCounter < wTimems; // ïðîâåðÿåì, çàäåðæàëèñü ëè ìû íà óêàçàííîå âðåìÿ èëè åùå íåò
  315. /*|*/ dwDeltaCounter = ( __FLASH_SMART_GETTIMER() - dwStartCounter ) ) // îáíîâëÿåì ñ÷åò÷èê çàäåðæêè
  316. {
  317. __flash_hal__part_statusread_stage2( &r_status ); // ÷èòàåì ñòàòóñ
  318. if ( !r_status.bBusy ) // ïðîâåðÿåì, íå îñâîáîäèëñÿ ëè ÷èï?
  319. {
  320. __flash_hal__part_statusread_stage3( 0 ); // äà, îñâîáîäèëñÿ, çàâåðøàåì ÷òåíèå
  321. return 1; // âîçâðàùàåì 1 (îñâîáîäèëñÿ)
  322. }
  323. __FLASH_WAITms(1); // âûæèäàåì êâàíò âðåìåíè
  324. }
  325. __flash_hal__part_statusread_stage3( &r_status ); // âðåìÿ âûøëî, çàâåðøàåì ÷òåíèå
  326. if ( !r_status.bBusy ) // ïîñëåäíèé ðàç ïðîâåðÿåì ñòàòóñ
  327. return 1; // ñâîáîäåí!
  328. return 0; // ÷èï äî ñèõ ïîð çàíÿò
  329. }
  330. // ########################################################################################################
  331. // --------------------------------------------------------------------------------------------------------
  332. // __flash_hal__part_statusread - ãðóïïà ñêðûòûõ íèçêîóðîâíåâûõ ôóíêöèé, ïîçâîëÿþùàÿ îñóùåñòâëÿòü ïîñòîÿííîå ñêàíèðîâàíèå ðåãèñòðà
  333. // ñòàòóñà. ×èï ïðåäîñòàâëÿåò âîçìîæíîñòü ñ÷èòûâàòü ðåãèñòð ñòàòóñà áåç îòïðàâêè êîìàíäû íà ÷òåíèå ïðè ïîâòîðíîì ÷òåíèè,
  334. // äî óñòàíîâêè CS â íåàêòèâíîå ïîëîæåíèå. Ò.Î âîçìîæíî ïåðåäàòü êîìàíäó îäèí ðàç, çàòåì ÷èòàòü ñòàòóñ áåñêîíå÷íî.
  335. // Ôóíêöèè äîëæíû âûçûâàòüñÿ â ïîðÿäêå íóìåðàöèè, ïðè ýòîì ñòàäèÿ 2 ìîæåò áûòü ïðîïóùåíà. Ôóíêèè ïðîâåðÿþò ïàðàìåòð
  336. // pcReadRegister íà NULL, åñëè îí îòëè÷åí îò NULL, ñ÷èòûâàþò â íåãî ñîäåðæìîå ðåãèñòðà, èíà÷å íè÷åãî íå ñ÷èòûâàþò.
  337. // Ïðèìåð îæèäàíèÿ çàâåðøåíèÿ îïåðàöèè ñòèðàíèÿ:
  338. // [code]
  339. //
  340. // __flash_status_t status; // ñòàòóñ-ðåãèñòð
  341. //
  342. // __flash_hal_pageerase( 0 ); // ñòèðàåì 0 ñòðàíèöó
  343. // __flash_hal__part_statusread_stage1( &status ); // èíèöèðóåì ÷òåíèå ñòàòóñà
  344. //
  345. // while( status.bBusy )
  346. // __flash_hal__part_statusread_stage2( &status ); // ïîâòîðÿåì ÷òåíèå ñòàòóñà
  347. //
  348. // __flash_hal__part_statusread_stage3( 0 ); // çàâåðøàåì ÷òåíèå ñòàòóñà
  349. //
  350. // [/code]
  351. // __flash_hal__part_statusread_stage1 - 1 ñòàäèÿ (íà÷àëüíàÿ) êîìàíäû áåñêîíå÷íîãî ÷òåíèÿ ñòàòóñà çàíÿòîñòè
  352. // __flash_hal__part_statusread_stage2 - 2 ñòàäèÿ (ïðîìåæóòî÷íàÿ) êîìàíäû áåñêîíå÷íîãî ÷òåíèÿ ñòàòóñà çàíÿòîñòè
  353. // __flash_hal__part_statusread_stage3 - 3 ñòàäèÿ (çàêëþ÷èòåëüíàÿ) êîìàíäû áåñêîíå÷íîãî ÷òåíèÿ ñòàòóñà çàíÿòîñòè
  354. //
  355. // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
  356. // * ÍÅ çàäåðæèâàåò âûïîëíåíèå: òðåáóåòñÿ âíåøíèé öèêë äëÿ îðãàíèçàöèè ñêàíèðîâàíèÿ
  357. static void __flash_hal__part_statusread_stage1( __flash_status1_t * pcReadRegister ) // [W25Q OK]
  358. {
  359. chip_sel_active();
  360. ( (__flash_packet_statusread_t*) cmdbuffer )->opcode = _ACMD_STATREAD_1;
  361. // îòïðàâëÿåì êîìàíäó
  362. __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_statusread_t) );
  363. if( pcReadRegister )
  364. // ÷èòàåì ðåãèñòð
  365. __FLASH_HAL_RD( pcReadRegister, sizeof(__flash_status1_t) );
  366. }
  367. //----- ------- ------ ------ ------ ------- ------
  368. static void __flash_hal__part_statusread_stage2( __flash_status1_t * pcReadRegister ) // [W25Q OK]
  369. {
  370. if( pcReadRegister )
  371. // ÷èòàåì ðåãèñòð
  372. __FLASH_HAL_RD( pcReadRegister, sizeof(__flash_status1_t) );
  373. }
  374. //----- ------- ------ ------ ------ ------- ------
  375. static void __flash_hal__part_statusread_stage3( __flash_status1_t * pcReadRegister ) // [W25Q OK]
  376. {
  377. if( pcReadRegister )
  378. // ÷èòàåì ðåãèñòð
  379. __FLASH_HAL_RD( pcReadRegister, sizeof(__flash_status1_t) );
  380. chip_sel_inactive();
  381. }
  382. // --------------------------------------------------------------------------------------------------------
  383. // ########################################################################################################
  384. // __flash_hal__getReadyFast - ïðîâåðêà çàíÿòîñòè áåç îæèäàíèÿ
  385. //
  386. // # Âîçâðàùàåìîå çíà÷åíèå: FLERR_SUCCESS åñëè ñâîáîäåí, èíà÷å FLERR_TIMEOUT
  387. static flash_err_t __flash_hal__getReadyFast( ) // [W25Q OK]
  388. {
  389. __flash_status1_t status;
  390. __flash_hal__statusRead1( &status );
  391. if( !status.bBusy )
  392. return FLERR_SUCCESS;
  393. return FLERR_TIMEOUT;
  394. }
  395. /*
  396. // --------------------------------------------------------------------------------------------------------
  397. // ########################################################################################################
  398. // __flash_hal__getprotectstate - ïîëó÷åíèå ñîñòîÿíèÿ îáùåãî áèòà çàùèòû
  399. //
  400. // # Âîçâðàùàåìîå çíà÷åíèå - FLERR_PROTECT_ENABLED, åñëè áèò çàùèòû óñòàíîâëåí, èíà÷å FLERR_PROTECT_DISABLED
  401. static flash_err_t __flash_hal__getprotectstate( ) // [W25Q WRONG]
  402. {
  403. __flash_status1_t status;
  404. __flash_hal__statusRead1( &status );
  405. if( status.cBlkProt )
  406. return FLERR_PROTECT_ENABLED;
  407. return FLERR_PROTECT_DISABLED;
  408. }
  409. */
  410. // --------------------------------------------------------------------------------------------------------
  411. // ########################################################################################################
  412. // __flash_hal__dirtyDetect - Íèçêîóðîâíåâîå îïðåäåëåíèå íàëè÷èÿ ÷èïà (äîñòóïíîñòè)
  413. // Èñïîëüçóåòñÿ âî âðåìÿ ïåðâè÷íîé èíèöèàëèçàöèè â flash_initialize().
  414. static flash_err_t __flash_hal__dirtyDetect() // [W25Q OK]
  415. {
  416. // ñíà÷àëà ïûòàåìñÿ ïðî÷èòàòü èäåíòèôèêàòîð:
  417. // ÷òåíèå ðåãèñòðà èíôîðìàöèè
  418. __FLASH_DWORD flashID = __flash_hal__manufacturerIdRead( 0 );
  419. // îïðåäåëÿåì íàëè÷èå ôëåøêè ïî èäåíòèôèêàòîðó
  420. if( ((__flash_rvid_t*) &flashID)->FullId == __FLASH_INVALID_ID )
  421. {
  422. // ïîõîæå, ÷òî ÷èïà íåò, îáíàðóæèòü íå óäàëîñü
  423. return FLERR_LL_INITFAIL_NOTFOUND;
  424. }
  425. // åùå íå âñå, íóæíî óáåäèòüñÿ, ÷òî óñòðîéñòâî îòâå÷àåò:
  426. // ÷èòàåì ñòàòóñ
  427. if( ! __flash_smartWaitms( W25QXXX_API_TIMEOUT ) )
  428. {
  429. // ëèáî ñòàòóñ íå ÷èòàåòñÿ, ëèáî óñòðîéñòâî çàíÿòî.
  430. // ò.ê. ôóíêöèÿ ïðåäíàçíà÷åíà äëÿ èñïîëüçîâàíèÿ âî âðåìÿ èíèöèàëèçàöèè,
  431. // ïðåäïîëàãàåòñÿ, ÷òî ÷èï äîëæåí áûòü ñâîáîäåí.
  432. // Ïîýòîìó âîçâðàùàåì îøèáêó
  433. return FLERR_UNEXPECTED_BUSY;
  434. }
  435. return FLERR_SUCCESS;
  436. }
  437. // --------------------------------------------------------------------------------------------------------
  438. // --------------------------------------------------------------------------------------------------------
  439. // ########################################################################################################
  440. // __flash_hal__finalizePrepare - Íèçêîóðîâíåâàÿ ôóíêöèÿ äëÿ ïîäãîòîâêè ôëåøïàìÿòè ê äåèíèöèàëèçàöèè äðàéâåðà
  441. // Âûïîëíÿåò äåéñòâèÿ, íàïðàâëåííûå íà çàâåðøåíèå ðàáîòû ñ ôëåøïàìÿòüþ è ïîäãîòîâêè åå ê âûêëþ÷åíèþ
  442. // Âûçûâàåòñÿ â ìîìåíò îêîí÷àòåëüíîé îñòàíîâêè ðàáîòû ñ ôëåøïàìÿòüþ
  443. static flash_err_t __flash_hal__finalizePrepare() // [W25Q OK]
  444. {
  445. // Ñíà÷àëà òðåáóåòñÿ ïðîâåðèòü ðåæèì çàùèòû çàïèñè:
  446. // åñëè ðàçðåøåíî óïðàâëåíèå àïïàðàòíûì ñèãíàëîì çàùèòû çàïèñè
  447. #if W25QXXX_HW_WR_PROTECT
  448. // åñëè àïïàðàòíàÿ çàùèòà çàïèñè îòêëþ÷åíà â íàñòðîéêàõ
  449. #if W25QXXX_HW_WR_PROTECT_KEEPUNPROTECTED == 1
  450. // òðåáóåòñÿ óñòàíîâèòü àïïàðàòíóþ çàùèòó çàïèñè ïîñëå äåèíèöèàëèçàöèè äðàéâåðà
  451. __imp_flash_hwwrprotect_assert();
  452. #endif
  453. #endif
  454. // Ïîòîì ïðîâåðÿåì ñòàòóñ ãîòîâíîñòè
  455. if( ! (__flash_smartWaitms( W25QXXX_API_TIMEOUT ) ) )
  456. {
  457. // óñòðîéñòâî çàíÿòî.
  458. return FLERR_UNEXPECTED_BUSY;
  459. }
  460. return FLERR_SUCCESS;
  461. }
  462. // --------------------------------------------------------------------------------------------------------
  463. // --------------------------------------------------------------------------------------------------------
  464. // ########################################################################################################
  465. // __flash_hal__startupDetect - Íèçêîóðîâíåâîå äåòåêòèðîâàíèå ÷èïà ôëåøïàìÿòè
  466. // Ïðîèçâîäèò íà÷àëüíóþ íàñòðîéêó àïïàðàòóðû äëÿ âîçìîæíîñòè îïðåäåëåíèÿ íàëè÷èÿ ÷èïà íà øèíå
  467. static flash_err_t __flash_hal__startupDetect()
  468. {
  469. // åñëè ðàçðåøåíî óïðàâëåíèå ïèòàíèåì
  470. #if W25QXXX_POWER_MANAGEMENT
  471. // ïîäàòü ïèòàíèå íà ìèêðîñõåìó
  472. __flash_hal__powerOn();
  473. __FLASH_WAITus( _TIME_STRUP_us );
  474. #endif
  475. // åñëè ðàçðåøåíî óïðàâëåíèå ïèòàíèåì
  476. #if W25QXXX_RESET_MANAGEMENT
  477. // ñíÿòü ñèãíëàë ñáðîñà ñ ÷èïà
  478. __flash_hal__resetRelease();
  479. __FLASH_WAITus( _TIME_RSTRC_us );
  480. #endif
  481. // ïðîáóæäàåì ÷èï, åñëè òîò íàõîäèòñÿ â ðåæèìå ñíà
  482. // èíà÷å îí íå áóäåò âîñïðèíèìàòü êîìàíäû.
  483. // Íåèçâåñòíî, áûë ëè ÷èï â ðåæèìå ãèáåðíàöèè, íî ýòî íå âàæíî
  484. __flash_hal__wakeUp();
  485. // ïðåäâàðèòåëüíûé òàéìàóò çàïóñêà - æäåì ìàêñèìàëüíîå âðåìÿ äî ãîòîâíîñòè çàïèñè âî ôëåø
  486. __FLASH_WAITms( _TIME_START_ms );
  487. // ïðîèçâîäèòñÿ íåñêîëüêî äâå ïîïûòêè äîñòó÷àòüñÿ äî ÷èïà
  488. flash_err_t dirty_status = FLERR_GENERIC_ERROR;
  489. for( size_t attempt = 0; attempt < 2; ++attempt )
  490. {
  491. // ïðîáóåì "ãðÿçíîå" ÷òåíèå èäåíòèôèêàòîðà.
  492. // Ðåçóëüòàò ÷òåíèÿ íå ñîõðàíÿåòñÿ, òðåáóåòñÿ îáíàðóæèòü
  493. // ëèøü ïðèñóñòâèå íà øèíå è îïðåäåëèòü ãîòîâíîñòü
  494. // Ïîýòîìó êàê îñòóñòâèå íà øèíå, òàê è çàíÿòîñòü ÷èïà ðàñöåíèâàåòñÿ
  495. // êàê îøèáêà.
  496. dirty_status = __flash_hal__dirtyDetect();
  497. if( FLASH_ERROR(dirty_status) )
  498. {
  499. // åñëè ïåðâàÿ ïîïûòêà ïðîâàëåíà, è __flash_hal__dirtyDetect ïîñëå ñáðîñà
  500. // äàåò îøèáêó - çíà÷èò âîçâðàùàåì îøèáêó
  501. if( attempt > 0 )
  502. return dirty_status;
  503. // åñëè ðàçðåøåíî óïðàâëåíèå ñèãíàëîì ñáðîñà
  504. #if W25QXXX_RESET_MANAGEMENT
  505. // Ôîðìèðóåì èìïóëüñ ñáðîñà:
  506. __flash_hal__resetPulse();
  507. #else
  508. // óïðàâëåíèå ñèãíàëîì ñáðîñà íåäîñòóïíî
  509. // à óïðàâëåíèå ïèòàíèåì äîñòóïíî?
  510. #if W25QXXX_POWER_MANAGEMENT
  511. // Ôîðìèðóåì èìïóëüñ ïîäà÷è ïèòàíèÿ
  512. __flash_hal__powerPulse( _TIME_COOLDOWN_ms, _TIME_START_ms );
  513. #else
  514. // Ïðîâåðêà äîñòóïíîñòè âåðíóëà îøèáêó.
  515. // Óïðàâëåíèå ïèòàíèåì è ñèãíàëîì ñáðîñà íåäîñòóïíî
  516. // Âîçâðàùàåì îøèáêó
  517. return dirty_status;
  518. #endif
  519. #endif
  520. } else break;
  521. }
  522. if( FLASH_ERROR(dirty_status) )
  523. return dirty_status;
  524. // ÷òåíèå ðåãèñòðà èíôîðìàöèè
  525. __FLASH_DWORD flashID = __flash_hal__manufacturerIdRead( 0 );
  526. // îïðåäåëÿåì íàëè÷èå ôëåøêè ïî èäåíòèôèêàòîðó
  527. if( ((__flash_rvid_t*) &flashID)->FullId == __FLASH_INVALID_ID )
  528. {
  529. return FLERR_LL_INITFAIL_NOTFOUND;
  530. }
  531. __flash_uniqueidregister_t uniqueidRegister;
  532. if( !__flash_hal__uniqueIdRegisterValidate( &uniqueidRegister ) )
  533. {
  534. return FLERR_LL_INITFAIL_NOTFOUND;
  535. }
  536. // ïðîâåðÿåì ID ïðîèçâîäèòåëÿ
  537. #ifdef W25QXXX_FLASH_DESIRED_ID
  538. if( ((__flash_rvid_t*) &flashID)->LowId != W25QXXX_FLASH_DESIRED_ID )
  539. {
  540. return FLERR_LL_INITFAIL_WRONGID;
  541. }
  542. #endif
  543. // ïðîâåðÿåì âìåñòèìîñòü ÷èïà
  544. #ifdef W25QXXX_FLASH_DESIRED_DENSITY
  545. if( ((__flash_rvid_t*) &flashID)->DevId.Density != W25QXXX_FLASH_DESIRED_DENSITY )
  546. {
  547. return FLERR_LL_INITFAIL_WRONGDENSITY;
  548. }
  549. #endif
  550. // ïðîâåðÿåì ñåìåéñòâî ÷èïà
  551. #if defined(W25QXXX_FLASH_DESIRED_FAMILY_ALT1) || defined(W25QXXX_FLASH_DESIRED_FAMILY_ALT2)
  552. switch( ((__flash_rvid_t*) &flashID)->DevId.Family )
  553. {
  554. #if defined(W25QXXX_FLASH_DESIRED_FAMILY_ALT1)
  555. case W25QXXX_FLASH_DESIRED_FAMILY_ALT1:
  556. #endif
  557. #if defined(W25QXXX_FLASH_DESIRED_FAMILY_ALT2)
  558. case W25QXXX_FLASH_DESIRED_FAMILY_ALT2:
  559. #endif
  560. break;
  561. default: return FLERR_LL_INITFAIL_WRONGFAMILY;
  562. }
  563. #endif
  564. return FLERR_SUCCESS;
  565. }
  566. // --------------------------------------------------------------------------------------------------------
  567. // ########################################################################################################
  568. // __flash_hal__initialize - Íèçêîóðîâíåâàÿ èíèöèàëèçàöèÿ äðàéâåðà ôëåøïàìÿòè
  569. //
  570. // * îïðåäåëåíèå íàëè÷èÿ ïîäêëþ÷åííîé ìèêðîñõåìû
  571. // * ÷òåíèå èäåíòèôèêàòîðà è îïðåäåëåíèå ïðîèçâîäèòåëÿ
  572. // * êîíòðîëü ïðàâèëüíîñòè:
  573. // - èäåíòèôèêàòîðà ïðîèçâîäèòåëÿ
  574. // - òèïà óñòðîéñòâà, ñåìåéñòâà (DevId)
  575. // - ðàçìåðà ÷èïà
  576. // * óñòàíîâêà è ïðîâåðêà ðàçìåðà ñòðàíèöû
  577. //
  578. // # Âîçâðàùàåìîå çíà÷íèå - êîä âûïîëíåíèÿ
  579. static flash_err_t __flash_hal__initialize() // [W25Q OK]
  580. {
  581. // ïåðâè÷íàÿ èíèöèàëèçàöèÿ øèíû è ÷èïà
  582. flash_err_t detectStatus = __flash_hal__startupDetect();
  583. if( FLASH_ERROR(detectStatus) )
  584. return detectStatus;
  585. // åñëè ðàçðåøåíî óïðàâëåíèå àïïàðàòíûì ñèãíàëîì çàùèòû çàïèñè
  586. #if W25QXXX_HW_WR_PROTECT
  587. // åñëè àïïàðàòíàÿ çàùèòà çàïèñè îòêëþ÷åíà â íàñòðîéêàõ
  588. #if W25QXXX_HW_WR_PROTECT_KEEPUNPROTECTED == 1
  589. // òðåáóåòñÿ ñíÿòü àïïàðàòíóþ çàùèòó çàïèñè íà âñ¸ âðåìÿ ðàáîòû äðàéâåðà
  590. __imp_flash_hwwrprotect_release();
  591. #endif
  592. #endif
  593. return FLERR_SUCCESS;
  594. }
  595. // ########################################################################################################
  596. // ########################################################################################################
  597. // ########################################################################################################
  598. // ########################################################################################################
  599. // ########################################################################################################
  600. // ########################################################################################################
  601. // --------------------------------------------------------------------------------------------------------
  602. // __flash_hal__writeEnable - ðàçðåøåíèå çàïèñè â ÷èï
  603. //
  604. // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
  605. // * ÍÅ çàäåðæèâàåò âûïîëíåíèå
  606. static void __flash_hal__writeEnable() // [W25Q OK]
  607. {
  608. chip_sel_active();
  609. ( (__flash_packet_writecontrol_t*) cmdbuffer )->opcode = _SCMD_WRENABLE;
  610. // îòïðàâëÿåì êîìàíäó
  611. __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_writecontrol_t) );
  612. chip_sel_inactive();
  613. }
  614. // --------------------------------------------------------------------------------------------------------
  615. // __flash_hal__writeDisable - çàïðåùåíèå çàïèñè â ÷èï
  616. //
  617. // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
  618. // * ÍÅ çàäåðæèâàåò âûïîëíåíèå
  619. static void __flash_hal__writeDisable() // [W25Q OK]
  620. {
  621. chip_sel_active();
  622. ( (__flash_packet_writecontrol_t*) cmdbuffer )->opcode = _SCMD_WRDISABLE;
  623. // îòïðàâëÿåì êîìàíäó
  624. __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_writecontrol_t) );
  625. chip_sel_inactive();
  626. }
  627. // --------------------------------------------------------------------------------------------------------
  628. // __flash_hal__statusRead1 - ÷òåíèå ðåãèñòðà ñòàòóñà 1
  629. //
  630. // * íå ïðîâåðÿåò ïðàâèëüíîñòü ïåðåäàííûõ ïàðàìåòðîâ
  631. // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
  632. // * ÍÅ çàäåðæèâàåò âûïîëíåíèå
  633. static void __flash_hal__statusRead1( __flash_status1_t * pcReadRegister // áóôåð äëÿ ÷òåíèÿ ñòàòóñ-ðåãèñòðà
  634. ) // [W25Q OK]
  635. {
  636. chip_sel_active();
  637. ( (__flash_packet_statusread_t*) cmdbuffer )->opcode = _ACMD_STATREAD_1;
  638. // îòïðàâëÿåì êîìàíäó
  639. __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_statusread_t) );
  640. // ÷èòàåì ðåãèñòð
  641. __FLASH_HAL_RD( pcReadRegister, sizeof(__flash_status1_t) );
  642. chip_sel_inactive();
  643. }
  644. // --------------------------------------------------------------------------------------------------------
  645. // __flash_hal__statusRead2 - ÷òåíèå ðåãèñòðà ñòàòóñà 2
  646. //
  647. // * íå ïðîâåðÿåò ïðàâèëüíîñòü ïåðåäàííûõ ïàðàìåòðîâ
  648. // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
  649. // * ÍÅ çàäåðæèâàåò âûïîëíåíèå
  650. static void __flash_hal__statusRead2( __flash_status2_t * pcReadRegister // áóôåð äëÿ ÷òåíèÿ ñòàòóñ-ðåãèñòðà
  651. ) // [W25Q OK]
  652. {
  653. chip_sel_active();
  654. ( (__flash_packet_statusread_t*) cmdbuffer )->opcode = _ACMD_STATREAD_2;
  655. // îòïðàâëÿåì êîìàíäó
  656. __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_statusread_t) );
  657. // ÷èòàåì ðåãèñòð
  658. __FLASH_HAL_RD( pcReadRegister, sizeof(__flash_status2_t) );
  659. chip_sel_inactive();
  660. }
  661. // --------------------------------------------------------------------------------------------------------
  662. // __flash_hal__statusRead3 - ÷òåíèå ðåãèñòðà ñòàòóñà 3
  663. //
  664. // * íå ïðîâåðÿåò ïðàâèëüíîñòü ïåðåäàííûõ ïàðàìåòðîâ
  665. // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
  666. // * ÍÅ çàäåðæèâàåò âûïîëíåíèå
  667. static void __flash_hal__statusRead3( __flash_status3_t * pcReadRegister // áóôåð äëÿ ÷òåíèÿ ñòàòóñ-ðåãèñòðà
  668. ) // [W25Q OK]
  669. {
  670. chip_sel_active();
  671. ( (__flash_packet_statusread_t*) cmdbuffer )->opcode = _ACMD_STATREAD_3;
  672. // îòïðàâëÿåì êîìàíäó
  673. __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_statusread_t) );
  674. // ÷èòàåì ðåãèñòð
  675. __FLASH_HAL_RD( pcReadRegister, sizeof(__flash_status3_t) );
  676. chip_sel_inactive();
  677. }
  678. // --------------------------------------------------------------------------------------------------------
  679. // __flash_hal__statusWrite1 - çàïèñü ðåãèñòðà ñòàòóñà 1
  680. //
  681. // * íå ïðîâåðÿåò ïðàâèëüíîñòü ïåðåäàííûõ ïàðàìåòðîâ
  682. // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
  683. // * çàäåðæèâàåò âûïîëíåíèå íà ÄÅÑßÒÊÈ ÌÈËËÈÑÅÊÓÍÄ
  684. static void __flash_hal__statusWrite1( __flash_status1_t * pcWriteRegister // áóôåð äëÿ çàïèñè ñòàòóñ-ðåãèñòðà
  685. ) // [W25Q OK]
  686. {
  687. chip_sel_active();
  688. ( (__flash_packet_statuswrite_t*) cmdbuffer )->opcode = _ACMD_STATWRIT_1;
  689. ( (__flash_packet_statuswrite_t*) cmdbuffer )->status = pcWriteRegister->status;
  690. // îòïðàâëÿåì êîìàíäó
  691. __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_statuswrite_t) );
  692. chip_sel_inactive();
  693. #if W25Q16JV_BKGOPERATIONS == 0
  694. __FLASH_SMART_WAITms( _TIME_STPRG_ms );
  695. #endif
  696. }
  697. // --------------------------------------------------------------------------------------------------------
  698. // __flash_hal__statusWrite2 - çàïèñü ðåãèñòðà ñòàòóñà 2
  699. //
  700. // * íå ïðîâåðÿåò ïðàâèëüíîñòü ïåðåäàííûõ ïàðàìåòðîâ
  701. // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
  702. // * çàäåðæèâàåò âûïîëíåíèå íà ÄÅÑßÒÊÈ ÌÈËËÈÑÅÊÓÍÄ
  703. static void __flash_hal__statusWrite2( __flash_status2_t * pcWriteRegister // áóôåð äëÿ çàïèñè ñòàòóñ-ðåãèñòðà
  704. ) // [W25Q OK]
  705. {
  706. chip_sel_active();
  707. ( (__flash_packet_statuswrite_t*) cmdbuffer )->opcode = _ACMD_STATWRIT_2;
  708. ( (__flash_packet_statuswrite_t*) cmdbuffer )->status = pcWriteRegister->status;
  709. // îòïðàâëÿåì êîìàíäó
  710. __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_statuswrite_t) );
  711. chip_sel_inactive();
  712. #if W25Q16JV_BKGOPERATIONS == 0
  713. __FLASH_SMART_WAITms( _TIME_STPRG_ms );
  714. #endif
  715. }
  716. // --------------------------------------------------------------------------------------------------------
  717. // __flash_hal__statusWrite3 - çàïèñü ðåãèñòðà ñòàòóñà 3
  718. //
  719. // * íå ïðîâåðÿåò ïðàâèëüíîñòü ïåðåäàííûõ ïàðàìåòðîâ
  720. // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
  721. // * çàäåðæèâàåò âûïîëíåíèå íà ÄÅÑßÒÊÈ ÌÈËËÈÑÅÊÓÍÄ
  722. static void __flash_hal__statusWrite3( __flash_status3_t * pcWriteRegister // áóôåð äëÿ çàïèñè ñòàòóñ-ðåãèñòðà
  723. ) // [W25Q OK]
  724. {
  725. chip_sel_active();
  726. ( (__flash_packet_statuswrite_t*) cmdbuffer )->opcode = _ACMD_STATWRIT_3;
  727. ( (__flash_packet_statuswrite_t*) cmdbuffer )->status = pcWriteRegister->status;
  728. // îòïðàâëÿåì êîìàíäó
  729. __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_statuswrite_t) );
  730. chip_sel_inactive();
  731. #if W25Q16JV_BKGOPERATIONS == 0
  732. __FLASH_SMART_WAITms( _TIME_STPRG_ms );
  733. #endif
  734. }
  735. // --------------------------------------------------------------------------------------------------------
  736. // __flash_hal__arrayRead - ïîñëåäîâàòåëüíîå ÷òåíèå (ìàññèâ)
  737. //
  738. // * íå ïðîâåðÿåò ïðàâèëüíîñòü ïåðåäàííûõ ïàðàìåòðîâ
  739. // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
  740. static void __flash_hal__arrayRead ( __FLASH_DWORD w24Address, // àäðåñ íà÷àëà ÷òåíèÿ
  741. __FLASH_BYTE * pDataRead, // óêàçàòåëü íà áóôåð-ïðèåìíèê äàííûõ
  742. __FLASH_WORD wCntToRead // êîëè÷åñòâî äàííûõ íà ÷òåíèå
  743. ) // [W25Q OK]
  744. {
  745. chip_sel_active();
  746. ( (__flash_packet_arrayread_t*) cmdbuffer )->opcode = _LCMD_ARRYREAD;
  747. __FLASH_LL_FILLADDRESS( ( (__flash_packet_arrayread_t*) cmdbuffer ), w24Address);
  748. // îòïðàâëÿåì êîìàíäó
  749. __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_arrayread_t) );
  750. // ÷èòàåì äàííûå
  751. __FLASH_HAL_RD( pDataRead, wCntToRead );
  752. chip_sel_inactive();
  753. }
  754. // --------------------------------------------------------------------------------------------------------
  755. // __flash_hal__chunkProgram - ïðîãðàììèðîâàíèå ñòðàíèöû áåç ñòèðàíèÿ áëîêà/ñòðàíèöû
  756. //
  757. // * íå ïðîâåðÿåò ïðàâèëüíîñòü ïåðåäàííûõ ïàðàìåòðîâ
  758. // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
  759. // * çàäåðæèâàåò âûïîëíåíèå íà ÌÈËËÈÑÅÊÓÍÄÛ
  760. static void __flash_hal__chunkProgram( __flash_pageprogramptr_t pdata,
  761. __FLASH_DWORD w24Address ) // àäðåñ íà÷àëà çàïèñè
  762. {
  763. chip_sel_active();
  764. ( (__flash_packet_page_program_t*) cmdbuffer )->opcode = _WCMD_PGWRIT;
  765. w24Address &= 0xFFFF00; // ñáðàñûâàåòñÿ àäðåñ âíóòðè ñòðàíèöû 256 áàéò
  766. __FLASH_LL_FILLADDRESS( ( (__flash_packet_page_program_t*) cmdbuffer ), w24Address);
  767. // îòïðàâëÿåì êîìàíäó
  768. __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_page_program_t) );
  769. // îòïðàâëÿåì äàííûå
  770. __FLASH_HAL_WRCMD( pdata, sizeof(*pdata) );
  771. chip_sel_inactive();
  772. #if W25Q16JV_BKGOPERATIONS == 0
  773. __FLASH_SMART_WAITms( _TIME_PGPRG_ms );
  774. #endif
  775. }
  776. // --------------------------------------------------------------------------------------------------------
  777. // __flash_hal__pageErase - ñòèðàíèå ñòðàíèöû
  778. //
  779. // * íå ïðîâåðÿåò ïðàâèëüíîñòü ïåðåäàííûõ ïàðàìåòðîâ
  780. // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
  781. // * çàäåðæèâàåò âûïîëíåíèå íà ÑÎÒÍÈ ÌÈËËÈÑÅÊÓÍÄ
  782. static void __flash_hal__pageErase( __FLASH_WORD wPageNum // íîìåð ñòèðàåìîé ñòðàíèöû
  783. ) // [W25Q OK]
  784. {
  785. chip_sel_active();
  786. ( (__flash_packet_pageerase_t*) cmdbuffer )->opcode = _ECMD_PAGERASE;
  787. __FLASH_LL_FILLADDRESS( ( (__flash_packet_pageerase_t*) cmdbuffer ), ( wPageNum * (__PAGE_SIZE) ) );
  788. // îòïðàâëÿåì êîìàíäó
  789. __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_pageerase_t) );
  790. chip_sel_inactive();
  791. #if W25QXXX_BKGOPERATIONS == 0
  792. __FLASH_SMART_WAITms( _TIME_PGERS_ms );
  793. #endif
  794. }
  795. // --------------------------------------------------------------------------------------------------------
  796. /*
  797. // --------------------------------------------------------------------------------------------------------
  798. // __flash_hal__blockErase - ñòèðàíèå áëîêà (=ñòðàíèöû)
  799. //
  800. // * íå ïðîâåðÿåò ïðàâèëüíîñòü ïåðåäàííûõ ïàðàìåòðîâ
  801. // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
  802. // * çàäåðæèâàåò âûïîëíåíèå íà ÑÎÒÍÈ ÌÈËËÈÑÅÊÓÍÄ
  803. static void __flash_hal__blockErase( __FLASH_WORD wBlockNum // íîìåð ñòèðàåìîãî áëîêà
  804. ) // [W25Q OK]
  805. {
  806. chip_sel_active();
  807. ( (__flash_packet_blockerase_t*) cmdbuffer )->opcode = _ECMD_PAGERASE;
  808. __FLASH_LL_FILLADDRESS( ( (__flash_packet_blockerase_t*) cmdbuffer ), ( wBlockNum * (__PAGE_SIZE) ) );
  809. // îòïðàâëÿåì êîìàíäó
  810. __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_pageerase_t) );
  811. chip_sel_inactive();
  812. #if W25QXXX_BKGOPERATIONS == 0
  813. __FLASH_SMART_WAITms( _TIME_PGERS_ms );
  814. #endif
  815. }
  816. // --------------------------------------------------------------------------------------------------------
  817. */
  818. // --------------------------------------------------------------------------------------------------------
  819. // __flash_hal__sectorErase - ñòèðàíèå ñåêòîðîâ
  820. //
  821. // * íå ïðîâåðÿåò ïðàâèëüíîñòü ïåðåäàííûõ ïàðàìåòðîâ
  822. // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
  823. // * çàäåðæèâàåò âûïîëíåíèå íà ÑÅÊÓÍÄÛ
  824. static void __flash_hal__sectorErase( __FLASH_WORD wSector // íîìåð ñåêòîðà 0-31
  825. ) // [W25Q OK]
  826. {
  827. chip_sel_active();
  828. ( (__flash_packet_sectorerase_t*) cmdbuffer )->opcode = _ECMD_SCTERASE;
  829. __FLASH_LL_FILLADDRESS( ( (__flash_packet_sectorerase_t*) cmdbuffer ), ( wSector * (__SECTOR_STD_SIZE) ) );
  830. // îòïðàâëÿåì êîìàíäó
  831. __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_sectorerase_t) );
  832. chip_sel_inactive();
  833. #if W25QXXX_BKGOPERATIONS == 0
  834. __FLASH_SMART_WAITms( _TIME_SCERS_ms );
  835. #endif
  836. }
  837. // --------------------------------------------------------------------------------------------------------
  838. // --------------------------------------------------------------------------------------------------------
  839. // __flash_hal__sleepMode - ïåðåõîä â ðåæèì ïîíèæåííîãî ýíåðãîïîòðåáëåíèÿ
  840. //
  841. // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
  842. // # ïåðåâîäèò óñòðîéñòâî â ðåæèì, êîãäà âñå êîìàíäû, êðîìå __flash_hal__wakeUp èãíîðèðóþòñÿ
  843. static void __flash_hal__sleepMode() // [W25Q OK]
  844. {
  845. chip_sel_active();
  846. ( (__flash_packet_powerdown_t*) cmdbuffer )->opcode = _ACMD_EPWRDOWN;
  847. // îòïðàâëÿåì êîìàíäó
  848. __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_powerdown_t) );
  849. chip_sel_inactive();
  850. __FLASH_WAITus( _TIME_EDPDM_us );
  851. }
  852. // --------------------------------------------------------------------------------------------------------
  853. // --------------------------------------------------------------------------------------------------------
  854. // __flash_hal__wakeUp - âûõîä èç ðåæèìà ïîíèæåííîãî ýíåðãîïîòðåáëåíèÿ
  855. //
  856. // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
  857. // # âûâîäèò óñòðîéñòâî èç ðåæèìà, êîãäà âñå êîìàíäû, êðîìå __flash_hal__wakeUp èãíîðèðóþòñÿ
  858. static void __flash_hal__wakeUp() // [W25Q OK]
  859. {
  860. chip_sel_active();
  861. // åñëè ôëåø íàõîäèëàñü âî ñíå, íåîáõîäèìî æäàòü _TIME_RDPDM_us
  862. __FLASH_WAITus(_TIME_RDPDM_us);
  863. ( (__flash_packet_powerup_t*) cmdbuffer )->opcode = _ACMD_LPWRDOWN;
  864. // îòïðàâëÿåì êîìàíäó
  865. __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_powerup_t) );
  866. chip_sel_inactive();
  867. __FLASH_WAITus( _TIME_RDPDM_us );
  868. }
  869. // --------------------------------------------------------------------------------------------------------
  870. // --------------------------------------------------------------------------------------------------------
  871. // __flash_hal__manufacturerIdRead - ÷òåíèå èäåíòèôèêàòîðà ïðîèçâîäèòåëÿ
  872. //
  873. // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
  874. // * ìîæåò èñïîëüçîâàòüñÿ äëÿ îïåðåäåëåíèÿ òèïà ÷èïà äëÿ âûÿñíåíèÿ åãî âìåñòèìîñòè
  875. // * ôóíêöèÿ ïðèíèìàåò ïàðàìåòð @pManufacturerID òèïà __flash_id_t. Ýòîò ïàðàìåòð áóäåò ñîäåðæàòü
  876. // èíôîðìàöèþ î ÷èïå, åñëè ïàðàìåòð íå NULL. Êðîìå òîãî, äëÿ òîãî, ÷òîáû ïðî÷èòàòü ðàñøèðåííóþ
  877. // èíôîðìàöèþ ïðîèçâîäèòåëÿ (extended device information), ïîëÿ pManufacturerID->pExtBf è
  878. // pManufacturerID->ExtLen äîëæíû áûòü ïðîèíèíöèàëèçèðîâàííû óêàçàòåëåì íà ïðèíèìàþùèé áóôåð
  879. // è äëèííîé ýòîãî áóôåðà ñîîòâåòñòâåííî. Ïðè íàëè÷èè ðàñøèðåííîé èíôîðìàöèè ïîëå ExtLen áóäåò
  880. // ïåðåçàïèñàíî, è áóäåò ñîäåðæàòü äëèííó ðàñøèðåííîé èíôîðìàöèè, ñîõðàíåííîé ïî óêàçàòåëþ pExtBf.
  881. // Ïàìÿòü ïî óêàçàòåëþ pExtBf äîëæíà áûòü âûäåëåíà çàðàíåå ïåðåä âûçîâîì ôóíêöèè. Íóëü-ñèìâîë íå
  882. // äîáàâëÿåòñÿ. Ïàìÿòü, íà÷èíàÿ ñ ExtLen áàéòà, íå ïåðåçàïèñûâàåòñÿ (îñòàåòñÿ ìóñîð).
  883. // * ïàðàìåòð @pManufacturerID ìîæåò áûòü ðàâåí NULL. Äëÿ òîãî, ÷òîáû ÍÅ ÷èòàòü ðàñøèðåííóþ èíôîðìàöèþ,
  884. // ïåðåäàéòå NULL âìåñòî pManufacturerID, èëè, åñëè ïåðåäàåòå pManufacturerID, îáíóëèòå â íåì ïîëÿ pExtBf è ExtLen.
  885. // * ôóíêöèÿ ñïîñîáíà ñ÷èòûâàòü ðàñøèðåííóþ èíôîðìàöèþ â ôîðìàòå Serial Flash Discoverable Parameter Structure
  886. // (JESD216D.01). Òàêèì îáðàçîì, êðîìå ñòàíäàðòíîãî ID ïðîèçâîäèòåëÿ äëèííîé 1 áàéò, ïðîèçâîäèòåëü çàïèñûâàåò
  887. // ñîîáùåíèå äëèííîé äë 256 áàéò [JESD216D.01]. Íàëè÷èå ðàñøèðåííîé èíôîðìàöèè â âûäàâàåìîé ñòðóêòóðå
  888. // îïöèîíàëüíî: ïðîèçâîäèòåëü ìîæåò íå ïîìåùàòü SFDP ñòðóêòóðó, ëèáî åå ÷òåíèå ìîæåò áûòü íå ðåàëèçîâàíî.
  889. // Äëÿ äàííîãî ôîðìàòà ïîëå HighId â __flash_id_t íå òðåáóåòñÿ è çàðåçåðâèðîâàíî (âñåãäà ðàâíî 0).
  890. // * âîâçðàùàåìîå çíà÷åíèå - DWORD, "îòêóøåííûé" ïî ìëàäøåìó àäðåñó îò ñòðóêòóðû __flash_id_t - ñîäåðæèò
  891. // DevId, LowId, HighId.
  892. static __FLASH_DWORD __flash_hal__manufacturerIdRead( __flash_id_t * pManufacturerID // íåîáÿçàòåëüíûé ïàðàìåòð-áóôåð äëÿ ïðèåìà ðàñøèðåííîé èíôîðìàöèè
  893. ) // [W25Q OK]
  894. {
  895. // ëîêàëüíûå ïåðåìåííûå ôóíêöèè îáúåäèíåíû ñ âîçâðàùàåìûì çíà÷åíèåì, ÷òîáû âåðíóòü
  896. // ÷àñòü èíôîðìàöèè â âèäå DWORD
  897. union
  898. {
  899. struct
  900. {
  901. __FLASH_BYTE LowId; // ñòàíäàðòíûé áàéò ID (íå ðàñøèðåííûé)
  902. __FLASH_BYTE HighId; // ðàñøèðåííûé áàéò ID (êîëè÷åñòâî 0x7F Continuation Code) (JEDEC JEP-106)
  903. union
  904. {
  905. __FLASH_WORD DevId; // êîä óñòðîéñòâà
  906. struct
  907. {
  908. __FLASH_BYTE LDevId; // êîä óñòðîéñòâà (Low)
  909. __FLASH_BYTE HDevId; // êîä óñòðîéñòâà (High)
  910. };
  911. };
  912. };
  913. __FLASH_DWORD ReturnValue; // âîçâðàùàåìîå çíà÷åíèå
  914. };
  915. DevId = 0;
  916. LDevId = 0;
  917. HDevId = 0;
  918. LowId = 0;
  919. HighId = 0;
  920. ReturnValue = 0;
  921. //-----------
  922. chip_sel_active();
  923. //-----------
  924. // ÷òåíèå JEDEC ID íà÷àòî
  925. ( (__flash_packet_manufactureridread_t*) cmdbuffer )->opcode = _ACMD_MFIDREAD;
  926. // îòïðàâëÿåì êîìàíäó
  927. __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_manufactureridread_t) );
  928. // ÷òåíèå Manufacturer ID
  929. __FLASH_HAL_RD( &LowId, sizeof( LowId ) );
  930. // ÷òåíèå Device ID
  931. __FLASH_HAL_RD( &LDevId, sizeof( LDevId ) );
  932. __FLASH_HAL_RD( &HDevId, sizeof( HDevId ) );
  933. // ÷òåíèå JEDEC ID çàêîí÷åíî
  934. //-----------
  935. chip_sel_inactive();
  936. //-----------
  937. // åñëè òðåáóåòñÿ ÷òåíèå ðàñøèðåííîé èíôîðìàöèè
  938. // @ExtLen > 0 óêàçûâàåò íà âûäåëåííûé áóôåð ïîä SFDP ðåãèñòð
  939. if( NULL != pManufacturerID && pManufacturerID->ExtLen > 0 )
  940. {
  941. chip_sel_active();
  942. //-----------
  943. // ÷òåíèå SFDP íà÷àòî
  944. ( (__flash_packet_sfdp_read_t*) cmdbuffer )->opcode = _ACMD_SFDPREAD;
  945. ( (__flash_packet_sfdp_read_t*) cmdbuffer )->zero1 = 0; // A23..A16 must be 0
  946. ( (__flash_packet_sfdp_read_t*) cmdbuffer )->zero1 = 0; // A15..A08 must be 0
  947. ( (__flash_packet_sfdp_read_t*) cmdbuffer )->offset = 0; // ÷òåíèå ïî íóëåâîìó ñìåùåíèþ
  948. ( (__flash_packet_sfdp_read_t*) cmdbuffer )->dummy = 0; // ôèêòèâíûé áàéò
  949. // îòïðàâëÿåì êîìàíäó
  950. __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_sfdp_read_t) );
  951. // ÷òåíèå SFDP â áóôåð
  952. for( size_t offset = 0; offset < pManufacturerID->ExtLen; offset++ )
  953. {
  954. __FLASH_HAL_RD( pManufacturerID->pExtBf + offset, sizeof( uint8_t ) );
  955. }
  956. //-----------
  957. chip_sel_inactive();
  958. }
  959. //-----------
  960. return ReturnValue;
  961. }
  962. // --------------------------------------------------------------------------------------------------------
  963. // --------------------------------------------------------------------------------------------------------
  964. // __flash_hal__globalUnlock - ñíÿòü áëîêèðîâêó çàïèñè ñî âñåõ ñåêòîðîâ/áëîêîâ / âûêëþ÷èòü ïðîãðàììíóþ çàùèòó îò çàïèñè/ñòèðàíèÿ
  965. //
  966. // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
  967. static void __flash_hal__globalUnlock() // [W25Q OK]
  968. {
  969. chip_sel_active();
  970. ( (__flash_packet_globallockcontrol_t*) cmdbuffer )->opcode = _SCMD_GLBLUNLK;
  971. // îòïðàâëÿåì êîìàíäó
  972. __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_globallockcontrol_t) );
  973. chip_sel_inactive();
  974. #if W25QXXX_BKGOPERATIONS == 0
  975. __FLASH_SMART_WAITms( _TIME_PGPRG_ms );
  976. #endif
  977. }
  978. // --------------------------------------------------------------------------------------------------------
  979. // --------------------------------------------------------------------------------------------------------
  980. // __flash_hal__globalLock - óñòàíîâèòü áëîêèðîâêó çàïèñè íà âñå ñåêòîðà/áëîêè / âêëþ÷èòü ïðîãðàììíóþ çàùèòó îò çàïèñè/ñòèðàíèÿ
  981. //
  982. // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
  983. static void __flash_hal__globalLock() // [W25Q OK]
  984. {
  985. chip_sel_active();
  986. ( (__flash_packet_globallockcontrol_t*) cmdbuffer )->opcode = _SCMD_GLBLLK;
  987. // îòïðàâëÿåì êîìàíäó
  988. __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_globallockcontrol_t) );
  989. chip_sel_inactive();
  990. #if W25QXXX_BKGOPERATIONS == 0
  991. __FLASH_SMART_WAITms( _TIME_PGPRG_ms );
  992. #endif
  993. }
  994. // --------------------------------------------------------------------------------------------------------
  995. // --------------------------------------------------------------------------------------------------------
  996. // __flash_hal__protectStateWrite - çàïèñûâàåò èíäèâèäóàëüíóþ áëîêèðîâêó ñåêòîðà/áëîêà
  997. //
  998. // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
  999. // * íå ïðîâåðÿåò ïðàâèëüíîñòü ïåðåäàííûõ ïàðàìåòðîâ
  1000. // * çàäåðæèâàåò âûïîëíåíèå íà ÌÈËËÈÑÅÊÓÍÄÛ
  1001. static void __flash_hal__protectStateWrite( size_t nProtSector, bool protectState ) // [W25Q OK]
  1002. {
  1003. chip_sel_active();
  1004. if( protectState )
  1005. ( (__flash_packet_protectregister_rw_t*) cmdbuffer )->opcode = _SCMD_BLKLOCK;
  1006. else
  1007. ( (__flash_packet_protectregister_rw_t*) cmdbuffer )->opcode = _SCMD_BLKULOCK;
  1008. __FLASH_LL_FILLADDRESS( ( (__flash_packet_protectregister_rw_t*) cmdbuffer ), __PROT_SECTOR_TO_ADDRESS(nProtSector) );
  1009. // îòïðàâëÿåì êîìàíäó
  1010. __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_protectregister_rw_t) );
  1011. chip_sel_inactive();
  1012. #if W25QXXX_BKGOPERATIONS == 0 //!
  1013. __FLASH_SMART_WAITms( _TIME_PGPRG_ms );
  1014. #endif
  1015. }
  1016. // --------------------------------------------------------------------------------------------------------
  1017. // --------------------------------------------------------------------------------------------------------
  1018. // __flash_hal__protectStateRead - ñ÷èòûâàåò èíäèâèäóàëüíóþ áëîêèðîâêó ñåêòîðà/áëîêà
  1019. //
  1020. // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
  1021. // * íå ïðîâåðÿåò ïðàâèëüíîñòü ïåðåäàííûõ ïàðàìåòðîâ
  1022. static bool __flash_hal__protectStateRead( size_t nProtSector ) // [W25Q OK]
  1023. {
  1024. chip_sel_active();
  1025. uint8_t state = 0;
  1026. ( (__flash_packet_protectregister_rw_t*) cmdbuffer )->opcode = _SCMD_BLKLKRD;
  1027. __FLASH_LL_FILLADDRESS( ( (__flash_packet_protectregister_rw_t*) cmdbuffer ), __PROT_SECTOR_TO_ADDRESS(nProtSector) );
  1028. // îòïðàâëÿåì êîìàíäó
  1029. __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_protectregister_rw_t) );
  1030. // ñ÷èòûâàåòñÿ áèò çàùèòû
  1031. __FLASH_HAL_RD( &state, sizeof( uint8_t ) );
  1032. chip_sel_inactive();
  1033. // LSB áèò ïîêàçûâàåò ñîñòîÿíèå çàùèòû, 0-íåò çàùèòû, 1-çàùèòà âêëþ÷åíà
  1034. return ((bool)(state & 1));
  1035. }
  1036. // --------------------------------------------------------------------------------------------------------
  1037. // --------------------------------------------------------------------------------------------------------
  1038. // __flash_hal__securityRegister1Write - çàïèñûâàåò ðåãèñòð áåçîïàñíîñòè
  1039. //
  1040. // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
  1041. // * ïàðàìåòð @contents íå ìîæåò áûòü ðàâåí NULL
  1042. // * ÈÇÌÅÍßÅÒ ÑÎÄÅÐÆÈÌÎÅ ÂÑÒÐÎÅÍÍÎÃÎ ÐÅÃÈÑÒÐÀ ÁÅÇÎÏÀÑÍÎÑÒÈ 1
  1043. static void __flash_hal__securityRegister1Write( __flash_securityregister_t * contents // ñîäåðæèìîå ðåãèñòðà áåçîïàñíîñòè
  1044. ) // [W25Q OK]
  1045. {
  1046. if( !contents ) return;
  1047. chip_sel_active();
  1048. ( (__flash_packet_securityregisterwrite_t*) cmdbuffer )->opcode = _SCMD_SECRGWRT;
  1049. ( (__flash_packet_securityregisterwrite_t*) cmdbuffer )->zero = 0;
  1050. ( (__flash_packet_securityregisterwrite_t*) cmdbuffer )->regSelector = 1;
  1051. ( (__flash_packet_securityregisterwrite_t*) cmdbuffer )->zero_2 = 0;
  1052. ( (__flash_packet_securityregisterwrite_t*) cmdbuffer )->byteSelector = 0;
  1053. // îòïðàâëÿåì êîìàíäó
  1054. __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_securityregisterwrite_t) );
  1055. // çàïèñûâàåì ðåãèñòð áåçîïàñíîñòè
  1056. __FLASH_HAL_WR( contents, sizeof(__flash_securityregister_t) );
  1057. #if W25QXXX_BKGOPERATIONS == 0
  1058. __FLASH_SMART_WAITms( _TIME_PGPRG_ms );
  1059. #endif
  1060. chip_sel_inactive();
  1061. }
  1062. // --------------------------------------------------------------------------------------------------------
  1063. // --------------------------------------------------------------------------------------------------------
  1064. // __flash_hal__securityRegister2Write - çàïèñûâàåò ðåãèñòð áåçîïàñíîñòè
  1065. //
  1066. // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
  1067. // * ïàðàìåòð @contents íå ìîæåò áûòü ðàâåí NULL
  1068. // * ÈÇÌÅÍßÅÒ ÑÎÄÅÐÆÈÌÎÅ ÂÑÒÐÎÅÍÍÎÃÎ ÐÅÃÈÑÒÐÀ ÁÅÇÎÏÀÑÍÎÑÒÈ 2
  1069. static void __flash_hal__securityRegister2Write( __flash_securityregister_t * contents // ñîäåðæèìîå ðåãèñòðà áåçîïàñíîñòè
  1070. ) // [W25Q OK]
  1071. {
  1072. if( !contents ) return;
  1073. chip_sel_active();
  1074. ( (__flash_packet_securityregisterwrite_t*) cmdbuffer )->opcode = _SCMD_SECRGWRT;
  1075. ( (__flash_packet_securityregisterwrite_t*) cmdbuffer )->zero = 0;
  1076. ( (__flash_packet_securityregisterwrite_t*) cmdbuffer )->regSelector = 2;
  1077. ( (__flash_packet_securityregisterwrite_t*) cmdbuffer )->zero_2 = 0;
  1078. ( (__flash_packet_securityregisterwrite_t*) cmdbuffer )->byteSelector = 0;
  1079. // îòïðàâëÿåì êîìàíäó
  1080. __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_securityregisterwrite_t) );
  1081. // çàïèñûâàåì ðåãèñòð áåçîïàñíîñòè
  1082. __FLASH_HAL_WR( contents, sizeof(__flash_securityregister_t) );
  1083. #if W25QXXX_BKGOPERATIONS == 0
  1084. __FLASH_SMART_WAITms( _TIME_PGPRG_ms );
  1085. #endif
  1086. chip_sel_inactive();
  1087. }
  1088. // --------------------------------------------------------------------------------------------------------
  1089. // --------------------------------------------------------------------------------------------------------
  1090. // __flash_hal__securityRegister3Write - çàïèñûâàåò ðåãèñòð áåçîïàñíîñòè
  1091. //
  1092. // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
  1093. // * ïàðàìåòð @contents íå ìîæåò áûòü ðàâåí NULL
  1094. // * ÈÇÌÅÍßÅÒ ÑÎÄÅÐÆÈÌÎÅ ÂÑÒÐÎÅÍÍÎÃÎ ÐÅÃÈÑÒÐÀ ÁÅÇÎÏÀÑÍÎÑÒÈ 3
  1095. static void __flash_hal__securityRegister3Write( __flash_securityregister_t * contents // ñîäåðæèìîå ðåãèñòðà áåçîïàñíîñòè
  1096. ) // [W25Q OK]
  1097. {
  1098. if( !contents ) return;
  1099. chip_sel_active();
  1100. ( (__flash_packet_securityregisterwrite_t*) cmdbuffer )->opcode = _SCMD_SECRGWRT;
  1101. ( (__flash_packet_securityregisterwrite_t*) cmdbuffer )->zero = 0;
  1102. ( (__flash_packet_securityregisterwrite_t*) cmdbuffer )->regSelector = 3;
  1103. ( (__flash_packet_securityregisterwrite_t*) cmdbuffer )->zero_2 = 0;
  1104. ( (__flash_packet_securityregisterwrite_t*) cmdbuffer )->byteSelector = 0;
  1105. // îòïðàâëÿåì êîìàíäó
  1106. __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_securityregisterwrite_t) );
  1107. // çàïèñûâàåì ðåãèñòð áåçîïàñíîñòè
  1108. __FLASH_HAL_WR( contents, sizeof(__flash_securityregister_t) );
  1109. #if W25QXXX_BKGOPERATIONS == 0
  1110. __FLASH_SMART_WAITms( _TIME_PGPRG_ms );
  1111. #endif
  1112. chip_sel_inactive();
  1113. }
  1114. // --------------------------------------------------------------------------------------------------------
  1115. // --------------------------------------------------------------------------------------------------------
  1116. // __flash_hal__securityRegister1Erase - ñòèðàåò ðåãèñòð áåçîïàñíîñòè
  1117. //
  1118. // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
  1119. // * ïàðàìåòð @contents íå ìîæåò áûòü ðàâåí NULL
  1120. // * ÑÒÈÐÀÅÒ ÑÎÄÅÐÆÈÌÎÅ ÂÑÒÐÎÅÍÍÎÃÎ ÐÅÃÈÑÒÐÀ ÁÅÇÎÏÀÑÍÎÑÒÈ 1
  1121. static void __flash_hal__securityRegister1Erase() // [W25Q OK]
  1122. {
  1123. chip_sel_active();
  1124. ( (__flash_packet_securityregistererase_t*) cmdbuffer )->opcode = _SCMD_SECRGERS;
  1125. ( (__flash_packet_securityregistererase_t*) cmdbuffer )->zero = 0;
  1126. ( (__flash_packet_securityregistererase_t*) cmdbuffer )->regSelector = 1;
  1127. ( (__flash_packet_securityregistererase_t*) cmdbuffer )->zero_2 = 0;
  1128. ( (__flash_packet_securityregistererase_t*) cmdbuffer )->zero_3 = 0;
  1129. // îòïðàâëÿåì êîìàíäó
  1130. __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_securityregisterwrite_t) );
  1131. #if W25QXXX_BKGOPERATIONS == 0
  1132. __FLASH_SMART_WAITms( _TIME_PGERS_ms );
  1133. #endif
  1134. chip_sel_inactive();
  1135. }
  1136. // --------------------------------------------------------------------------------------------------------
  1137. // --------------------------------------------------------------------------------------------------------
  1138. // __flash_hal__securityRegister2Erase - ñòèðàåò ðåãèñòð áåçîïàñíîñòè
  1139. //
  1140. // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
  1141. // * ïàðàìåòð @contents íå ìîæåò áûòü ðàâåí NULL
  1142. // * ÑÒÈÐÀÅÒ ÑÎÄÅÐÆÈÌÎÅ ÂÑÒÐÎÅÍÍÎÃÎ ÐÅÃÈÑÒÐÀ ÁÅÇÎÏÀÑÍÎÑÒÈ 2
  1143. static void __flash_hal__securityRegister2Erase() // [W25Q OK]
  1144. {
  1145. chip_sel_active();
  1146. ( (__flash_packet_securityregistererase_t*) cmdbuffer )->opcode = _SCMD_SECRGERS;
  1147. ( (__flash_packet_securityregistererase_t*) cmdbuffer )->zero = 0;
  1148. ( (__flash_packet_securityregistererase_t*) cmdbuffer )->regSelector = 2;
  1149. ( (__flash_packet_securityregistererase_t*) cmdbuffer )->zero_2 = 0;
  1150. ( (__flash_packet_securityregistererase_t*) cmdbuffer )->zero_3 = 0;
  1151. // îòïðàâëÿåì êîìàíäó
  1152. __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_securityregisterwrite_t) );
  1153. #if W25QXXX_BKGOPERATIONS == 0
  1154. __FLASH_SMART_WAITms( _TIME_PGERS_ms );
  1155. #endif
  1156. chip_sel_inactive();
  1157. }
  1158. // --------------------------------------------------------------------------------------------------------
  1159. // --------------------------------------------------------------------------------------------------------
  1160. // __flash_hal__securityRegister3Erase - ñòèðàåò ðåãèñòð áåçîïàñíîñòè
  1161. //
  1162. // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
  1163. // * ïàðàìåòð @contents íå ìîæåò áûòü ðàâåí NULL
  1164. // * ÑÒÈÐÀÅÒ ÑÎÄÅÐÆÈÌÎÅ ÂÑÒÐÎÅÍÍÎÃÎ ÐÅÃÈÑÒÐÀ ÁÅÇÎÏÀÑÍÎÑÒÈ 3
  1165. static void __flash_hal__securityRegister3Erase() // [W25Q OK]
  1166. {
  1167. chip_sel_active();
  1168. ( (__flash_packet_securityregistererase_t*) cmdbuffer )->opcode = _SCMD_SECRGERS;
  1169. ( (__flash_packet_securityregistererase_t*) cmdbuffer )->zero = 0;
  1170. ( (__flash_packet_securityregistererase_t*) cmdbuffer )->regSelector = 3;
  1171. ( (__flash_packet_securityregistererase_t*) cmdbuffer )->zero_2 = 0;
  1172. ( (__flash_packet_securityregistererase_t*) cmdbuffer )->zero_3 = 0;
  1173. // îòïðàâëÿåì êîìàíäó
  1174. __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_securityregisterwrite_t) );
  1175. #if W25QXXX_BKGOPERATIONS == 0
  1176. __FLASH_SMART_WAITms( _TIME_PGERS_ms );
  1177. #endif
  1178. chip_sel_inactive();
  1179. }
  1180. // --------------------------------------------------------------------------------------------------------
  1181. // --------------------------------------------------------------------------------------------------------
  1182. // __flash_hal__securityRegister1Read - ïðî÷èòûâàåò ðåãèñòð áåçîïàñíîñòè #1
  1183. //
  1184. // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
  1185. // * ïàðàìåòð @contents íå ìîæåò áûòü NULL - óêàæèòå áóôåð-ïðèåìíèå äëÿ ñîõðàíåíèÿ ñîäåðæèìîãî ðåãèñòðà áëîêèðîâêè (ñì. __flash_securityregister_t)
  1186. // * ñ÷èòûâàåò êàê ïîëüçîâàòåëüñêóþ ÷àñòü, òàê è çàïðîãðàììèðîâàííóþ ïðîèçâîäèòåëåì
  1187. static void __flash_hal__securityRegister1Read( __flash_securityregister_t * contents // áóôåð-ïðèåìíèê ñîäåðæèìîãî ðåãèñòðà áëîêèðîâêè
  1188. ) // [W25Q OK]
  1189. {
  1190. if( !contents ) return;
  1191. chip_sel_active();
  1192. ( (__flash_packet_securityregisterread_t*) cmdbuffer )->opcode = _SCMD_SECRGRD;
  1193. ( (__flash_packet_securityregisterread_t*) cmdbuffer )->zero = 0;
  1194. ( (__flash_packet_securityregisterread_t*) cmdbuffer )->regSelector = 1;
  1195. ( (__flash_packet_securityregisterread_t*) cmdbuffer )->zero_2 = 0;
  1196. ( (__flash_packet_securityregisterread_t*) cmdbuffer )->byteSelector = 0;
  1197. // îòïðàâëÿåì êîìàíäó
  1198. __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_securityregisterread_t) );
  1199. // ÷èòàåì ðåãèñòð áåçîïàñíîñòè
  1200. __FLASH_HAL_RD( contents, sizeof(__flash_securityregister_t) );
  1201. chip_sel_inactive();
  1202. }
  1203. // --------------------------------------------------------------------------------------------------------
  1204. // --------------------------------------------------------------------------------------------------------
  1205. // __flash_hal__securityRegister2Read - ïðî÷èòûâàåò ðåãèñòð áåçîïàñíîñòè #1
  1206. //
  1207. // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
  1208. // * ïàðàìåòð @contents íå ìîæåò áûòü NULL - óêàæèòå áóôåð-ïðèåìíèå äëÿ ñîõðàíåíèÿ ñîäåðæèìîãî ðåãèñòðà áëîêèðîâêè (ñì. __flash_securityregister_t)
  1209. // * ñ÷èòûâàåò êàê ïîëüçîâàòåëüñêóþ ÷àñòü, òàê è çàïðîãðàììèðîâàííóþ ïðîèçâîäèòåëåì
  1210. static void __flash_hal__securityRegister2Read( __flash_securityregister_t * contents // áóôåð-ïðèåìíèê ñîäåðæèìîãî ðåãèñòðà áëîêèðîâêè
  1211. ) // [W25Q OK]
  1212. {
  1213. if( !contents ) return;
  1214. chip_sel_active();
  1215. ( (__flash_packet_securityregisterread_t*) cmdbuffer )->opcode = _SCMD_SECRGRD;
  1216. ( (__flash_packet_securityregisterread_t*) cmdbuffer )->zero = 0;
  1217. ( (__flash_packet_securityregisterread_t*) cmdbuffer )->regSelector = 2;
  1218. ( (__flash_packet_securityregisterread_t*) cmdbuffer )->zero_2 = 0;
  1219. ( (__flash_packet_securityregisterread_t*) cmdbuffer )->byteSelector = 0;
  1220. // îòïðàâëÿåì êîìàíäó
  1221. __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_securityregisterread_t) );
  1222. // ÷èòàåì ðåãèñòð áåçîïàñíîñòè
  1223. __FLASH_HAL_RD( contents, sizeof(__flash_securityregister_t) );
  1224. chip_sel_inactive();
  1225. }
  1226. // --------------------------------------------------------------------------------------------------------
  1227. // --------------------------------------------------------------------------------------------------------
  1228. // __flash_hal__securityRegister3Read - ïðî÷èòûâàåò ðåãèñòð áåçîïàñíîñòè #3
  1229. //
  1230. // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
  1231. // * ïàðàìåòð @contents íå ìîæåò áûòü NULL - óêàæèòå áóôåð-ïðèåìíèå äëÿ ñîõðàíåíèÿ ñîäåðæèìîãî ðåãèñòðà áëîêèðîâêè (ñì. __flash_securityregister_t)
  1232. // * ñ÷èòûâàåò êàê ïîëüçîâàòåëüñêóþ ÷àñòü, òàê è çàïðîãðàììèðîâàííóþ ïðîèçâîäèòåëåì
  1233. static void __flash_hal__securityRegister3Read( __flash_securityregister_t * contents // áóôåð-ïðèåìíèê ñîäåðæèìîãî ðåãèñòðà áëîêèðîâêè
  1234. ) // [W25Q OK]
  1235. {
  1236. if( !contents ) return;
  1237. chip_sel_active();
  1238. ( (__flash_packet_securityregisterread_t*) cmdbuffer )->opcode = _SCMD_SECRGRD;
  1239. ( (__flash_packet_securityregisterread_t*) cmdbuffer )->zero = 0;
  1240. ( (__flash_packet_securityregisterread_t*) cmdbuffer )->regSelector = 3;
  1241. ( (__flash_packet_securityregisterread_t*) cmdbuffer )->zero_2 = 0;
  1242. ( (__flash_packet_securityregisterread_t*) cmdbuffer )->byteSelector = 0;
  1243. // îòïðàâëÿåì êîìàíäó
  1244. __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_securityregisterread_t) );
  1245. // ÷èòàåì ðåãèñòð áåçîïàñíîñòè
  1246. __FLASH_HAL_RD( contents, sizeof(__flash_securityregister_t) );
  1247. chip_sel_inactive();
  1248. }
  1249. // --------------------------------------------------------------------------------------------------------
  1250. // --------------------------------------------------------------------------------------------------------
  1251. // __flash_hal__uniqueIdRegisterRead - ïðî÷èòûâàåò ðåãèñòð óíèêàëüíîãî èäåíòèôèêàòîðà (UniqueID)
  1252. //
  1253. // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
  1254. // * ïàðàìåòð @contents íå ìîæåò áûòü NULL - óêàæèòå áóôåð-ïðèåìíèêå äëÿ ñîõðàíåíèÿ ñîäåðæèìîãî ðåãèñòðà UniqueID (ñì. __flash_uniqueidregister_t)
  1255. static void __flash_hal__uniqueIdRegisterRead( __flash_uniqueidregister_t * contents // áóôåð-ïðèåìíèê ñîäåðæèìîãî ðåãèñòðà UniqueID
  1256. ) // [W25Q OK]
  1257. {
  1258. if( !contents ) return;
  1259. chip_sel_active();
  1260. ( (__flash_packet_uid_read_t*) cmdbuffer )->opcode = _ACMD_UIDRREAD;
  1261. ( (__flash_packet_uid_read_t*) cmdbuffer )->zero1 = 0; // ïåðåäàåòñÿ ôèêòèâíûé áàéò
  1262. ( (__flash_packet_uid_read_t*) cmdbuffer )->zero2 = 0; // ïåðåäàåòñÿ ôèêòèâíûé áàéò
  1263. ( (__flash_packet_uid_read_t*) cmdbuffer )->zero3 = 0; // ïåðåäàåòñÿ ôèêòèâíûé áàéò
  1264. ( (__flash_packet_uid_read_t*) cmdbuffer )->zero4 = 0; // ïåðåäàåòñÿ ôèêòèâíûé áàéò
  1265. // îòïðàâëÿåì êîìàíäó
  1266. __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_uid_read_t) );
  1267. // ÷èòàåì ðåãèñòð UniqueID
  1268. __FLASH_HAL_RD( contents, sizeof(__flash_uniqueidregister_t) );
  1269. chip_sel_inactive();
  1270. }
  1271. // --------------------------------------------------------------------------------------------------------
  1272. // --------------------------------------------------------------------------------------------------------
  1273. // __flash_hal__uniqueIdRegisterValidate - ïðî÷èòûâàåò ðåãèñòð UniqueID è âûïîëíÿåò
  1274. // ïðîâåðêó îñìûñëåííîñòè ïðî÷èòàííîãî çàâîäñêîãî èäåíòèôèêàòîðà.
  1275. // Ôóíêöèÿ ðàñöåíèâàåò èíäåíòèôèêàòîð ñîñòîÿùèé èç îäíèõ 0xFF èëè 0x00 êàê íåâîçìîæíûé.
  1276. //  ýòîì ñëó÷àå èìååò ìåñòî îøèáêà, ôóíêöèÿ âîçâðàùàåò false.
  1277. static bool __flash_hal__uniqueIdRegisterValidate( __flash_uniqueidregister_t * contents // áóôåð-ïðèåìíèê ñîäåðæèìîãî ðåãèñòðà UniqueID
  1278. ) // [W25Q OK]
  1279. {
  1280. if( NULL != contents )
  1281. {
  1282. __flash_hal__uniqueIdRegisterRead( contents );
  1283. __FLASH_DWORD n00 = 0;
  1284. __FLASH_DWORD nFF = 0;
  1285. for( __FLASH_DWORD i = 0; i < sizeof(contents->uid); ++i )
  1286. {
  1287. if( 0xFF == contents->uid[i] ) ++nFF;
  1288. if( 0x00 == contents->uid[i] ) ++n00;
  1289. }
  1290. if( (n00 != sizeof(contents->uid))
  1291. &&
  1292. (nFF != sizeof(contents->uid)) )
  1293. {
  1294. return true;
  1295. }
  1296. }
  1297. return false;
  1298. }
  1299. // --------------------------------------------------------------------------------------------------------
  1300. #if W25QXXX_POWER_MANAGEMENT > 0
  1301. // --------------------------------------------------------------------------------------------------------
  1302. // __flash_hal__powerOn - ðåàëèçóåò óïðàâëåíèå ïèòàíèåì ìèêðîñõåìû ïàìÿòè (ïîäàåò ïèòàíèå)
  1303. //
  1304. static void __flash_hal__powerOn() // [W25Q OK]
  1305. {
  1306. // ñíÿòü ñèãíàë âûáîðà ÷èïà (÷èï íå âûáðàí, ðåæèì idle)
  1307. chip_sel_inactive();
  1308. // ïîäàòü ïèòàíèå
  1309. __imp_flash_poweron();
  1310. }
  1311. // --------------------------------------------------------------------------------------------------------
  1312. // __flash_hal__powerOff - ðåàëèçóåò óïðàâëåíèå ïèòàíèåì ìèêðîñõåìû ïàìÿòè (ñíèìàåò ïèòàíèå)
  1313. //
  1314. static void __flash_hal__powerOff() // [W25Q OK]
  1315. {
  1316. // ñíÿòü ïèòàíèå
  1317. __imp_flash_poweroff();
  1318. }
  1319. // --------------------------------------------------------------------------------------------------------
  1320. // __flash_hal__powerPulse - ðåàëèçóåò óïðàâëåíèå ïèòàíèåì ìèêðîñõåìû - ôîðìèðóåò èìïóëüñ ïåðåçàãðóçêè
  1321. static void __flash_hal__powerPulse( __FLASH_WORD nCooldownTime_ms, __FLASH_WORD nStartupTime_ms ) // [W25Q OK]
  1322. {
  1323. // ñíÿòü ïèòàíèå
  1324. __imp_flash_poweroff();
  1325. // ñíÿòü ñèãíàë âûáîðà ÷èïà (÷èï íå âûáðàí, ðåæèì idle)
  1326. chip_sel_inactive();
  1327. if( nCooldownTime_ms > 0 )
  1328. {
  1329. // íåìíîãî ïîäîæäåì, ïîêà îñòûíåò :)
  1330. __FLASH_WAITms( _TIME_COOLDOWN_ms );
  1331. }
  1332. else
  1333. {
  1334. // æäåì ñîâñåì íåìíîãî
  1335. __FLASH_WAITus( _TIME_STRUP_us );
  1336. }
  1337. // ïîäàòü ïèòàíèå
  1338. __imp_flash_poweron();
  1339. // åñëè ðàçðåøåíî óïðàâëåíèå ðåæèìîì ñáðîñà
  1340. #if W25QXXX_RESET_MANAGEMENT
  1341. // ñôîðìèðîâàòü èìïóëüñ ñáðîñà ìèêðîñõåìû
  1342. __flash_hal__resetPulse();
  1343. #endif
  1344. if( nStartupTime_ms > 0 )
  1345. {
  1346. // îæèäàòü ãîòîâíîñòè
  1347. __FLASH_WAITms( _TIME_START_ms );
  1348. }
  1349. else
  1350. {
  1351. // æäåì ñîâñåì íåìíîãî
  1352. __FLASH_WAITus( _TIME_STRUP_us );
  1353. }
  1354. }
  1355. #endif
  1356. #if W25QXXX_RESET_MANAGEMENT > 0
  1357. // --------------------------------------------------------------------------------------------------------
  1358. // __flash_hal__resetAssert - ðåàëèçóåò óïðàâëåíèå ñèãíàëîì ñáðîñà ìèêðîñõåìû ïàìÿòè (óñòàíàâëèâàåò ñèãíàë ñáðîñà)
  1359. //
  1360. static void __flash_hal__resetAssert() // [W25Q OK]
  1361. {
  1362. // ñíÿòü ñèãíàë âûáîðà ÷èïà (÷èï íå âûáðàí, ðåæèì idle)
  1363. chip_sel_inactive();
  1364. // óñòàíîâèòü ñèãíàë ñáðîñà
  1365. __imp_flash_reset_assert();
  1366. }
  1367. // --------------------------------------------------------------------------------------------------------
  1368. // __flash_hal__resetRelease - ðåàëèçóåò óïðàâëåíèå ñèãíàëîì ñáðîñà ìèêðîñõåìû ïàìÿòè (ñíèìàåò ñèãíàë ñáðîñà)
  1369. //
  1370. static void __flash_hal__resetRelease() // [W25Q OK]
  1371. {
  1372. // ñíÿòü ñèãíàë ñáðîñà
  1373. __imp_flash_reset_release();
  1374. }
  1375. // --------------------------------------------------------------------------------------------------------
  1376. // __flash_hal__resetPulse - ðåàëèçóåò óïðàâëåíèå ñèãíàëîì ñáðîñà ìèêðîñõåìû ïàìÿòè (ïîäàåò çàêîí÷åííûé èìïóëüñ ñáðîñà)
  1377. //
  1378. static void __flash_hal__resetPulse() // [W25Q OK]
  1379. {
  1380. // ôîðìèðóåì èìïóëüñ ñáðîñà
  1381. // ñíà÷àëà ñíèìàåì ñèãíàë ñáðîñà
  1382. __imp_flash_reset_release();
  1383. // ïîñëå ñíÿòèÿ ñèãíàëà ñáðîñà íåîáõîäèìî îæèäàòü âðåìÿ âîññòàíîâëåíèÿ
  1384. __FLASH_WAITus(_TIME_RSTRC_us);
  1385. // ïîòîì ñòàâèì ñèãíàë ñáðîñà
  1386. __flash_hal__resetAssert();
  1387. // îæèäàíèå: òðåáóåòñÿ âðåìÿ äëÿ ðåàêöèè íà ñèãíàë ñáðîñà
  1388. __FLASH_WAITus(_TIME_RSTWD_us);
  1389. // ïîòîì ñíîâà ñíèìàåì
  1390. __flash_hal__resetRelease();
  1391. // ïîñëå ñíÿòèÿ ñèãíàëà ñáðîñà íåîáõîäèìî îæèäàòü âðåìÿ âîññòàíîâëåíèÿ
  1392. __FLASH_WAITus(_TIME_RSTRC_us);
  1393. }
  1394. #endif