{"id":467105,"date":"2025-07-15T15:01:35","date_gmt":"2025-07-15T15:01:35","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=467105"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=467105","title":{"rendered":"<span>Dual flash SS 8-bit Parallel + Zynq 7000<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! <\/p>\n<p>\u042f \u0445\u043e\u0447\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441\u00a0\u0432\u0430\u043c\u0438, \u043a\u0430\u043a\u00a0\u043e\u0434\u043d\u0430\u0436\u0434\u044b \u043c\u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043e\u0436\u0438\u0432\u043b\u044f\u0442\u044c \u0432\u0442\u043e\u0440\u0443\u044e \u0444\u043b\u0435\u0448\u043a\u0443 \u043d\u0430\u00a0\u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0435 (\u0434\u0430\u043b\u0435\u0435 \u00ab\u043c\u043a\u00bb), \u043d\u0443 \u043a\u043e\u043c\u0443 \u043d\u0435\u00a0\u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f, \u0442\u043e \u043d\u0430\u0437\u043e\u0432\u0435\u043c \u044d\u0442\u043e \u00ab\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0443\u0435\u043c\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043d\u0430\u00a0\u043a\u0440\u0438\u0441\u0442\u0430\u043b\u043b\u0435\u00bb. \u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435 \u043a\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0448\u0435\u043b \u0441\u044e\u0434\u0430 \u0438 \u0445\u043e\u0447\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0438 \u0432\u0441\u0435 \u043f\u043e\u043d\u044f\u0442\u044c, \u0442\u043e \u0432\u0430\u043c \u0441\u044e\u0434\u0430, \u0442\u0430\u043a \u043a\u0430\u043a\u00a0\u044f \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u044e \u0432\u0441\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0442\u00a0\u0410\u00a0\u0434\u043e\u00a0\u042f.<\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0434\u043d\u044f\u0442\u044b \u0442\u0430\u043a\u0438\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b:<\/p>\n<ol>\n<li>\n<p>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f QSPI (\u043a\u0442\u043e \u043d\u0435 \u0437\u043d\u0430\u0435\u0442, \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0435\u0440\u0438\u0444\u0435\u0440\u0438\u044f, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0444\u043b\u0435\u0448\u043a\u043e\u0439 \u043d\u0430 \u043f\u0440\u044f\u043c\u0443\u044e).<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f flash. \u041d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430.<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u0440\u043e\u0434\u0435\u043b\u0430\u0432 \u0432\u0441\u0435 \u043f\u0443\u043d\u043a\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0442\u0440\u043e\u043d\u0443\u0442\u044b \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u0432\u0430\u043c \u0441\u0442\u0430\u043d\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u043a\u0430\u043a \u0438 \u0447\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. <\/p>\n<h2>1. \u0412\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435<\/h2>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0436\u0435 \u0438\u0437 \u0441\u0435\u0431\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0444\u043b\u0435\u0448\u0435\u043a. \u0412 \u041f\u041b\u0418\u0421 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f 3 \u0440\u0435\u0436\u0438\u043c\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \u043d\u0438\u0436\u0435.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/66d\/cf6\/42b\/66dcf642b698ba934efa5c0d791f241a.png\" width=\"789\" height=\"474\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/66d\/cf6\/42b\/66dcf642b698ba934efa5c0d791f241a.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/66d\/cf6\/42b\/66dcf642b698ba934efa5c0d791f241a.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u0440\u0435\u0436\u0438\u043c Single SS 4-bit \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0437 \u0441\u0435\u0431\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0438 \u0441\u0432\u044f\u0437\u044c \u0441 \u043e\u0434\u043d\u043e\u0439 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0444\u043b\u0435\u0448\u043a\u043e\u0439 \u043d\u0430 \u043f\u043b\u0430\u0442\u0435. \u0422\u0430\u043c \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e \u043f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0435\u0442, \u043d\u043e \u043a\u043e\u0434 \u043d\u0438\u0436\u0435 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 \u0434\u043b\u044f \u0435\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438. \u0412\u0442\u043e\u0440\u043e\u0439 \u0438 \u0442\u0440\u0435\u0442\u0438\u0439 \u0440\u0435\u0436\u0438\u043c\u044b \u043a\u0430\u043a \u0440\u0430\u0437 \u0442\u0430\u043a\u0438 \u043d\u0443\u0436\u043d\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0432\u0443\u043c\u044f \u0444\u043b\u0435\u0448\u043a\u0430\u043c\u0438, \u043d\u043e \u0432 \u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0435 2 qspi, \u0430 \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u043e\u0434\u0438\u043d. \u0422\u043e \u0435\u0441\u0442\u044c \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0434\u0435\u0440\u0433\u0430\u0442\u044c Chip Select \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0444\u043b\u0435\u0448. \u041d\u0438\u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043d\u0430 \u043c\u043e\u0435\u0439 \u043f\u043b\u0430\u0442\u0435, \u0441 \u0444\u043b\u0435\u0448\u043a\u043e\u0439 \u0442\u0438\u043f\u0430 WINBOND W25Q128JV.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/710\/25b\/eb7\/71025beb7d808663bb93697adf6cc734.jpg\" width=\"1280\" height=\"863\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/710\/25b\/eb7\/71025beb7d808663bb93697adf6cc734.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/710\/25b\/eb7\/71025beb7d808663bb93697adf6cc734.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041f\u0440\u043e\u0441\u0442\u044b\u043c \u044f\u0437\u044b\u043a\u043e\u043c \u0441\u043a\u0430\u0436\u0443 \u0442\u0430\u043a, \u0447\u0442\u043e \u043e\u043d\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u044b \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e. \u041c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u0430\u043a \u044d\u0442\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u043e \u043d\u0430 \u043a\u0438\u0442\u0430\u0439\u0441\u043a\u043e\u043c \u0430\u043d\u0430\u043b\u043e\u0433\u0435, \u0443 \u043c\u0435\u043d\u044f \u043a\u0430\u0441\u0442\u043e\u043c.<br \/>\u041f\u0435\u0440\u0435\u0434 \u043e\u0442\u043b\u0430\u0434\u043a\u043e\u0439 \u0438 \u0440\u0430\u0431\u043e\u0442\u043e\u0439 \u0443\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e boot_mode \u0443 \u0432\u0430\u0441 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043d\u0430 0. \u042d\u0442\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0434\u043b\u044f \u043f\u043b\u0430\u0442\u044b, \u0447\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430 \u043c\u043a \u0438\u0434\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 JTAG, \u0437\u0430\u043f\u0438\u0441\u044c\u044e \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432 \u041e\u0417\u0423, \u0432 \u043e\u0431\u0445\u043e\u0434 \u0444\u043b\u0435\u0448\u043a\u0438. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430 \u044d\u0442\u043e\u0439 \u0447\u0443\u0434\u0435\u0441\u043d\u043e\u0439 \u043d\u043e\u0442\u0435, \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u0434\u0430\u043b\u0435\u0435.<\/p>\n<h2>2. QSPI<\/h2>\n<p>\u041e\u043f\u0443\u0449\u0443 \u043c\u043e\u043c\u0435\u043d\u0442\u044b \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0445 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439, \u0442\u0430\u043a \u043a\u0430\u043a \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e zynq-7000 \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u043e\u043b\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432. \u0414\u043b\u044f \u043a\u0440\u0430\u0441\u043e\u0442\u044b \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0441 \u043d\u0438\u043c\u0438, \u0447\u0442\u043e\u0431\u044b \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0447\u0435\u0433\u043e, \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u0442\u043e\u0439 \u0438\u043b\u0438 \u0438\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u044b\u0435 \u043d\u0430\u043c \u0431\u0438\u0442\u044b. <\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2c4\/34b\/580\/2c434b5807623ee8da589fa177f00698.png\" width=\"806\" height=\"761\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/2c4\/34b\/580\/2c434b5807623ee8da589fa177f00698.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2c4\/34b\/580\/2c434b5807623ee8da589fa177f00698.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e6c\/b6b\/e63\/e6cb6be630d7d49523a1cf3c7447b0f4.png\" width=\"801\" height=\"274\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/e6c\/b6b\/e63\/e6cb6be630d7d49523a1cf3c7447b0f4.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e6c\/b6b\/e63\/e6cb6be630d7d49523a1cf3c7447b0f4.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u044d\u0442\u0438\u0445 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u0442\u043e\u043b\u043a\u043e\u043c \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043d\u0435\u0442, \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f, \u0447\u0442\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0432 \u0441\u0430\u043c\u043e\u043c \u043f\u0440\u0430\u0432\u043e\u043c \u0441\u0442\u043e\u043b\u0431\u0446\u0435. \u0412 \u044d\u0442\u043e\u043c \u043f\u043b\u0430\u043d\u0435 \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u043a\u0438\u0442\u0430\u0439\u0446\u044b \u043d\u0435 \u043c\u043e\u043b\u043e\u0434\u0446\u044b, \u0445\u0434.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043a\u043e\u0434 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0434\u043b\u044f QSPI, \u0434\u043b\u044f \u043c\u043e\u0438\u0445 \u043b\u0438\u0447\u043d\u044b\u0445 \u0443\u0434\u043e\u0431\u0441\u0442\u0432, \u0432 \u0442\u0435\u043e\u0440\u0438\u0438 \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c, \u043d\u043e \u043f\u0443\u0441\u0442\u044c \u0431\u0443\u0434\u0435\u0442.<\/p>\n<p>\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b\u0438\u043a \u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a<\/p>\n<pre><code>#ifndef QSPI_DRIVER_ZYNQ #define QSPI_DRIVER_ZYNQ  #include \"xqspips.h\" #include \"xqspips_hw.h\" #include \"xparameters_ps.h\" #include \"w25q128jvsiq_driver.h\" #include \"assert.h\"  #define QSPI_BANK ((QspiBank_t*) QSPI0_BASE) #define QSPI_TX((QspiTx_t*) (QSPI0_BASE + 0x80)) #define QSPI_LQSPI   ((QspiLqspi_t*) (QSPI0_BASE + 0xA0)) #define QSPI_MOD((QspiMod_t*) (QSPI0_BASE + 0xFC))  #define QSPI_DEVICE_IDXPAR_XQSPIPS_0_DEVICE_ID #define QSPI_CONNECTION_MODE (XPAR_XQSPIPS_0_QSPI_MODE) #define QSPI_BUS_WIDTH (XPAR_XQSPIPS_0_QSPI_BUS_WIDTH)  #define SINGLE_FLASH_CONNECTION0 #define DUAL_STACK_CONNECTION1 #define DUAL_PARALLEL_CONNECTION2 #define FLASH_SIZE_16MB0x1000000  #define DEBUG_GENERAL0x00000001    \/* general debug  messages *\/ #define DEBUG_INFO0x00000002    \/* More debug information *\/  #define LQSPI_CR_FAST_READ0x0000000B #define LQSPI_CR_FAST_DUAL_READ0x0000003B #define LQSPI_CR_FAST_QUAD_READ0x0000006B \/* Fast Quad Read output *\/ #define LQSPI_CR_1_DUMMY_BYTE0x00000100 \/* 1 Dummy Byte between      address and return data *\/  #define SINGLE_QSPI_CONFIG_FAST_READ(XQSPIPS_LQSPI_CR_LINEAR_MASK | \\  LQSPI_CR_1_DUMMY_BYTE | \\  LQSPI_CR_FAST_READ)  #define SINGLE_QSPI_CONFIG_FAST_DUAL_READ(XQSPIPS_LQSPI_CR_LINEAR_MASK | \\  LQSPI_CR_1_DUMMY_BYTE | \\  LQSPI_CR_FAST_DUAL_READ)  #define SINGLE_QSPI_CONFIG_FAST_QUAD_READ(XQSPIPS_LQSPI_CR_LINEAR_MASK | \\  LQSPI_CR_1_DUMMY_BYTE | \\  LQSPI_CR_FAST_QUAD_READ)  #define DUAL_QSPI_CONFIG_FAST_QUAD_READ(XQSPIPS_LQSPI_CR_LINEAR_MASK | \\  XQSPIPS_LQSPI_CR_TWO_MEM_MASK | \\  XQSPIPS_LQSPI_CR_SEP_BUS_MASK | \\  LQSPI_CR_1_DUMMY_BYTE | \\  LQSPI_CR_FAST_QUAD_READ)  #define DUAL_STACK_CONFIG_FAST_READ(XQSPIPS_LQSPI_CR_TWO_MEM_MASK | \\  LQSPI_CR_1_DUMMY_BYTE | \\  LQSPI_CR_FAST_READ)  #define DUAL_STACK_CONFIG_FAST_DUAL_READ(XQSPIPS_LQSPI_CR_TWO_MEM_MASK | \\  LQSPI_CR_1_DUMMY_BYTE | \\  LQSPI_CR_FAST_DUAL_READ)  #define DUAL_STACK_CONFIG_FAST_QUAD_READ(XQSPIPS_LQSPI_CR_TWO_MEM_MASK | \\  LQSPI_CR_1_DUMMY_BYTE | \\  LQSPI_CR_FAST_QUAD_READ)  #define SINGLE_QSPI_IO_CONFIG_FAST_READ(LQSPI_CR_1_DUMMY_BYTE | \\  LQSPI_CR_FAST_READ)  #define SINGLE_QSPI_IO_CONFIG_FAST_DUAL_READ(LQSPI_CR_1_DUMMY_BYTE | \\  LQSPI_CR_FAST_DUAL_READ)  #define SINGLE_QSPI_IO_CONFIG_FAST_QUAD_READ(LQSPI_CR_1_DUMMY_BYTE | \\  LQSPI_CR_FAST_QUAD_READ)  #define DUAL_QSPI_IO_CONFIG_FAST_QUAD_READ(XQSPIPS_LQSPI_CR_TWO_MEM_MASK | \\  XQSPIPS_LQSPI_CR_SEP_BUS_MASK | \\  LQSPI_CR_1_DUMMY_BYTE | \\  LQSPI_CR_FAST_QUAD_READ)  #define QSPI_BUSWIDTH_ONE0U #define QSPI_BUSWIDTH_TWO1U #define QSPI_BUSWIDTH_FOUR2U  #define MICRON_ID0x20 #define SPANSION_ID0x01 #define WINBOND_ID0xEF #define MACRONIX_ID0xC2 #define ISSI_ID0x9D  typedef enum {   HAL_SPIQF_STATE_RESET  = 0x00U,  \/\/\/&lt; \u0421\u0431\u0440\u043e\u0441   HAL_SPIQF_STATE_READY  = 0x20U,  \/\/\/&lt; \u0413\u043e\u0442\u043e\u0432 \u043a \u0440\u0430\u0431\u043e\u0442\u0435   HAL_SPIQF_STATE_BUSY   = 0x24U,  \/\/\/&lt; \u0417\u0430\u043d\u044f\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 } HAL_QSPI_StateTypeDef_t;  typedef enum {   QSPI_OK       = 0x00U,   QSPI_ERROR    = 0x01U,   QSPI_BUSY     = 0x02U,   QSPI_TIMEOUT  = 0x03U, } QspiStatus_t;  typedef struct{ volatile u32 config_reg;\/\/\/&lt; Address: 0x0 - qspi configuration volatile u32 intr_status_reg;\/\/\/&lt; Address: 0x4 - qspi interrupt status volatile u32 intrpt_en_reg;\/\/\/&lt; Address: 0x8 - interrupt enable volatile u32 intrpt_dis_reg;\/\/\/&lt; Address: 0xC - interrupt disable volatile u32 intrpt_mask_reg;\/\/\/&lt; Address: 0x10 - interrupt mask volatile u32 en_reg;\/\/\/&lt; Address: 0x14 - spi_enable volatile u32 delay_reg;\/\/\/&lt; Address: 0x18 - delay volatile u32 txd0;\/\/\/&lt; Address: 0x1C - transmit data register volatile u32 rx_data_reg;\/\/\/&lt; Address: 0x20 - receive data volatile u32 slave_idle_count_reg;\/\/\/&lt; Address: 0x24 - slave idle threshold volatile u32 tx_thres_reg;\/\/\/&lt; Address: 0x28 - tx_fifo treshold volatile u32 rx_thres_reg;\/\/\/&lt; Address: 0x2C - rx_fifo treshold volatile u32 gpio;\/\/\/&lt; Address: 0x30 - general purpose inputs and outputs volatile u32 res;\/\/\/&lt; Address: 0x34 - reserved volatile u32 lpbk_dly_adj;\/\/\/&lt; Address: 0x38 - loopback master clock delay adjustment }QspiBank_t;  typedef struct{ volatile u32 txd1;\/\/\/&lt; Address: 0x80 - transmit data volatile u32 txd2;\/\/\/&lt; Address: 0x84 - transmit data volatile u32 txd3;\/\/\/&lt; Address: 0x88 - transmit data }QspiTx_t;  typedef struct{ volatile u32 lqspi_cfg;\/\/\/&lt; Address: 0xA0 - configuration reg specially for the linear quad-spi controller volatile u32 lqspi_sts;\/\/\/&lt; Address: 0xA4 - status reg specially for the linear quad-spi controller }QspiLqspi_t;  typedef struct{ volatile u32 mod_id;\/\/\/&lt; Address: 0xFC - module identification }QspiMod_t;  typedef struct{ QspiBank_t* QSpiBank; QspiTx_t*   QSpiTx; QspiLqspi_t*QSpiLqspi; QspiMod_t* QSpiMode; }Qspi_Typedef;  typedef struct{ Qspi_Typedef *pPort; XQspiPs* pPortPs; HAL_QSPI_StateTypeDef_tState; u32*pTxBuff; u8*pRxBuff; u32XferCount; intNumSector; intNumBlock; }Qspi_t;  u32 InitialQspi();  extern Qspi_tpQspi; extern XQspiPs pQspiPs; extern XQspiPs *QspiInstancePtr;  #endif \/\/QSPI_DRIVER_ZYNQ <\/code><\/pre>\n<pre><code>#if defined(ZYNQ_AD)  #include \"qspi_driver_zynq.h\"  Qspi_t pQspi; XQspiPs pQspiPs; XQspiPs *QspiInstancePtr;  u32 FlashReadBaseAddress; u32 QspiFlashSize; u32 QspiFlashMake; u32 FlashReadBaseAddress; u8 LinearBootDeviceFlag;  \/**  * @brief \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 Qspi \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0430\u044f, \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u0432 Vitis (\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 qspi)  * @return \u0421\u0442\u0430\u0442\u0443\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 XST_SUCCESS\/XST_FAILURE  *\/ u32 InitialQspi() { XQspiPs_Config *QspiConfig; int Status; QspiInstancePtr = &amp;pQspiPs; \/*  * Initialize the QSPI driver so that it's ready to use  *\/ QspiConfig = XQspiPs_LookupConfig(QSPI_DEVICE_ID); if (NULL == QspiConfig) { return XST_FAILURE; } Status = XQspiPs_CfgInitialize(QspiInstancePtr, QspiConfig, QspiConfig-&gt;BaseAddress); if (Status != XST_SUCCESS) { return XST_FAILURE; } \/*  * Set Manual Chip select options and drive HOLD_B pin high.  *\/ XQspiPs_SetOptions(QspiInstancePtr, XQSPIPS_FORCE_SSELECT_OPTION | XQSPIPS_HOLD_B_DRIVE_OPTION); \/*  * Set the prescaler for QSPI clock  *\/ XQspiPs_SetClkPrescaler(QspiInstancePtr, XQSPIPS_CLK_PRESCALE_8); \/*  * Assert the FLASH chip select.  *\/ XQspiPs_SetSlaveSelect(QspiInstancePtr); \/*  * Read Flash ID and extract Manufacture and Size information  *\/ Status = FlashReadID(); if (Status != XST_SUCCESS) { return XST_FAILURE; } return XST_SUCCESS; }  #endif \/\/defined(ZYNQ_AD) <\/code><\/pre>\n<p>\u0412 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435\u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e. \u0412\u0437\u044f\u0442\u044b \u0430\u0434\u0440\u0435\u0441\u0430 \u043f\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c\u0443 \u043c\u043a, \u0432\u044b\u0432\u0435\u043b \u0432\u0441\u0435 \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u043d\u0443\u0436\u043d\u044b\u0435 \u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u0442\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u044b\u043c\u0438, \u0438\u0437 \u0444\u0430\u0439\u043b\u043e\u0432 \u0441\u0430\u043c\u043e\u0439 \u041f\u041b\u0418\u0421, \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u044b \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u0438 \u0432\u0442\u043e\u0440\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u044b\u0445 \u0432\u0435\u0449\u0435\u0439, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u043d\u0430 \u0431\u0443\u0444\u0435\u0440\u0430, \u043d\u043e\u043c\u0435\u0440\u0430 \u0441\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0438 \u0431\u043b\u043e\u043a\u043e\u0432 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. <br \/>\u0412 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u043d\u0438\u0447\u0435\u0433\u043e \u043c\u0443\u0434\u0440\u0435\u043d\u043e\u0433\u043e \u0442\u043e\u0436\u0435 \u043d\u0435\u0442, \u0432\u044b\u0432\u0435\u0434\u0435\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u0432 \u041f\u041b\u0418\u0421, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 QSPI. \u0412 \u0432\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0435 \u0434\u0432\u0430 \u0444\u0430\u0439\u043b\u0438\u043a\u0430 \u0438 Ctrl+C, Ctrl+V.<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0438 \u0432\u044b\u0437\u0432\u0430\u043d\u0430 \u043e\u043d\u0430 \u0432 \u043c\u0435\u0439\u043d \u0438\u043b\u0438 \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u043c \u0444\u0430\u0439\u043b\u0435 \u0438\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439(\u0430\u044f) \u0443 \u0432\u0430\u0441 \u043e\u0442\u0432\u0435\u0434\u0435\u043d(\u043d\u0430) \u0434\u043b\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<pre><code>extern Qspi_t pQspi; extern XQspiPspQspiPs; Qspi_t*  Qspi;  \/**  * @brief \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0438\u0444\u0438\u0440\u0438\u0438 QSPI \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 flash memory  * @param[in] pQspi - \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043f\u0435\u0440\u0438\u0444\u0435\u0440\u0438\u0438 qspi  * @param[in] pQspiPs - \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 qspi  * @param[in] pRxBuff - \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0431\u0443\u0444\u0435\u0440  *\/ static void QspiDefaultInit(Qspi_t* pQspi, XQspiPs* pQspiPs, void* pRxBuff) { pQspi-&gt;pPortPs = pQspiPs; pQspi-&gt;pRxBuff = (u8*)pRxBuff; pQspi-&gt;XferCount = 0; pQspi-&gt;State = HAL_SPIQF_STATE_RESET; \/\/ \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 qspi pQspi-&gt;pPort= malloc(sizeof(Qspi_Typedef)); pQspi-&gt;pPort-&gt;QSpiBank = QSPI_BANK; pQspi-&gt;pPort-&gt;QSpiTx = QSPI_TX; pQspi-&gt;pPort-&gt;QSpiLqspi = QSPI_LQSPI; pQspi-&gt;pPort-&gt;QSpiMode = QSPI_MOD;  InitialQspi(); }<\/code><\/pre>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043c\u044b \u043a\u043e\u043b\u0438\u043c \u0433\u0434\u0435 \u0443\u0433\u043e\u0434\u043d\u043e \u043f\u0435\u0440\u0435\u0434 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c qspi. \u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u0432 \u043a\u043e\u043d\u0446\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f InitialQspi(), \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442 qspi. <\/p>\n<h2>2. Flash WINBOND W25Q128JV<\/h2>\n<p>\u041d\u0430\u0441\u0442\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0448\u0435\u0439 \u0437\u0430\u0432\u0435\u0442\u043d\u043e\u0439 \u0444\u043b\u0435\u0448\u043a\u0438. \u0421\u0432\u044f\u0437\u044c \u0443 \u043d\u0430\u0441 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u0430\u043a\u043e\u0435-\u043b\u0438\u0431\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u0444\u043b\u0435\u0448\u043a\u043e\u0439, \u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0435\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u043f\u043e qspi, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0432 \u0434\u0430\u0442\u0430\u0448\u0438\u0442\u0435. \u041f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u044f\u044e \u043f\u043e\u043b\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0444\u043b\u0435\u0448\u043a\u0435.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c72\/5db\/c25\/c725dbc251fd2846a041cb84b4c51a21.png\" width=\"643\" height=\"736\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/c72\/5db\/c25\/c725dbc251fd2846a041cb84b4c51a21.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c72\/5db\/c25\/c725dbc251fd2846a041cb84b4c51a21.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/acf\/a2d\/6e6\/acfa2d6e6508e89a888df7732a078429.png\" width=\"647\" height=\"360\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/acf\/a2d\/6e6\/acfa2d6e6508e89a888df7732a078429.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/acf\/a2d\/6e6\/acfa2d6e6508e89a888df7732a078429.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041d\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e: \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u043e\u0447\u0438\u0441\u0442\u043a\u0430 \u0441\u0435\u043a\u0442\u043e\u0440\u0430\/\u0431\u043b\u043e\u043a\u0430, \u0447\u0442\u0435\u043d\u0438\u0435 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443, \u0437\u0430\u043f\u0438\u0441\u044c \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443, \u0447\u0442\u0435\u043d\u0438\u0435 \u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u0444\u043b\u0435\u0448\u043a\u0438. \u0412\u0441\u0435 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u043d\u0438\u0436\u0435 \u043f\u043e \u044d\u0442\u0430\u043f\u0430\u043c, \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0435 \u0431\u044b\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0438 \u043f\u0440\u043e\u0441\u0442\u043e.<\/p>\n<p>\u0415\u0441\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e qspi. \u041e\u043d\u0430 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u043a\u0438\u0442\u0430\u0439\u0446\u0430\u043c\u0438, \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0435\u044e &#8212; XQspiPs_PolledTransfer. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u043f\u0438\u0448\u0443 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b, \u0447\u0442\u043e \u043a\u0430\u043a \u0438 \u043f\u043e\u0447\u0435\u043c\u0443.<\/p>\n<pre><code>#if defined(ZYNQ_AD) #include \"w25q128jvsiq_driver.h\"  u8 WriteBuffer[10]; u8 ReadStatusCmd[] = {READ_ENABLE_CMD, 0}; \/\/ \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c 2 \u0431\u0430\u0439\u0442\u0430 u8 pFlashStatus[2]; u8 ReadBuffer[SECTOR_BYTES + OVERHEAD_SIZE + DUMMY_SIZE];  Flash_t* pFlash; Flash_t Flash;  static void WriteEnableCmd(); static bool CheckCmd(); static u8 ReadReg1(Flash_t* pFlash); static u8 ReadReg2(Flash_t* pFlash); static u8 ReadReg3(Flash_t* pFlash); static void WriteReg1(Flash_t* pFlash, u8 Register, bool Num); static void WriteReg2(Flash_t* pFlash, u8 Register, bool Num); static void WriteReg3(Flash_t* pFlash, u8 Register, bool Num);<\/code><\/pre>\n<p>\u041e\u0431\u044b\u0447\u043d\u043e\u0435 \u0434\u0435\u043b\u043e &#8212; \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u0443\u0444\u0435\u0440\u043e\u0432, \u043a\u043e\u043b\u0438\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u044b \u0441\u0442\u0430\u0442\u0438\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0439. <br \/>WriteEnableCmd &#8212; \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0430\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e 0\u044506, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u043c \u0444\u043b\u0435\u0448\u043a\u0435, \u0447\u0442\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f,<br \/>ReadReg &#8212; \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u0444\u043b\u0435\u0448\u043a\u0438,<br \/>WriteReg &#8212; \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0431\u0438\u0442 \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u0444\u043b\u0435\u0448\u043a\u0438,<br \/>CheckCmd &#8212; \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u0432\u0441\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u0444\u043b\u0435\u0448\u043a\u0438.<\/p>\n<p>\u042f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u043a \u043a\u0430\u0436\u0434\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432\u044b\u0439 \u043d\u043e\u043c\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043e \u0442\u043e\u043c, \u043a \u043a\u0430\u043a\u043e\u043c\u0443 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0443 \u043c\u044b \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u0438\u043b\u0438 \u043a\u0443\u0434\u0430 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0431\u0438\u0442\u044b.<\/p>\n<pre><code>void CheckAllReg() { ReadReg1(pFlash); ReadReg2(pFlash); ReadReg3(pFlash); }  \/**  * @brief \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b 0\u044506  *\/ static void WriteEnableCmd() { u8 WriteEnableCmd = {WRITE_ENABLE_CMD}; XQspiPs_PolledTransfer(QspiInstancePtr, &amp;WriteEnableCmd, NULL, sizeof(WriteEnableCmd)); CheckCmd(); }  \/**  * @brief \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 1  * @param[in] \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 Flash_t  * @return \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 1  *\/ static u8 ReadReg1(Flash_t* pFlash) { WriteBuffer[0] = READ_REG_1_CMD; WriteBuffer[1] = 0x00; XQspiPs_PolledTransfer(QspiInstancePtr, WriteBuffer, ReadBuffer, 1); CheckCmd(); pFlash-&gt;Reg1 = ReadBuffer[1]; return ReadBuffer[1]; }  \/**  * @brief \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 2  * @param[in] \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 Flash_t  * @return \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 2  *\/ static u8 ReadReg2(Flash_t* pFlash) { WriteBuffer[0] = READ_REG_2_CMD; WriteBuffer[1] = 0x00; XQspiPs_PolledTransfer(QspiInstancePtr, WriteBuffer, ReadBuffer, 1); CheckCmd(); pFlash-&gt;Reg2 = ReadBuffer[1]; return ReadBuffer[1]; }  \/**  * @brief \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 3  * @param[in] pFlash - \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 Flash_t  * @return \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 3  *\/ static u8 ReadReg3(Flash_t* pFlash) { WriteBuffer[0] = READ_REG_3_CMD; WriteBuffer[1] = 0x00; XQspiPs_PolledTransfer(QspiInstancePtr, WriteBuffer, ReadBuffer, 1); CheckCmd(); pFlash-&gt;Reg3 = ReadBuffer[1]; return ReadBuffer[1]; }  \/**  * @brief \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 1  * @param[in] pFlash - \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 Flash  * @param[in] Register - \u0440\u0435\u0433\u0438\u0441\u0442\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c  * @param[in] Num - \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f 1\/0  *\/ static void WriteReg1(Flash_t* pFlash, u8 Register, bool Num) { bool go = 0; pFlash-&gt;TempReg = ReadReg1(pFlash);\/\/ \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u043e\u043c\u0435\u0440\u0430 \u0431\u0438\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \/\/ \u0435\u0441\u043b\u0438 \u0443\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u043d\u0443\u0436\u043d\u044b\u0439 \u0431\u0438\u0442 if(((pFlash-&gt;TempReg &amp; Register) == 1)&amp;&amp;(Num == 1)) return; if(((pFlash-&gt;TempReg &amp; Register) == 0)&amp;&amp;(Num == 0)) return; \/\/ \u0435\u0441\u043b\u0438 \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u043d\u0443\u0436\u043d\u044b\u0439 \u0431\u0438\u0442 if((((pFlash-&gt;TempReg &amp; Register) == 0)&amp;&amp;(Num == 1))||(((pFlash-&gt;TempReg &amp; Register) == 1)&amp;&amp;(Num == 0))) { if(Num == 1) pFlash-&gt;TempReg |= Register; else pFlash-&gt;TempReg &amp;= ~(Register); \/\/ \u0444\u043b\u0430\u0433, \u0447\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0440\u0435\u0433\u0438\u0441\u0442\u0440 go = 1; }  if(go == 1) { WriteEnableCmd(QspiInstancePtr);  WriteBuffer[0] = WRITE_REG_1_CMD; WriteBuffer[1] = pFlash-&gt;TempReg; XQspiPs_PolledTransfer(QspiInstancePtr, WriteBuffer, NULL, 2); if(CheckCmd()) pFlash-&gt;Reg1 = pFlash-&gt;TempReg; } }  \/**  * @brief \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 2  * @param[in] pFlash - \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 Flash  * @param[in] Register - \u0440\u0435\u0433\u0438\u0441\u0442\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c  * @param[in] Num - \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f 1\/0  *\/ static void WriteReg2(Flash_t* pFlash, u8 Register, bool Num) { bool go = 0; pFlash-&gt;TempReg = ReadReg2(pFlash);\/\/ \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u043e\u043c\u0435\u0440\u0430 \u0431\u0438\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c usleep(100); \/\/ \u0435\u0441\u043b\u0438 \u0443\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u043d\u0443\u0436\u043d\u044b\u0439 \u0431\u0438\u0442 if(((pFlash-&gt;TempReg &amp; Register) == Register)&amp;&amp;(Num == 1)) return; if(((pFlash-&gt;TempReg &amp; Register) == 0x00)&amp;&amp;(Num == 0)) return; \/\/ \u0435\u0441\u043b\u0438 \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u043d\u0443\u0436\u043d\u044b\u0439 \u0431\u0438\u0442 if((((pFlash-&gt;TempReg &amp; Register) == 0x00)&amp;&amp;(Num == 1))||(((pFlash-&gt;TempReg &amp; Register) == Register)&amp;&amp;(Num == 0))) { if(Num == 1) pFlash-&gt;TempReg |= Register; else pFlash-&gt;TempReg &amp;= ~(Register); \/\/ \u0444\u043b\u0430\u0433, \u0447\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0440\u0435\u0433\u0438\u0441\u0442\u0440 go = 1; } if(go == 1) { WriteEnableCmd(QspiInstancePtr);  WriteBuffer[0] = WRITE_REG_2_CMD; WriteBuffer[1] = pFlash-&gt;TempReg; XQspiPs_PolledTransfer(QspiInstancePtr, WriteBuffer, NULL, 2); CheckCmd(); pFlash-&gt;Reg2 = pFlash-&gt;TempReg; } usleep(100); }  \/**  * @brief \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 3  * @param[in] pFlash - \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 Flash  * @param[in] Register - \u0440\u0435\u0433\u0438\u0441\u0442\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c  * @param[in] Num - \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f 1\/0  *\/ static void WriteReg3(Flash_t* pFlash, u8 Register, bool Num) { bool go = 0; pFlash-&gt;TempReg = ReadReg3(pFlash);\/\/ \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u043e\u043c\u0435\u0440\u0430 \u0431\u0438\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \/\/ \u0435\u0441\u043b\u0438 \u0443\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u043d\u0443\u0436\u043d\u044b\u0439 \u0431\u0438\u0442 if(((pFlash-&gt;TempReg &amp; Register) == 1)&amp;&amp;(Num == 1)) return; if(((pFlash-&gt;TempReg &amp; Register) == 0)&amp;&amp;(Num == 0)) return; \/\/ \u0435\u0441\u043b\u0438 \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u043d\u0443\u0436\u043d\u044b\u0439 \u0431\u0438\u0442 if((((pFlash-&gt;TempReg &amp; Register) == 0)&amp;&amp;(Num == 1))||(((pFlash-&gt;TempReg &amp; Register) == 1)&amp;&amp;(Num == 0))) { if(Num == 1) pFlash-&gt;TempReg |= Register; else pFlash-&gt;TempReg &amp;= ~(Register); \/\/ \u0444\u043b\u0430\u0433, \u0447\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0440\u0435\u0433\u0438\u0441\u0442\u0440 bool go = 1; }  if(go == 1) { WriteEnableCmd(QspiInstancePtr);  WriteBuffer[0] = WRITE_REG_3_CMD; WriteBuffer[1] = pFlash-&gt;TempReg; XQspiPs_PolledTransfer(QspiInstancePtr, WriteBuffer, NULL, 2); if(CheckCmd()) pFlash-&gt;Reg3 = pFlash-&gt;TempReg; } }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0442\u043e\u0438\u0442 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u0430\u043c\u044b\u043c \u0432\u043a\u0443\u0441\u043d\u044b\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c \u0434\u043b\u044f \u0444\u043b\u0435\u0448. \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0431\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0437\u0430\u0438\u0433\u0440\u0430\u0435\u0442 \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c.<\/p>\n<pre><code>\/**  * @brief \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 \u043b\u044e\u0431\u0430\u044f  * @param[in] Command - \u043a\u043e\u043c\u0430\u043d\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0430 \u0432 datasheet \u0434\u043b\u044f w25q128jvsiq  * @param[in] Address - \u043f\u043e \u043a\u0430\u043a\u043e\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0432\u043e flash  * @param[in] ByteCnt - \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u0439\u0442, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432\u043e flash  *\/ void FlashSendCmd(u8 Command, u32 Address, u32 ByteCnt) { \/\/ \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0437\u0430\u043f\u0438\u0441\u0438 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c\u0438 \u0430\u0434\u0440\u0435\u0441\u043e\u043c \u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 WriteBuffer[0] = Command; WriteBuffer[1] = (u8)((Address &amp; 0xFF0000) &gt;&gt; 16); WriteBuffer[2] = (u8)((Address &amp; 0xFF00) &gt;&gt; 8); WriteBuffer[3] = (u8)(Address &amp; 0xFF);  if(Command == PAGE_PROGRAM_CMD) { XQspiPs_PolledTransfer(QspiInstancePtr, WriteBuffer, NULL, ByteCnt + OVERHEAD_SIZE); CheckCmd(); return; }  if((Command == READ_REG_1_CMD)||(Command == READ_REG_2_CMD)||(Command == READ_REG_3_CMD)) { XQspiPs_PolledTransfer(QspiInstancePtr, WriteBuffer, ReadBuffer, 2); CheckCmd(); return; }  if((Command == READ_DATA_CMD)||(Command == FAST_READ_CMD)||(Command == FAST_READ_DUAL_OUTPUT_CMD)||(Command == FAST_READ_QUAD_OUTPUT_CMD)||(Command == FAST_READ_DUAL_IO_CMD)||(Command == FAST_READ_QUAD_IO_CMD)) { XQspiPs_PolledTransfer(QspiInstancePtr, WriteBuffer, ReadBuffer, ByteCnt + OVERHEAD_SIZE); CheckCmd(); return; } \/\/ \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u043d\u0430 \u0444\u043b\u0435\u0448, \u0447\u0442\u043e\u0431\u044b \u0432 \u043d\u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 XQspiPs_PolledTransfer(QspiInstancePtr, WriteBuffer, NULL, ByteCnt + OVERHEAD_SIZE); CheckCmd(); }  \/**  * @brief \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u0441\u0435\u043a\u0442\u043e\u0440\u0430, \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u0430\u044f \u043f\u0435\u0440\u0435\u0434 \u0437\u0430\u043f\u0438\u0441\u044c\u044e  * @param[in] Sector - \u043d\u043e\u043c\u0435\u0440 \u0441\u0435\u043a\u0442\u043e\u0440\u0430 (0-15)  * @param[in] Block - \u043d\u043e\u043c\u0435\u0440 \u0431\u043b\u043e\u043a\u0430 (0-255)  *\/ void FlashEraseSector(int Sector, int Block) { u32 Address; \/\/ \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 WRITE_ENABLE_CMD \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u043e\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u0443\u044e \u043d\u0430\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 WriteEnableCmd();  u32 AddressSector = (u32)(Sector * (int)SECTOR_SIZE) &amp; 0x0000FFFF;\/\/ \u0430\u0434\u0440\u0435\u0441 \u0441\u0435\u043a\u0442\u043e\u0440\u0430 u32 AddressBlock = (u32)(Block * (int)BLOCK_SIZE) &amp; 0x00FF0000;\/\/ \u0430\u0434\u0440\u0435\u0441 \u0431\u043b\u043e\u043a\u0430 Address = (u32)(AddressSector | AddressBlock) &amp; 0x00FFFFFF;  WriteBuffer[0] = SECTOR_ERASE_CMD; WriteBuffer[1] = (u8)((Address &amp; 0xFF0000) &gt;&gt; 16); WriteBuffer[2] = (u8)((Address &amp; 0xFF00) &gt;&gt; 8); WriteBuffer[3] = (u8)(Address &amp; 0xFF);  XQspiPs_PolledTransfer(QspiInstancePtr, WriteBuffer, NULL, 4); CheckCmd(); }  \/**  * @brief \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u0431\u043b\u043e\u043a\u0430  * @param[in] Block - \u043d\u043e\u043c\u0435\u0440 \u0431\u043b\u043e\u043a\u0430 \u0437\u0430\u043f\u0438\u0441\u0438 (0-255)  *\/ void FlashEraseBlock(int Block) { ReadReg1(pFlash); ReadReg2(pFlash); ReadReg3(pFlash); u32 Address; \/\/ \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 WRITE_ENABLE_CMD \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u043e\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u0443\u044e \u043d\u0430\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 WriteEnableCmd();  Address = (u32)(Block * BLOCK_SIZE) &amp; 0x00FF0000;\/\/ \u0430\u0434\u0440\u0435\u0441 \u0431\u043b\u043e\u043a\u0430  WriteBuffer[0] = BLOCK_ERASE_CMD; WriteBuffer[1] = (u8)((Address &amp; 0xFF0000)&gt;&gt;16); WriteBuffer[2] = (u8)((Address &amp; 0xFF00)&gt;&gt;8); WriteBuffer[3] = (u8)(Address &amp; 0xFF);  XQspiPs_PolledTransfer(QspiInstancePtr, WriteBuffer, NULL, 4); CheckCmd(); }  \/**  * @brief \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443, \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u0430\u044f \u043f\u0435\u0440\u0435\u0434 \u0437\u0430\u043f\u0438\u0441\u044c\u044e  * @param[in] u32 Address - \u0430\u0434\u0440\u0435\u0441 \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0430 \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u0441\u0435\u043a\u0442\u043e\u0440\u0430  *\/ void FlashEraseAddress(u32 Address) { \/\/ \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 WRITE_ENABLE_CMD \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u043e\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u0443\u044e \u043d\u0430\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 WriteEnableCmd();  WriteBuffer[0] = SECTOR_ERASE_CMD; WriteBuffer[1] = (u8)((Address &amp; 0xFF0000) &gt;&gt; 16); WriteBuffer[2] = (u8)((Address &amp; 0xFF00) &gt;&gt; 8); WriteBuffer[3] = (u8)(Address &amp; 0xFF);  XQspiPs_PolledTransfer(QspiInstancePtr, WriteBuffer, NULL, 4); CheckCmd(); }  \/**  * @brief \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0432 \u0430\u0434\u0440\u0435\u0441  * @param[in] Address -\u0430\u0434\u0440\u0435\u0441 \u0437\u0430\u043f\u0438\u0441\u0438  * @param[in] Massive - \u043c\u0430\u0441\u0441\u0438\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c  * @info \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0430 4 \u0431\u0430\u0439\u0442\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438  *\/ void FlashPageProgaAddress(u32 Address, u8* Massive, int Bytes) { \/\/debug WriteEnableCmd();  *Massive = PAGE_PROGRAM_CMD;  *(Massive + 1) = (u8)((Address &amp; 0xFF0000) &gt;&gt; 16); *(Massive + 2) = (u8)((Address &amp; 0xFF00) &gt;&gt; 8); *(Massive + 3) = (u8)(Address &amp; 0xFF);  XQspiPs_PolledTransfer(QspiInstancePtr, Massive, NULL, Bytes + 4); CheckCmd();  }  \/**  * @brief \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0447\u0442\u0435\u043d\u0438\u044f ID Flash \u043f\u0430\u043c\u044f\u0442\u0438  *\/ int FlashReadID() { u32 Status; \/\/ \u0447\u0442\u0435\u043d\u0438\u0435 ID \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0440\u0435\u0436\u0438\u043c WriteBuffer[0] = 0x9F; WriteBuffer[1] = 0x00; WriteBuffer[2] = 0x00; WriteBuffer[3] = 0x00; Status = XQspiPs_PolledTransfer(QspiInstancePtr, WriteBuffer, ReadBuffer, 4); if (Status != XST_SUCCESS) { return XST_FAILURE; } xil_printf(\"Single pFlash Information\\r\\n\"); xil_printf(\"pFlashID=0x%x 0x%x 0x%x\\r\\n\", ReadBuffer[1], ReadBuffer[2], ReadBuffer[3]);  return XST_SUCCESS; }  \/**  * @brief \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b  * @return 1  *\/ static bool CheckCmd() { while(1) { XQspiPs_PolledTransfer(QspiInstancePtr, ReadStatusCmd, pFlashStatus, sizeof(ReadStatusCmd)); if((pFlashStatus[1] &amp; 0x01) == 0x0) break; } return 1; }  \/**  * @brief \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 \u0432 Flash \u043f\u0430\u043c\u044f\u0442\u0438  *\/ void FlashReadAddress(u32 ByteCount, u32 Address, u8 Cmd) { if(Cmd == READ_DATA_CMD) WriteReg2(pFlash, REGISTER_QE, 0);  FlashSendCmd(Cmd, Address, ByteCount); CheckCmd(); } <\/code><\/pre>\n<p>\u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043d\u0438 \u0443 \u043a\u043e\u0433\u043e \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432.<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f FlashSendCmd \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u0430\u044f, \u0442\u043e \u0435\u0441\u0442\u044c \u043e\u043d\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043b\u044e\u0431\u044b\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432\u044b\u0448\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0432 \u0444\u043b\u0435\u0448\u043a\u0443, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 XQspiPs_PolledTransfer. \u0412\u0445\u043e\u0434\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0443 \u043d\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 &#8212; \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 qspi, \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0441\u0430\u043c\u0438\u043c vitis; \u0431\u0443\u0444\u0435\u0440 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438; \u0431\u0443\u0444\u0435\u0440 \u043f\u0440\u0438\u0435\u043c\u043a\u0438; \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u0439\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 (\u0434\u043b\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438). \u041f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430 \u0431\u0430\u0439\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439, \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e.<br \/>\u0424\u0443\u043d\u043a\u0446\u0438\u044f FlashEraseBlock, FlashEraseSector \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u044b \u0434\u043b\u044f \u043d\u0430\u0441, \u0442\u0430\u043a \u043a\u0430\u043a \u0431\u0435\u0437 \u043d\u0438\u0445 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u043e \u0444\u043b\u0435\u0448. \u0412\u0441\u0435 \u044d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043e\u0447\u0438\u0449\u0435\u043d\u043d\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c, \u0442\u043e \u0435\u0441\u0442\u044c \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043e 0xFF. \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c 0x20, 0xD8 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e. \u042f \u0447\u0430\u0449\u0435 \u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0441\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u0431\u043b\u043e\u043a\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u043e\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u043e\u0439, \u043c\u043d\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435 \u0432\u043e \u0444\u043b\u0435\u0448, \u043f\u0430\u043c\u044f\u0442\u0438 \u0445\u0432\u0430\u0442\u0430\u0435\u0442, \u044d\u0442\u043e \u0432\u0430\u043c \u043d\u0435 stm32f103rb nucleo \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0441 \u0444\u043b\u0435\u0448\u043a\u043e\u0439 \u0432 128 \u043a\u0431\u0430\u0439\u0442, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0434\u0430\u0436\u0435 \u0441 \u0442\u0440\u0443\u0434\u043e\u043c \u043f\u043e\u0445\u0440\u0430\u043d\u0438\u0448\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0443, \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 53 \u043a\u0438\u043b\u043e. \u0425\u043e\u0442\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0437\u0430\u043f\u0438\u0441\u0438 \u0432\u043e \u0444\u043b\u0435\u0448 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u0435\u043d. \u041d\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c&#8230;<br \/>\u041d\u0438\u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044e \u0441\u0445\u0435\u043c\u0443 \u0444\u043b\u0435\u0448\u043a\u0438 \u043f\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044e \u043f\u0430\u043c\u044f\u0442\u0438. <\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f3d\/32a\/a87\/f3d32aa87461775092251f94c8045d0a.png\" width=\"661\" height=\"805\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/f3d\/32a\/a87\/f3d32aa87461775092251f94c8045d0a.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f3d\/32a\/a87\/f3d32aa87461775092251f94c8045d0a.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0432\u0448\u0438\u0441\u044c \u0441 \u0440\u0438\u0441\u0443\u043d\u043e\u0447\u043a\u043e\u043c, \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443.<br \/>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u0441 \u0440\u0438\u0441\u0443\u043d\u043a\u0430, \u043d\u0430\u0448\u0430 \u043f\u0430\u043c\u044f\u0442\u044c \u0432 16 \u043a\u0438\u043b\u043e \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430 \u0431\u043b\u043e\u043a\u0438 \u043f\u043e 64 \u043a\u0431\u0430\u0439\u0442 \u043a\u0430\u0436\u0434\u044b\u0439, \u0430 \u0431\u043b\u043e\u043a\u0438 \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0434\u0435\u043b\u044f\u0442\u0441\u044f \u043d\u0430 \u0441\u0435\u043a\u0442\u043e\u0440\u0430 \u043f\u043e 4 \u043a\u0431\u0430\u0439\u0442, \u0430 \u0441\u0435\u043a\u0442\u043e\u0440\u0430 \u0434\u0435\u043b\u044f\u0442\u0441\u044f \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0432 256 \u0431\u0430\u0439\u0442. <br \/>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0433\u0443 \u043f\u043e\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0447\u0442\u0435\u043d\u0438\u044f  \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 \u0438\u043c\u0435\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b: \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u0439\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0438\u0437 \u0444\u043b\u0435\u0448\u043a\u0438 (\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u043c \u0431\u0443\u0444\u0435\u0440\u043e\u043c, \u0432 \u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 4096 \u0431\u0430\u0439\u0442); \u0430\u0434\u0440\u0435\u0441 \u0432\u043e \u0444\u043b\u0435\u0448 \u043e\u0442\u043a\u0443\u0434\u0430 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0438 \u0431\u0430\u0439\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u0432 \u043a\u0430\u043a\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c. \u041c\u043e\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043e\u0441\u043d\u043e\u0432\u0430\u043d \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0438 0\u044503, \u0442\u0430\u043a \u043a\u0430\u043a \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0435\u0436\u0438\u043c \u0447\u0442\u0435\u043d\u0438\u044f \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u0432\u044b\u0432\u043e\u0434\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e \u0448\u0438\u043d\u0430\u043c, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c \u0442\u0438\u043f\u043e\u0432 \u0441\u043e\u0431\u0438\u0440\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u042d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u043d\u0430\u0447\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0431\u0443\u0444\u0435\u0440\u0435 \u0443 \u0432\u0430\u0441 \u0431\u0443\u0434\u0443\u0442 \u043b\u0435\u0436\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0435. \u0422\u0430\u043a\u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0431\u0443\u0444\u0435\u0440 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u0441\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445 \u0444\u043b\u0435\u0448\u0438. \u0424\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u0443\u0444\u0435\u0440\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u043f\u043e \u043a\u043e\u0434\u0443, \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 0x06, \u0434\u0430\u043b\u0435\u0435 \u043d\u043e\u043c\u0435\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0443\u0436\u043d\u0430 \u0438 \u0434\u0430\u043b\u0435\u0435 3 \u0431\u0430\u0439\u0442\u0430 \u0430\u0434\u0440\u0435\u0441\u0430. \u0410\u0434\u0440\u0435\u0441 \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0437 \u0441\u0435\u0431\u044f 0xFCxxxxxx, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u0442\u0430\u0440\u0448\u0438\u0439 \u0431\u0430\u0439\u0442 \u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0443\u0436\u043d\u044b\u0435 3, \u0434\u0430\u043b\u0435\u0435 qspi \u0441\u0430\u043c \u0440\u0435\u0448\u0438\u0442 \u043a\u0430\u043a \u0438 \u043a\u0443\u0434\u0430 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c, \u0442\u0430\u043a \u043a\u0430\u043a \u0443 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e \u0447\u0435\u0442\u043d\u044b\u043c \u0438 \u043d\u0435\u0447\u0435\u0442\u043d\u044b\u043c \u0431\u0438\u0442\u0430\u043c. \u0421 \u0437\u0430\u043f\u0438\u0441\u044c\u044e \u0432\u0441\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e, \u043d\u043e \u0435\u0441\u0442\u044c \u043d\u044e\u0430\u043d\u0441, \u0442\u0430\u043a \u043a\u0430\u043a \u0443 \u043d\u0430\u0441 \u0442\u0435\u043f\u0435\u0440\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u0432\u0435 \u0444\u043b\u0435\u0448\u0438, \u0442\u043e \u0430\u0434\u0440\u0435\u0441\u0430 \u0443 \u043d\u0430\u0441 \u0434\u0435\u043b\u044f\u0442\u0441\u044f \u043f\u043e\u043f\u043e\u043b\u0430\u043c. \u0422\u043e \u0435\u0441\u0442\u044c \u0435\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043f\u043e \u043d\u0443\u043b\u0435\u0432\u043e\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443, \u0442\u043e \u0441\u0434\u0432\u0438\u0433 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c \u0431\u0443\u0434\u0435\u0442 &#8212; 0x80, \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u043e\u0442 256 \u0431\u0430\u0439\u0442 \u0432 hex. \u0422\u043e \u0435\u0441\u0442\u044c \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u0435\u0440\u0435\u0442\u0435 \u043b\u044e\u0431\u043e\u0439 \u0430\u0434\u0440\u0435\u0441 \u043a\u0443\u0434\u0430 \u0445\u043e\u0442\u0438\u0442\u0435 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u0434\u0435\u043b\u0438\u0442\u0435 \u043d\u0430 2 \u0432 hex, \u044d\u0442\u043e \u0438 \u0431\u0443\u0434\u0435\u0442 \u043d\u0443\u0436\u043d\u044b\u0439 \u0432\u0430\u043c \u0430\u0434\u0440\u0435\u0441.<\/p>\n<p>\u0418\u0437\u044e\u043c\u0438\u043d\u043a\u043e\u0439 \u043d\u0430 \u0442\u043e\u0440\u0442\u0438\u043a\u0435 \u0431\u0443\u0434\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0444\u043b\u0435\u0448\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u0437\u0432\u0430\u043d\u0430 \u0441\u043b\u0435\u0434\u043e\u043c \u0437\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 qspi. <\/p>\n<pre><code>\/**  * @brief \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 flash memory  * @detail \u0415\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432\u0442\u043e\u0440\u0443\u044e \u0444\u043b\u0435\u0448, \u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043c\u0430\u043a\u0440\u043e\u0441 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f  * DUAL_FLASH_WINBOND, \u0438\u043d\u0430\u0447\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c  * @param[in] Flash - \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0444\u043b\u0435\u0448\u043a\u0438  * @return None  *\/ static void FlashDefaultInit(Flash_t* Flash) { Flash-&gt;Reg1 = 0x00; Flash-&gt;Reg2 = 0x00; Flash-&gt;Reg3 = 0x00; Flash-&gt;TempReg = 0x00; Flash-&gt;FlashState = 0x03;  CheckAllReg();  \/\/ \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0434\u043b\u044f \u0432\u0442\u043e\u0440\u043e\u0439 \u0444\u043b\u0435\u0448, \u0435\u0441\u043b\u0438 \u043e\u043d\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0430 #if defined (DUAL_FLASH_WINBOND) XQspiPs_WriteReg(0xE000D000, 0xA0, 0x60000000); uint8_t Rec[10] = {}; uint8_t num1 = 0x02; XQspiPs_PolledTransfer(&amp;pQspiPs, (uint8_t[]){0x06}, NULL, 1); XQspiPs_PolledTransfer(&amp;pQspiPs, (uint8_t[]){0x31, num1}, Rec, 2); uint32_t num = XQspiPs_ReadReg(QSPI0_BASE, 0x00); num |= (((3 &lt;&lt; 2) &lt;&lt; 4) &lt;&lt; 8); XQspiPs_WriteReg(0xE000D000, 0x00, num); #endif }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0442\u0430\u043a\u0436\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e, \u0441\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u043c\u0430\u043a\u0440\u043e\u0441. \u0412\u043d\u0443\u0442\u0440\u0438 \u0432\u043f\u0438\u0441\u0430\u043d\u044b \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043a\u043e\u043c\u0430\u043d\u0434 \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0432\u0442\u043e\u0440\u043e\u0439 \u0444\u043b\u0435\u0448\u043a\u0438, \u0432\u044b \u0432\u0441\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u0430\u043c\u0438 \u0441 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u043c\u0438 \u0432\u044b\u0448\u0435 \u0438 \u0443\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u0438\u0442\u044c\u0441\u044f \u0432 \u044d\u0442\u043e\u043c.<\/p>\n<p>\u041d\u0443 \u0432\u043e\u0442 \u0438 \u043f\u0440\u0438\u0448\u043b\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043a \u043a\u043e\u043d\u0446\u0443. \u0421\u043f\u0430\u0441\u0438\u0431\u043e, \u0447\u0442\u043e \u0434\u043e\u0447\u0438\u0442\u0430\u043b\u0438 \u0434\u043e \u043a\u043e\u043d\u0446\u0430. \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u043b\u0438\u0441\u044c \u043a\u0430\u043a\u0438\u0435-\u043b\u0438\u0431\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u044b &#8212; \u043f\u0438\u0448\u0438\u0442\u0435 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445, \u0441 \u0440\u0430\u0434\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u043c\u043e\u0433\u0443!<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/927990\/\"> https:\/\/habr.com\/ru\/articles\/927990\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! <\/p>\n<p>\u042f \u0445\u043e\u0447\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441\u00a0\u0432\u0430\u043c\u0438, \u043a\u0430\u043a\u00a0\u043e\u0434\u043d\u0430\u0436\u0434\u044b \u043c\u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043e\u0436\u0438\u0432\u043b\u044f\u0442\u044c \u0432\u0442\u043e\u0440\u0443\u044e \u0444\u043b\u0435\u0448\u043a\u0443 \u043d\u0430\u00a0\u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0435 (\u0434\u0430\u043b\u0435\u0435 \u00ab\u043c\u043a\u00bb), \u043d\u0443 \u043a\u043e\u043c\u0443 \u043d\u0435\u00a0\u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f, \u0442\u043e \u043d\u0430\u0437\u043e\u0432\u0435\u043c \u044d\u0442\u043e \u00ab\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0443\u0435\u043c\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043d\u0430\u00a0\u043a\u0440\u0438\u0441\u0442\u0430\u043b\u043b\u0435\u00bb. \u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435 \u043a\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0448\u0435\u043b \u0441\u044e\u0434\u0430 \u0438 \u0445\u043e\u0447\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0438 \u0432\u0441\u0435 \u043f\u043e\u043d\u044f\u0442\u044c, \u0442\u043e \u0432\u0430\u043c \u0441\u044e\u0434\u0430, \u0442\u0430\u043a \u043a\u0430\u043a\u00a0\u044f \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u044e \u0432\u0441\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0442\u00a0\u0410\u00a0\u0434\u043e\u00a0\u042f.<\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0434\u043d\u044f\u0442\u044b \u0442\u0430\u043a\u0438\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b:<\/p>\n<ol>\n<li>\n<p>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f QSPI (\u043a\u0442\u043e \u043d\u0435 \u0437\u043d\u0430\u0435\u0442, \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0435\u0440\u0438\u0444\u0435\u0440\u0438\u044f, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0444\u043b\u0435\u0448\u043a\u043e\u0439 \u043d\u0430 \u043f\u0440\u044f\u043c\u0443\u044e).<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f flash. \u041d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430.<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u0440\u043e\u0434\u0435\u043b\u0430\u0432 \u0432\u0441\u0435 \u043f\u0443\u043d\u043a\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0442\u0440\u043e\u043d\u0443\u0442\u044b \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u0432\u0430\u043c \u0441\u0442\u0430\u043d\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u043a\u0430\u043a \u0438 \u0447\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. <\/p>\n<h2>1. \u0412\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435<\/h2>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0436\u0435 \u0438\u0437 \u0441\u0435\u0431\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0444\u043b\u0435\u0448\u0435\u043a. \u0412 \u041f\u041b\u0418\u0421 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f 3 \u0440\u0435\u0436\u0438\u043c\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \u043d\u0438\u0436\u0435.<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u0440\u0435\u0436\u0438\u043c Single SS 4-bit \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0437 \u0441\u0435\u0431\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0438 \u0441\u0432\u044f\u0437\u044c \u0441 \u043e\u0434\u043d\u043e\u0439 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0444\u043b\u0435\u0448\u043a\u043e\u0439 \u043d\u0430 \u043f\u043b\u0430\u0442\u0435. \u0422\u0430\u043c \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e \u043f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0435\u0442, \u043d\u043e \u043a\u043e\u0434 \u043d\u0438\u0436\u0435 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 \u0434\u043b\u044f \u0435\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438. \u0412\u0442\u043e\u0440\u043e\u0439 \u0438 \u0442\u0440\u0435\u0442\u0438\u0439 \u0440\u0435\u0436\u0438\u043c\u044b \u043a\u0430\u043a \u0440\u0430\u0437 \u0442\u0430\u043a\u0438 \u043d\u0443\u0436\u043d\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0432\u0443\u043c\u044f \u0444\u043b\u0435\u0448\u043a\u0430\u043c\u0438, \u043d\u043e \u0432 \u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0435 2 qspi, \u0430 \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u043e\u0434\u0438\u043d. \u0422\u043e \u0435\u0441\u0442\u044c \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0434\u0435\u0440\u0433\u0430\u0442\u044c Chip Select \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0444\u043b\u0435\u0448. \u041d\u0438\u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043d\u0430 \u043c\u043e\u0435\u0439 \u043f\u043b\u0430\u0442\u0435, \u0441 \u0444\u043b\u0435\u0448\u043a\u043e\u0439 \u0442\u0438\u043f\u0430 WINBOND W25Q128JV.<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u041f\u0440\u043e\u0441\u0442\u044b\u043c \u044f\u0437\u044b\u043a\u043e\u043c \u0441\u043a\u0430\u0436\u0443 \u0442\u0430\u043a, \u0447\u0442\u043e \u043e\u043d\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u044b \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e. \u041c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u0430\u043a \u044d\u0442\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u043e \u043d\u0430 \u043a\u0438\u0442\u0430\u0439\u0441\u043a\u043e\u043c \u0430\u043d\u0430\u043b\u043e\u0433\u0435, \u0443 \u043c\u0435\u043d\u044f \u043a\u0430\u0441\u0442\u043e\u043c.<br \/>\u041f\u0435\u0440\u0435\u0434 \u043e\u0442\u043b\u0430\u0434\u043a\u043e\u0439 \u0438 \u0440\u0430\u0431\u043e\u0442\u043e\u0439 \u0443\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e boot_mode \u0443 \u0432\u0430\u0441 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043d\u0430 0. \u042d\u0442\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0434\u043b\u044f \u043f\u043b\u0430\u0442\u044b, \u0447\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430 \u043c\u043a \u0438\u0434\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 JTAG, \u0437\u0430\u043f\u0438\u0441\u044c\u044e \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432 \u041e\u0417\u0423, \u0432 \u043e\u0431\u0445\u043e\u0434 \u0444\u043b\u0435\u0448\u043a\u0438. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430 \u044d\u0442\u043e\u0439 \u0447\u0443\u0434\u0435\u0441\u043d\u043e\u0439 \u043d\u043e\u0442\u0435, \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u0434\u0430\u043b\u0435\u0435.<\/p>\n<h2>2. QSPI<\/h2>\n<p>\u041e\u043f\u0443\u0449\u0443 \u043c\u043e\u043c\u0435\u043d\u0442\u044b \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0445 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439, \u0442\u0430\u043a \u043a\u0430\u043a \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e zynq-7000 \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u043e\u043b\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432. \u0414\u043b\u044f \u043a\u0440\u0430\u0441\u043e\u0442\u044b \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0441 \u043d\u0438\u043c\u0438, \u0447\u0442\u043e\u0431\u044b \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0447\u0435\u0433\u043e, \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u0442\u043e\u0439 \u0438\u043b\u0438 \u0438\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u044b\u0435 \u043d\u0430\u043c \u0431\u0438\u0442\u044b. <\/p>\n<figure class=\"full-width\"><\/figure>\n<figure class=\"full-width\"><\/figure>\n<p>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u044d\u0442\u0438\u0445 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u0442\u043e\u043b\u043a\u043e\u043c \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043d\u0435\u0442, \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f, \u0447\u0442\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0432 \u0441\u0430\u043c\u043e\u043c \u043f\u0440\u0430\u0432\u043e\u043c \u0441\u0442\u043e\u043b\u0431\u0446\u0435. \u0412 \u044d\u0442\u043e\u043c \u043f\u043b\u0430\u043d\u0435 \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u043a\u0438\u0442\u0430\u0439\u0446\u044b \u043d\u0435 \u043c\u043e\u043b\u043e\u0434\u0446\u044b, \u0445\u0434.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043a\u043e\u0434 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0434\u043b\u044f QSPI, \u0434\u043b\u044f \u043c\u043e\u0438\u0445 \u043b\u0438\u0447\u043d\u044b\u0445 \u0443\u0434\u043e\u0431\u0441\u0442\u0432, \u0432 \u0442\u0435\u043e\u0440\u0438\u0438 \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c, \u043d\u043e \u043f\u0443\u0441\u0442\u044c \u0431\u0443\u0434\u0435\u0442.<\/p>\n<p>\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b\u0438\u043a \u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a<\/p>\n<pre><code>#ifndef QSPI_DRIVER_ZYNQ #define QSPI_DRIVER_ZYNQ  #include \"xqspips.h\" #include \"xqspips_hw.h\" #include \"xparameters_ps.h\" #include \"w25q128jvsiq_driver.h\" #include \"assert.h\"  #define QSPI_BANK ((QspiBank_t*) QSPI0_BASE) #define QSPI_TX((QspiTx_t*) (QSPI0_BASE + 0x80)) #define QSPI_LQSPI   ((QspiLqspi_t*) (QSPI0_BASE + 0xA0)) #define QSPI_MOD((QspiMod_t*) (QSPI0_BASE + 0xFC))  #define QSPI_DEVICE_IDXPAR_XQSPIPS_0_DEVICE_ID #define QSPI_CONNECTION_MODE (XPAR_XQSPIPS_0_QSPI_MODE) #define QSPI_BUS_WIDTH (XPAR_XQSPIPS_0_QSPI_BUS_WIDTH)  #define SINGLE_FLASH_CONNECTION0 #define DUAL_STACK_CONNECTION1 #define DUAL_PARALLEL_CONNECTION2 #define FLASH_SIZE_16MB0x1000000  #define DEBUG_GENERAL0x00000001    \/* general debug  messages *\/ #define DEBUG_INFO0x00000002    \/* More debug information *\/  #define LQSPI_CR_FAST_READ0x0000000B #define LQSPI_CR_FAST_DUAL_READ0x0000003B #define LQSPI_CR_FAST_QUAD_READ0x0000006B \/* Fast Quad Read output *\/ #define LQSPI_CR_1_DUMMY_BYTE0x00000100 \/* 1 Dummy Byte between      address and return data *\/  #define SINGLE_QSPI_CONFIG_FAST_READ(XQSPIPS_LQSPI_CR_LINEAR_MASK | \\  LQSPI_CR_1_DUMMY_BYTE | \\  LQSPI_CR_FAST_READ)  #define SINGLE_QSPI_CONFIG_FAST_DUAL_READ(XQSPIPS_LQSPI_CR_LINEAR_MASK | \\  LQSPI_CR_1_DUMMY_BYTE | \\  LQSPI_CR_FAST_DUAL_READ)  #define SINGLE_QSPI_CONFIG_FAST_QUAD_READ(XQSPIPS_LQSPI_CR_LINEAR_MASK | \\  LQSPI_CR_1_DUMMY_BYTE | \\  LQSPI_CR_FAST_QUAD_READ)  #define DUAL_QSPI_CONFIG_FAST_QUAD_READ(XQSPIPS_LQSPI_CR_LINEAR_MASK | \\  XQSPIPS_LQSPI_CR_TWO_MEM_MASK | \\  XQSPIPS_LQSPI_CR_SEP_BUS_MASK | \\  LQSPI_CR_1_DUMMY_BYTE | \\  LQSPI_CR_FAST_QUAD_READ)  #define DUAL_STACK_CONFIG_FAST_READ(XQSPIPS_LQSPI_CR_TWO_MEM_MASK | \\  LQSPI_CR_1_DUMMY_BYTE | \\  LQSPI_CR_FAST_READ)  #define DUAL_STACK_CONFIG_FAST_DUAL_READ(XQSPIPS_LQSPI_CR_TWO_MEM_MASK | \\  LQSPI_CR_1_DUMMY_BYTE | \\  LQSPI_CR_FAST_DUAL_READ)  #define DUAL_STACK_CONFIG_FAST_QUAD_READ(XQSPIPS_LQSPI_CR_TWO_MEM_MASK | \\  LQSPI_CR_1_DUMMY_BYTE | \\  LQSPI_CR_FAST_QUAD_READ)  #define SINGLE_QSPI_IO_CONFIG_FAST_READ(LQSPI_CR_1_DUMMY_BYTE | \\  LQSPI_CR_FAST_READ)  #define SINGLE_QSPI_IO_CONFIG_FAST_DUAL_READ(LQSPI_CR_1_DUMMY_BYTE | \\  LQSPI_CR_FAST_DUAL_READ)  #define SINGLE_QSPI_IO_CONFIG_FAST_QUAD_READ(LQSPI_CR_1_DUMMY_BYTE | \\  LQSPI_CR_FAST_QUAD_READ)  #define DUAL_QSPI_IO_CONFIG_FAST_QUAD_READ(XQSPIPS_LQSPI_CR_TWO_MEM_MASK | \\  XQSPIPS_LQSPI_CR_SEP_BUS_MASK | \\  LQSPI_CR_1_DUMMY_BYTE | \\  LQSPI_CR_FAST_QUAD_READ)  #define QSPI_BUSWIDTH_ONE0U #define QSPI_BUSWIDTH_TWO1U #define QSPI_BUSWIDTH_FOUR2U  #define MICRON_ID0x20 #define SPANSION_ID0x01 #define WINBOND_ID0xEF #define MACRONIX_ID0xC2 #define ISSI_ID0x9D  typedef enum {   HAL_SPIQF_STATE_RESET  = 0x00U,  \/\/\/&lt; \u0421\u0431\u0440\u043e\u0441   HAL_SPIQF_STATE_READY  = 0x20U,  \/\/\/&lt; \u0413\u043e\u0442\u043e\u0432 \u043a \u0440\u0430\u0431\u043e\u0442\u0435   HAL_SPIQF_STATE_BUSY   = 0x24U,  \/\/\/&lt; \u0417\u0430\u043d\u044f\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 } HAL_QSPI_StateTypeDef_t;  typedef enum {   QSPI_OK       = 0x00U,   QSPI_ERROR    = 0x01U,   QSPI_BUSY     = 0x02U,   QSPI_TIMEOUT  = 0x03U, } QspiStatus_t;  typedef struct{ volatile u32 config_reg;\/\/\/&lt; Address: 0x0 - qspi configuration volatile u32 intr_status_reg;\/\/\/&lt; Address: 0x4 - qspi interrupt status volatile u32 intrpt_en_reg;\/\/\/&lt; Address: 0x8 - interrupt enable volatile u32 intrpt_dis_reg;\/\/\/&lt; Address: 0xC - interrupt disable volatile u32 intrpt_mask_reg;\/\/\/&lt; Address: 0x10 - interrupt mask volatile u32 en_reg;\/\/\/&lt; Address: 0x14 - spi_enable volatile u32 delay_reg;\/\/\/&lt; Address: 0x18 - delay volatile u32 txd0;\/\/\/&lt; Address: 0x1C - transmit data register volatile u32 rx_data_reg;\/\/\/&lt; Address: 0x20 - receive data volatile u32 slave_idle_count_reg;\/\/\/&lt; Address: 0x24 - slave idle threshold volatile u32 tx_thres_reg;\/\/\/&lt; Address: 0x28 - tx_fifo treshold volatile u32 rx_thres_reg;\/\/\/&lt; Address: 0x2C - rx_fifo treshold volatile u32 gpio;\/\/\/&lt; Address: 0x30 - general purpose inputs and outputs volatile u32 res;\/\/\/&lt; Address: 0x34 - reserved volatile u32 lpbk_dly_adj;\/\/\/&lt; Address: 0x38 - loopback master clock delay adjustment }QspiBank_t;  typedef struct{ volatile u32 txd1;\/\/\/&lt; Address: 0x80 - transmit data volatile u32 txd2;\/\/\/&lt; Address: 0x84 - transmit data volatile u32 txd3;\/\/\/&lt; Address: 0x88 - transmit data }QspiTx_t;  typedef struct{ volatile u32 lqspi_cfg;\/\/\/&lt; Address: 0xA0 - configuration reg specially for the linear quad-spi controller volatile u32 lqspi_sts;\/\/\/&lt; Address: 0xA4 - status reg specially for the linear quad-spi controller }QspiLqspi_t;  typedef struct{ volatile u32 mod_id;\/\/\/&lt; Address: 0xFC - module identification }QspiMod_t;  typedef struct{ QspiBank_t* QSpiBank; QspiTx_t*   QSpiTx; QspiLqspi_t*QSpiLqspi; QspiMod_t* QSpiMode; }Qspi_Typedef;  typedef struct{ Qspi_Typedef *pPort; XQspiPs* pPortPs; HAL_QSPI_StateTypeDef_tState; u32*pTxBuff; u8*pRxBuff; u32XferCount; intNumSector; intNumBlock; }Qspi_t;  u32 InitialQspi();  extern Qspi_tpQspi; extern XQspiPs pQspiPs; extern XQspiPs *QspiInstancePtr;  #endif \/\/QSPI_DRIVER_ZYNQ <\/code><\/pre>\n<pre><code>#if defined(ZYNQ_AD)  #include \"qspi_driver_zynq.h\"  Qspi_t pQspi; XQspiPs pQspiPs; XQspiPs *QspiInstancePtr;  u32 FlashReadBaseAddress; u32 QspiFlashSize; u32 QspiFlashMake; u32 FlashReadBaseAddress; u8 LinearBootDeviceFlag;  \/**  * @brief \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 Qspi \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0430\u044f, \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u0432 Vitis (\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 qspi)  * @return \u0421\u0442\u0430\u0442\u0443\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 XST_SUCCESS\/XST_FAILURE  *\/ u32 InitialQspi() { XQspiPs_Config *QspiConfig; int Status; QspiInstancePtr = &amp;pQspiPs; \/*  * Initialize the QSPI driver so that it's ready to use  *\/ QspiConfig = XQspiPs_LookupConfig(QSPI_DEVICE_ID); if (NULL == QspiConfig) { return XST_FAILURE; } Status = XQspiPs_CfgInitialize(QspiInstancePtr, QspiConfig, QspiConfig-&gt;BaseAddress); if (Status != XST_SUCCESS) { return XST_FAILURE; } \/*  * Set Manual Chip select options and drive HOLD_B pin high.  *\/ XQspiPs_SetOptions(QspiInstancePtr, XQSPIPS_FORCE_SSELECT_OPTION | XQSPIPS_HOLD_B_DRIVE_OPTION); \/*  * Set the prescaler for QSPI clock  *\/ XQspiPs_SetClkPrescaler(QspiInstancePtr, XQSPIPS_CLK_PRESCALE_8); \/*  * Assert the FLASH chip select.  *\/ XQspiPs_SetSlaveSelect(QspiInstancePtr); \/*  * Read Flash ID and extract Manufacture and Size information  *\/ Status = FlashReadID(); if (Status != XST_SUCCESS) { return XST_FAILURE; } return XST_SUCCESS; }  #endif \/\/defined(ZYNQ_AD) <\/code><\/pre>\n<p>\u0412 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435\u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e. \u0412\u0437\u044f\u0442\u044b \u0430\u0434\u0440\u0435\u0441\u0430 \u043f\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c\u0443 \u043c\u043a, \u0432\u044b\u0432\u0435\u043b \u0432\u0441\u0435 \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u043d\u0443\u0436\u043d\u044b\u0435 \u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u0442\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u044b\u043c\u0438, \u0438\u0437 \u0444\u0430\u0439\u043b\u043e\u0432 \u0441\u0430\u043c\u043e\u0439 \u041f\u041b\u0418\u0421, \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u044b \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u0438 \u0432\u0442\u043e\u0440\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u044b\u0445 \u0432\u0435\u0449\u0435\u0439, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u043d\u0430 \u0431\u0443\u0444\u0435\u0440\u0430, \u043d\u043e\u043c\u0435\u0440\u0430 \u0441\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0438 \u0431\u043b\u043e\u043a\u043e\u0432 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. <br \/>\u0412 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u043d\u0438\u0447\u0435\u0433\u043e \u043c\u0443\u0434\u0440\u0435\u043d\u043e\u0433\u043e \u0442\u043e\u0436\u0435 \u043d\u0435\u0442, \u0432\u044b\u0432\u0435\u0434\u0435\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u0432 \u041f\u041b\u0418\u0421, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 QSPI. \u0412 \u0432\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0435 \u0434\u0432\u0430 \u0444\u0430\u0439\u043b\u0438\u043a\u0430 \u0438 Ctrl+C, Ctrl+V.<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0438 \u0432\u044b\u0437\u0432\u0430\u043d\u0430 \u043e\u043d\u0430 \u0432 \u043c\u0435\u0439\u043d \u0438\u043b\u0438 \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u043c \u0444\u0430\u0439\u043b\u0435 \u0438\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439(\u0430\u044f) \u0443 \u0432\u0430\u0441 \u043e\u0442\u0432\u0435\u0434\u0435\u043d(\u043d\u0430) \u0434\u043b\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<pre><code>extern Qspi_t pQspi; extern XQspiPspQspiPs; Qspi_t*  Qspi;  \/**  * @brief \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0438\u0444\u0438\u0440\u0438\u0438 QSPI \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 flash memory  * @param[in] pQspi - \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043f\u0435\u0440\u0438\u0444\u0435\u0440\u0438\u0438 qspi  * @param[in] pQspiPs - \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 qspi  * @param[in] pRxBuff - \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0431\u0443\u0444\u0435\u0440  *\/ static void QspiDefaultInit(Qspi_t* pQspi, XQspiPs* pQspiPs, void* pRxBuff) { pQspi-&gt;pPortPs = pQspiPs; pQspi-&gt;pRxBuff = (u8*)pRxBuff; pQspi-&gt;XferCount = 0; pQspi-&gt;State = HAL_SPIQF_STATE_RESET; \/\/ \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 qspi pQspi-&gt;pPort= malloc(sizeof(Qspi_Typedef)); pQspi-&gt;pPort-&gt;QSpiBank = QSPI_BANK; pQspi-&gt;pPort-&gt;QSpiTx = QSPI_TX; pQspi-&gt;pPort-&gt;QSpiLqspi = QSPI_LQSPI; pQspi-&gt;pPort-&gt;QSpiMode = QSPI_MOD;  InitialQspi(); }<\/code><\/pre>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043c\u044b \u043a\u043e\u043b\u0438\u043c \u0433\u0434\u0435 \u0443\u0433\u043e\u0434\u043d\u043e \u043f\u0435\u0440\u0435\u0434 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c qspi. <\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-467105","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/467105","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=467105"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/467105\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=467105"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=467105"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=467105"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}