| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695 |
- // Ôàéë ñ íèçêîóðîâíåâûìè êîììàíäàìè äëÿ W25Q16JV.
- // v 1.0 îò 09/10/20
- // Àâòîð: Ñû÷åâ À.
- // ¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹
- // ¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹ ÍÈÇÊÎÓÐÎÂÍÅÂÛÅ ÍÅÁÅÇÎÏÀÑÍÛÅ ÔÓÍÊÖÈÈ ¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹
- // ¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹
- #define W25Q16JV_LOWLEVEL
- #include "drivers\flash\base\flash_api_types.h"
- #include "drivers\flash\w25q\common\W25Q_HAL.h" // àïïàðàòíàÿ àáñòðàöèÿ îò SSP
- #include "drivers\flash\w25q\lowlevel\W25Q16JV_LL.h" // îïðåäåëåíèÿ äëÿ W25Q16JV
- #include "drivers\flash\w25q\lowlevel\W25Q16JV_LL_func.h" // ïðîòîòèïû LL-ôóíêöèé
- // ########################################################################################################
- static union
- {
- __flash_protectionregister_t protSectorFlagsBuffer;
- struct
- {
- __flash_sectorprotectionregister_t sectorFlagsBuffer1; // îñíîâíîé
- __flash_sectorprotectionregister_t sectorFlagsBuffer2; // êîïèÿ
- };
- __FLASH_BYTE pageBuffer[ __PAGE_SIZE ];
- }
- flash_hal_Buffer;
- // __flash_hal__getBuffer - çàïðîñèòü âíóòðåííèé áóôåð íèçêîãî óðîâíÿ
- static void * __flash_hal__getBuffer( __flash_internal_buffer_type_t type, size_t * pRetBufSize )
- {
- void * rValue = NULL; *pRetBufSize = 0;
- switch( type )
- {
- case fibufSectorFlags: *pRetBufSize = sizeof(flash_hal_Buffer.sectorFlagsBuffer1); rValue = &flash_hal_Buffer.sectorFlagsBuffer1;
- case fibufSectorFlags_2: *pRetBufSize = sizeof(flash_hal_Buffer.sectorFlagsBuffer2); rValue = &flash_hal_Buffer.sectorFlagsBuffer2;
- case fibufProtSectorFlags: *pRetBufSize = sizeof(flash_hal_Buffer.protSectorFlagsBuffer); rValue = &flash_hal_Buffer.protSectorFlagsBuffer;
- case fibufPageIO: *pRetBufSize = sizeof(flash_hal_Buffer.pageBuffer); rValue = &flash_hal_Buffer.pageBuffer[0];
- }
- // îáíóëåíèå áóôåðà
- if( NULL != rValue && 0 != *pRetBufSize )
- {
- __imp_sys_memzero( rValue, *pRetBufSize );
- }
- return rValue;
- }
- // ########################################################################################################
- // __flash_hal__writeDisable - çàïðåùåíèå çàïèñè â ÷èï
- static void __flash_hal__writeDisable();
- // __flash_hal__writeEnable - ðàçðåøåíèå çàïèñè â ÷èï
- static void __flash_hal__writeEnable();
- // __flash_hal__statusRead1 - ÷òåíèå ðåãèñòðà ñòàòóñà 1
- static void __flash_hal__statusRead1( __flash_status1_t * pcReadRegister ); // áóôåð äëÿ ÷òåíèÿ ñòàòóñ-ðåãèñòðà
- // __flash_hal__statusRead2 - ÷òåíèå ðåãèñòðà ñòàòóñà 3
- static void __flash_hal__statusRead2( __flash_status2_t * pcReadRegister ); // áóôåð äëÿ ÷òåíèÿ ñòàòóñ-ðåãèñòðà
- // __flash_hal__statusRead3 - ÷òåíèå ðåãèñòðà ñòàòóñà 3
- static void __flash_hal__statusRead3( __flash_status3_t * pcReadRegister ); // áóôåð äëÿ ÷òåíèÿ ñòàòóñ-ðåãèñòðà
- // __flash_hal__statusWrite1 - çàïèñü ðåãèñòðà ñòàòóñà 1
- static void __flash_hal__statusWrite1( __flash_status1_t * pcWriteRegister ); // áóôåð äëÿ çàïèñè ñòàòóñ-ðåãèñòðà
- // __flash_hal__statusWrite2 - çàïèñü ðåãèñòðà ñòàòóñà 3
- static void __flash_hal__statusWrite2( __flash_status2_t * pcWriteRegister ); // áóôåð äëÿ çàïèñè ñòàòóñ-ðåãèñòðà
- // __flash_hal__statusWrite3 - çàïèñü ðåãèñòðà ñòàòóñà 3
- static void __flash_hal__statusWrite3( __flash_status3_t * pcWriteRegister ); // áóôåð äëÿ çàïèñè ñòàòóñ-ðåãèñòðà
- // __flash_hal__pageErase - ñòèðàíèå ñòðàíèöû
- static void __flash_hal__pageErase( __FLASH_WORD wPageNum ); // íîìåð ñòèðàåìîé ñòðàíèöû
- // __flash_hal__blockErase - ñòèðàíèå áëîêà
- // static void __flash_hal__blockErase( __FLASH_WORD wBlockNum ); // íîìåð ñòèðàåìîãî áëîêà
- // __flash_hal__sectorErase - ñòèðàíèå ñåêòîðîâ ñ íîìåðîì 1 è âûøå
- static void __flash_hal__sectorErase( __FLASH_WORD wSector ); // íîìåð ñåêòîðà 1-63
- // __flash_hal__sleepMode - ïåðåõîä â ðåæèì ïîíèæåííîãî ýíåðãîïîòðåáëåíèÿ
- static void __flash_hal__sleepMode();
- // __flash_hal__wakeUp - âûõîä èç ðåæèìà ïîíèæåííîãî ýíåðãîïîòðåáëåíèÿ
- static void __flash_hal__wakeUp();
- // __flash_hal__arrayRead - ïîñëåäîâàòåëüíîå ÷òåíèå (ìàññèâ)
- static void __flash_hal__arrayRead ( __FLASH_DWORD w24Address, // àäðåñ íà÷àëà ÷òåíèÿ
- __FLASH_BYTE * pDataRead, // óêàçàòåëü íà áóôåð-ïðèåìíèê äàííûõ
- __FLASH_WORD wCntToRead ); // êîëè÷åñòâî äàííûõ íà ÷òåíèå
- // __flash_hal__chunkProgram - ïðîãðàììèðîâàíèå ñòðàíèöû áåç ñòèðàíèÿ áëîêà/ñòðàíèöû
- static void __flash_hal__chunkProgram( __flash_pageprogramptr_t pdata,
- __FLASH_DWORD w24Address ); // àäðåñ íà÷àëà çàïèñè
- // __flash_hal__securityRegister1Erase - ñòèðàåò ðåãèñòð áåçîïàñíîñòè
- static void __flash_hal__securityRegister1Erase();
- // __flash_hal__securityRegister2Erase - ñòèðàåò ðåãèñòð áåçîïàñíîñòè
- static void __flash_hal__securityRegister2Erase();
- // __flash_hal__securityRegister3Erase - ñòèðàåò ðåãèñòð áåçîïàñíîñòè
- static void __flash_hal__securityRegister3Erase();
- // __flash_hal__securityRegister1Write - çàïèñûâàåò ðåãèñòð áåçîïàñíîñòè
- static void __flash_hal__securityRegister1Write( __flash_securityregister_t * contents ); // ñîäåðæèìîå ðåãèñòðà áåçîïàñíîñòè
- // __flash_hal__securityRegister2Write - çàïèñûâàåò ðåãèñòð áåçîïàñíîñòè
- static void __flash_hal__securityRegister2Write( __flash_securityregister_t * contents ); // ñîäåðæèìîå ðåãèñòðà áåçîïàñíîñòè
- // __flash_hal__securityRegister3Write - çàïèñûâàåò ðåãèñòð áåçîïàñíîñòè
- static void __flash_hal__securityRegister3Write( __flash_securityregister_t * contents ); // ñîäåðæèìîå ðåãèñòðà áåçîïàñíîñòè
- // __flash_hal__securityRegister1Read - ïðî÷èòûâàåò ðåãèñòð áåçîïàñíîñòè
- static void __flash_hal__securityRegister1Read( __flash_securityregister_t * contents ); // áóôåð-ïðèåìíèê ñîäåðæèìîãî ðåãèñòðà áëîêèðîâêè
- // __flash_hal__securityRegister2Read - ïðî÷èòûâàåò ðåãèñòð áåçîïàñíîñòè
- static void __flash_hal__securityRegister2Read( __flash_securityregister_t * contents ); // áóôåð-ïðèåìíèê ñîäåðæèìîãî ðåãèñòðà áëîêèðîâêè
- // __flash_hal__securityRegister3Read - ïðî÷èòûâàåò ðåãèñòð áåçîïàñíîñòè
- void __flash_hal__securityRegister3Read( __flash_securityregister_t * contents ); // áóôåð-ïðèåìíèê ñîäåðæèìîãî ðåãèñòðà áëîêèðîâêè
- // __flash_hal__manufacturerIdRead - ÷òåíèå èäåíòèôèêàòîðà ïðîèçâîäèòåëÿ
- static __FLASH_DWORD __flash_hal__manufacturerIdRead( __flash_id_t * pManufacturerID );// íåîáÿçàòåëüíûé ïàðàìåòð-áóôåð äëÿ ïðèåìà ðàñøèðåííîé èíôîðìàöèè
- // __flash_hal__uniqueIdRegisterRead -
- static void __flash_hal__uniqueIdRegisterRead( __flash_uniqueidregister_t * contents ); // áóôåð-ïðèåìíèê ñîäåðæèìîãî ðåãèñòðà UniqueID
- // __flash_hal__uniqueIdRegisterValidate - ïðî÷èòûâàåò ðåãèñòð UniqueID è âûïîëíÿåò
- static bool __flash_hal__uniqueIdRegisterValidate( __flash_uniqueidregister_t * contents ); // áóôåð-ïðèåìíèê ñîäåðæèìîãî ðåãèñòðà UniqueID
- #if W25QXXX_POWER_MANAGEMENT > 0
- // __flash_hal__powerOn - ðåàëèçóåò óïðàâëåíèå ïèòàíèåì ìèêðîñõåìû ïàìÿòè (ïîäàåò ïèòàíèå)
- static void __flash_hal__powerOn();
- // __flash_hal__powerOff - ðåàëèçóåò óïðàâëåíèå ïèòàíèåì ìèêðîñõåìû ïàìÿòè (ñíèìàåò ïèòàíèå)
- static void __flash_hal__powerOff();
- // __flash_hal__powerPulse - ðåàëèçóåò óïðàâëåíèå ïèòàíèåì ìèêðîñõåìû - ôîðìèðóåò èìïóëüñ ïåðåçàãðóçêè
- static void __flash_hal__powerPulse( __FLASH_WORD nCooldownTime_ms, __FLASH_WORD nStartupTime_ms );
- #endif
- #if W25QXXX_RESET_MANAGEMENT > 0
- // __flash_hal__resetAssert - ðåàëèçóåò óïðàâëåíèå ñèãíàëîì ñáðîñà ìèêðîñõåìû ïàìÿòè (óñòàíàâëèâàåò ñèãíàë ñáðîñà)
- static void __flash_hal__resetAssert();
- // __flash_hal__resetRelease - ðåàëèçóåò óïðàâëåíèå ñèãíàëîì ñáðîñà ìèêðîñõåìû ïàìÿòè (ñíèìàåò ñèãíàë ñáðîñà)
- static void __flash_hal__resetRelease();
- // __flash_hal__resetPulse - ðåàëèçóåò óïðàâëåíèå ñèãíàëîì ñáðîñà ìèêðîñõåìû ïàìÿòè (ïîäàåò çàêîí÷åííûé èìïóëüñ ñáðîñà)
- static void __flash_hal__resetPulse();
- #endif
- // __flash_hal__initialize - Íèçêîóðîâíåâàÿ èíèöèàëèçàöèÿ ôëåøïàìÿòè
- // # âîçâðàùàåò 0, åñëè âñå óñïåøíî, èëè êîä îøèáêè
- static flash_err_t __flash_hal__initialize();
- // __flash_hal__finalizePrepare - Íèçêîóðîâíåâàÿ ôóíêöèÿ äëÿ ïîäãîòîâêè ôëåøïàìÿòè ê äåèíèöèàëèçàöèè äðàéâåðà
- static flash_err_t __flash_hal__finalizePrepare();
- // __flash_hal__dirtyDetect - Íèçêîóðîâíåâîå îïðåäåëåíèå íàëè÷èÿ ÷èïà (äîñòóïíîñòè)
- // Èñïîëüçóåòñÿ âî âðåìÿ ïåðâè÷íîé èíèöèàëèçàöèè â flash_initialize().
- static flash_err_t __flash_hal__dirtyDetect();
- // __flash_hal__startupDetect - Íèçêîóðîâíåâîå îïðåäåëåíèå íàëè÷èÿ ÷èïà (äîñòóïíîñòè)
- // Èñïîëüçóåòñÿ âåðõíèì óðîâíåì API äëÿ îïðåäåëåíèÿ ìîäåëè óñòàíîâëåííîãî ÷èïà ïàìÿòè
- static flash_err_t __flash_hal__startupDetect();
- // __flash_hal__getReadyFast - ïðîâåðêà çàíÿòîñòè áåç îæèäàíèÿ
- static flash_err_t __flash_hal__getReadyFast( );
- // ñëóæåáíàÿ ôóíêöèÿ äëÿ ïðîâåðêè ãîòîâíîñòè ÷èïà
- static int __flash_smartWaitms( __FLASH_WORD wTimems );
- // __flash_hal__globalLock - óñòàíîâèòü áëîêèðîâêó çàïèñè íà âñå ñåêòîðà/áëîêè
- static void __flash_hal__globalLock(); // [W25Q OK]
- // __flash_hal__globalUnlock - ñíÿòü áëîêèðîâêó çàïèñè ñî âñåõ ñåêòîðîâ/áëîêîâ
- static void __flash_hal__globalUnlock(); // [W25Q OK]
- // __flash_hal__protectStateWrite - çàïèñûâàåò èíäèâèäóàëüíóþ áëîêèðîâêó ñåêòîðà/áëîêà
- static void __flash_hal__protectStateWrite( size_t nProtSector, bool protectState );
- // __flash_hal__protectStateRead - ñ÷èòûâàåò èíäèâèäóàëüíóþ áëîêèðîâêó ñåêòîðà/áëîêà
- static bool __flash_hal__protectStateRead( size_t nProtSector );
- // __flash_hal__protectregister_write - çàïèñûâàåò ðåãèñòð çàùèòû (áèòû èíäèâèäóàëüíîé çàùèòû ñåêòîðîâ/áëîêîâ)
- // void __flash_hal__protectregister_write( __flash_protectionregister_t * contents );
- // __flash_hal__protectregister_read - ïðî÷èòûâàåò ðåãèñòð çàùèòû (áèòû èíäèâèäóàëüíîé çàùèòû ñåêòîðîâ/áëîêîâ)
- // void __flash_hal__protectregister_read( __flash_protectionregister_t * contents );
- // ########################################################################################################
- const W25Q_LL_Routines_t W25Q_LL_Routines =
- {
- .operations =
- {
- .writeDisable = __flash_hal__writeDisable,
- .writeEnable = __flash_hal__writeEnable,
- },
- .status =
- {
- .statusRead1 = __flash_hal__statusRead1,
- .statusRead2 = __flash_hal__statusRead2,
- .statusRead3 = __flash_hal__statusRead3,
- .statusWrite1 = __flash_hal__statusWrite1,
- .statusWrite2 = __flash_hal__statusWrite2,
- .statusWrite3 = __flash_hal__statusWrite3,
- },
- .security =
- {
- .securityRegister1Erase = __flash_hal__securityRegister1Erase,
- .securityRegister2Erase = __flash_hal__securityRegister2Erase,
- .securityRegister3Erase = __flash_hal__securityRegister3Erase,
- .securityRegister1Write = __flash_hal__securityRegister1Write,
- .securityRegister2Write = __flash_hal__securityRegister2Write,
- .securityRegister3Write = __flash_hal__securityRegister3Write,
- .securityRegister1Read = __flash_hal__securityRegister1Read,
- .securityRegister2Read = __flash_hal__securityRegister2Read,
- .securityRegister3Read = __flash_hal__securityRegister3Read,
- },
- .protection =
- {
- .globalLock = __flash_hal__globalLock,
- .globalUnlock = __flash_hal__globalUnlock,
- .protectStateWrite = __flash_hal__protectStateWrite,
- .protectStateRead = __flash_hal__protectStateRead,
- //.readState = __flash_hal__protectregister_read,
- //.writeState = __flash_hal__protectregister_write,
- },
- .sleep =
- {
- .sleepMode = __flash_hal__sleepMode,
- .wakeUp = __flash_hal__wakeUp,
- },
- .data =
- {
- .arrayRead = __flash_hal__arrayRead,
- .chunkProgram = __flash_hal__chunkProgram,
- .pageErase = __flash_hal__pageErase,
- .sectorErase = __flash_hal__sectorErase,
- },
- .id =
- {
- .manufacturerIdRead = __flash_hal__manufacturerIdRead,
- .uniqueIdRegisterRead = __flash_hal__uniqueIdRegisterRead,
- .uniqueIdRegisterValidate = __flash_hal__uniqueIdRegisterValidate,
- },
- .service =
- {
- .startupDetect = __flash_hal__startupDetect,
- .initialize = __flash_hal__initialize,
- .finalizePrepare = __flash_hal__finalizePrepare,
- .dirtyDetect = __flash_hal__dirtyDetect,
- .getBuf = __flash_hal__getBuffer,
- },
- #if W25QXXX_POWER_MANAGEMENT > 0
- .power =
- {
- .powerOn = __flash_hal__powerOn,
- .powerOff = __flash_hal__powerOff,
- .powerPulse = __flash_hal__powerPulse,
- },
- #endif
- #if W25QXXX_RESET_MANAGEMENT > 0
- .reset =
- {
- .resetAssert = __flash_hal__resetAssert,
- .resetRelease = __flash_hal__resetRelease,
- .resetPulse = __flash_hal__resetPulse,
- },
- #endif
- .ready =
- {
- .getReadyFast = __flash_hal__getReadyFast,
- .smartWaitms = __flash_smartWaitms,
- }
- };
- // ########################################################################################################
- // Ãëîáàëüíûå ïåðåìåííûå
- #pragma pack( push, 1 )
- #ifdef W25QXXX_FLASH_RAM_PLACE
- _PLACEIN( W25QXXX_FLASH_RAM_PLACE )
- #endif
- static union /* __flash_global */
- {
- __FLASH_BYTE alloc_place[ __FLASH_LL_SVCMEM_SIZE ];
- struct /* __flash_var */
- {
- // __FLASH_BYTE pagebuffer[ __FULL_PAGE_SIZE ]; // ÍÅ ÒÐÅÁÓÅÒÑß! áóôåð ïîä ÷òåíèå/çàïèñü ñòðàíèö
- __FLASH_BYTE cmdbuffer [ __FLASH_LL_COMMAND_MAXSIZE ]; // áóôåð äëÿ âûïîëåíèÿ êîìàíä
- };
- };
- #pragma pack( pop )
- //__flash_protectionregister_t * __flash_internal_getbuffer_protect() { return &protectionregister; }
- // ########################################################################################################
- // ########################################################################################################
- // ########################################################################################################
- // ########################################################################################################
- // ########################################################################################################
- // ########################################################################################################
- // ñëóæåáíûå ôóíêöèè óïðàâëåíèÿ CS
- // óñòàíîâêà ñèãíàëà ChipSelect â àêòèâíîå ñîñòîÿíèå
- static inline void chip_sel_active() // [W25Q OK]
- {
- __FLASH_HAL_CS_LO();
- __FLASH_WAITus(_TIME_CSCLR_us);
- }
- // óñòàíîâêà ñèãíàëà ChipSelect â íåàêòèâíîå ñîñòîÿíèå
- static inline void chip_sel_inactive() // [W25Q OK]
- {
- __FLASH_WAITus(_TIME_CSSET_us);
- __FLASH_HAL_CS_HI();
- __FLASH_WAITus(_TIME_CSHLD_us); // ìèíèìàëüíîå âðåìÿ ìåæäó êîìàíäàìè
- }
- #if W25QXXX_NO_MS_DELAYS == 1
- // ¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹
- // __int_sys_delayms - ñëóæåáíàÿ ôóíêöèÿ îæèäàíèÿ â ìñ, åñëè àíàëîã îòñóòñòâóåò ó ïîëüçîâàòåëÿ.
- // Îïöèÿ W25QXXX_NO_MS_DELAYS ïîçâîëÿåò çàìåíèòü çàäåðæêó â ìñ íà çàäåðæêó â ìêñ.
- static inline void __int_sys_delayms( __FLASH_WORD timeout ) // [W25Q OK]
- {
- __imp_sys_delayus( timeout * 1000 );
- }
- #endif
- // --------------------------------------------------------------------------------------------------------
- // __flash_smartWaitms - êîìáèíèðîâàíàÿ ôóíêöèÿ îæèäàíèÿ çàäàííîãî êîëè÷åñòâà ìèëëèñåêóíä ñ
- // ïðîâåðêîé ñîñòîÿíèÿ ÷èïà íà ïðåäìåò òîãî, çàíÿò îí, èëè íåò. Åñëè íå çàíÿò,
- // ôóíêöèÿ âîçâðàùàåò óïðàâëåíèå ñðàçó æå. Åñëè çàíÿò âñå óêàçàííîå âðåìÿ,
- // ôóíêöèÿ âîçâðàòèò óïðàâëåíèå ÷åðåç óêàçàííûé òàéìàóò (íå ìåíüøèé, íî, âîçìîæíî, áîëüøèé).
- //
- // * íå èçìåíÿåò ñîäåðæèìîå âíóòðåííèõ SRAM áóôåðîâ
- // * èñïîëüçóåò ñèñòåìíûå âûçîâû äëÿ îïðåäåëåíèÿ êîëè÷åñòâà ïðîøåäøåãî âðåìåíè
- // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
- // * ïðîèçâîäèò îïðîñ ÷èïà êîìàíäîé "Çàïðîñ ñòàòóñíîãî ðåãèñòðà" (Status Register Read)
- // * ôóíêöèÿ èñïîëüçóåò âûçîâ ôóíêöèé áåñêîíå÷íîãî ÷òåíèÿ ñòàòóñà
- //
- static void __flash_hal__part_statusread_stage1( __flash_status1_t * pcReadRegister );
- static void __flash_hal__part_statusread_stage2( __flash_status1_t * pcReadRegister );
- static void __flash_hal__part_statusread_stage3( __flash_status1_t * pcReadRegister );
- //
- // * ôóíêöèÿ âîçâðàùàåò 1, åñëè äîñòîâåðíî èçâåñòíî, ÷òî ôëàã BUSY ñáðîøåí (óñòðîéñòâî ãîòîâî), èíà÷å 0 (òðåáóåòñÿ ïîâòîðíàÿ ïðîâåðêà)
- //
- static int __flash_smartWaitms( __FLASH_WORD wTimems ) // [W25Q OK]
- {
- __flash_status1_t r_status; // ñòàòóñ-ðåãèñòð
- __flash_hal__part_statusread_stage1( &r_status ); // íà÷èíàåì ñ÷èòûâàòü
- // -- -- -- -- -- -- äëÿ êîðîòêèõ çàäåðæåê -- -- -- -- -- -- -- -- -- --
- if ( !r_status.bBusy ) // ñðàçó ïðîâåðÿåì, åñëè óñòðîéñòâî ñâîáîäíî, âîçâðàùàåì óïðàâëåíèå
- {
- __flash_hal__part_statusread_stage3( 0 ); // çàâåðøàåì ÷òåíèå ðåãèñòðà
- return 1;
- }
- if ( wTimems < W25QXXX_SMART_WAIT_THRESHOLD ) // äëÿ ìàëûõ âðåìåí îæèäàíèÿ íàêëàäíî îïðàøèâàòü ÷èï ïîñòîÿííî
- {
- __FLASH_WAITms(wTimems); // âûæèäàåì óêàçàííîå âðåìÿ
- __flash_hal__part_statusread_stage3( &r_status ); // ïðîâåðÿåì ðåãèñòð
- if ( !r_status.bBusy ) // åñëè ñâîáîäíî - âåðíåì 1
- return 1;
- return 0; // åñëè çàíÿòî - âåðíåì 0
- }
- // -- -- -- -- -- -- äëÿ äëèííûõ çàäåðæåê -- -- -- -- -- -- -- -- -- --
- __FLASH_DWORD dwStartCounter = __FLASH_SMART_GETTIMER(); // ïîëó÷àåì îòìåòêó âðåìåíè
- for(/*|*/ __FLASH_DWORD dwDeltaCounter = 0; // ñ÷åò÷èê çàäåðæêè
- /*|*/ dwDeltaCounter < wTimems; // ïðîâåðÿåì, çàäåðæàëèñü ëè ìû íà óêàçàííîå âðåìÿ èëè åùå íåò
- /*|*/ dwDeltaCounter = ( __FLASH_SMART_GETTIMER() - dwStartCounter ) ) // îáíîâëÿåì ñ÷åò÷èê çàäåðæêè
- {
- __flash_hal__part_statusread_stage2( &r_status ); // ÷èòàåì ñòàòóñ
- if ( !r_status.bBusy ) // ïðîâåðÿåì, íå îñâîáîäèëñÿ ëè ÷èï?
- {
- __flash_hal__part_statusread_stage3( 0 ); // äà, îñâîáîäèëñÿ, çàâåðøàåì ÷òåíèå
- return 1; // âîçâðàùàåì 1 (îñâîáîäèëñÿ)
- }
- __FLASH_WAITms(1); // âûæèäàåì êâàíò âðåìåíè
- }
- __flash_hal__part_statusread_stage3( &r_status ); // âðåìÿ âûøëî, çàâåðøàåì ÷òåíèå
- if ( !r_status.bBusy ) // ïîñëåäíèé ðàç ïðîâåðÿåì ñòàòóñ
- return 1; // ñâîáîäåí!
- return 0; // ÷èï äî ñèõ ïîð çàíÿò
- }
- // ########################################################################################################
- // --------------------------------------------------------------------------------------------------------
- // __flash_hal__part_statusread - ãðóïïà ñêðûòûõ íèçêîóðîâíåâûõ ôóíêöèé, ïîçâîëÿþùàÿ îñóùåñòâëÿòü ïîñòîÿííîå ñêàíèðîâàíèå ðåãèñòðà
- // ñòàòóñà. ×èï ïðåäîñòàâëÿåò âîçìîæíîñòü ñ÷èòûâàòü ðåãèñòð ñòàòóñà áåç îòïðàâêè êîìàíäû íà ÷òåíèå ïðè ïîâòîðíîì ÷òåíèè,
- // äî óñòàíîâêè CS â íåàêòèâíîå ïîëîæåíèå. Ò.Î âîçìîæíî ïåðåäàòü êîìàíäó îäèí ðàç, çàòåì ÷èòàòü ñòàòóñ áåñêîíå÷íî.
- // Ôóíêöèè äîëæíû âûçûâàòüñÿ â ïîðÿäêå íóìåðàöèè, ïðè ýòîì ñòàäèÿ 2 ìîæåò áûòü ïðîïóùåíà. Ôóíêèè ïðîâåðÿþò ïàðàìåòð
- // pcReadRegister íà NULL, åñëè îí îòëè÷åí îò NULL, ñ÷èòûâàþò â íåãî ñîäåðæìîå ðåãèñòðà, èíà÷å íè÷åãî íå ñ÷èòûâàþò.
- // Ïðèìåð îæèäàíèÿ çàâåðøåíèÿ îïåðàöèè ñòèðàíèÿ:
- // [code]
- //
- // __flash_status_t status; // ñòàòóñ-ðåãèñòð
- //
- // __flash_hal_pageerase( 0 ); // ñòèðàåì 0 ñòðàíèöó
- // __flash_hal__part_statusread_stage1( &status ); // èíèöèðóåì ÷òåíèå ñòàòóñà
- //
- // while( status.bBusy )
- // __flash_hal__part_statusread_stage2( &status ); // ïîâòîðÿåì ÷òåíèå ñòàòóñà
- //
- // __flash_hal__part_statusread_stage3( 0 ); // çàâåðøàåì ÷òåíèå ñòàòóñà
- //
- // [/code]
- // __flash_hal__part_statusread_stage1 - 1 ñòàäèÿ (íà÷àëüíàÿ) êîìàíäû áåñêîíå÷íîãî ÷òåíèÿ ñòàòóñà çàíÿòîñòè
- // __flash_hal__part_statusread_stage2 - 2 ñòàäèÿ (ïðîìåæóòî÷íàÿ) êîìàíäû áåñêîíå÷íîãî ÷òåíèÿ ñòàòóñà çàíÿòîñòè
- // __flash_hal__part_statusread_stage3 - 3 ñòàäèÿ (çàêëþ÷èòåëüíàÿ) êîìàíäû áåñêîíå÷íîãî ÷òåíèÿ ñòàòóñà çàíÿòîñòè
- //
- // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
- // * ÍÅ çàäåðæèâàåò âûïîëíåíèå: òðåáóåòñÿ âíåøíèé öèêë äëÿ îðãàíèçàöèè ñêàíèðîâàíèÿ
- static void __flash_hal__part_statusread_stage1( __flash_status1_t * pcReadRegister ) // [W25Q OK]
- {
- chip_sel_active();
- ( (__flash_packet_statusread_t*) cmdbuffer )->opcode = _ACMD_STATREAD_1;
- // îòïðàâëÿåì êîìàíäó
- __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_statusread_t) );
- if( pcReadRegister )
- // ÷èòàåì ðåãèñòð
- __FLASH_HAL_RD( pcReadRegister, sizeof(__flash_status1_t) );
- }
- //----- ------- ------ ------ ------ ------- ------
- static void __flash_hal__part_statusread_stage2( __flash_status1_t * pcReadRegister ) // [W25Q OK]
- {
- if( pcReadRegister )
- // ÷èòàåì ðåãèñòð
- __FLASH_HAL_RD( pcReadRegister, sizeof(__flash_status1_t) );
- }
- //----- ------- ------ ------ ------ ------- ------
- static void __flash_hal__part_statusread_stage3( __flash_status1_t * pcReadRegister ) // [W25Q OK]
- {
- if( pcReadRegister )
- // ÷èòàåì ðåãèñòð
- __FLASH_HAL_RD( pcReadRegister, sizeof(__flash_status1_t) );
- chip_sel_inactive();
- }
- // --------------------------------------------------------------------------------------------------------
- // ########################################################################################################
- // __flash_hal__getReadyFast - ïðîâåðêà çàíÿòîñòè áåç îæèäàíèÿ
- //
- // # Âîçâðàùàåìîå çíà÷åíèå: FLERR_SUCCESS åñëè ñâîáîäåí, èíà÷å FLERR_TIMEOUT
- static flash_err_t __flash_hal__getReadyFast( ) // [W25Q OK]
- {
- __flash_status1_t status;
- __flash_hal__statusRead1( &status );
- if( !status.bBusy )
- return FLERR_SUCCESS;
- return FLERR_TIMEOUT;
- }
- /*
- // --------------------------------------------------------------------------------------------------------
- // ########################################################################################################
- // __flash_hal__getprotectstate - ïîëó÷åíèå ñîñòîÿíèÿ îáùåãî áèòà çàùèòû
- //
- // # Âîçâðàùàåìîå çíà÷åíèå - FLERR_PROTECT_ENABLED, åñëè áèò çàùèòû óñòàíîâëåí, èíà÷å FLERR_PROTECT_DISABLED
- static flash_err_t __flash_hal__getprotectstate( ) // [W25Q WRONG]
- {
- __flash_status1_t status;
- __flash_hal__statusRead1( &status );
- if( status.cBlkProt )
- return FLERR_PROTECT_ENABLED;
- return FLERR_PROTECT_DISABLED;
- }
- */
- // --------------------------------------------------------------------------------------------------------
- // ########################################################################################################
- // __flash_hal__dirtyDetect - Íèçêîóðîâíåâîå îïðåäåëåíèå íàëè÷èÿ ÷èïà (äîñòóïíîñòè)
- // Èñïîëüçóåòñÿ âî âðåìÿ ïåðâè÷íîé èíèöèàëèçàöèè â flash_initialize().
- static flash_err_t __flash_hal__dirtyDetect() // [W25Q OK]
- {
- // ñíà÷àëà ïûòàåìñÿ ïðî÷èòàòü èäåíòèôèêàòîð:
- // ÷òåíèå ðåãèñòðà èíôîðìàöèè
- __FLASH_DWORD flashID = __flash_hal__manufacturerIdRead( 0 );
- // îïðåäåëÿåì íàëè÷èå ôëåøêè ïî èäåíòèôèêàòîðó
- if( ((__flash_rvid_t*) &flashID)->FullId == __FLASH_INVALID_ID )
- {
- // ïîõîæå, ÷òî ÷èïà íåò, îáíàðóæèòü íå óäàëîñü
- return FLERR_LL_INITFAIL_NOTFOUND;
- }
- // åùå íå âñå, íóæíî óáåäèòüñÿ, ÷òî óñòðîéñòâî îòâå÷àåò:
- // ÷èòàåì ñòàòóñ
- if( ! __flash_smartWaitms( W25QXXX_API_TIMEOUT ) )
- {
- // ëèáî ñòàòóñ íå ÷èòàåòñÿ, ëèáî óñòðîéñòâî çàíÿòî.
- // ò.ê. ôóíêöèÿ ïðåäíàçíà÷åíà äëÿ èñïîëüçîâàíèÿ âî âðåìÿ èíèöèàëèçàöèè,
- // ïðåäïîëàãàåòñÿ, ÷òî ÷èï äîëæåí áûòü ñâîáîäåí.
- // Ïîýòîìó âîçâðàùàåì îøèáêó
- return FLERR_UNEXPECTED_BUSY;
- }
- return FLERR_SUCCESS;
- }
- // --------------------------------------------------------------------------------------------------------
- // --------------------------------------------------------------------------------------------------------
- // ########################################################################################################
- // __flash_hal__finalizePrepare - Íèçêîóðîâíåâàÿ ôóíêöèÿ äëÿ ïîäãîòîâêè ôëåøïàìÿòè ê äåèíèöèàëèçàöèè äðàéâåðà
- // Âûïîëíÿåò äåéñòâèÿ, íàïðàâëåííûå íà çàâåðøåíèå ðàáîòû ñ ôëåøïàìÿòüþ è ïîäãîòîâêè åå ê âûêëþ÷åíèþ
- // Âûçûâàåòñÿ â ìîìåíò îêîí÷àòåëüíîé îñòàíîâêè ðàáîòû ñ ôëåøïàìÿòüþ
- static flash_err_t __flash_hal__finalizePrepare() // [W25Q OK]
- {
- // Ñíà÷àëà òðåáóåòñÿ ïðîâåðèòü ðåæèì çàùèòû çàïèñè:
- // åñëè ðàçðåøåíî óïðàâëåíèå àïïàðàòíûì ñèãíàëîì çàùèòû çàïèñè
- #if W25QXXX_HW_WR_PROTECT
- // åñëè àïïàðàòíàÿ çàùèòà çàïèñè îòêëþ÷åíà â íàñòðîéêàõ
- #if W25QXXX_HW_WR_PROTECT_KEEPUNPROTECTED == 1
- // òðåáóåòñÿ óñòàíîâèòü àïïàðàòíóþ çàùèòó çàïèñè ïîñëå äåèíèöèàëèçàöèè äðàéâåðà
- __imp_flash_hwwrprotect_assert();
- #endif
- #endif
- // Ïîòîì ïðîâåðÿåì ñòàòóñ ãîòîâíîñòè
- if( ! (__flash_smartWaitms( W25QXXX_API_TIMEOUT ) ) )
- {
- // óñòðîéñòâî çàíÿòî.
- return FLERR_UNEXPECTED_BUSY;
- }
- return FLERR_SUCCESS;
- }
- // --------------------------------------------------------------------------------------------------------
- // --------------------------------------------------------------------------------------------------------
- // ########################################################################################################
- // __flash_hal__startupDetect - Íèçêîóðîâíåâîå äåòåêòèðîâàíèå ÷èïà ôëåøïàìÿòè
- // Ïðîèçâîäèò íà÷àëüíóþ íàñòðîéêó àïïàðàòóðû äëÿ âîçìîæíîñòè îïðåäåëåíèÿ íàëè÷èÿ ÷èïà íà øèíå
- static flash_err_t __flash_hal__startupDetect()
- {
- // åñëè ðàçðåøåíî óïðàâëåíèå ïèòàíèåì
- #if W25QXXX_POWER_MANAGEMENT
- // ïîäàòü ïèòàíèå íà ìèêðîñõåìó
- __flash_hal__powerOn();
- __FLASH_WAITus( _TIME_STRUP_us );
- #endif
- // åñëè ðàçðåøåíî óïðàâëåíèå ïèòàíèåì
- #if W25QXXX_RESET_MANAGEMENT
- // ñíÿòü ñèãíëàë ñáðîñà ñ ÷èïà
- __flash_hal__resetRelease();
- __FLASH_WAITus( _TIME_RSTRC_us );
- #endif
- // ïðîáóæäàåì ÷èï, åñëè òîò íàõîäèòñÿ â ðåæèìå ñíà
- // èíà÷å îí íå áóäåò âîñïðèíèìàòü êîìàíäû.
- // Íåèçâåñòíî, áûë ëè ÷èï â ðåæèìå ãèáåðíàöèè, íî ýòî íå âàæíî
- __flash_hal__wakeUp();
- // ïðåäâàðèòåëüíûé òàéìàóò çàïóñêà - æäåì ìàêñèìàëüíîå âðåìÿ äî ãîòîâíîñòè çàïèñè âî ôëåø
- __FLASH_WAITms( _TIME_START_ms );
- // ïðîèçâîäèòñÿ íåñêîëüêî äâå ïîïûòêè äîñòó÷àòüñÿ äî ÷èïà
- flash_err_t dirty_status = FLERR_GENERIC_ERROR;
- for( size_t attempt = 0; attempt < 2; ++attempt )
- {
- // ïðîáóåì "ãðÿçíîå" ÷òåíèå èäåíòèôèêàòîðà.
- // Ðåçóëüòàò ÷òåíèÿ íå ñîõðàíÿåòñÿ, òðåáóåòñÿ îáíàðóæèòü
- // ëèøü ïðèñóñòâèå íà øèíå è îïðåäåëèòü ãîòîâíîñòü
- // Ïîýòîìó êàê îñòóñòâèå íà øèíå, òàê è çàíÿòîñòü ÷èïà ðàñöåíèâàåòñÿ
- // êàê îøèáêà.
- dirty_status = __flash_hal__dirtyDetect();
- if( FLASH_ERROR(dirty_status) )
- {
- // åñëè ïåðâàÿ ïîïûòêà ïðîâàëåíà, è __flash_hal__dirtyDetect ïîñëå ñáðîñà
- // äàåò îøèáêó - çíà÷èò âîçâðàùàåì îøèáêó
- if( attempt > 0 )
- return dirty_status;
- // åñëè ðàçðåøåíî óïðàâëåíèå ñèãíàëîì ñáðîñà
- #if W25QXXX_RESET_MANAGEMENT
- // Ôîðìèðóåì èìïóëüñ ñáðîñà:
- __flash_hal__resetPulse();
- #else
- // óïðàâëåíèå ñèãíàëîì ñáðîñà íåäîñòóïíî
- // à óïðàâëåíèå ïèòàíèåì äîñòóïíî?
- #if W25QXXX_POWER_MANAGEMENT
- // Ôîðìèðóåì èìïóëüñ ïîäà÷è ïèòàíèÿ
- __flash_hal__powerPulse( _TIME_COOLDOWN_ms, _TIME_START_ms );
- #else
- // Ïðîâåðêà äîñòóïíîñòè âåðíóëà îøèáêó.
- // Óïðàâëåíèå ïèòàíèåì è ñèãíàëîì ñáðîñà íåäîñòóïíî
- // Âîçâðàùàåì îøèáêó
- return dirty_status;
- #endif
- #endif
- } else break;
- }
- if( FLASH_ERROR(dirty_status) )
- return dirty_status;
- // ÷òåíèå ðåãèñòðà èíôîðìàöèè
- __FLASH_DWORD flashID = __flash_hal__manufacturerIdRead( 0 );
- // îïðåäåëÿåì íàëè÷èå ôëåøêè ïî èäåíòèôèêàòîðó
- if( ((__flash_rvid_t*) &flashID)->FullId == __FLASH_INVALID_ID )
- {
- return FLERR_LL_INITFAIL_NOTFOUND;
- }
- __flash_uniqueidregister_t uniqueidRegister;
- if( !__flash_hal__uniqueIdRegisterValidate( &uniqueidRegister ) )
- {
- return FLERR_LL_INITFAIL_NOTFOUND;
- }
- // ïðîâåðÿåì ID ïðîèçâîäèòåëÿ
- #ifdef W25QXXX_FLASH_DESIRED_ID
- if( ((__flash_rvid_t*) &flashID)->LowId != W25QXXX_FLASH_DESIRED_ID )
- {
- return FLERR_LL_INITFAIL_WRONGID;
- }
- #endif
- // ïðîâåðÿåì âìåñòèìîñòü ÷èïà
- #ifdef W25QXXX_FLASH_DESIRED_DENSITY
- if( ((__flash_rvid_t*) &flashID)->DevId.Density != W25QXXX_FLASH_DESIRED_DENSITY )
- {
- return FLERR_LL_INITFAIL_WRONGDENSITY;
- }
- #endif
- // ïðîâåðÿåì ñåìåéñòâî ÷èïà
- #if defined(W25QXXX_FLASH_DESIRED_FAMILY_ALT1) || defined(W25QXXX_FLASH_DESIRED_FAMILY_ALT2)
- switch( ((__flash_rvid_t*) &flashID)->DevId.Family )
- {
- #if defined(W25QXXX_FLASH_DESIRED_FAMILY_ALT1)
- case W25QXXX_FLASH_DESIRED_FAMILY_ALT1:
- #endif
- #if defined(W25QXXX_FLASH_DESIRED_FAMILY_ALT2)
- case W25QXXX_FLASH_DESIRED_FAMILY_ALT2:
- #endif
- break;
- default: return FLERR_LL_INITFAIL_WRONGFAMILY;
- }
- #endif
- return FLERR_SUCCESS;
- }
- // --------------------------------------------------------------------------------------------------------
- // ########################################################################################################
- // __flash_hal__initialize - Íèçêîóðîâíåâàÿ èíèöèàëèçàöèÿ äðàéâåðà ôëåøïàìÿòè
- //
- // * îïðåäåëåíèå íàëè÷èÿ ïîäêëþ÷åííîé ìèêðîñõåìû
- // * ÷òåíèå èäåíòèôèêàòîðà è îïðåäåëåíèå ïðîèçâîäèòåëÿ
- // * êîíòðîëü ïðàâèëüíîñòè:
- // - èäåíòèôèêàòîðà ïðîèçâîäèòåëÿ
- // - òèïà óñòðîéñòâà, ñåìåéñòâà (DevId)
- // - ðàçìåðà ÷èïà
- // * óñòàíîâêà è ïðîâåðêà ðàçìåðà ñòðàíèöû
- //
- // # Âîçâðàùàåìîå çíà÷íèå - êîä âûïîëíåíèÿ
- static flash_err_t __flash_hal__initialize() // [W25Q OK]
- {
- // ïåðâè÷íàÿ èíèöèàëèçàöèÿ øèíû è ÷èïà
- flash_err_t detectStatus = __flash_hal__startupDetect();
- if( FLASH_ERROR(detectStatus) )
- return detectStatus;
- // åñëè ðàçðåøåíî óïðàâëåíèå àïïàðàòíûì ñèãíàëîì çàùèòû çàïèñè
- #if W25QXXX_HW_WR_PROTECT
- // åñëè àïïàðàòíàÿ çàùèòà çàïèñè îòêëþ÷åíà â íàñòðîéêàõ
- #if W25QXXX_HW_WR_PROTECT_KEEPUNPROTECTED == 1
- // òðåáóåòñÿ ñíÿòü àïïàðàòíóþ çàùèòó çàïèñè íà âñ¸ âðåìÿ ðàáîòû äðàéâåðà
- __imp_flash_hwwrprotect_release();
- #endif
- #endif
- return FLERR_SUCCESS;
- }
- // ########################################################################################################
- // ########################################################################################################
- // ########################################################################################################
- // ########################################################################################################
- // ########################################################################################################
- // ########################################################################################################
- // --------------------------------------------------------------------------------------------------------
- // __flash_hal__writeEnable - ðàçðåøåíèå çàïèñè â ÷èï
- //
- // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
- // * ÍÅ çàäåðæèâàåò âûïîëíåíèå
- static void __flash_hal__writeEnable() // [W25Q OK]
- {
- chip_sel_active();
- ( (__flash_packet_writecontrol_t*) cmdbuffer )->opcode = _SCMD_WRENABLE;
- // îòïðàâëÿåì êîìàíäó
- __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_writecontrol_t) );
- chip_sel_inactive();
- }
- // --------------------------------------------------------------------------------------------------------
- // __flash_hal__writeDisable - çàïðåùåíèå çàïèñè â ÷èï
- //
- // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
- // * ÍÅ çàäåðæèâàåò âûïîëíåíèå
- static void __flash_hal__writeDisable() // [W25Q OK]
- {
- chip_sel_active();
- ( (__flash_packet_writecontrol_t*) cmdbuffer )->opcode = _SCMD_WRDISABLE;
- // îòïðàâëÿåì êîìàíäó
- __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_writecontrol_t) );
- chip_sel_inactive();
- }
- // --------------------------------------------------------------------------------------------------------
- // __flash_hal__statusRead1 - ÷òåíèå ðåãèñòðà ñòàòóñà 1
- //
- // * íå ïðîâåðÿåò ïðàâèëüíîñòü ïåðåäàííûõ ïàðàìåòðîâ
- // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
- // * ÍÅ çàäåðæèâàåò âûïîëíåíèå
- static void __flash_hal__statusRead1( __flash_status1_t * pcReadRegister // áóôåð äëÿ ÷òåíèÿ ñòàòóñ-ðåãèñòðà
- ) // [W25Q OK]
- {
- chip_sel_active();
- ( (__flash_packet_statusread_t*) cmdbuffer )->opcode = _ACMD_STATREAD_1;
- // îòïðàâëÿåì êîìàíäó
- __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_statusread_t) );
- // ÷èòàåì ðåãèñòð
- __FLASH_HAL_RD( pcReadRegister, sizeof(__flash_status1_t) );
- chip_sel_inactive();
- }
- // --------------------------------------------------------------------------------------------------------
- // __flash_hal__statusRead2 - ÷òåíèå ðåãèñòðà ñòàòóñà 2
- //
- // * íå ïðîâåðÿåò ïðàâèëüíîñòü ïåðåäàííûõ ïàðàìåòðîâ
- // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
- // * ÍÅ çàäåðæèâàåò âûïîëíåíèå
- static void __flash_hal__statusRead2( __flash_status2_t * pcReadRegister // áóôåð äëÿ ÷òåíèÿ ñòàòóñ-ðåãèñòðà
- ) // [W25Q OK]
- {
- chip_sel_active();
- ( (__flash_packet_statusread_t*) cmdbuffer )->opcode = _ACMD_STATREAD_2;
- // îòïðàâëÿåì êîìàíäó
- __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_statusread_t) );
- // ÷èòàåì ðåãèñòð
- __FLASH_HAL_RD( pcReadRegister, sizeof(__flash_status2_t) );
- chip_sel_inactive();
- }
- // --------------------------------------------------------------------------------------------------------
- // __flash_hal__statusRead3 - ÷òåíèå ðåãèñòðà ñòàòóñà 3
- //
- // * íå ïðîâåðÿåò ïðàâèëüíîñòü ïåðåäàííûõ ïàðàìåòðîâ
- // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
- // * ÍÅ çàäåðæèâàåò âûïîëíåíèå
- static void __flash_hal__statusRead3( __flash_status3_t * pcReadRegister // áóôåð äëÿ ÷òåíèÿ ñòàòóñ-ðåãèñòðà
- ) // [W25Q OK]
- {
- chip_sel_active();
- ( (__flash_packet_statusread_t*) cmdbuffer )->opcode = _ACMD_STATREAD_3;
- // îòïðàâëÿåì êîìàíäó
- __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_statusread_t) );
- // ÷èòàåì ðåãèñòð
- __FLASH_HAL_RD( pcReadRegister, sizeof(__flash_status3_t) );
- chip_sel_inactive();
- }
- // --------------------------------------------------------------------------------------------------------
- // __flash_hal__statusWrite1 - çàïèñü ðåãèñòðà ñòàòóñà 1
- //
- // * íå ïðîâåðÿåò ïðàâèëüíîñòü ïåðåäàííûõ ïàðàìåòðîâ
- // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
- // * çàäåðæèâàåò âûïîëíåíèå íà ÄÅÑßÒÊÈ ÌÈËËÈÑÅÊÓÍÄ
- static void __flash_hal__statusWrite1( __flash_status1_t * pcWriteRegister // áóôåð äëÿ çàïèñè ñòàòóñ-ðåãèñòðà
- ) // [W25Q OK]
- {
- chip_sel_active();
- ( (__flash_packet_statuswrite_t*) cmdbuffer )->opcode = _ACMD_STATWRIT_1;
- ( (__flash_packet_statuswrite_t*) cmdbuffer )->status = pcWriteRegister->status;
- // îòïðàâëÿåì êîìàíäó
- __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_statuswrite_t) );
- chip_sel_inactive();
- #if W25Q16JV_BKGOPERATIONS == 0
- __FLASH_SMART_WAITms( _TIME_STPRG_ms );
- #endif
- }
- // --------------------------------------------------------------------------------------------------------
- // __flash_hal__statusWrite2 - çàïèñü ðåãèñòðà ñòàòóñà 2
- //
- // * íå ïðîâåðÿåò ïðàâèëüíîñòü ïåðåäàííûõ ïàðàìåòðîâ
- // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
- // * çàäåðæèâàåò âûïîëíåíèå íà ÄÅÑßÒÊÈ ÌÈËËÈÑÅÊÓÍÄ
- static void __flash_hal__statusWrite2( __flash_status2_t * pcWriteRegister // áóôåð äëÿ çàïèñè ñòàòóñ-ðåãèñòðà
- ) // [W25Q OK]
- {
- chip_sel_active();
- ( (__flash_packet_statuswrite_t*) cmdbuffer )->opcode = _ACMD_STATWRIT_2;
- ( (__flash_packet_statuswrite_t*) cmdbuffer )->status = pcWriteRegister->status;
- // îòïðàâëÿåì êîìàíäó
- __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_statuswrite_t) );
- chip_sel_inactive();
- #if W25Q16JV_BKGOPERATIONS == 0
- __FLASH_SMART_WAITms( _TIME_STPRG_ms );
- #endif
- }
- // --------------------------------------------------------------------------------------------------------
- // __flash_hal__statusWrite3 - çàïèñü ðåãèñòðà ñòàòóñà 3
- //
- // * íå ïðîâåðÿåò ïðàâèëüíîñòü ïåðåäàííûõ ïàðàìåòðîâ
- // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
- // * çàäåðæèâàåò âûïîëíåíèå íà ÄÅÑßÒÊÈ ÌÈËËÈÑÅÊÓÍÄ
- static void __flash_hal__statusWrite3( __flash_status3_t * pcWriteRegister // áóôåð äëÿ çàïèñè ñòàòóñ-ðåãèñòðà
- ) // [W25Q OK]
- {
- chip_sel_active();
- ( (__flash_packet_statuswrite_t*) cmdbuffer )->opcode = _ACMD_STATWRIT_3;
- ( (__flash_packet_statuswrite_t*) cmdbuffer )->status = pcWriteRegister->status;
- // îòïðàâëÿåì êîìàíäó
- __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_statuswrite_t) );
- chip_sel_inactive();
- #if W25Q16JV_BKGOPERATIONS == 0
- __FLASH_SMART_WAITms( _TIME_STPRG_ms );
- #endif
- }
- // --------------------------------------------------------------------------------------------------------
- // __flash_hal__arrayRead - ïîñëåäîâàòåëüíîå ÷òåíèå (ìàññèâ)
- //
- // * íå ïðîâåðÿåò ïðàâèëüíîñòü ïåðåäàííûõ ïàðàìåòðîâ
- // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
- static void __flash_hal__arrayRead ( __FLASH_DWORD w24Address, // àäðåñ íà÷àëà ÷òåíèÿ
- __FLASH_BYTE * pDataRead, // óêàçàòåëü íà áóôåð-ïðèåìíèê äàííûõ
- __FLASH_WORD wCntToRead // êîëè÷åñòâî äàííûõ íà ÷òåíèå
- ) // [W25Q OK]
- {
- chip_sel_active();
- ( (__flash_packet_arrayread_t*) cmdbuffer )->opcode = _LCMD_ARRYREAD;
- __FLASH_LL_FILLADDRESS( ( (__flash_packet_arrayread_t*) cmdbuffer ), w24Address);
- // îòïðàâëÿåì êîìàíäó
- __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_arrayread_t) );
- // ÷èòàåì äàííûå
- __FLASH_HAL_RD( pDataRead, wCntToRead );
- chip_sel_inactive();
- }
- // --------------------------------------------------------------------------------------------------------
- // __flash_hal__chunkProgram - ïðîãðàììèðîâàíèå ñòðàíèöû áåç ñòèðàíèÿ áëîêà/ñòðàíèöû
- //
- // * íå ïðîâåðÿåò ïðàâèëüíîñòü ïåðåäàííûõ ïàðàìåòðîâ
- // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
- // * çàäåðæèâàåò âûïîëíåíèå íà ÌÈËËÈÑÅÊÓÍÄÛ
- static void __flash_hal__chunkProgram( __flash_pageprogramptr_t pdata,
- __FLASH_DWORD w24Address ) // àäðåñ íà÷àëà çàïèñè
- {
- chip_sel_active();
- ( (__flash_packet_page_program_t*) cmdbuffer )->opcode = _WCMD_PGWRIT;
- w24Address &= 0xFFFF00; // ñáðàñûâàåòñÿ àäðåñ âíóòðè ñòðàíèöû 256 áàéò
- __FLASH_LL_FILLADDRESS( ( (__flash_packet_page_program_t*) cmdbuffer ), w24Address);
- // îòïðàâëÿåì êîìàíäó
- __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_page_program_t) );
- // îòïðàâëÿåì äàííûå
- __FLASH_HAL_WRCMD( pdata, sizeof(*pdata) );
- chip_sel_inactive();
- #if W25Q16JV_BKGOPERATIONS == 0
- __FLASH_SMART_WAITms( _TIME_PGPRG_ms );
- #endif
- }
- // --------------------------------------------------------------------------------------------------------
- // __flash_hal__pageErase - ñòèðàíèå ñòðàíèöû
- //
- // * íå ïðîâåðÿåò ïðàâèëüíîñòü ïåðåäàííûõ ïàðàìåòðîâ
- // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
- // * çàäåðæèâàåò âûïîëíåíèå íà ÑÎÒÍÈ ÌÈËËÈÑÅÊÓÍÄ
- static void __flash_hal__pageErase( __FLASH_WORD wPageNum // íîìåð ñòèðàåìîé ñòðàíèöû
- ) // [W25Q OK]
- {
- chip_sel_active();
- ( (__flash_packet_pageerase_t*) cmdbuffer )->opcode = _ECMD_PAGERASE;
- __FLASH_LL_FILLADDRESS( ( (__flash_packet_pageerase_t*) cmdbuffer ), ( wPageNum * (__PAGE_SIZE) ) );
- // îòïðàâëÿåì êîìàíäó
- __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_pageerase_t) );
- chip_sel_inactive();
- #if W25QXXX_BKGOPERATIONS == 0
- __FLASH_SMART_WAITms( _TIME_PGERS_ms );
- #endif
- }
- // --------------------------------------------------------------------------------------------------------
- /*
- // --------------------------------------------------------------------------------------------------------
- // __flash_hal__blockErase - ñòèðàíèå áëîêà (=ñòðàíèöû)
- //
- // * íå ïðîâåðÿåò ïðàâèëüíîñòü ïåðåäàííûõ ïàðàìåòðîâ
- // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
- // * çàäåðæèâàåò âûïîëíåíèå íà ÑÎÒÍÈ ÌÈËËÈÑÅÊÓÍÄ
- static void __flash_hal__blockErase( __FLASH_WORD wBlockNum // íîìåð ñòèðàåìîãî áëîêà
- ) // [W25Q OK]
- {
- chip_sel_active();
- ( (__flash_packet_blockerase_t*) cmdbuffer )->opcode = _ECMD_PAGERASE;
- __FLASH_LL_FILLADDRESS( ( (__flash_packet_blockerase_t*) cmdbuffer ), ( wBlockNum * (__PAGE_SIZE) ) );
- // îòïðàâëÿåì êîìàíäó
- __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_pageerase_t) );
- chip_sel_inactive();
- #if W25QXXX_BKGOPERATIONS == 0
- __FLASH_SMART_WAITms( _TIME_PGERS_ms );
- #endif
- }
- // --------------------------------------------------------------------------------------------------------
- */
- // --------------------------------------------------------------------------------------------------------
- // __flash_hal__sectorErase - ñòèðàíèå ñåêòîðîâ
- //
- // * íå ïðîâåðÿåò ïðàâèëüíîñòü ïåðåäàííûõ ïàðàìåòðîâ
- // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
- // * çàäåðæèâàåò âûïîëíåíèå íà ÑÅÊÓÍÄÛ
- static void __flash_hal__sectorErase( __FLASH_WORD wSector // íîìåð ñåêòîðà 0-31
- ) // [W25Q OK]
- {
- chip_sel_active();
- ( (__flash_packet_sectorerase_t*) cmdbuffer )->opcode = _ECMD_SCTERASE;
- __FLASH_LL_FILLADDRESS( ( (__flash_packet_sectorerase_t*) cmdbuffer ), ( wSector * (__SECTOR_STD_SIZE) ) );
- // îòïðàâëÿåì êîìàíäó
- __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_sectorerase_t) );
- chip_sel_inactive();
- #if W25QXXX_BKGOPERATIONS == 0
- __FLASH_SMART_WAITms( _TIME_SCERS_ms );
- #endif
- }
- // --------------------------------------------------------------------------------------------------------
- // --------------------------------------------------------------------------------------------------------
- // __flash_hal__sleepMode - ïåðåõîä â ðåæèì ïîíèæåííîãî ýíåðãîïîòðåáëåíèÿ
- //
- // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
- // # ïåðåâîäèò óñòðîéñòâî â ðåæèì, êîãäà âñå êîìàíäû, êðîìå __flash_hal__wakeUp èãíîðèðóþòñÿ
- static void __flash_hal__sleepMode() // [W25Q OK]
- {
- chip_sel_active();
- ( (__flash_packet_powerdown_t*) cmdbuffer )->opcode = _ACMD_EPWRDOWN;
- // îòïðàâëÿåì êîìàíäó
- __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_powerdown_t) );
- chip_sel_inactive();
- __FLASH_WAITus( _TIME_EDPDM_us );
- }
- // --------------------------------------------------------------------------------------------------------
- // --------------------------------------------------------------------------------------------------------
- // __flash_hal__wakeUp - âûõîä èç ðåæèìà ïîíèæåííîãî ýíåðãîïîòðåáëåíèÿ
- //
- // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
- // # âûâîäèò óñòðîéñòâî èç ðåæèìà, êîãäà âñå êîìàíäû, êðîìå __flash_hal__wakeUp èãíîðèðóþòñÿ
- static void __flash_hal__wakeUp() // [W25Q OK]
- {
- chip_sel_active();
- // åñëè ôëåø íàõîäèëàñü âî ñíå, íåîáõîäèìî æäàòü _TIME_RDPDM_us
- __FLASH_WAITus(_TIME_RDPDM_us);
- ( (__flash_packet_powerup_t*) cmdbuffer )->opcode = _ACMD_LPWRDOWN;
- // îòïðàâëÿåì êîìàíäó
- __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_powerup_t) );
- chip_sel_inactive();
- __FLASH_WAITus( _TIME_RDPDM_us );
- }
- // --------------------------------------------------------------------------------------------------------
- // --------------------------------------------------------------------------------------------------------
- // __flash_hal__manufacturerIdRead - ÷òåíèå èäåíòèôèêàòîðà ïðîèçâîäèòåëÿ
- //
- // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
- // * ìîæåò èñïîëüçîâàòüñÿ äëÿ îïåðåäåëåíèÿ òèïà ÷èïà äëÿ âûÿñíåíèÿ åãî âìåñòèìîñòè
- // * ôóíêöèÿ ïðèíèìàåò ïàðàìåòð @pManufacturerID òèïà __flash_id_t. Ýòîò ïàðàìåòð áóäåò ñîäåðæàòü
- // èíôîðìàöèþ î ÷èïå, åñëè ïàðàìåòð íå NULL. Êðîìå òîãî, äëÿ òîãî, ÷òîáû ïðî÷èòàòü ðàñøèðåííóþ
- // èíôîðìàöèþ ïðîèçâîäèòåëÿ (extended device information), ïîëÿ pManufacturerID->pExtBf è
- // pManufacturerID->ExtLen äîëæíû áûòü ïðîèíèíöèàëèçèðîâàííû óêàçàòåëåì íà ïðèíèìàþùèé áóôåð
- // è äëèííîé ýòîãî áóôåðà ñîîòâåòñòâåííî. Ïðè íàëè÷èè ðàñøèðåííîé èíôîðìàöèè ïîëå ExtLen áóäåò
- // ïåðåçàïèñàíî, è áóäåò ñîäåðæàòü äëèííó ðàñøèðåííîé èíôîðìàöèè, ñîõðàíåííîé ïî óêàçàòåëþ pExtBf.
- // Ïàìÿòü ïî óêàçàòåëþ pExtBf äîëæíà áûòü âûäåëåíà çàðàíåå ïåðåä âûçîâîì ôóíêöèè. Íóëü-ñèìâîë íå
- // äîáàâëÿåòñÿ. Ïàìÿòü, íà÷èíàÿ ñ ExtLen áàéòà, íå ïåðåçàïèñûâàåòñÿ (îñòàåòñÿ ìóñîð).
- // * ïàðàìåòð @pManufacturerID ìîæåò áûòü ðàâåí NULL. Äëÿ òîãî, ÷òîáû ÍÅ ÷èòàòü ðàñøèðåííóþ èíôîðìàöèþ,
- // ïåðåäàéòå NULL âìåñòî pManufacturerID, èëè, åñëè ïåðåäàåòå pManufacturerID, îáíóëèòå â íåì ïîëÿ pExtBf è ExtLen.
- // * ôóíêöèÿ ñïîñîáíà ñ÷èòûâàòü ðàñøèðåííóþ èíôîðìàöèþ â ôîðìàòå Serial Flash Discoverable Parameter Structure
- // (JESD216D.01). Òàêèì îáðàçîì, êðîìå ñòàíäàðòíîãî ID ïðîèçâîäèòåëÿ äëèííîé 1 áàéò, ïðîèçâîäèòåëü çàïèñûâàåò
- // ñîîáùåíèå äëèííîé äë 256 áàéò [JESD216D.01]. Íàëè÷èå ðàñøèðåííîé èíôîðìàöèè â âûäàâàåìîé ñòðóêòóðå
- // îïöèîíàëüíî: ïðîèçâîäèòåëü ìîæåò íå ïîìåùàòü SFDP ñòðóêòóðó, ëèáî åå ÷òåíèå ìîæåò áûòü íå ðåàëèçîâàíî.
- // Äëÿ äàííîãî ôîðìàòà ïîëå HighId â __flash_id_t íå òðåáóåòñÿ è çàðåçåðâèðîâàíî (âñåãäà ðàâíî 0).
- // * âîâçðàùàåìîå çíà÷åíèå - DWORD, "îòêóøåííûé" ïî ìëàäøåìó àäðåñó îò ñòðóêòóðû __flash_id_t - ñîäåðæèò
- // DevId, LowId, HighId.
- static __FLASH_DWORD __flash_hal__manufacturerIdRead( __flash_id_t * pManufacturerID // íåîáÿçàòåëüíûé ïàðàìåòð-áóôåð äëÿ ïðèåìà ðàñøèðåííîé èíôîðìàöèè
- ) // [W25Q OK]
- {
- // ëîêàëüíûå ïåðåìåííûå ôóíêöèè îáúåäèíåíû ñ âîçâðàùàåìûì çíà÷åíèåì, ÷òîáû âåðíóòü
- // ÷àñòü èíôîðìàöèè â âèäå DWORD
- union
- {
- struct
- {
- __FLASH_BYTE LowId; // ñòàíäàðòíûé áàéò ID (íå ðàñøèðåííûé)
- __FLASH_BYTE HighId; // ðàñøèðåííûé áàéò ID (êîëè÷åñòâî 0x7F Continuation Code) (JEDEC JEP-106)
- union
- {
- __FLASH_WORD DevId; // êîä óñòðîéñòâà
- struct
- {
- __FLASH_BYTE LDevId; // êîä óñòðîéñòâà (Low)
- __FLASH_BYTE HDevId; // êîä óñòðîéñòâà (High)
- };
- };
- };
- __FLASH_DWORD ReturnValue; // âîçâðàùàåìîå çíà÷åíèå
- };
- DevId = 0;
- LDevId = 0;
- HDevId = 0;
- LowId = 0;
- HighId = 0;
- ReturnValue = 0;
- //-----------
- chip_sel_active();
- //-----------
- // ÷òåíèå JEDEC ID íà÷àòî
- ( (__flash_packet_manufactureridread_t*) cmdbuffer )->opcode = _ACMD_MFIDREAD;
- // îòïðàâëÿåì êîìàíäó
- __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_manufactureridread_t) );
- // ÷òåíèå Manufacturer ID
- __FLASH_HAL_RD( &LowId, sizeof( LowId ) );
- // ÷òåíèå Device ID
- __FLASH_HAL_RD( &LDevId, sizeof( LDevId ) );
- __FLASH_HAL_RD( &HDevId, sizeof( HDevId ) );
- // ÷òåíèå JEDEC ID çàêîí÷åíî
- //-----------
- chip_sel_inactive();
- //-----------
- // åñëè òðåáóåòñÿ ÷òåíèå ðàñøèðåííîé èíôîðìàöèè
- // @ExtLen > 0 óêàçûâàåò íà âûäåëåííûé áóôåð ïîä SFDP ðåãèñòð
- if( NULL != pManufacturerID && pManufacturerID->ExtLen > 0 )
- {
- chip_sel_active();
- //-----------
- // ÷òåíèå SFDP íà÷àòî
- ( (__flash_packet_sfdp_read_t*) cmdbuffer )->opcode = _ACMD_SFDPREAD;
- ( (__flash_packet_sfdp_read_t*) cmdbuffer )->zero1 = 0; // A23..A16 must be 0
- ( (__flash_packet_sfdp_read_t*) cmdbuffer )->zero1 = 0; // A15..A08 must be 0
- ( (__flash_packet_sfdp_read_t*) cmdbuffer )->offset = 0; // ÷òåíèå ïî íóëåâîìó ñìåùåíèþ
- ( (__flash_packet_sfdp_read_t*) cmdbuffer )->dummy = 0; // ôèêòèâíûé áàéò
- // îòïðàâëÿåì êîìàíäó
- __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_sfdp_read_t) );
- // ÷òåíèå SFDP â áóôåð
- for( size_t offset = 0; offset < pManufacturerID->ExtLen; offset++ )
- {
- __FLASH_HAL_RD( pManufacturerID->pExtBf + offset, sizeof( uint8_t ) );
- }
- //-----------
- chip_sel_inactive();
- }
- //-----------
- return ReturnValue;
- }
- // --------------------------------------------------------------------------------------------------------
- // --------------------------------------------------------------------------------------------------------
- // __flash_hal__globalUnlock - ñíÿòü áëîêèðîâêó çàïèñè ñî âñåõ ñåêòîðîâ/áëîêîâ / âûêëþ÷èòü ïðîãðàììíóþ çàùèòó îò çàïèñè/ñòèðàíèÿ
- //
- // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
- static void __flash_hal__globalUnlock() // [W25Q OK]
- {
- chip_sel_active();
- ( (__flash_packet_globallockcontrol_t*) cmdbuffer )->opcode = _SCMD_GLBLUNLK;
- // îòïðàâëÿåì êîìàíäó
- __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_globallockcontrol_t) );
- chip_sel_inactive();
- #if W25QXXX_BKGOPERATIONS == 0
- __FLASH_SMART_WAITms( _TIME_PGPRG_ms );
- #endif
- }
- // --------------------------------------------------------------------------------------------------------
- // --------------------------------------------------------------------------------------------------------
- // __flash_hal__globalLock - óñòàíîâèòü áëîêèðîâêó çàïèñè íà âñå ñåêòîðà/áëîêè / âêëþ÷èòü ïðîãðàììíóþ çàùèòó îò çàïèñè/ñòèðàíèÿ
- //
- // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
- static void __flash_hal__globalLock() // [W25Q OK]
- {
- chip_sel_active();
- ( (__flash_packet_globallockcontrol_t*) cmdbuffer )->opcode = _SCMD_GLBLLK;
- // îòïðàâëÿåì êîìàíäó
- __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_globallockcontrol_t) );
- chip_sel_inactive();
- #if W25QXXX_BKGOPERATIONS == 0
- __FLASH_SMART_WAITms( _TIME_PGPRG_ms );
- #endif
- }
- // --------------------------------------------------------------------------------------------------------
- // --------------------------------------------------------------------------------------------------------
- // __flash_hal__protectStateWrite - çàïèñûâàåò èíäèâèäóàëüíóþ áëîêèðîâêó ñåêòîðà/áëîêà
- //
- // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
- // * íå ïðîâåðÿåò ïðàâèëüíîñòü ïåðåäàííûõ ïàðàìåòðîâ
- // * çàäåðæèâàåò âûïîëíåíèå íà ÌÈËËÈÑÅÊÓÍÄÛ
- static void __flash_hal__protectStateWrite( size_t nProtSector, bool protectState ) // [W25Q OK]
- {
- chip_sel_active();
- if( protectState )
- ( (__flash_packet_protectregister_rw_t*) cmdbuffer )->opcode = _SCMD_BLKLOCK;
- else
- ( (__flash_packet_protectregister_rw_t*) cmdbuffer )->opcode = _SCMD_BLKULOCK;
- __FLASH_LL_FILLADDRESS( ( (__flash_packet_protectregister_rw_t*) cmdbuffer ), __PROT_SECTOR_TO_ADDRESS(nProtSector) );
- // îòïðàâëÿåì êîìàíäó
- __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_protectregister_rw_t) );
- chip_sel_inactive();
- #if W25QXXX_BKGOPERATIONS == 0 //!
- __FLASH_SMART_WAITms( _TIME_PGPRG_ms );
- #endif
- }
- // --------------------------------------------------------------------------------------------------------
- // --------------------------------------------------------------------------------------------------------
- // __flash_hal__protectStateRead - ñ÷èòûâàåò èíäèâèäóàëüíóþ áëîêèðîâêó ñåêòîðà/áëîêà
- //
- // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
- // * íå ïðîâåðÿåò ïðàâèëüíîñòü ïåðåäàííûõ ïàðàìåòðîâ
- static bool __flash_hal__protectStateRead( size_t nProtSector ) // [W25Q OK]
- {
- chip_sel_active();
- uint8_t state = 0;
- ( (__flash_packet_protectregister_rw_t*) cmdbuffer )->opcode = _SCMD_BLKLKRD;
- __FLASH_LL_FILLADDRESS( ( (__flash_packet_protectregister_rw_t*) cmdbuffer ), __PROT_SECTOR_TO_ADDRESS(nProtSector) );
- // îòïðàâëÿåì êîìàíäó
- __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_protectregister_rw_t) );
- // ñ÷èòûâàåòñÿ áèò çàùèòû
- __FLASH_HAL_RD( &state, sizeof( uint8_t ) );
- chip_sel_inactive();
- // LSB áèò ïîêàçûâàåò ñîñòîÿíèå çàùèòû, 0-íåò çàùèòû, 1-çàùèòà âêëþ÷åíà
- return ((bool)(state & 1));
- }
- // --------------------------------------------------------------------------------------------------------
- // --------------------------------------------------------------------------------------------------------
- // __flash_hal__securityRegister1Write - çàïèñûâàåò ðåãèñòð áåçîïàñíîñòè
- //
- // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
- // * ïàðàìåòð @contents íå ìîæåò áûòü ðàâåí NULL
- // * ÈÇÌÅÍßÅÒ ÑÎÄÅÐÆÈÌÎÅ ÂÑÒÐÎÅÍÍÎÃÎ ÐÅÃÈÑÒÐÀ ÁÅÇÎÏÀÑÍÎÑÒÈ 1
- static void __flash_hal__securityRegister1Write( __flash_securityregister_t * contents // ñîäåðæèìîå ðåãèñòðà áåçîïàñíîñòè
- ) // [W25Q OK]
- {
- if( !contents ) return;
- chip_sel_active();
- ( (__flash_packet_securityregisterwrite_t*) cmdbuffer )->opcode = _SCMD_SECRGWRT;
- ( (__flash_packet_securityregisterwrite_t*) cmdbuffer )->zero = 0;
- ( (__flash_packet_securityregisterwrite_t*) cmdbuffer )->regSelector = 1;
- ( (__flash_packet_securityregisterwrite_t*) cmdbuffer )->zero_2 = 0;
- ( (__flash_packet_securityregisterwrite_t*) cmdbuffer )->byteSelector = 0;
- // îòïðàâëÿåì êîìàíäó
- __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_securityregisterwrite_t) );
- // çàïèñûâàåì ðåãèñòð áåçîïàñíîñòè
- __FLASH_HAL_WR( contents, sizeof(__flash_securityregister_t) );
- #if W25QXXX_BKGOPERATIONS == 0
- __FLASH_SMART_WAITms( _TIME_PGPRG_ms );
- #endif
- chip_sel_inactive();
- }
- // --------------------------------------------------------------------------------------------------------
- // --------------------------------------------------------------------------------------------------------
- // __flash_hal__securityRegister2Write - çàïèñûâàåò ðåãèñòð áåçîïàñíîñòè
- //
- // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
- // * ïàðàìåòð @contents íå ìîæåò áûòü ðàâåí NULL
- // * ÈÇÌÅÍßÅÒ ÑÎÄÅÐÆÈÌÎÅ ÂÑÒÐÎÅÍÍÎÃÎ ÐÅÃÈÑÒÐÀ ÁÅÇÎÏÀÑÍÎÑÒÈ 2
- static void __flash_hal__securityRegister2Write( __flash_securityregister_t * contents // ñîäåðæèìîå ðåãèñòðà áåçîïàñíîñòè
- ) // [W25Q OK]
- {
- if( !contents ) return;
- chip_sel_active();
- ( (__flash_packet_securityregisterwrite_t*) cmdbuffer )->opcode = _SCMD_SECRGWRT;
- ( (__flash_packet_securityregisterwrite_t*) cmdbuffer )->zero = 0;
- ( (__flash_packet_securityregisterwrite_t*) cmdbuffer )->regSelector = 2;
- ( (__flash_packet_securityregisterwrite_t*) cmdbuffer )->zero_2 = 0;
- ( (__flash_packet_securityregisterwrite_t*) cmdbuffer )->byteSelector = 0;
- // îòïðàâëÿåì êîìàíäó
- __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_securityregisterwrite_t) );
- // çàïèñûâàåì ðåãèñòð áåçîïàñíîñòè
- __FLASH_HAL_WR( contents, sizeof(__flash_securityregister_t) );
- #if W25QXXX_BKGOPERATIONS == 0
- __FLASH_SMART_WAITms( _TIME_PGPRG_ms );
- #endif
- chip_sel_inactive();
- }
- // --------------------------------------------------------------------------------------------------------
- // --------------------------------------------------------------------------------------------------------
- // __flash_hal__securityRegister3Write - çàïèñûâàåò ðåãèñòð áåçîïàñíîñòè
- //
- // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
- // * ïàðàìåòð @contents íå ìîæåò áûòü ðàâåí NULL
- // * ÈÇÌÅÍßÅÒ ÑÎÄÅÐÆÈÌÎÅ ÂÑÒÐÎÅÍÍÎÃÎ ÐÅÃÈÑÒÐÀ ÁÅÇÎÏÀÑÍÎÑÒÈ 3
- static void __flash_hal__securityRegister3Write( __flash_securityregister_t * contents // ñîäåðæèìîå ðåãèñòðà áåçîïàñíîñòè
- ) // [W25Q OK]
- {
- if( !contents ) return;
- chip_sel_active();
- ( (__flash_packet_securityregisterwrite_t*) cmdbuffer )->opcode = _SCMD_SECRGWRT;
- ( (__flash_packet_securityregisterwrite_t*) cmdbuffer )->zero = 0;
- ( (__flash_packet_securityregisterwrite_t*) cmdbuffer )->regSelector = 3;
- ( (__flash_packet_securityregisterwrite_t*) cmdbuffer )->zero_2 = 0;
- ( (__flash_packet_securityregisterwrite_t*) cmdbuffer )->byteSelector = 0;
- // îòïðàâëÿåì êîìàíäó
- __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_securityregisterwrite_t) );
- // çàïèñûâàåì ðåãèñòð áåçîïàñíîñòè
- __FLASH_HAL_WR( contents, sizeof(__flash_securityregister_t) );
- #if W25QXXX_BKGOPERATIONS == 0
- __FLASH_SMART_WAITms( _TIME_PGPRG_ms );
- #endif
- chip_sel_inactive();
- }
- // --------------------------------------------------------------------------------------------------------
- // --------------------------------------------------------------------------------------------------------
- // __flash_hal__securityRegister1Erase - ñòèðàåò ðåãèñòð áåçîïàñíîñòè
- //
- // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
- // * ïàðàìåòð @contents íå ìîæåò áûòü ðàâåí NULL
- // * ÑÒÈÐÀÅÒ ÑÎÄÅÐÆÈÌÎÅ ÂÑÒÐÎÅÍÍÎÃÎ ÐÅÃÈÑÒÐÀ ÁÅÇÎÏÀÑÍÎÑÒÈ 1
- static void __flash_hal__securityRegister1Erase() // [W25Q OK]
- {
- chip_sel_active();
- ( (__flash_packet_securityregistererase_t*) cmdbuffer )->opcode = _SCMD_SECRGERS;
- ( (__flash_packet_securityregistererase_t*) cmdbuffer )->zero = 0;
- ( (__flash_packet_securityregistererase_t*) cmdbuffer )->regSelector = 1;
- ( (__flash_packet_securityregistererase_t*) cmdbuffer )->zero_2 = 0;
- ( (__flash_packet_securityregistererase_t*) cmdbuffer )->zero_3 = 0;
- // îòïðàâëÿåì êîìàíäó
- __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_securityregisterwrite_t) );
- #if W25QXXX_BKGOPERATIONS == 0
- __FLASH_SMART_WAITms( _TIME_PGERS_ms );
- #endif
- chip_sel_inactive();
- }
- // --------------------------------------------------------------------------------------------------------
- // --------------------------------------------------------------------------------------------------------
- // __flash_hal__securityRegister2Erase - ñòèðàåò ðåãèñòð áåçîïàñíîñòè
- //
- // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
- // * ïàðàìåòð @contents íå ìîæåò áûòü ðàâåí NULL
- // * ÑÒÈÐÀÅÒ ÑÎÄÅÐÆÈÌÎÅ ÂÑÒÐÎÅÍÍÎÃÎ ÐÅÃÈÑÒÐÀ ÁÅÇÎÏÀÑÍÎÑÒÈ 2
- static void __flash_hal__securityRegister2Erase() // [W25Q OK]
- {
- chip_sel_active();
- ( (__flash_packet_securityregistererase_t*) cmdbuffer )->opcode = _SCMD_SECRGERS;
- ( (__flash_packet_securityregistererase_t*) cmdbuffer )->zero = 0;
- ( (__flash_packet_securityregistererase_t*) cmdbuffer )->regSelector = 2;
- ( (__flash_packet_securityregistererase_t*) cmdbuffer )->zero_2 = 0;
- ( (__flash_packet_securityregistererase_t*) cmdbuffer )->zero_3 = 0;
- // îòïðàâëÿåì êîìàíäó
- __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_securityregisterwrite_t) );
- #if W25QXXX_BKGOPERATIONS == 0
- __FLASH_SMART_WAITms( _TIME_PGERS_ms );
- #endif
- chip_sel_inactive();
- }
- // --------------------------------------------------------------------------------------------------------
- // --------------------------------------------------------------------------------------------------------
- // __flash_hal__securityRegister3Erase - ñòèðàåò ðåãèñòð áåçîïàñíîñòè
- //
- // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
- // * ïàðàìåòð @contents íå ìîæåò áûòü ðàâåí NULL
- // * ÑÒÈÐÀÅÒ ÑÎÄÅÐÆÈÌÎÅ ÂÑÒÐÎÅÍÍÎÃÎ ÐÅÃÈÑÒÐÀ ÁÅÇÎÏÀÑÍÎÑÒÈ 3
- static void __flash_hal__securityRegister3Erase() // [W25Q OK]
- {
- chip_sel_active();
- ( (__flash_packet_securityregistererase_t*) cmdbuffer )->opcode = _SCMD_SECRGERS;
- ( (__flash_packet_securityregistererase_t*) cmdbuffer )->zero = 0;
- ( (__flash_packet_securityregistererase_t*) cmdbuffer )->regSelector = 3;
- ( (__flash_packet_securityregistererase_t*) cmdbuffer )->zero_2 = 0;
- ( (__flash_packet_securityregistererase_t*) cmdbuffer )->zero_3 = 0;
- // îòïðàâëÿåì êîìàíäó
- __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_securityregisterwrite_t) );
- #if W25QXXX_BKGOPERATIONS == 0
- __FLASH_SMART_WAITms( _TIME_PGERS_ms );
- #endif
- chip_sel_inactive();
- }
- // --------------------------------------------------------------------------------------------------------
- // --------------------------------------------------------------------------------------------------------
- // __flash_hal__securityRegister1Read - ïðî÷èòûâàåò ðåãèñòð áåçîïàñíîñòè #1
- //
- // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
- // * ïàðàìåòð @contents íå ìîæåò áûòü NULL - óêàæèòå áóôåð-ïðèåìíèå äëÿ ñîõðàíåíèÿ ñîäåðæèìîãî ðåãèñòðà áëîêèðîâêè (ñì. __flash_securityregister_t)
- // * ñ÷èòûâàåò êàê ïîëüçîâàòåëüñêóþ ÷àñòü, òàê è çàïðîãðàììèðîâàííóþ ïðîèçâîäèòåëåì
- static void __flash_hal__securityRegister1Read( __flash_securityregister_t * contents // áóôåð-ïðèåìíèê ñîäåðæèìîãî ðåãèñòðà áëîêèðîâêè
- ) // [W25Q OK]
- {
- if( !contents ) return;
- chip_sel_active();
- ( (__flash_packet_securityregisterread_t*) cmdbuffer )->opcode = _SCMD_SECRGRD;
- ( (__flash_packet_securityregisterread_t*) cmdbuffer )->zero = 0;
- ( (__flash_packet_securityregisterread_t*) cmdbuffer )->regSelector = 1;
- ( (__flash_packet_securityregisterread_t*) cmdbuffer )->zero_2 = 0;
- ( (__flash_packet_securityregisterread_t*) cmdbuffer )->byteSelector = 0;
- // îòïðàâëÿåì êîìàíäó
- __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_securityregisterread_t) );
- // ÷èòàåì ðåãèñòð áåçîïàñíîñòè
- __FLASH_HAL_RD( contents, sizeof(__flash_securityregister_t) );
- chip_sel_inactive();
- }
- // --------------------------------------------------------------------------------------------------------
- // --------------------------------------------------------------------------------------------------------
- // __flash_hal__securityRegister2Read - ïðî÷èòûâàåò ðåãèñòð áåçîïàñíîñòè #1
- //
- // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
- // * ïàðàìåòð @contents íå ìîæåò áûòü NULL - óêàæèòå áóôåð-ïðèåìíèå äëÿ ñîõðàíåíèÿ ñîäåðæèìîãî ðåãèñòðà áëîêèðîâêè (ñì. __flash_securityregister_t)
- // * ñ÷èòûâàåò êàê ïîëüçîâàòåëüñêóþ ÷àñòü, òàê è çàïðîãðàììèðîâàííóþ ïðîèçâîäèòåëåì
- static void __flash_hal__securityRegister2Read( __flash_securityregister_t * contents // áóôåð-ïðèåìíèê ñîäåðæèìîãî ðåãèñòðà áëîêèðîâêè
- ) // [W25Q OK]
- {
- if( !contents ) return;
- chip_sel_active();
- ( (__flash_packet_securityregisterread_t*) cmdbuffer )->opcode = _SCMD_SECRGRD;
- ( (__flash_packet_securityregisterread_t*) cmdbuffer )->zero = 0;
- ( (__flash_packet_securityregisterread_t*) cmdbuffer )->regSelector = 2;
- ( (__flash_packet_securityregisterread_t*) cmdbuffer )->zero_2 = 0;
- ( (__flash_packet_securityregisterread_t*) cmdbuffer )->byteSelector = 0;
- // îòïðàâëÿåì êîìàíäó
- __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_securityregisterread_t) );
- // ÷èòàåì ðåãèñòð áåçîïàñíîñòè
- __FLASH_HAL_RD( contents, sizeof(__flash_securityregister_t) );
- chip_sel_inactive();
- }
- // --------------------------------------------------------------------------------------------------------
- // --------------------------------------------------------------------------------------------------------
- // __flash_hal__securityRegister3Read - ïðî÷èòûâàåò ðåãèñòð áåçîïàñíîñòè #3
- //
- // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
- // * ïàðàìåòð @contents íå ìîæåò áûòü NULL - óêàæèòå áóôåð-ïðèåìíèå äëÿ ñîõðàíåíèÿ ñîäåðæèìîãî ðåãèñòðà áëîêèðîâêè (ñì. __flash_securityregister_t)
- // * ñ÷èòûâàåò êàê ïîëüçîâàòåëüñêóþ ÷àñòü, òàê è çàïðîãðàììèðîâàííóþ ïðîèçâîäèòåëåì
- static void __flash_hal__securityRegister3Read( __flash_securityregister_t * contents // áóôåð-ïðèåìíèê ñîäåðæèìîãî ðåãèñòðà áëîêèðîâêè
- ) // [W25Q OK]
- {
- if( !contents ) return;
- chip_sel_active();
- ( (__flash_packet_securityregisterread_t*) cmdbuffer )->opcode = _SCMD_SECRGRD;
- ( (__flash_packet_securityregisterread_t*) cmdbuffer )->zero = 0;
- ( (__flash_packet_securityregisterread_t*) cmdbuffer )->regSelector = 3;
- ( (__flash_packet_securityregisterread_t*) cmdbuffer )->zero_2 = 0;
- ( (__flash_packet_securityregisterread_t*) cmdbuffer )->byteSelector = 0;
- // îòïðàâëÿåì êîìàíäó
- __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_securityregisterread_t) );
- // ÷èòàåì ðåãèñòð áåçîïàñíîñòè
- __FLASH_HAL_RD( contents, sizeof(__flash_securityregister_t) );
- chip_sel_inactive();
- }
- // --------------------------------------------------------------------------------------------------------
- // --------------------------------------------------------------------------------------------------------
- // __flash_hal__uniqueIdRegisterRead - ïðî÷èòûâàåò ðåãèñòð óíèêàëüíîãî èäåíòèôèêàòîðà (UniqueID)
- //
- // * ïîòîêî-íåáåçîïàñíàÿ ôóíêöèÿ
- // * ïàðàìåòð @contents íå ìîæåò áûòü NULL - óêàæèòå áóôåð-ïðèåìíèêå äëÿ ñîõðàíåíèÿ ñîäåðæèìîãî ðåãèñòðà UniqueID (ñì. __flash_uniqueidregister_t)
- static void __flash_hal__uniqueIdRegisterRead( __flash_uniqueidregister_t * contents // áóôåð-ïðèåìíèê ñîäåðæèìîãî ðåãèñòðà UniqueID
- ) // [W25Q OK]
- {
- if( !contents ) return;
- chip_sel_active();
- ( (__flash_packet_uid_read_t*) cmdbuffer )->opcode = _ACMD_UIDRREAD;
- ( (__flash_packet_uid_read_t*) cmdbuffer )->zero1 = 0; // ïåðåäàåòñÿ ôèêòèâíûé áàéò
- ( (__flash_packet_uid_read_t*) cmdbuffer )->zero2 = 0; // ïåðåäàåòñÿ ôèêòèâíûé áàéò
- ( (__flash_packet_uid_read_t*) cmdbuffer )->zero3 = 0; // ïåðåäàåòñÿ ôèêòèâíûé áàéò
- ( (__flash_packet_uid_read_t*) cmdbuffer )->zero4 = 0; // ïåðåäàåòñÿ ôèêòèâíûé áàéò
- // îòïðàâëÿåì êîìàíäó
- __FLASH_HAL_WRCMD( &cmdbuffer, sizeof(__flash_packet_uid_read_t) );
- // ÷èòàåì ðåãèñòð UniqueID
- __FLASH_HAL_RD( contents, sizeof(__flash_uniqueidregister_t) );
- chip_sel_inactive();
- }
- // --------------------------------------------------------------------------------------------------------
- // --------------------------------------------------------------------------------------------------------
- // __flash_hal__uniqueIdRegisterValidate - ïðî÷èòûâàåò ðåãèñòð UniqueID è âûïîëíÿåò
- // ïðîâåðêó îñìûñëåííîñòè ïðî÷èòàííîãî çàâîäñêîãî èäåíòèôèêàòîðà.
- // Ôóíêöèÿ ðàñöåíèâàåò èíäåíòèôèêàòîð ñîñòîÿùèé èç îäíèõ 0xFF èëè 0x00 êàê íåâîçìîæíûé.
- //  ýòîì ñëó÷àå èìååò ìåñòî îøèáêà, ôóíêöèÿ âîçâðàùàåò false.
- static bool __flash_hal__uniqueIdRegisterValidate( __flash_uniqueidregister_t * contents // áóôåð-ïðèåìíèê ñîäåðæèìîãî ðåãèñòðà UniqueID
- ) // [W25Q OK]
- {
- if( NULL != contents )
- {
- __flash_hal__uniqueIdRegisterRead( contents );
- __FLASH_DWORD n00 = 0;
- __FLASH_DWORD nFF = 0;
- for( __FLASH_DWORD i = 0; i < sizeof(contents->uid); ++i )
- {
- if( 0xFF == contents->uid[i] ) ++nFF;
- if( 0x00 == contents->uid[i] ) ++n00;
- }
- if( (n00 != sizeof(contents->uid))
- &&
- (nFF != sizeof(contents->uid)) )
- {
- return true;
- }
- }
- return false;
- }
- // --------------------------------------------------------------------------------------------------------
- #if W25QXXX_POWER_MANAGEMENT > 0
- // --------------------------------------------------------------------------------------------------------
- // __flash_hal__powerOn - ðåàëèçóåò óïðàâëåíèå ïèòàíèåì ìèêðîñõåìû ïàìÿòè (ïîäàåò ïèòàíèå)
- //
- static void __flash_hal__powerOn() // [W25Q OK]
- {
- // ñíÿòü ñèãíàë âûáîðà ÷èïà (÷èï íå âûáðàí, ðåæèì idle)
- chip_sel_inactive();
- // ïîäàòü ïèòàíèå
- __imp_flash_poweron();
- }
- // --------------------------------------------------------------------------------------------------------
- // __flash_hal__powerOff - ðåàëèçóåò óïðàâëåíèå ïèòàíèåì ìèêðîñõåìû ïàìÿòè (ñíèìàåò ïèòàíèå)
- //
- static void __flash_hal__powerOff() // [W25Q OK]
- {
- // ñíÿòü ïèòàíèå
- __imp_flash_poweroff();
- }
- // --------------------------------------------------------------------------------------------------------
- // __flash_hal__powerPulse - ðåàëèçóåò óïðàâëåíèå ïèòàíèåì ìèêðîñõåìû - ôîðìèðóåò èìïóëüñ ïåðåçàãðóçêè
- static void __flash_hal__powerPulse( __FLASH_WORD nCooldownTime_ms, __FLASH_WORD nStartupTime_ms ) // [W25Q OK]
- {
- // ñíÿòü ïèòàíèå
- __imp_flash_poweroff();
- // ñíÿòü ñèãíàë âûáîðà ÷èïà (÷èï íå âûáðàí, ðåæèì idle)
- chip_sel_inactive();
- if( nCooldownTime_ms > 0 )
- {
- // íåìíîãî ïîäîæäåì, ïîêà îñòûíåò :)
- __FLASH_WAITms( _TIME_COOLDOWN_ms );
- }
- else
- {
- // æäåì ñîâñåì íåìíîãî
- __FLASH_WAITus( _TIME_STRUP_us );
- }
- // ïîäàòü ïèòàíèå
- __imp_flash_poweron();
- // åñëè ðàçðåøåíî óïðàâëåíèå ðåæèìîì ñáðîñà
- #if W25QXXX_RESET_MANAGEMENT
- // ñôîðìèðîâàòü èìïóëüñ ñáðîñà ìèêðîñõåìû
- __flash_hal__resetPulse();
- #endif
- if( nStartupTime_ms > 0 )
- {
- // îæèäàòü ãîòîâíîñòè
- __FLASH_WAITms( _TIME_START_ms );
- }
- else
- {
- // æäåì ñîâñåì íåìíîãî
- __FLASH_WAITus( _TIME_STRUP_us );
- }
- }
- #endif
- #if W25QXXX_RESET_MANAGEMENT > 0
- // --------------------------------------------------------------------------------------------------------
- // __flash_hal__resetAssert - ðåàëèçóåò óïðàâëåíèå ñèãíàëîì ñáðîñà ìèêðîñõåìû ïàìÿòè (óñòàíàâëèâàåò ñèãíàë ñáðîñà)
- //
- static void __flash_hal__resetAssert() // [W25Q OK]
- {
- // ñíÿòü ñèãíàë âûáîðà ÷èïà (÷èï íå âûáðàí, ðåæèì idle)
- chip_sel_inactive();
- // óñòàíîâèòü ñèãíàë ñáðîñà
- __imp_flash_reset_assert();
- }
- // --------------------------------------------------------------------------------------------------------
- // __flash_hal__resetRelease - ðåàëèçóåò óïðàâëåíèå ñèãíàëîì ñáðîñà ìèêðîñõåìû ïàìÿòè (ñíèìàåò ñèãíàë ñáðîñà)
- //
- static void __flash_hal__resetRelease() // [W25Q OK]
- {
- // ñíÿòü ñèãíàë ñáðîñà
- __imp_flash_reset_release();
- }
- // --------------------------------------------------------------------------------------------------------
- // __flash_hal__resetPulse - ðåàëèçóåò óïðàâëåíèå ñèãíàëîì ñáðîñà ìèêðîñõåìû ïàìÿòè (ïîäàåò çàêîí÷åííûé èìïóëüñ ñáðîñà)
- //
- static void __flash_hal__resetPulse() // [W25Q OK]
- {
- // ôîðìèðóåì èìïóëüñ ñáðîñà
- // ñíà÷àëà ñíèìàåì ñèãíàë ñáðîñà
- __imp_flash_reset_release();
- // ïîñëå ñíÿòèÿ ñèãíàëà ñáðîñà íåîáõîäèìî îæèäàòü âðåìÿ âîññòàíîâëåíèÿ
- __FLASH_WAITus(_TIME_RSTRC_us);
- // ïîòîì ñòàâèì ñèãíàë ñáðîñà
- __flash_hal__resetAssert();
- // îæèäàíèå: òðåáóåòñÿ âðåìÿ äëÿ ðåàêöèè íà ñèãíàë ñáðîñà
- __FLASH_WAITus(_TIME_RSTWD_us);
- // ïîòîì ñíîâà ñíèìàåì
- __flash_hal__resetRelease();
- // ïîñëå ñíÿòèÿ ñèãíàëà ñáðîñà íåîáõîäèìî îæèäàòü âðåìÿ âîññòàíîâëåíèÿ
- __FLASH_WAITus(_TIME_RSTRC_us);
- }
- #endif
|