Записки инженера » Архив сайта » Микроконтроллер – работаем с SD картой без файловой системы.htm 400 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml" lang="ru-RU"><head profile="http://gmpg.org/xfn/11">
  3. <meta name="yandex-verification" content="79f59c6192737b18">
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  5. <title>Записки инженера » Архив сайта » Микроконтроллер – работаем с SD картой без файловой системы</title>
  6. <meta name="description" content="Все о разработке web сайтов доступным и понятным языком. Администрирование Linux/Unix.">
  7. <meta name="keywords" content="OpenCart, 1С-Битрикс ,HTML, WEB, PHP, JavaScript, MySQL, SQL, CSS, POST, GET, Linux, Unix, Wordpress ">
  8. <meta name="generator" content="WordPress 3.5"><!-- leave this for stats -->
  9. <link rel="stylesheet" href="%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D0%BA%D0%B8%20%D0%B8%D0%BD%D0%B6%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%20%C2%BB%20%D0%90%D1%80%D1%85%D0%B8%D0%B2%20%D1%81%D0%B0%D0%B9%D1%82%D0%B0%20%C2%BB%20%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%BB%D0%B5%D1%80%20%E2%80%93%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D0%BC%20%D1%81%20SD%20%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D0%B9%20%D0%B1%D0%B5%D0%B7%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%BE%D0%B9%20%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_files/style.css" type="text/css" media="screen">
  10. <link rel="alternate" type="application/rss+xml" title="Записки инженера RSS Feed" href="http://s-engineer.ru/feed/">
  11. <link rel="pingback" href="http://s-engineer.ru/xmlrpc.php">
  12. <link rel="alternate" type="application/rss+xml" title="Записки инженера » Лента комментариев к «Микроконтроллер – работаем с SD картой без файловой системы»" href="http://s-engineer.ru/mikrokontroller-rabotaem-s-sd-kartoj-bez-fajlovoj-sistemoj/feed/">
  13. <link rel="stylesheet" id="crayon_style-css" href="%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D0%BA%D0%B8%20%D0%B8%D0%BD%D0%B6%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%20%C2%BB%20%D0%90%D1%80%D1%85%D0%B8%D0%B2%20%D1%81%D0%B0%D0%B9%D1%82%D0%B0%20%C2%BB%20%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%BB%D0%B5%D1%80%20%E2%80%93%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D0%BC%20%D1%81%20SD%20%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D0%B9%20%D0%B1%D0%B5%D0%B7%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%BE%D0%B9%20%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_files/crayon_style.css" type="text/css" media="all">
  14. <link rel="stylesheet" id="crayon_global_style-css" href="%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D0%BA%D0%B8%20%D0%B8%D0%BD%D0%B6%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%20%C2%BB%20%D0%90%D1%80%D1%85%D0%B8%D0%B2%20%D1%81%D0%B0%D0%B9%D1%82%D0%B0%20%C2%BB%20%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%BB%D0%B5%D1%80%20%E2%80%93%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D0%BC%20%D1%81%20SD%20%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D0%B9%20%D0%B1%D0%B5%D0%B7%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%BE%D0%B9%20%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_files/global_style.css" type="text/css" media="all">
  15. <link rel="stylesheet" id="crayon-theme-ado-css" href="%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D0%BA%D0%B8%20%D0%B8%D0%BD%D0%B6%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%20%C2%BB%20%D0%90%D1%80%D1%85%D0%B8%D0%B2%20%D1%81%D0%B0%D0%B9%D1%82%D0%B0%20%C2%BB%20%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%BB%D0%B5%D1%80%20%E2%80%93%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D0%BC%20%D1%81%20SD%20%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D0%B9%20%D0%B1%D0%B5%D0%B7%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%BE%D0%B9%20%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_files/ado.css" type="text/css" media="all">
  16. <link rel="stylesheet" id="crayon-font-monaco-css" href="%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D0%BA%D0%B8%20%D0%B8%D0%BD%D0%B6%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%20%C2%BB%20%D0%90%D1%80%D1%85%D0%B8%D0%B2%20%D1%81%D0%B0%D0%B9%D1%82%D0%B0%20%C2%BB%20%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%BB%D0%B5%D1%80%20%E2%80%93%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D0%BC%20%D1%81%20SD%20%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D0%B9%20%D0%B1%D0%B5%D0%B7%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%BE%D0%B9%20%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_files/monaco.css" type="text/css" media="all">
  17. <link rel="stylesheet" id="cptch_stylesheet-css" href="%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D0%BA%D0%B8%20%D0%B8%D0%BD%D0%B6%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%20%C2%BB%20%D0%90%D1%80%D1%85%D0%B8%D0%B2%20%D1%81%D0%B0%D0%B9%D1%82%D0%B0%20%C2%BB%20%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%BB%D0%B5%D1%80%20%E2%80%93%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D0%BC%20%D1%81%20SD%20%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D0%B9%20%D0%B1%D0%B5%D0%B7%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%BE%D0%B9%20%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_files/style_wp_before_3.css" type="text/css" media="all">
  18. <link rel="stylesheet" id="yarpp-thumbnails-yarpp-thumbnail-css" href="%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D0%BA%D0%B8%20%D0%B8%D0%BD%D0%B6%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%20%C2%BB%20%D0%90%D1%80%D1%85%D0%B8%D0%B2%20%D1%81%D0%B0%D0%B9%D1%82%D0%B0%20%C2%BB%20%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%BB%D0%B5%D1%80%20%E2%80%93%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D0%BC%20%D1%81%20SD%20%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D0%B9%20%D0%B1%D0%B5%D0%B7%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%BE%D0%B9%20%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_files/styles-thumbnails.css" type="text/css" media="all">
  19. <link rel="stylesheet" id="wp-pagenavi-css" href="%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D0%BA%D0%B8%20%D0%B8%D0%BD%D0%B6%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%20%C2%BB%20%D0%90%D1%80%D1%85%D0%B8%D0%B2%20%D1%81%D0%B0%D0%B9%D1%82%D0%B0%20%C2%BB%20%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%BB%D0%B5%D1%80%20%E2%80%93%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D0%BC%20%D1%81%20SD%20%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D0%B9%20%D0%B1%D0%B5%D0%B7%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%BE%D0%B9%20%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_files/pagenavi-css.css" type="text/css" media="all">
  20. <script type="text/javascript" src="%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D0%BA%D0%B8%20%D0%B8%D0%BD%D0%B6%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%20%C2%BB%20%D0%90%D1%80%D1%85%D0%B8%D0%B2%20%D1%81%D0%B0%D0%B9%D1%82%D0%B0%20%C2%BB%20%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%BB%D0%B5%D1%80%20%E2%80%93%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D0%BC%20%D1%81%20SD%20%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D0%B9%20%D0%B1%D0%B5%D0%B7%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%BE%D0%B9%20%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_files/jquery.js"></script>
  21. <script type="text/javascript">
  22. /* <![CDATA[ */
  23. var CrayonSyntaxSettings = {"is_admin":"0","ajaxurl":"http:\/\/s-engineer.ru\/wp-admin\/admin-ajax.php","prefix":"crayon-","setting":"crayon-setting","selected":"crayon-setting-selected","changed":"crayon-setting-changed","special":"crayon-setting-special","orig_value":"data-orig-value"};
  24. /* ]]> */
  25. </script>
  26. <script type="text/javascript" src="%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D0%BA%D0%B8%20%D0%B8%D0%BD%D0%B6%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%20%C2%BB%20%D0%90%D1%80%D1%85%D0%B8%D0%B2%20%D1%81%D0%B0%D0%B9%D1%82%D0%B0%20%C2%BB%20%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%BB%D0%B5%D1%80%20%E2%80%93%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D0%BC%20%D1%81%20SD%20%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D0%B9%20%D0%B1%D0%B5%D0%B7%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%BE%D0%B9%20%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_files/util.js"></script>
  27. <script type="text/javascript" src="%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D0%BA%D0%B8%20%D0%B8%D0%BD%D0%B6%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%20%C2%BB%20%D0%90%D1%80%D1%85%D0%B8%D0%B2%20%D1%81%D0%B0%D0%B9%D1%82%D0%B0%20%C2%BB%20%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%BB%D0%B5%D1%80%20%E2%80%93%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D0%BC%20%D1%81%20SD%20%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D0%B9%20%D0%B1%D0%B5%D0%B7%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%BE%D0%B9%20%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_files/jquery_002.js"></script>
  28. <script type="text/javascript" src="%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D0%BA%D0%B8%20%D0%B8%D0%BD%D0%B6%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%20%C2%BB%20%D0%90%D1%80%D1%85%D0%B8%D0%B2%20%D1%81%D0%B0%D0%B9%D1%82%D0%B0%20%C2%BB%20%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%BB%D0%B5%D1%80%20%E2%80%93%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D0%BC%20%D1%81%20SD%20%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D0%B9%20%D0%B1%D0%B5%D0%B7%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%BE%D0%B9%20%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_files/crayon.js"></script>
  29. <link rel="EditURI" type="application/rsd+xml" title="RSD" href="http://s-engineer.ru/xmlrpc.php?rsd">
  30. <link rel="wlwmanifest" type="application/wlwmanifest+xml" href="http://s-engineer.ru/wp-includes/wlwmanifest.xml">
  31. <link rel="prev" title="Как подключить SD карту к микроконтроллеру? (примитивный способ)" href="http://s-engineer.ru/kak-podklyuchit-sd-kartu-k-mikrokontrolleru-primitivnyj-sposob/">
  32. <link rel="next" title="SSH-доступ по ключу (FreeBSD)" href="http://s-engineer.ru/ssh-dostup-po-klyuchu-freebsd/">
  33. <meta name="generator" content="WordPress 3.5">
  34. <link rel="canonical" href="http://s-engineer.ru/mikrokontroller-rabotaem-s-sd-kartoj-bez-fajlovoj-sistemoj/">
  35. <link rel="shortlink" href="http://s-engineer.ru/?p=3845">
  36. <!-- Wordpress Popular Posts v2.3.7 -->
  37. <script type="text/javascript">
  38. /* <![CDATA[ */
  39. jQuery.post('http://s-engineer.ru/wp-admin/admin-ajax.php', {action: 'wpp_update', token: 'addd2087ce', id: 3845}, function(data){/*alert(data);*/});
  40. /* ]]> */
  41. </script>
  42. <!-- End Wordpress Popular Posts v2.3.7 -->
  43. <!-- Yandex buttons share -->
  44. <script type="text/javascript" src="%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D0%BA%D0%B8%20%D0%B8%D0%BD%D0%B6%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%20%C2%BB%20%D0%90%D1%80%D1%85%D0%B8%D0%B2%20%D1%81%D0%B0%D0%B9%D1%82%D0%B0%20%C2%BB%20%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%BB%D0%B5%D1%80%20%E2%80%93%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D0%BC%20%D1%81%20SD%20%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D0%B9%20%D0%B1%D0%B5%D0%B7%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%BE%D0%B9%20%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_files/share.js" charset="utf-8"></script>
  45. <!-- /Yandex buttons share -->
  46. </head>
  47. <body>
  48. <!-- СЧЕТЧИК -->
  49. <!-- Yandex.Metrika counter -->
  50. <script type="text/javascript">
  51. (function (d, w, c) {
  52. (w[c] = w[c] || []).push(function() {
  53. try {
  54. w.yaCounter18982588 = new Ya.Metrika({id:18982588,
  55. webvisor:true,
  56. clickmap:true,
  57. trackLinks:true,
  58. accurateTrackBounce:true});
  59. } catch(e) { }
  60. });
  61. var n = d.getElementsByTagName("script")[0],
  62. s = d.createElement("script"),
  63. f = function () { n.parentNode.insertBefore(s, n); };
  64. s.type = "text/javascript";
  65. s.async = true;
  66. s.src = (d.location.protocol == "https:" ? "https:" : "http:") + "//mc.yandex.ru/metrika/watch.js";
  67. if (w.opera == "[object Opera]") {
  68. d.addEventListener("DOMContentLoaded", f, false);
  69. } else { f(); }
  70. })(document, window, "yandex_metrika_callbacks");
  71. </script>
  72. <noscript><div><img src="//mc.yandex.ru/watch/18982588" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
  73. <!-- /Yandex.Metrika counter -->
  74. <!-- Rating@Mail.ru counter -->
  75. <script type="text/javascript">//<![CDATA[
  76. var _tmr = _tmr || [];
  77. _tmr.push({id: "2423022", type: "pageView", start: (new Date()).getTime()});
  78. (function (d, w) {
  79. var ts = d.createElement("script"); ts.type = "text/javascript"; ts.async = true;
  80. ts.src = (d.location.protocol == "https:" ? "https:" : "http:") + "//top-fwz1.mail.ru/js/code.js";
  81. var f = function () {var s = d.getElementsByTagName("script")[0]; s.parentNode.insertBefore(ts, s);};
  82. if (w.opera == "[object Opera]") { d.addEventListener("DOMContentLoaded", f, false); } else { f(); }
  83. })(document, window);
  84. //]]></script><noscript><div style="position:absolute;left:-10000px;">
  85. <img title="[top-fwz1.mail.ru] Рейтинг@Mail.ru" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" style="border: 1px solid rgb(255, 204, 204); background-repeat: no-repeat; background-position: center center; background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9gMFRANL5LXnioAAAJWSURBVDjLnZI/ixtXFMV/972ZNzPSrmTtalexlsWBGMfEYOzaVciXyKdIkW/hFKnS22WafIDUxk0g2AQSgm0csIPWK42ktaSRNPP+pRBK5SLOqS7cew7ccw4xxrPJ+8XdHx4+7AE8e3Cj++zLm71fvrqT8x+QAK35dJr2n/x89urTa+eDm/cS+eI2y3eT+Lx/bt8u1vNqfDH++teXdk/6ThAfUUBIgL9ku75z/8WL7LOlhXIGJ0Pyw75wMcnGv//xSQ2DH4ddu9k01dXWsWzcofhYaiiViLjiWi9UWQa1gzcjWF7hgfzzW5ydnXB62JLjg0PTLfJertNepnQSIA+gE4Cs03UuNYYQYP4e5jPogmSG9vA6rrjC+0AxN2i5Qk0DpXVJhCQB0EVRrzqdFgB1DZfvCDHixiV2NqO6LHHKIKnQMoaWbFBgIrQVgIXaDc+JCHgP5QRZr4jzGWFbo6yncRYviiiQKUhBRch3Lyix4bgPWsAkcDkmZAV2OiE0DaI1WoEShRKF3sWnmt01pFBnJydEpZDEwHSGt47lYsls43AIXjTWV9R1Qx0DGahqLyAhbqrj0/ib0nRzXNoyCo0Kkor2llV0eKOwdUMg4pSQA7JPQXvnJv1B+GlwOvrGlaXB6fV2lb5t6qOtike56DSJgYDGBQcOAsQAfueBMeHR48fhadb1j/58HWARdt6yBv7+/vpBe2o5OogxlcaKdt5aKCNsk309W0WxKQjmQ33/9mJVAdWHdmo/tNvtRZIkfCz+ZQwGg6rT6Zj/LTAajTbD4bD5WIF/AAseEisPFO8uAAAAAElFTkSuQmCC");" alt="Рейтинг@Mail.ru" height="1" width="1">
  86. </div></noscript>
  87. <!-- //Rating@Mail.ru counter -->
  88. <!-- КОНЕЦ СЧЕТЧИКУ -->
  89. <!-- слой для баннера vds24 -->
  90. <div id="layer_for_banner" style="position:relative; width:940px; margin: 0px auto;">
  91. <div id="header">
  92. <div id="logo">
  93. <h1><a href="http://s-engineer.ru/">Записки инженера</a></h1>
  94. <p>заметки по IT технологиям</p>
  95. </div>
  96. </div>
  97. <!-- end header -->
  98. <div id="menu">
  99. <ul>
  100. <li class="current_page_item"><a href="http://s-engineer.ru/" class="current_page_item">Главная</a></li>
  101. <li class="page_item page-item-1911"><a href="http://s-engineer.ru/karta-sajta/">Карта сайта</a></li>
  102. <li class="page_item page-item-3901"><a href="http://s-engineer.ru/xtkem/">ХТКЭМ</a></li>
  103. </ul>
  104. </div>
  105. <!-- end menu -->
  106. <!--баннер vds24 -->
  107. <!-- <div style="position:absolute; bottom:0px; right:0px;">
  108. <a href="http://vds24.net/vds-hosting/" rel="nofollow" target="_blank">
  109. <img alt="VDS Хостинг для Ваших проектов" src="http://vds24.net/wp-content/uploads/2013/06/ee5TJL5E8ZRwjcRx8mbH.gif" width="250" height="250" />
  110. </a>
  111. </div> -->
  112. <!--конец баннеру vds24 -->
  113. </div>
  114. <!--конец слой для баннера vds24 -->
  115. <div id="wrapper">
  116. <div id="page">
  117. <div id="page-bgtop">
  118. <div id="content">
  119. <center>
  120. </center>
  121. <div class="post" id="post-3845">
  122. <h2 class="title"><a href="http://s-engineer.ru/mikrokontroller-rabotaem-s-sd-kartoj-bez-fajlovoj-sistemoj/" rel="bookmark" title="Постоянная ссылка: Микроконтроллер – работаем с SD картой без файловой системы">Микроконтроллер – работаем с SD картой без файловой системы</a></h2>
  123. <div class="entry">
  124. <p>&nbsp;<br>
  125. <img class="aligncenter size-full wp-image-3892" alt="microcontroller_sd" src="%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D0%BA%D0%B8%20%D0%B8%D0%BD%D0%B6%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%20%C2%BB%20%D0%90%D1%80%D1%85%D0%B8%D0%B2%20%D1%81%D0%B0%D0%B9%D1%82%D0%B0%20%C2%BB%20%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%BB%D0%B5%D1%80%20%E2%80%93%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D0%BC%20%D1%81%20SD%20%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D0%B9%20%D0%B1%D0%B5%D0%B7%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%BE%D0%B9%20%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_files/microcontroller_sd.jpg" height="428" width="430"><br>
  126. &nbsp;<br>
  127. В данном посте, я расскажу как работать с SD картой без файловой системы. Я покажу как:</p>
  128. <p>&nbsp;</p>
  129. <p><a href="#2">Как проводить инициализацию SD карты?</a></p>
  130. <p><a href="#3">Как писать данные на SD карту?</a></p>
  131. <p><a href="#4">Как читать данные с SD карты?</a></p>
  132. <p><a href="#5">Как читать регистры SD карты (на примере регистра CID)?</a><br>
  133. <span id="more-3845"></span><br>
  134. &nbsp;</p>
  135. <p>&nbsp;</p>
  136. <div><div style="padding:8px 0px 8px 8px;">
  137. <!-- google adsense (top2) -->
  138. <script async="" src="%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D0%BA%D0%B8%20%D0%B8%D0%BD%D0%B6%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%20%C2%BB%20%D0%90%D1%80%D1%85%D0%B8%D0%B2%20%D1%81%D0%B0%D0%B9%D1%82%D0%B0%20%C2%BB%20%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%BB%D0%B5%D1%80%20%E2%80%93%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D0%BC%20%D1%81%20SD%20%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D0%B9%20%D0%B1%D0%B5%D0%B7%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%BE%D0%B9%20%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_files/adsbygoogle.js"></script>
  139. <ins class="adsbygoogle" style="display:inline-block;width:468px;height:60px" data-ad-client="ca-pub-7548259700415477" data-ad-slot="4246257742"></ins>
  140. <script>
  141. (adsbygoogle = window.adsbygoogle || []).push({});
  142. </script>
  143. <!-- end google adsense (top2) -->
  144. </div></div><p>В качестве контроллера я буду использовать<strong> ATmega328P</strong>&nbsp;(или Arduino UNO). &nbsp;Поехали…<br>
  145. <!--more--><br>
  146. &nbsp;</p>
  147. <p>&nbsp;</p>
  148. <h2 id="1">Откуда я беру информацию?</h2>
  149. <p>&nbsp;</p>
  150. <p>Итак, как всегда, первым делом я укажу <a href="https://www.sdcard.org/" rel="nofollow">официальной источник информации по SD картам</a>, который расскажет о том как работать с данными картами памяти.</p>
  151. <p>На сайте, в левой колонки перейдите в раздел&nbsp;<strong>Downloads</strong> -&gt;<strong> Simplifed Specifications</strong>,&nbsp;соглашаетесь и жмете «<strong>I Accept</strong>» и качаете «<strong>Physical Layer Simplified Specification</strong>».</p>
  152. <p>В результате вы скачаете pdf документ – спецификацию на SD карты, в
  153. ней все подробным образом раскачано какие бывают карты и как с ними
  154. работать.</p>
  155. <p>&nbsp;</p>
  156. <div><div style="padding:8px 0px 8px 8px;">
  157. <!-- google adsense (top3) -->
  158. <script async="" src="%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D0%BA%D0%B8%20%D0%B8%D0%BD%D0%B6%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%20%C2%BB%20%D0%90%D1%80%D1%85%D0%B8%D0%B2%20%D1%81%D0%B0%D0%B9%D1%82%D0%B0%20%C2%BB%20%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%BB%D0%B5%D1%80%20%E2%80%93%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D0%BC%20%D1%81%20SD%20%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D0%B9%20%D0%B1%D0%B5%D0%B7%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%BE%D0%B9%20%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_files/adsbygoogle.js"></script>
  159. <!-- s-engineer (top3) -->
  160. <ins class="adsbygoogle" style="display:inline-block;width:468px;height:60px" data-ad-client="ca-pub-7548259700415477" data-ad-slot="8519818945"></ins>
  161. <script>
  162. (adsbygoogle = window.adsbygoogle || []).push({});
  163. </script>
  164. <!-- end google adsense (top3) -->
  165. </div></div><p>Информацию для данного поста я черпал из данной спецификации, форумов и личного опыта.</p>
  166. <p>&nbsp;</p>
  167. <p>&nbsp;</p>
  168. <h2>Кратко о SD карте</h2>
  169. <p>&nbsp;</p>
  170. <p>SD карта (или&nbsp;Secure Digital Memory Card – безопасная цифровая
  171. карта памяти) представляет собой микроконтроллер и микросхему FLASH
  172. памяти.</p>
  173. <p>&nbsp;</p>
  174. <p>SD карта может работать в двух режимах</p>
  175. <ul>
  176. <li><strong>режим SD</strong>&nbsp;(свой родной протокол обмена данными)</li>
  177. <li><strong>режим SPI</strong>&nbsp;(в качестве интерфейса SD карта использует – SPI)</li>
  178. </ul>
  179. <p>Мы будем рассматривать работу<strong>&nbsp;с картой в режиме SPI</strong>. Что это за интерфейс и как с ним работать вы можете прочесть в посте “интерфейс SPI”.</p>
  180. <p>С точки зрения интерфейса SPI, SD карта имеет следующие разъемы:</p>
  181. <p>&nbsp;</p>
  182. <p><a href="http://s-engineer.ru/mikrokontroller-rabotaem-s-sd-kartoj-bez-fajlovoj-sistemoj/sd_card_connectors/" rel="attachment wp-att-3892"><img class="aligncenter size-full wp-image-3892" alt="SD_card_connectors" src="%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D0%BA%D0%B8%20%D0%B8%D0%BD%D0%B6%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%20%C2%BB%20%D0%90%D1%80%D1%85%D0%B8%D0%B2%20%D1%81%D0%B0%D0%B9%D1%82%D0%B0%20%C2%BB%20%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%BB%D0%B5%D1%80%20%E2%80%93%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D0%BC%20%D1%81%20SD%20%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D0%B9%20%D0%B1%D0%B5%D0%B7%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%BE%D0%B9%20%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_files/SD_card_connectors.jpg" height="311" width="500"></a></p>
  183. <p>Где</p>
  184. <p><strong>DO</strong> – разъем для получения данных с SD карты</p>
  185. <p><strong>DI</strong> – разъем для передачи данных SD карты</p>
  186. <p><strong>SCLK</strong> – разъем для синхроимпульсов</p>
  187. <p><strong>CS</strong> – разъем “выбор ведомого”</p>
  188. <p><strong>Vss</strong> – земля</p>
  189. <p><strong>Vdd</strong> – разъем питания, от <strong>2.7</strong> до <strong>3.6</strong> <strong>В</strong>.</p>
  190. <p>&nbsp;</p>
  191. <p>P.S. Повторюсь, карта работает при питание от<strong>&nbsp;2.7</strong>&nbsp;до&nbsp;<strong>3.6 В</strong>, потреблению по току не более&nbsp;<strong>100 мА</strong>. Входные данные и тактовый сигнал, также должен быть в этом диапазоне.</p>
  192. <p>&nbsp;</p>
  193. <p><a title="Как подключить SD карту к микроконтроллеру? (примитивный способ)" href="http://s-engineer.ru/kak-podklyuchit-sd-kartu-k-mikrokontrolleru-primitivnyj-sposob/">Как подключить SD карту?</a>&nbsp;(отдельный пост)<br>
  194. <a href="#6">Где я могу проверить данный код, если у меня нет ATmega328P?</a></p>
  195. <p>&nbsp;</p>
  196. <p>Подходим к сути поста, с SD картой можно работать<strong>&nbsp;напрямую</strong> (без применения файловой системы) как с<strong>&nbsp;простым элементом памяти</strong>. Принцип прост, если нам нужно<strong> считать что-либо</strong>, то мы отсылаем<strong> команду-запрос на чтение</strong> определенного блока памяти, далее<strong> карта возвращает этот блок данных</strong>. Если нужно <strong>записать что-то</strong>, то мы отправляем <strong>команду-запрос на запись</strong> с указанием куда писать данные. Далее после небольшого ожидания, отправляем<strong> блок данных который нужно записать на карту</strong>. Остается только разобраться в технических подробностях, как эти команды отсылать и как &nbsp;получать/передавать данные.</p>
  197. <p>&nbsp;</p>
  198. <p>Разбираемся далее…</p>
  199. <p>&nbsp;</p>
  200. <p>&nbsp;</p>
  201. <h2>Как общаются с SD картами?</h2>
  202. <p>&nbsp;</p>
  203. <p>&nbsp;</p>
  204. <h3>Взгляд из далека…</h3>
  205. <p>&nbsp;</p>
  206. <p>С помощью интерфейса <strong>SPI</strong> на <strong>SD карту</strong> посылают <strong>кадр-команду, </strong>которая<strong>&nbsp;</strong>имеет длину <strong>6 байт</strong>, т.е. <strong>6 пакетов SPI</strong>. В результате переданной команды, <strong>SD карта через некоторое время</strong> (которое может длиться от 0 до 8 байт или от 0-ля до 8-ми пакетов SPI) <strong>возвращает ответ</strong>. Ответ может быть как отчет об ошибках так и отчет о удачной полученной команды.</p>
  207. <p><strong>После переданной команды</strong>, SD карте можно <strong>передавать данные для записи</strong> или<strong> получать считанные данные</strong>. Данные передаются<strong> всегда блоками по 512 байт</strong> (или по <strong>512 пакетов SPI</strong>). Послать или получить<strong> 1-ин байт</strong> данных&nbsp;<strong>нам не удаться</strong>, мы манипулируем <strong>только 512-и&nbsp;байтными блоками</strong> данных. Опять-же, если вам нужно изменить<strong>&nbsp;несколько байтов</strong> &nbsp;на SD карте, то для начала вы должны <strong>прочесть 512 байтный</strong> блок, <strong>изменить</strong> нужные байт, далее его <strong>записать обратно</strong>, иначе ни как.</p>
  208. <p>&nbsp;</p>
  209. <p>&nbsp;</p>
  210. <h3>Погрузимся по глубже…</h3>
  211. <p>&nbsp;</p>
  212. <p>Я уже не раз повторял команды… команды записи/чтения, давайте разберемся какие бывают команды?</p>
  213. <p>Приведу некоторые, наиболее часто используемые, полных список вы можете <a href="#1">найти в спецификации на SD карты</a></p>
  214. <p style="text-align: center;">&nbsp;(картинка кликабельна)</p>
  215. <p><a href="http://s-engineer.ru/mikrokontroller-rabotaem-s-sd-kartoj-bez-fajlovoj-sistemoj/commands_sd/" rel="attachment wp-att-3884"><img class="aligncenter size-full wp-image-3884" alt="commands_SD" src="%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D0%BA%D0%B8%20%D0%B8%D0%BD%D0%B6%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%20%C2%BB%20%D0%90%D1%80%D1%85%D0%B8%D0%B2%20%D1%81%D0%B0%D0%B9%D1%82%D0%B0%20%C2%BB%20%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%BB%D0%B5%D1%80%20%E2%80%93%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D0%BC%20%D1%81%20SD%20%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D0%B9%20%D0%B1%D0%B5%D0%B7%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%BE%D0%B9%20%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_files/commands_SD.jpg" height="731" width="886"></a></p>
  216. <p>&nbsp;</p>
  217. <p>Команда имеет следующую структуру:</p>
  218. <p><a href="http://s-engineer.ru/mikrokontroller-rabotaem-s-sd-kartoj-bez-fajlovoj-sistemoj/structure_command_sd/" rel="attachment wp-att-3887"><img class="aligncenter size-full wp-image-3887" alt="structure_command_SD" src="%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D0%BA%D0%B8%20%D0%B8%D0%BD%D0%B6%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%20%C2%BB%20%D0%90%D1%80%D1%85%D0%B8%D0%B2%20%D1%81%D0%B0%D0%B9%D1%82%D0%B0%20%C2%BB%20%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%BB%D0%B5%D1%80%20%E2%80%93%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D0%BC%20%D1%81%20SD%20%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D0%B9%20%D0%B1%D0%B5%D0%B7%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%BE%D0%B9%20%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_files/structure_command_SD.jpg" height="168" width="591"></a></p>
  219. <p>&nbsp;</p>
  220. <p>Сначала идет <strong>01</strong>, далее <strong>индекс команды</strong>, который соответствует <strong>порядковому номеру команды</strong>, т.е. CMD0, CMD1, CMD2, CMD3 и т.п. На этом кончился первый байт команды, далее идет <strong>4-е байтовый аргумент</strong>. Последний байт <strong>это контрольная сумма по алгоритму CRC</strong>.</p>
  221. <p>&nbsp;</p>
  222. <p>&nbsp;</p>
  223. <h1 id="2">Как проводить инициализацию SD карты?</h1>
  224. <p>&nbsp;</p>
  225. <p>SD карта это не просто кусок пластика, как может показаться на первый
  226. взгляд, повторюсь, внутри неё находиться &nbsp;собственный контроллер с
  227. своим программным обеспечением. А как любой компьютер его надо еще
  228. запустить или проинициализировать, причем в нужном нам режиме. Я приведу
  229. <strong>порядок действий</strong>, который нужно <strong>совершить с SD картой</strong>, для её<strong> инициализации</strong>.</p>
  230. <p>&nbsp;</p>
  231. <p><strong>1.</strong> После подключения карты к питанию нужно дождаться
  232. пока питающие напряжение на карте не достигнет рабочего, обычно для
  233. этого надо <strong>подождать несколько миллисекунд</strong>.</p>
  234. <p><strong>2</strong>. Далее &nbsp;нужно <strong>проинициализировать&nbsp;SPI в режиме 0-ль</strong> (что это за режим? вы можете прочесть в “интерфейс SPI”)</p>
  235. <p><b>3</b>. Далее, нужно установить на контактах карты <strong>CS</strong> и <strong>DI</strong> (для контролера это выход <strong>MOSI </strong>и любой тот выход которые вы <strong>используете как CS</strong> на контролере) <strong>логическую единицу</strong> и <strong>подать на контакт CLK – 74 синхроимпульса</strong> (для контролера это выход <strong>SCK</strong>), <strong>можно и больше, главное, чтоб не меньше</strong>. После чего <strong>CS нужно установить в нулевой уровень</strong></p>
  236. <p>&nbsp;</p>
  237. <p>Как это делается?</p>
  238. <p>Установить логическую <strong>единицу на выход контролера CS проблем быть не должно</strong>, а вот как установить <strong>логическую единицу на MOSI</strong> и <strong>подать 74-е синхроимпульса может немного озадачить</strong>. Обычно это делается так: в теле цикла в <strong>регистр данных SPI записывают значение 0xFF</strong>, условие цикла должно соответствовать <strong>не менее 10 итерациям</strong>. Далее на <strong>CS устанавливают логический ноль</strong>.</p>
  239. <p>&nbsp;</p>
  240. <p>Пример “фрагмент кода для Arduino”:</p><!-- Crayon Syntax Highlighter v1.17 -->
  241. <div id="crayon-55a8b9b3aa7f6" class="crayon-syntax crayon-theme-ado crayon-font-monaco crayon-os-pc print-yes" data-settings=" scroll-mouseover" style=" margin-top: 12px; margin-bottom: 12px; float: none; clear: both; font-size: 12px !important; line-height: 15px !important;">
  242. <div class="crayon-toolbar" data-settings=" mouseover overlay delay" style="height: 18px !important; line-height: 18px !important;">
  243. <div class="crayon-tools"><a class="crayon-copy-button crayon-button" data-text="Нажмите %s для копирования, %s для вставки" title="Копировать как текст"></a><a class="crayon-popup-button crayon-button" title="Показать код в новом окне" onclick="return false;"></a></div></div>
  244. <div class="crayon-info" style="min-height: 15px !important; line-height: 15px !important;"></div>
  245. <div class="crayon-plain-wrap"><textarea class="crayon-plain print-no" data-settings=" show-plain-default" readonly="readonly" style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;" wrap="off"> delay(5); //ждем, пока питающее напряжение на карте не будет номинально
  246. pinMode(4, OUTPUT); //в качестве CS мы будем использовать 4-пин Arduino (или PD4 или 6-оый выход ATmega328P)
  247. digitalWrite(4, HIGH); //выставим логическую единицу на CS
  248. SPI.begin(); // инициализация SPI
  249. SPI.setDataMode(SPI_MODE0); //SD карта работает в режиме SPI-0
  250. SPI.setClockDivider(SPI_CLOCK_DIV128);
  251. for (int i = 0; i &lt; 10; i++) //подадим 80 тактовых импульсов
  252. SPI.transfer(0XFF); //хотя требуется не менее 74
  253. digitalWrite(4, LOW); //выставим на CS логический ноль</textarea></div>
  254. <div class="crayon-main" style="">
  255. <table class="crayon-table">
  256. <tbody><tr class="crayon-row">
  257. <td class="crayon-nums " data-settings="hide" style="font-size: 12px !important; line-height: 15px !important;">
  258. <div class="crayon-nums-content"><div class="crayon-num" data-line="crayon-55a8b9b3aa7f6-1">1</div><div class="crayon-num" data-line="crayon-55a8b9b3aa7f6-2">2</div><div class="crayon-num" data-line="crayon-55a8b9b3aa7f6-3">3</div><div class="crayon-num" data-line="crayon-55a8b9b3aa7f6-4">4</div><div class="crayon-num" data-line="crayon-55a8b9b3aa7f6-5">5</div><div class="crayon-num" data-line="crayon-55a8b9b3aa7f6-6">6</div><div class="crayon-num" data-line="crayon-55a8b9b3aa7f6-7">7</div><div class="crayon-num" data-line="crayon-55a8b9b3aa7f6-8">8</div><div class="crayon-num" data-line="crayon-55a8b9b3aa7f6-9">9</div><div class="crayon-num" data-line="crayon-55a8b9b3aa7f6-10">10</div><div class="crayon-num" data-line="crayon-55a8b9b3aa7f6-11">11</div><div class="crayon-num" data-line="crayon-55a8b9b3aa7f6-12">12</div><div class="crayon-num" data-line="crayon-55a8b9b3aa7f6-13">13</div></div>
  259. </td>
  260. <td class="crayon-code"><div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important;"><div class="crayon-line" id="crayon-55a8b9b3aa7f6-1"><span class="h">&nbsp;&nbsp;</span><span class="e">delay</span><span class="sy">(</span><span class="cn">5</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//ждем, пока питающее напряжение на карте не будет номинально</span></div><div class="crayon-line" id="crayon-55a8b9b3aa7f6-2">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa7f6-3"><span class="h">&nbsp;&nbsp;</span><span class="e">pinMode</span><span class="sy">(</span><span class="cn">4</span><span class="sy">,</span><span class="h"> </span><span class="i">OUTPUT</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//в качестве CS мы будем использовать 4-пин Arduino (или PD4 или 6-оый выход ATmega328P)</span></div><div class="crayon-line" id="crayon-55a8b9b3aa7f6-4"><span class="h">&nbsp;&nbsp;</span><span class="e">digitalWrite</span><span class="sy">(</span><span class="cn">4</span><span class="sy">,</span><span class="h"> </span><span class="i">HIGH</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//выставим логическую единицу на CS&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa7f6-5">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa7f6-6"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">begin</span><span class="sy">(</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">// инициализация SPI </span></div><div class="crayon-line" id="crayon-55a8b9b3aa7f6-7"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">setDataMode</span><span class="sy">(</span><span class="i">SPI_MODE0</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//SD карта работает в режиме SPI-0</span></div><div class="crayon-line" id="crayon-55a8b9b3aa7f6-8"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">setClockDivider</span><span class="sy">(</span><span class="i">SPI_CLOCK_DIV128</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa7f6-9">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa7f6-10"><span class="h">&nbsp;&nbsp;</span><span class="st">for</span><span class="h"> </span><span class="sy">(</span><span class="t">int</span><span class="h"> </span><span class="i">i</span><span class="h"> </span><span class="o">=</span><span class="h"> </span><span class="cn">0</span><span class="sy">;</span><span class="h"> </span><span class="i">i</span><span class="h"> </span><span class="o">&lt;</span><span class="h"> </span><span class="cn">10</span><span class="sy">;</span><span class="h"> </span><span class="i">i</span><span class="o">++</span><span class="sy">)</span><span class="h">&nbsp;&nbsp;</span><span class="c">//подадим 80 тактовых импульсов</span></div><div class="crayon-line" id="crayon-55a8b9b3aa7f6-11"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0XFF</span><span class="sy">)</span><span class="sy">;</span><span class="h">&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="c">//хотя требуется не менее 74</span></div><div class="crayon-line" id="crayon-55a8b9b3aa7f6-12">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa7f6-13"><span class="h">&nbsp;&nbsp;</span><span class="e">digitalWrite</span><span class="sy">(</span><span class="cn">4</span><span class="sy">,</span><span class="h"> </span><span class="i">LOW</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//выставим на CS логический ноль</span></div></div></td>
  261. </tr>
  262. </tbody></table>
  263. </div>
  264. </div>
  265. <!-- [Format Time: 0.0017 seconds] -->
  266. <p>&nbsp;</p>
  267. <p>Почему именно 10 итераций?</p>
  268. <p>Дело в том, что за <strong>10 итераций будет сгенерировано 8*10=80 синхроимпульсов</strong>, а нам нужно <strong>не менее 74</strong>. При 9-и итерациях будет сгенерировано 9*8=<strong>72</strong> синхроимпульса, <strong>что есть меньше 74</strong>. Мы просто взяли один из наименьших вариантов, хотя работать будет при любом количестве больше чем 10-и итераций.</p>
  269. <p>&nbsp;</p>
  270. <p>Физически, это процесс выглядит так:</p>
  271. <p>(к сожалению у меня нет реального&nbsp;осциллографа, поэтому я
  272. продемонстрирую процесс инициализации с помощью виртуального
  273. осциллографа&nbsp;САПР Proteus)</p>
  274. <p><a href="http://s-engineer.ru/mikrokontroller-rabotaem-s-sd-kartoj-bez-fajlovoj-sistemoj/diafram_initialization_sd/" rel="attachment wp-att-3907"><img class="aligncenter size-full wp-image-3907" alt="diafram_initialization_SD" src="%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D0%BA%D0%B8%20%D0%B8%D0%BD%D0%B6%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%20%C2%BB%20%D0%90%D1%80%D1%85%D0%B8%D0%B2%20%D1%81%D0%B0%D0%B9%D1%82%D0%B0%20%C2%BB%20%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%BB%D0%B5%D1%80%20%E2%80%93%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D0%BC%20%D1%81%20SD%20%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D0%B9%20%D0%B1%D0%B5%D0%B7%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%BE%D0%B9%20%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_files/diafram_initialization_SD.jpg" height="544" width="700"></a></p>
  275. <p>&nbsp;</p>
  276. <p>На диаграмме нас интересует только <strong>SCK</strong>, &nbsp;<strong>MOSI</strong>&nbsp;и&nbsp;<strong>CS</strong>&nbsp; Как видно на <strong>CS мы устанавливаем логическую единицу, а на SCK и MOSI видно что мы&nbsp;</strong><strong>посылаем 10 пакетов с значением 0xFF</strong> (другими словам посылаем не менее 74-е синхроимпульса с единицами на MOSI)</p>
  277. <p>&nbsp;</p>
  278. <p><strong>4</strong>.&nbsp;Далее, нужно подать команду <strong>CMD0 с пустым аргументом и соответствующим CRC равным 0×95 для программного сброса</strong>, SD карта должна вернуть байт ответа с значением <strong>0×01</strong>. Это означает, что карта <strong>перешла в режим SPI</strong>, она <strong>находится в состояние покоя и готова к процессу инициализации</strong>.</p>
  279. <p>&nbsp;</p>
  280. <p>Еще раз, SD карте мы посылаем следующие SPI пакеты</p>
  281. <p><strong>0х40 0х00 0х00 0х00 0х00 0х95</strong></p>
  282. <p>&nbsp;</p>
  283. <p>Через некоторое время SD карта возвращает ответ:</p>
  284. <p><strong>0х01</strong></p>
  285. <p>&nbsp;</p>
  286. <p>Пример “фрагмент кода для Arduino”:</p><!-- Crayon Syntax Highlighter v1.17 -->
  287. <div id="crayon-55a8b9b3aa813" class="crayon-syntax crayon-theme-ado crayon-font-monaco crayon-os-pc print-yes" data-settings=" scroll-mouseover" style=" margin-top: 12px; margin-bottom: 12px; float: none; clear: both; font-size: 12px !important; line-height: 15px !important;">
  288. <div class="crayon-toolbar" data-settings=" mouseover overlay delay" style="height: 18px !important; line-height: 18px !important;">
  289. <div class="crayon-tools"><a class="crayon-copy-button crayon-button" data-text="Нажмите %s для копирования, %s для вставки" title="Копировать как текст"></a><a class="crayon-popup-button crayon-button" title="Показать код в новом окне" onclick="return false;"></a></div></div>
  290. <div class="crayon-info" style="min-height: 15px !important; line-height: 15px !important;"></div>
  291. <div class="crayon-plain-wrap"><textarea class="crayon-plain print-no" data-settings=" show-plain-default" readonly="readonly" style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;" wrap="off"> //команда CDM0
  292. SPI.transfer(0x40); //индекс команды cmd0
  293. SPI.transfer(0x00); //первый байт пустого аргумента
  294. SPI.transfer(0x00); //второй байт пустого аргумента
  295. SPI.transfer(0x00); //третий байт пустого аргумента
  296. SPI.transfer(0x00); //четвертый байт пустого аргумента
  297. SPI.transfer(0x95); // CRC
  298. while (SPI.transfer(0xFF)!=0x01); //ожидание сигнала о принятия команды</textarea></div>
  299. <div class="crayon-main" style="">
  300. <table class="crayon-table">
  301. <tbody><tr class="crayon-row">
  302. <td class="crayon-nums " data-settings="hide" style="font-size: 12px !important; line-height: 15px !important;">
  303. <div class="crayon-nums-content"><div class="crayon-num" data-line="crayon-55a8b9b3aa813-1">1</div><div class="crayon-num" data-line="crayon-55a8b9b3aa813-2">2</div><div class="crayon-num" data-line="crayon-55a8b9b3aa813-3">3</div><div class="crayon-num" data-line="crayon-55a8b9b3aa813-4">4</div><div class="crayon-num" data-line="crayon-55a8b9b3aa813-5">5</div><div class="crayon-num" data-line="crayon-55a8b9b3aa813-6">6</div><div class="crayon-num" data-line="crayon-55a8b9b3aa813-7">7</div><div class="crayon-num" data-line="crayon-55a8b9b3aa813-8">8</div></div>
  304. </td>
  305. <td class="crayon-code"><div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important;"><div class="crayon-line" id="crayon-55a8b9b3aa813-1"><span class="h">&nbsp;&nbsp;</span><span class="c">//команда CDM0</span></div><div class="crayon-line" id="crayon-55a8b9b3aa813-2"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x40</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//индекс команды cmd0</span></div><div class="crayon-line" id="crayon-55a8b9b3aa813-3"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//первый байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa813-4"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//второй байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa813-5"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//третий байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa813-6"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//четвертый байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa813-7"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x95</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">// CRC</span></div><div class="crayon-line" id="crayon-55a8b9b3aa813-8"><span class="h">&nbsp;&nbsp;</span><span class="st">while</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="o">!=</span><span class="cn">0x01</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//ожидание сигнала о принятия команды</span></div></div></td>
  306. </tr>
  307. </tbody></table>
  308. </div>
  309. </div>
  310. <!-- [Format Time: 0.0013 seconds] -->
  311. <p>&nbsp;</p>
  312. <p>Физически, это процесс выглядит так:</p>
  313. <p><a href="http://s-engineer.ru/mikrokontroller-rabotaem-s-sd-kartoj-bez-fajlovoj-sistemoj/diafram_initialization_sd_2/" rel="attachment wp-att-3916"><img class="aligncenter size-full wp-image-3916" alt="diafram_initialization_SD_2" src="%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D0%BA%D0%B8%20%D0%B8%D0%BD%D0%B6%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%20%C2%BB%20%D0%90%D1%80%D1%85%D0%B8%D0%B2%20%D1%81%D0%B0%D0%B9%D1%82%D0%B0%20%C2%BB%20%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%BB%D0%B5%D1%80%20%E2%80%93%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D0%BC%20%D1%81%20SD%20%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D0%B9%20%D0%B1%D0%B5%D0%B7%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%BE%D0%B9%20%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_files/diafram_initialization_SD_2.jpg" height="716" width="930"></a></p>
  314. <p>&nbsp;</p>
  315. <p>как видно ответ SD карты приходит на втором пакете, увеличим развертку на этом фрагменте….</p>
  316. <p>&nbsp;</p>
  317. <p><a href="http://s-engineer.ru/mikrokontroller-rabotaem-s-sd-kartoj-bez-fajlovoj-sistemoj/diafram_initialization_sd_3/" rel="attachment wp-att-3918"><img class="aligncenter size-full wp-image-3918" alt="diafram_initialization_SD_3" src="%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D0%BA%D0%B8%20%D0%B8%D0%BD%D0%B6%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%20%C2%BB%20%D0%90%D1%80%D1%85%D0%B8%D0%B2%20%D1%81%D0%B0%D0%B9%D1%82%D0%B0%20%C2%BB%20%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%BB%D0%B5%D1%80%20%E2%80%93%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D0%BC%20%D1%81%20SD%20%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D0%B9%20%D0%B1%D0%B5%D0%B7%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%BE%D0%B9%20%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_files/diafram_initialization_SD_3.jpg" height="478" width="884"></a></p>
  318. <p>&nbsp;</p>
  319. <p>Видно, что <strong>SD</strong> карта отвечает <strong>0×01</strong> (8-ой бит равен единицы).</p>
  320. <p>&nbsp;</p>
  321. <p><strong>5.</strong>&nbsp;В состояние покоя, карта может принимать только <strong>CMD0</strong>, <strong>CMD1</strong>, <strong>CMD58</strong>. Для запуска инициализации нужно узнать что за версия карты: <strong>v.1</strong> или <strong>v.2</strong> (более современные версии <strong>3.0</strong> и более мы рассматривать не будем), т.к. процесс инициализации для <strong>них разный</strong>.</p>
  322. <p>Узнать версию, мы можем с помощью команды <strong>CMD8</strong>. Наша последовательность действий: посылаем команду <strong>CMD8</strong>, далее шлем <strong>0xFF</strong> до тех пор, пока не получим ответ <strong>0×01</strong> или <strong>0×04</strong>. Ответ <strong>0×01</strong> скажет нам, что карта версии <strong>v.2</strong> и выше, а <strong>0×04</strong> -”com are error”, что карта “старая”, т.е. <strong>v.1</strong>.</p>
  323. <p>Пример “фрагмент кода для Arduino”:</p><!-- Crayon Syntax Highlighter v1.17 -->
  324. <div id="crayon-55a8b9b3aa826" class="crayon-syntax crayon-theme-ado crayon-font-monaco crayon-os-pc print-yes" data-settings=" scroll-mouseover" style=" margin-top: 12px; margin-bottom: 12px; float: none; clear: both; font-size: 12px !important; line-height: 15px !important;">
  325. <div class="crayon-toolbar" data-settings=" mouseover overlay delay" style="height: 18px !important; line-height: 18px !important;">
  326. <div class="crayon-tools"><a class="crayon-copy-button crayon-button" data-text="Нажмите %s для копирования, %s для вставки" title="Копировать как текст"></a><a class="crayon-popup-button crayon-button" title="Показать код в новом окне" onclick="return false;"></a></div></div>
  327. <div class="crayon-info" style="min-height: 15px !important; line-height: 15px !important;"></div>
  328. <div class="crayon-plain-wrap"><textarea class="crayon-plain print-no" data-settings=" show-plain-default" readonly="readonly" style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;" wrap="off">SPI.transfer(0x48); //индекс команды cmd8
  329. SPI.transfer(0x00); //первый байт пустого аргумента
  330. SPI.transfer(0x00); //второй байт пустого аргумента
  331. SPI.transfer(0x01); //третий байт пустого аргумента
  332. SPI.transfer(0xAA); //четвертый байт пустого аргумента РАЗОБРАТЬСЯ ГДЕ ПЕРВЫЙ БАЙТ ГДЕ ПОСЛЕДНИЙ
  333. SPI.transfer(0X87); // CRC
  334. do { //ожидание сигнала о принятия команды (ответ R7 - 5 байт (1-ый байт это R1, далее 4-е байта нам не интересны))
  335. status_=SPI.transfer(0xFF);
  336. //если ответ R1 0x04 - "com are error", значит SD v.1
  337. if (status_==0x04) {
  338. Serial.println("SD V1");
  339. type_SD=1; //карта SD версии 1, иниализировать карту будем с помощьюу команды CDM1
  340. }
  341. //если ответ R1 0x01 - "in idle state", значит SD v.2
  342. if (status_==0x01) {
  343. Serial.println("SD V2");
  344. type_SD=2; //карта SD версии 2, иниализировать карту будем с помощью команды ACDM41 (CMD55 + CMD41)
  345. }
  346. } while((status_!=0x01) and (status_!=0x04));</textarea></div>
  347. <div class="crayon-main" style="">
  348. <table class="crayon-table">
  349. <tbody><tr class="crayon-row">
  350. <td class="crayon-nums " data-settings="hide" style="font-size: 12px !important; line-height: 15px !important;">
  351. <div class="crayon-nums-content"><div class="crayon-num" data-line="crayon-55a8b9b3aa826-1">1</div><div class="crayon-num" data-line="crayon-55a8b9b3aa826-2">2</div><div class="crayon-num" data-line="crayon-55a8b9b3aa826-3">3</div><div class="crayon-num" data-line="crayon-55a8b9b3aa826-4">4</div><div class="crayon-num" data-line="crayon-55a8b9b3aa826-5">5</div><div class="crayon-num" data-line="crayon-55a8b9b3aa826-6">6</div><div class="crayon-num" data-line="crayon-55a8b9b3aa826-7">7</div><div class="crayon-num" data-line="crayon-55a8b9b3aa826-8">8</div><div class="crayon-num" data-line="crayon-55a8b9b3aa826-9">9</div><div class="crayon-num" data-line="crayon-55a8b9b3aa826-10">10</div><div class="crayon-num" data-line="crayon-55a8b9b3aa826-11">11</div><div class="crayon-num" data-line="crayon-55a8b9b3aa826-12">12</div><div class="crayon-num" data-line="crayon-55a8b9b3aa826-13">13</div><div class="crayon-num" data-line="crayon-55a8b9b3aa826-14">14</div><div class="crayon-num" data-line="crayon-55a8b9b3aa826-15">15</div><div class="crayon-num" data-line="crayon-55a8b9b3aa826-16">16</div><div class="crayon-num" data-line="crayon-55a8b9b3aa826-17">17</div><div class="crayon-num" data-line="crayon-55a8b9b3aa826-18">18</div><div class="crayon-num" data-line="crayon-55a8b9b3aa826-19">19</div><div class="crayon-num" data-line="crayon-55a8b9b3aa826-20">20</div></div>
  352. </td>
  353. <td class="crayon-code"><div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important;"><div class="crayon-line" id="crayon-55a8b9b3aa826-1"><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x48</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//индекс команды cmd8</span></div><div class="crayon-line" id="crayon-55a8b9b3aa826-2"><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//первый байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa826-3"><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//второй байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa826-4"><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x01</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//третий байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa826-5"><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xAA</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//четвертый байт пустого аргумента РАЗОБРАТЬСЯ ГДЕ ПЕРВЫЙ БАЙТ ГДЕ ПОСЛЕДНИЙ</span></div><div class="crayon-line" id="crayon-55a8b9b3aa826-6"><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0X87</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">// CRC</span></div><div class="crayon-line" id="crayon-55a8b9b3aa826-7"><span class="st">do</span><span class="h"> </span><span class="sy">{</span><span class="h"> </span><span class="c">//ожидание сигнала о принятия команды (ответ R7 - 5 байт (1-ый байт это R1, далее 4-е байта нам не интересны))</span></div><div class="crayon-line" id="crayon-55a8b9b3aa826-8"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">status_</span><span class="o">=</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa826-9"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa826-10"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="c">//если ответ R1 0x04 - "com are error", значит SD v.1 </span></div><div class="crayon-line" id="crayon-55a8b9b3aa826-11"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">status_</span><span class="o">==</span><span class="cn">0x04</span><span class="sy">)</span><span class="h"> </span><span class="sy">{</span><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa826-12"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">Serial</span><span class="sy">.</span><span class="e">println</span><span class="sy">(</span><span class="s">"SD V1"</span><span class="sy">)</span><span class="sy">;</span><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa826-13"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">type_SD</span><span class="o">=</span><span class="cn">1</span><span class="sy">;</span><span class="h"> </span><span class="c">//карта SD версии 1, иниализировать карту будем с помощьюу команды CDM1</span></div><div class="crayon-line" id="crayon-55a8b9b3aa826-14"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="sy">}</span><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa826-15"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="c">//если ответ R1 0x01 - "in idle state", значит SD v.2</span></div><div class="crayon-line" id="crayon-55a8b9b3aa826-16"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">status_</span><span class="o">==</span><span class="cn">0x01</span><span class="sy">)</span><span class="h"> </span><span class="sy">{</span><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa826-17"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">Serial</span><span class="sy">.</span><span class="e">println</span><span class="sy">(</span><span class="s">"SD V2"</span><span class="sy">)</span><span class="sy">;</span><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa826-18"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">type_SD</span><span class="o">=</span><span class="cn">2</span><span class="sy">;</span><span class="h"> </span><span class="c">//карта SD версии 2, иниализировать карту будем с помощью команды ACDM41 (CMD55 + CMD41)</span></div><div class="crayon-line" id="crayon-55a8b9b3aa826-19"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa826-20"><span class="sy">}</span><span class="h"> </span><span class="st">while</span><span class="sy">(</span><span class="sy">(</span><span class="i">status_</span><span class="o">!=</span><span class="cn">0x01</span><span class="sy">)</span><span class="h"> </span><span class="st">and</span><span class="h"> </span><span class="sy">(</span><span class="i">status_</span><span class="o">!=</span><span class="cn">0x04</span><span class="sy">)</span><span class="sy">)</span><span class="sy">;</span></div></div></td>
  354. </tr>
  355. </tbody></table>
  356. </div>
  357. </div>
  358. <!-- [Format Time: 0.0022 seconds] -->
  359. <p>&nbsp;<br>
  360. Результат мы запишем в переменную <strong>status_</strong>, далее в зависимости от её значения мы будем проводить <strong>инициализацию тем или иным образом</strong>.</p>
  361. <p>Если карта <strong>v.1</strong>, то для инициализации нам нужно подать <strong>CMD1</strong> <strong>с пустым аргументом и любым CRC</strong>
  362. (т.к. карта уже перешла в режим SPI, а находясь в нем, CRC код не
  363. проверяется, включить проверку можно с помощью команды CMD59). Постоянно
  364. посылаем <strong>карте команду CMD1</strong> <strong>с пустым аргументом и любым CRC</strong>, до тех пор пока не получим байт <strong>ответа с значением 0×00</strong>, что означает инициализация завершена.</p>
  365. <p>&nbsp;</p>
  366. <p>Пример “фрагмент кода для Arduino”:</p><!-- Crayon Syntax Highlighter v1.17 -->
  367. <div id="crayon-55a8b9b3aa841" class="crayon-syntax crayon-theme-ado crayon-font-monaco crayon-os-pc print-yes" data-settings=" scroll-mouseover" style=" margin-top: 12px; margin-bottom: 12px; float: none; clear: both; font-size: 12px !important; line-height: 15px !important;">
  368. <div class="crayon-toolbar" data-settings=" mouseover overlay delay" style="height: 18px !important; line-height: 18px !important;">
  369. <div class="crayon-tools"><a class="crayon-copy-button crayon-button" data-text="Нажмите %s для копирования, %s для вставки" title="Копировать как текст"></a><a class="crayon-popup-button crayon-button" title="Показать код в новом окне" onclick="return false;"></a></div></div>
  370. <div class="crayon-info" style="min-height: 15px !important; line-height: 15px !important;"></div>
  371. <div class="crayon-plain-wrap"><textarea class="crayon-plain print-no" data-settings=" show-plain-default" readonly="readonly" style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;" wrap="off">while (true) {
  372. if (SPI.transfer(0x41)==0x00) break; //бесконечное число раз
  373. if (SPI.transfer(0x00)==0x00) break; //отправляем команды CMD1
  374. if (SPI.transfer(0x00)==0x00) break; //с пустым аргументом и
  375. if (SPI.transfer(0x00)==0x00) break; //произвольным CRC
  376. if (SPI.transfer(0x00)==0x00) break; //до тех пор, пока не получим
  377. if (SPI.transfer(0x00)==0x00) break; //ответ 0x00
  378. }</textarea></div>
  379. <div class="crayon-main" style="">
  380. <table class="crayon-table">
  381. <tbody><tr class="crayon-row">
  382. <td class="crayon-nums " data-settings="hide" style="font-size: 12px !important; line-height: 15px !important;">
  383. <div class="crayon-nums-content"><div class="crayon-num" data-line="crayon-55a8b9b3aa841-1">1</div><div class="crayon-num" data-line="crayon-55a8b9b3aa841-2">2</div><div class="crayon-num" data-line="crayon-55a8b9b3aa841-3">3</div><div class="crayon-num" data-line="crayon-55a8b9b3aa841-4">4</div><div class="crayon-num" data-line="crayon-55a8b9b3aa841-5">5</div><div class="crayon-num" data-line="crayon-55a8b9b3aa841-6">6</div><div class="crayon-num" data-line="crayon-55a8b9b3aa841-7">7</div><div class="crayon-num" data-line="crayon-55a8b9b3aa841-8">8</div></div>
  384. </td>
  385. <td class="crayon-code"><div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important;"><div class="crayon-line" id="crayon-55a8b9b3aa841-1"><span class="st">while</span><span class="h"> </span><span class="sy">(</span><span class="t">true</span><span class="sy">)</span><span class="h"> </span><span class="sy">{</span></div><div class="crayon-line" id="crayon-55a8b9b3aa841-2"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x41</span><span class="sy">)</span><span class="o">==</span><span class="cn">0x00</span><span class="sy">)</span><span class="h"> </span><span class="st">break</span><span class="sy">;</span><span class="h"> </span><span class="c">//бесконечное число раз</span></div><div class="crayon-line" id="crayon-55a8b9b3aa841-3"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="o">==</span><span class="cn">0x00</span><span class="sy">)</span><span class="h"> </span><span class="st">break</span><span class="sy">;</span><span class="h"> </span><span class="c">//отправляем команды CMD1</span></div><div class="crayon-line" id="crayon-55a8b9b3aa841-4"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="o">==</span><span class="cn">0x00</span><span class="sy">)</span><span class="h"> </span><span class="st">break</span><span class="sy">;</span><span class="h"> </span><span class="c">//с пустым аргументом и </span></div><div class="crayon-line" id="crayon-55a8b9b3aa841-5"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="o">==</span><span class="cn">0x00</span><span class="sy">)</span><span class="h"> </span><span class="st">break</span><span class="sy">;</span><span class="h"> </span><span class="c">//произвольным CRC</span></div><div class="crayon-line" id="crayon-55a8b9b3aa841-6"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="o">==</span><span class="cn">0x00</span><span class="sy">)</span><span class="h"> </span><span class="st">break</span><span class="sy">;</span><span class="h"> </span><span class="c">//до тех пор, пока не получим</span></div><div class="crayon-line" id="crayon-55a8b9b3aa841-7"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="o">==</span><span class="cn">0x00</span><span class="sy">)</span><span class="h"> </span><span class="st">break</span><span class="sy">;</span><span class="h"> </span><span class="c">//ответ 0x00</span></div><div class="crayon-line" id="crayon-55a8b9b3aa841-8"><span class="h">&nbsp;&nbsp;</span><span class="sy">}</span></div></div></td>
  386. </tr>
  387. </tbody></table>
  388. </div>
  389. </div>
  390. <!-- [Format Time: 0.0017 seconds] -->
  391. <p>&nbsp;</p>
  392. <p>Физически, это процесс выглядит так:</p>
  393. <p><a href="http://s-engineer.ru/mikrokontroller-rabotaem-s-sd-kartoj-bez-fajlovoj-sistemoj/diafram_initialization_sd_4/" rel="attachment wp-att-3923"><img class="aligncenter size-full wp-image-3923" alt="diafram_initialization_SD_4" src="%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D0%BA%D0%B8%20%D0%B8%D0%BD%D0%B6%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%20%C2%BB%20%D0%90%D1%80%D1%85%D0%B8%D0%B2%20%D1%81%D0%B0%D0%B9%D1%82%D0%B0%20%C2%BB%20%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%BB%D0%B5%D1%80%20%E2%80%93%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D0%BC%20%D1%81%20SD%20%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D0%B9%20%D0%B1%D0%B5%D0%B7%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%BE%D0%B9%20%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_files/diafram_initialization_SD_4.jpg" height="709" width="951"></a></p>
  394. <p>&nbsp;</p>
  395. <p>&nbsp;</p>
  396. <p>Если карта <strong>v.2</strong>, то шлем команду <strong>ACMD41</strong> (это <strong>CMD55</strong> + <strong>CMD41</strong>). Шлем <strong>CMD55 с пустым аргументом и любым CRC</strong>, далее шлем <strong>0xFF</strong> до тех пор, пока не получим ответ <strong>0×01</strong>. После чего, шлем команду <strong>CMD41 с пустым аргументом и любым CRC</strong>, далее шлем <strong>0xFF два раза</strong>, на второй раз <strong>смотрим ответ</strong>, если он равен <strong>0×00</strong>, то значит карта <strong>инициализирована успешно</strong>. </p>
  397. <p>&nbsp;</p>
  398. <p>Пример “фрагмент кода для Arduino”:</p>
  399. <p>&nbsp;</p>
  400. <p></p><!-- Crayon Syntax Highlighter v1.17 -->
  401. <div id="crayon-55a8b9b3aa853" class="crayon-syntax crayon-theme-ado crayon-font-monaco crayon-os-pc print-yes" data-settings=" scroll-mouseover" style=" margin-top: 12px; margin-bottom: 12px; float: none; clear: both; font-size: 12px !important; line-height: 15px !important;">
  402. <div class="crayon-toolbar" data-settings=" mouseover overlay delay" style="height: 18px !important; line-height: 18px !important;">
  403. <div class="crayon-tools"><a class="crayon-copy-button crayon-button" data-text="Нажмите %s для копирования, %s для вставки" title="Копировать как текст"></a><a class="crayon-popup-button crayon-button" title="Показать код в новом окне" onclick="return false;"></a></div></div>
  404. <div class="crayon-info" style="min-height: 15px !important; line-height: 15px !important;"></div>
  405. <div class="crayon-plain-wrap"><textarea class="crayon-plain print-no" data-settings=" show-plain-default" readonly="readonly" style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;" wrap="off">for (uint8_t i = 0; i &lt; 4; SPI.transfer(0xFF),i++); //свдигаем 4-е байта ответа от CMD8, нам они не нужны
  406. do {
  407. //CMD55
  408. SPI.transfer(0X77); //индекс команды cmd55
  409. SPI.transfer(0x00); //первый байт пустого аргумента
  410. SPI.transfer(0x00); //второй байт пустого аргумента
  411. SPI.transfer(0x00); //третий байт пустого аргумента
  412. SPI.transfer(0x00); //четвертый байт пустого аргумента РАЗОБРАТЬСЯ ГДЕ ПЕРВЫЙ БАЙТ ГДЕ ПОСЛЕДНИЙ
  413. SPI.transfer(0X00); // CRC
  414. while (SPI.transfer(0xFF)!=0x01); //ожидание сигнала о принятия команды
  415. //CMD41
  416. SPI.transfer(0X69); //индекс команды cmd41
  417. SPI.transfer(0x40); //первый байт пустого аргумента
  418. SPI.transfer(0x00); //второй байт пустого аргумента
  419. SPI.transfer(0x00); //третий байт пустого аргумента
  420. SPI.transfer(0x00); //четвертый байт пустого аргумента РАЗОБРАТЬСЯ ГДЕ ПЕРВЫЙ БАЙТ ГДЕ ПОСЛЕДНИЙ
  421. SPI.transfer(0XFF); // CRC
  422. SPI.transfer(0xFF); //сдвигаем на один байт
  423. status_ = SPI.transfer(0xFF); //ответ на команду ACMD41
  424. }
  425. while (status_!= 0X00); //шлем команду ACMD41 до тех пор, пока не получим ответ 0x00</textarea></div>
  426. <div class="crayon-main" style="">
  427. <table class="crayon-table">
  428. <tbody><tr class="crayon-row">
  429. <td class="crayon-nums " data-settings="hide" style="font-size: 12px !important; line-height: 15px !important;">
  430. <div class="crayon-nums-content"><div class="crayon-num" data-line="crayon-55a8b9b3aa853-1">1</div><div class="crayon-num" data-line="crayon-55a8b9b3aa853-2">2</div><div class="crayon-num" data-line="crayon-55a8b9b3aa853-3">3</div><div class="crayon-num" data-line="crayon-55a8b9b3aa853-4">4</div><div class="crayon-num" data-line="crayon-55a8b9b3aa853-5">5</div><div class="crayon-num" data-line="crayon-55a8b9b3aa853-6">6</div><div class="crayon-num" data-line="crayon-55a8b9b3aa853-7">7</div><div class="crayon-num" data-line="crayon-55a8b9b3aa853-8">8</div><div class="crayon-num" data-line="crayon-55a8b9b3aa853-9">9</div><div class="crayon-num" data-line="crayon-55a8b9b3aa853-10">10</div><div class="crayon-num" data-line="crayon-55a8b9b3aa853-11">11</div><div class="crayon-num" data-line="crayon-55a8b9b3aa853-12">12</div><div class="crayon-num" data-line="crayon-55a8b9b3aa853-13">13</div><div class="crayon-num" data-line="crayon-55a8b9b3aa853-14">14</div><div class="crayon-num" data-line="crayon-55a8b9b3aa853-15">15</div><div class="crayon-num" data-line="crayon-55a8b9b3aa853-16">16</div><div class="crayon-num" data-line="crayon-55a8b9b3aa853-17">17</div><div class="crayon-num" data-line="crayon-55a8b9b3aa853-18">18</div><div class="crayon-num" data-line="crayon-55a8b9b3aa853-19">19</div><div class="crayon-num" data-line="crayon-55a8b9b3aa853-20">20</div><div class="crayon-num" data-line="crayon-55a8b9b3aa853-21">21</div><div class="crayon-num" data-line="crayon-55a8b9b3aa853-22">22</div><div class="crayon-num" data-line="crayon-55a8b9b3aa853-23">23</div></div>
  431. </td>
  432. <td class="crayon-code"><div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important;"><div class="crayon-line" id="crayon-55a8b9b3aa853-1"><span class="st">for</span><span class="h"> </span><span class="sy">(</span><span class="i">uint8_t</span><span class="h"> </span><span class="i">i</span><span class="h"> </span><span class="o">=</span><span class="h"> </span><span class="cn">0</span><span class="sy">;</span><span class="h"> </span><span class="i">i</span><span class="h"> </span><span class="o">&lt;</span><span class="h"> </span><span class="cn">4</span><span class="sy">;</span><span class="h"> </span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="sy">,</span><span class="i">i</span><span class="o">++</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//свдигаем 4-е байта ответа от CMD8, нам они не нужны</span></div><div class="crayon-line" id="crayon-55a8b9b3aa853-2"><span class="h">&nbsp;&nbsp; </span><span class="st">do</span><span class="h"> </span><span class="sy">{</span></div><div class="crayon-line" id="crayon-55a8b9b3aa853-3"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="c">//CMD55</span></div><div class="crayon-line" id="crayon-55a8b9b3aa853-4"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0X77</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//индекс команды cmd55</span></div><div class="crayon-line" id="crayon-55a8b9b3aa853-5"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//первый байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa853-6"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//второй байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa853-7"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//третий байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa853-8"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//четвертый байт пустого аргумента РАЗОБРАТЬСЯ ГДЕ ПЕРВЫЙ БАЙТ ГДЕ ПОСЛЕДНИЙ</span></div><div class="crayon-line" id="crayon-55a8b9b3aa853-9"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0X00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">// CRC</span></div><div class="crayon-line" id="crayon-55a8b9b3aa853-10"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="st">while</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="o">!=</span><span class="cn">0x01</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//ожидание сигнала о принятия команды</span></div><div class="crayon-line" id="crayon-55a8b9b3aa853-11"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa853-12"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="c">//CMD41&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa853-13"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0X69</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//индекс команды cmd41&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa853-14"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x40</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//первый байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa853-15"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//второй байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa853-16"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//третий байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa853-17"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//четвертый байт пустого аргумента РАЗОБРАТЬСЯ ГДЕ ПЕРВЫЙ БАЙТ ГДЕ ПОСЛЕДНИЙ</span></div><div class="crayon-line" id="crayon-55a8b9b3aa853-18"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0XFF</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">// CRC </span></div><div class="crayon-line" id="crayon-55a8b9b3aa853-19"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa853-20"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//сдвигаем на один байт</span></div><div class="crayon-line" id="crayon-55a8b9b3aa853-21"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">status_</span><span class="h"> </span><span class="o">=</span><span class="h"> </span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="sy">;</span><span class="h">&nbsp;&nbsp;</span><span class="c">//ответ на команду ACMD41</span></div><div class="crayon-line" id="crayon-55a8b9b3aa853-22"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa853-23"><span class="h">&nbsp;&nbsp; </span><span class="st">while</span><span class="h"> </span><span class="sy">(</span><span class="i">status_</span><span class="o">!=</span><span class="h"> </span><span class="cn">0X00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//шлем команду ACMD41 до тех пор, пока не получим ответ 0x00</span></div></div></td>
  433. </tr>
  434. </tbody></table>
  435. </div>
  436. </div>
  437. <!-- [Format Time: 0.0031 seconds] -->
  438. <p>&nbsp;<br>
  439. После инициализации нужно выставить логическую единицу на CS<br>
  440. &nbsp;</p>
  441. <p></p><!-- Crayon Syntax Highlighter v1.17 -->
  442. <div id="crayon-55a8b9b3aa864" class="crayon-syntax crayon-theme-ado crayon-font-monaco crayon-os-pc print-yes" data-settings=" scroll-mouseover" style=" margin-top: 12px; margin-bottom: 12px; float: none; clear: both; font-size: 12px !important; line-height: 15px !important;">
  443. <div class="crayon-toolbar" data-settings=" mouseover overlay delay" style="height: 18px !important; line-height: 18px !important;">
  444. <div class="crayon-tools"><a class="crayon-copy-button crayon-button" data-text="Нажмите %s для копирования, %s для вставки" title="Копировать как текст"></a><a class="crayon-popup-button crayon-button" title="Показать код в новом окне" onclick="return false;"></a></div></div>
  445. <div class="crayon-info" style="min-height: 15px !important; line-height: 15px !important;"></div>
  446. <div class="crayon-plain-wrap"><textarea class="crayon-plain print-no" data-settings=" show-plain-default" readonly="readonly" style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;" wrap="off"> digitalWrite(4, HIGH); //выставим логичекую еденицу на CS</textarea></div>
  447. <div class="crayon-main" style="">
  448. <table class="crayon-table">
  449. <tbody><tr class="crayon-row">
  450. <td class="crayon-nums " data-settings="hide" style="font-size: 12px !important; line-height: 15px !important;">
  451. <div class="crayon-nums-content"><div class="crayon-num" data-line="crayon-55a8b9b3aa864-1">1</div></div>
  452. </td>
  453. <td class="crayon-code"><div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important;"><div class="crayon-line" id="crayon-55a8b9b3aa864-1"><span class="h">&nbsp;&nbsp;</span><span class="e">digitalWrite</span><span class="sy">(</span><span class="cn">4</span><span class="sy">,</span><span class="h"> </span><span class="i">HIGH</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//выставим логичекую еденицу на CS</span></div></div></td>
  454. </tr>
  455. </tbody></table>
  456. </div>
  457. </div>
  458. <!-- [Format Time: 0.0003 seconds] -->
  459. <p>&nbsp;</p>
  460. <p>Приведу результирующий код на Arduino – “инициализация SD карты”</p><!-- Crayon Syntax Highlighter v1.17 -->
  461. <div id="crayon-55a8b9b3aa875" class="crayon-syntax crayon-theme-ado crayon-font-monaco crayon-os-pc print-yes" data-settings=" scroll-mouseover" style=" margin-top: 12px; margin-bottom: 12px; float: none; clear: both; font-size: 12px !important; line-height: 15px !important;">
  462. <div class="crayon-toolbar" data-settings=" mouseover overlay delay" style="height: 18px !important; line-height: 18px !important;">
  463. <div class="crayon-tools"><a class="crayon-copy-button crayon-button" data-text="Нажмите %s для копирования, %s для вставки" title="Копировать как текст"></a><a class="crayon-popup-button crayon-button" title="Показать код в новом окне" onclick="return false;"></a></div></div>
  464. <div class="crayon-info" style="min-height: 15px !important; line-height: 15px !important;"></div>
  465. <div class="crayon-plain-wrap"><textarea class="crayon-plain print-no" data-settings=" show-plain-default" readonly="readonly" style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;" wrap="off">#include &lt;SPI.h&gt;
  466. uint8_t status_;
  467. int type_SD=0;
  468. void setup() {
  469. uint8_t st;
  470. Serial.begin(9600);
  471. delay(5); //ждем, пока питающее напряжение на карте не будет номинально
  472. pinMode(4, OUTPUT); //в качестве CS мы будем использовать 4-пин Arduino (или PD4 или 6-оый выход ATmega328P)
  473. digitalWrite(4, HIGH); //выставим логическую еденицу на CS
  474. SPI.begin(); // инициализация SPI
  475. SPI.setDataMode(SPI_MODE0); //SD карта работает в режиме SPI-0
  476. SPI.setClockDivider(SPI_CLOCK_DIV128);
  477. for (int i = 0; i &lt; 10; i++) //подадим 80 тактовых импульсов
  478. SPI.transfer(0XFF); //хотя требуется не менее 74
  479. /////////////////////////////////////НАЧАЛО ИНИЦИАЛИЗАЦИИ///////////////////////////////////////////
  480. digitalWrite(4, LOW); //выставим на CS логический ноль
  481. //-----команда CDM0 - програмный сброс
  482. SPI.transfer(0x40); //индекс команды cmd0
  483. SPI.transfer(0x00); //первый байт пустого аргумента
  484. SPI.transfer(0x00); //второй байт пустого аргумента
  485. SPI.transfer(0x00); //третий байт пустого аргумента
  486. SPI.transfer(0x00); //четвертый байт пустого аргумента
  487. SPI.transfer(0x95); // CRC
  488. while (SPI.transfer(0xFF)!=0x01); //ожидание сигнала о принятия команды (ответ R1 - один байт)
  489. //-----конец команды CDM0 - програмный сброс
  490. //-----команда CDM8 - проверяем версию SD карты
  491. delay(300);
  492. SPI.transfer(0x48); //индекс команды cmd8
  493. SPI.transfer(0x00); //первый байт пустого аргумента
  494. SPI.transfer(0x00); //второй байт пустого аргумента
  495. SPI.transfer(0x01); //третий байт пустого аргумента
  496. SPI.transfer(0xAA); //четвертый байт пустого аргумента РАЗОБРАТЬСЯ ГДЕ ПЕРВЫЙ БАЙТ ГДЕ ПОСЛЕДНИЙ
  497. SPI.transfer(0X87); // CRC
  498. do { //ожидание сигнала о принятия команды (ответ R7 - 5 байт (1-ый байт это R1, далее 4-е байта нам не интересны))
  499. status_=SPI.transfer(0xFF);
  500. //если ответ R1 0x04 - "com are error", значит SD v.1
  501. if (status_==0x04) {
  502. Serial.println("SD V1");
  503. type_SD=1; //карта SD версии 1, иниализировать карту будем с помощьюу команды CDM1
  504. }
  505. //если ответ R1 0x01 - "in idle state", значит SD v.2
  506. if (status_==0x01) {
  507. Serial.println("SD V2");
  508. type_SD=2; //карта SD версии 2, иниализировать карту будем с помощью команды ACDM41 (CMD55 + CMD41)
  509. }
  510. } while((status_!=0x01) and (status_!=0x04));
  511. //-----конец команды CDM8 - проверяем версию SD карты
  512. //-----инициализация карты SD v.1, с помощью команды CMD1
  513. if (type_SD==1) {
  514. while (true) {
  515. if (SPI.transfer(0x41)==0x00) break; //бесконечное число раз
  516. if (SPI.transfer(0x00)==0x00) break; //отправляем команды CMD1
  517. if (SPI.transfer(0x00)==0x00) break; //с пустым аргументом и
  518. if (SPI.transfer(0x00)==0x00) break; //произвольным CRC
  519. if (SPI.transfer(0x00)==0x00) break; //до тех пор, пока не получим
  520. if (SPI.transfer(0x00)==0x00) break; //ответ 0x00
  521. }
  522. }
  523. //-----конец инициализации карты SD v.1
  524. //-----инициализация карты SD v.2, с помощью команды ACDM41 (CMD55 + CMD41)
  525. if (type_SD==2) {
  526. for (uint8_t i = 0; i &lt; 4; SPI.transfer(0xFF),i++); //свдигаем 4-е байта ответа от CMD8, нам они не нужны
  527. do {
  528. //CMD55
  529. SPI.transfer(0X77); //индекс команды cmd55
  530. SPI.transfer(0x00); //первый байт пустого аргумента
  531. SPI.transfer(0x00); //второй байт пустого аргумента
  532. SPI.transfer(0x00); //третий байт пустого аргумента
  533. SPI.transfer(0x00); //четвертый байт пустого аргумента РАЗОБРАТЬСЯ ГДЕ ПЕРВЫЙ БАЙТ ГДЕ ПОСЛЕДНИЙ
  534. SPI.transfer(0X00); // CRC
  535. while (SPI.transfer(0xFF)!=0x01); //ожидание сигнала о принятия команды
  536. //CMD41
  537. SPI.transfer(0X69); //индекс команды cmd41
  538. SPI.transfer(0x40); //первый байт пустого аргумента
  539. SPI.transfer(0x00); //второй байт пустого аргумента
  540. SPI.transfer(0x00); //третий байт пустого аргумента
  541. SPI.transfer(0x00); //четвертый байт пустого аргумента РАЗОБРАТЬСЯ ГДЕ ПЕРВЫЙ БАЙТ ГДЕ ПОСЛЕДНИЙ
  542. SPI.transfer(0XFF); // CRC
  543. SPI.transfer(0xFF); //сдвигаем на один байт
  544. status_ = SPI.transfer(0xFF); //ответ на команду ACMD41
  545. }
  546. while (status_!= 0X00); //шлем команду ACMD41 до тех пор, пока не получим ответ 0x00
  547. }
  548. //------конец инициализации карты SD v.2
  549. Serial.println("USPEH!");
  550. digitalWrite(4, HIGH); //выставим логическую еденицу на CS
  551. /////////////////////////////////////КОНЕЦ ИНИЦИАЛИЗАЦИИ///////////////////////////////////////////
  552. }
  553. void loop() {
  554. delay(100);
  555. }</textarea></div>
  556. <div class="crayon-main" style="">
  557. <table class="crayon-table">
  558. <tbody><tr class="crayon-row">
  559. <td class="crayon-nums " data-settings="hide" style="font-size: 12px !important; line-height: 15px !important;">
  560. <div class="crayon-nums-content"><div class="crayon-num" data-line="crayon-55a8b9b3aa875-1">1</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-2">2</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-3">3</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-4">4</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-5">5</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-6">6</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-7">7</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-8">8</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-9">9</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-10">10</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-11">11</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-12">12</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-13">13</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-14">14</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-15">15</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-16">16</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-17">17</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-18">18</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-19">19</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-20">20</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-21">21</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-22">22</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-23">23</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-24">24</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-25">25</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-26">26</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-27">27</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-28">28</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-29">29</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-30">30</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-31">31</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-32">32</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-33">33</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-34">34</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-35">35</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-36">36</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-37">37</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-38">38</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-39">39</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-40">40</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-41">41</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-42">42</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-43">43</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-44">44</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-45">45</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-46">46</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-47">47</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-48">48</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-49">49</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-50">50</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-51">51</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-52">52</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-53">53</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-54">54</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-55">55</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-56">56</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-57">57</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-58">58</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-59">59</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-60">60</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-61">61</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-62">62</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-63">63</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-64">64</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-65">65</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-66">66</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-67">67</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-68">68</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-69">69</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-70">70</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-71">71</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-72">72</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-73">73</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-74">74</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-75">75</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-76">76</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-77">77</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-78">78</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-79">79</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-80">80</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-81">81</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-82">82</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-83">83</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-84">84</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-85">85</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-86">86</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-87">87</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-88">88</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-89">89</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-90">90</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-91">91</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-92">92</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-93">93</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-94">94</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-95">95</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-96">96</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-97">97</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-98">98</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-99">99</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-100">100</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-101">101</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-102">102</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-103">103</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-104">104</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-105">105</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-106">106</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-107">107</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-108">108</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-109">109</div><div class="crayon-num" data-line="crayon-55a8b9b3aa875-110">110</div></div>
  561. </td>
  562. <td class="crayon-code"><div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important;"><div class="crayon-line" id="crayon-55a8b9b3aa875-1"><span class="p">#include &lt;SPI.h&gt;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-2">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa875-3"><span class="e">uint8_t </span><span class="i">status_</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-4"><span class="t">int</span><span class="h"> </span><span class="i">type_SD</span><span class="o">=</span><span class="cn">0</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-5">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa875-6"><span class="t">void</span><span class="h"> </span><span class="e">setup</span><span class="sy">(</span><span class="sy">)</span><span class="h"> </span><span class="sy">{</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-7"><span class="h">&nbsp;&nbsp; </span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-8"><span class="h">&nbsp;&nbsp;</span><span class="e">uint8_t </span><span class="i">st</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-9"><span class="h">&nbsp;&nbsp;</span><span class="i">Serial</span><span class="sy">.</span><span class="e">begin</span><span class="sy">(</span><span class="cn">9600</span><span class="sy">)</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-10"><span class="h">&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-11"><span class="h">&nbsp;&nbsp;</span><span class="e">delay</span><span class="sy">(</span><span class="cn">5</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//ждем, пока питающее напряжение на карте не будет номинально</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-12">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa875-13"><span class="h">&nbsp;&nbsp;</span><span class="e">pinMode</span><span class="sy">(</span><span class="cn">4</span><span class="sy">,</span><span class="h"> </span><span class="i">OUTPUT</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//в качестве CS мы будем использовать 4-пин Arduino (или PD4 или 6-оый выход ATmega328P)</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-14"><span class="h">&nbsp;&nbsp;</span><span class="e">digitalWrite</span><span class="sy">(</span><span class="cn">4</span><span class="sy">,</span><span class="h"> </span><span class="i">HIGH</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//выставим логическую еденицу на CS&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-15">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa875-16"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">begin</span><span class="sy">(</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">// инициализация SPI </span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-17"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">setDataMode</span><span class="sy">(</span><span class="i">SPI_MODE0</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//SD карта работает в режиме SPI-0</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-18"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">setClockDivider</span><span class="sy">(</span><span class="i">SPI_CLOCK_DIV128</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-19">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa875-20"><span class="h">&nbsp;&nbsp;</span><span class="st">for</span><span class="h"> </span><span class="sy">(</span><span class="t">int</span><span class="h"> </span><span class="i">i</span><span class="h"> </span><span class="o">=</span><span class="h"> </span><span class="cn">0</span><span class="sy">;</span><span class="h"> </span><span class="i">i</span><span class="h"> </span><span class="o">&lt;</span><span class="h"> </span><span class="cn">10</span><span class="sy">;</span><span class="h"> </span><span class="i">i</span><span class="o">++</span><span class="sy">)</span><span class="h">&nbsp;&nbsp;</span><span class="c">//подадим 80 тактовых импульсов</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-21"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0XFF</span><span class="sy">)</span><span class="sy">;</span><span class="h">&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="c">//хотя требуется не менее 74</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-22">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa875-23"><span class="h"> </span><span class="c">/////////////////////////////////////НАЧАЛО ИНИЦИАЛИЗАЦИИ///////////////////////////////////////////</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-24"><span class="h">&nbsp;&nbsp;</span><span class="e">digitalWrite</span><span class="sy">(</span><span class="cn">4</span><span class="sy">,</span><span class="h"> </span><span class="i">LOW</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//выставим на CS логический ноль</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-25">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa875-26"><span class="h">&nbsp;&nbsp;</span><span class="c">//-----команда CDM0 - програмный сброс</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-27"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x40</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//индекс команды cmd0</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-28"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//первый байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-29"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//второй байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-30"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//третий байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-31"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//четвертый байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-32"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x95</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">// CRC</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-33"><span class="h">&nbsp;&nbsp;</span><span class="st">while</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="o">!=</span><span class="cn">0x01</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//ожидание сигнала о принятия команды (ответ R1 - один байт)</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-34"><span class="h">&nbsp;&nbsp;</span><span class="c">//-----конец команды CDM0 - програмный сброс</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-35"><span class="h">&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-36"><span class="h">&nbsp;&nbsp;</span><span class="c">//-----команда CDM8 - проверяем версию SD карты</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-37"><span class="h">&nbsp;&nbsp;</span><span class="e">delay</span><span class="sy">(</span><span class="cn">300</span><span class="sy">)</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-38"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x48</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//индекс команды cmd8</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-39"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//первый байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-40"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//второй байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-41"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x01</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//третий байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-42"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xAA</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//четвертый байт пустого аргумента РАЗОБРАТЬСЯ ГДЕ ПЕРВЫЙ БАЙТ ГДЕ ПОСЛЕДНИЙ</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-43"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0X87</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">// CRC</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-44"><span class="h">&nbsp;&nbsp;</span><span class="st">do</span><span class="h"> </span><span class="sy">{</span><span class="h"> </span><span class="c">//ожидание сигнала о принятия команды (ответ R7 - 5 байт (1-ый байт это R1, далее 4-е байта нам не интересны))</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-45"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">status_</span><span class="o">=</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-46"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-47"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="c">//если ответ R1 0x04 - "com are error", значит SD v.1 </span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-48"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">status_</span><span class="o">==</span><span class="cn">0x04</span><span class="sy">)</span><span class="h"> </span><span class="sy">{</span><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-49"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">Serial</span><span class="sy">.</span><span class="e">println</span><span class="sy">(</span><span class="s">"SD V1"</span><span class="sy">)</span><span class="sy">;</span><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-50"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">type_SD</span><span class="o">=</span><span class="cn">1</span><span class="sy">;</span><span class="h"> </span><span class="c">//карта SD версии 1, иниализировать карту будем с помощьюу команды CDM1</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-51"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="sy">}</span><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-52"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="c">//если ответ R1 0x01 - "in idle state", значит SD v.2</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-53"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">status_</span><span class="o">==</span><span class="cn">0x01</span><span class="sy">)</span><span class="h"> </span><span class="sy">{</span><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-54"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">Serial</span><span class="sy">.</span><span class="e">println</span><span class="sy">(</span><span class="s">"SD V2"</span><span class="sy">)</span><span class="sy">;</span><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-55"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">type_SD</span><span class="o">=</span><span class="cn">2</span><span class="sy">;</span><span class="h"> </span><span class="c">//карта SD версии 2, иниализировать карту будем с помощью команды ACDM41 (CMD55 + CMD41)</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-56"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-57"><span class="h">&nbsp;&nbsp;</span><span class="sy">}</span><span class="h"> </span><span class="st">while</span><span class="sy">(</span><span class="sy">(</span><span class="i">status_</span><span class="o">!=</span><span class="cn">0x01</span><span class="sy">)</span><span class="h"> </span><span class="st">and</span><span class="h"> </span><span class="sy">(</span><span class="i">status_</span><span class="o">!=</span><span class="cn">0x04</span><span class="sy">)</span><span class="sy">)</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-58"><span class="h">&nbsp;&nbsp;</span><span class="c">//-----конец команды CDM8 - проверяем версию SD карты</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-59"><span class="h">&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-60"><span class="h">&nbsp;&nbsp;</span><span class="c">//-----инициализация карты SD v.1, с помощью команды CMD1&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-61"><span class="h">&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">type_SD</span><span class="o">==</span><span class="cn">1</span><span class="sy">)</span><span class="h"> </span><span class="sy">{</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-62"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">while</span><span class="h"> </span><span class="sy">(</span><span class="t">true</span><span class="sy">)</span><span class="h"> </span><span class="sy">{</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-63"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x41</span><span class="sy">)</span><span class="o">==</span><span class="cn">0x00</span><span class="sy">)</span><span class="h"> </span><span class="st">break</span><span class="sy">;</span><span class="h"> </span><span class="c">//бесконечное число раз</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-64"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="o">==</span><span class="cn">0x00</span><span class="sy">)</span><span class="h"> </span><span class="st">break</span><span class="sy">;</span><span class="h"> </span><span class="c">//отправляем команды CMD1</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-65"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="o">==</span><span class="cn">0x00</span><span class="sy">)</span><span class="h"> </span><span class="st">break</span><span class="sy">;</span><span class="h"> </span><span class="c">//с пустым аргументом и </span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-66"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="o">==</span><span class="cn">0x00</span><span class="sy">)</span><span class="h"> </span><span class="st">break</span><span class="sy">;</span><span class="h"> </span><span class="c">//произвольным CRC</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-67"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="o">==</span><span class="cn">0x00</span><span class="sy">)</span><span class="h"> </span><span class="st">break</span><span class="sy">;</span><span class="h"> </span><span class="c">//до тех пор, пока не получим</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-68"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="o">==</span><span class="cn">0x00</span><span class="sy">)</span><span class="h"> </span><span class="st">break</span><span class="sy">;</span><span class="h"> </span><span class="c">//ответ 0x00</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-69"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-70"><span class="h">&nbsp;&nbsp;</span><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-71"><span class="h">&nbsp;&nbsp;</span><span class="c">//-----конец инициализации карты SD v.1&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-72"><span class="h">&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-73"><span class="h">&nbsp;&nbsp;</span><span class="c">//-----инициализация карты SD v.2, с помощью команды ACDM41 (CMD55 + CMD41)&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-74"><span class="h">&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">type_SD</span><span class="o">==</span><span class="cn">2</span><span class="sy">)</span><span class="h"> </span><span class="sy">{</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-75"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">for</span><span class="h"> </span><span class="sy">(</span><span class="i">uint8_t</span><span class="h"> </span><span class="i">i</span><span class="h"> </span><span class="o">=</span><span class="h"> </span><span class="cn">0</span><span class="sy">;</span><span class="h"> </span><span class="i">i</span><span class="h"> </span><span class="o">&lt;</span><span class="h"> </span><span class="cn">4</span><span class="sy">;</span><span class="h"> </span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="sy">,</span><span class="i">i</span><span class="o">++</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//свдигаем 4-е байта ответа от CMD8, нам они не нужны</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-76"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="st">do</span><span class="h"> </span><span class="sy">{</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-77"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="c">//CMD55</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-78"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0X77</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//индекс команды cmd55</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-79"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//первый байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-80"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//второй байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-81"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//третий байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-82"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//четвертый байт пустого аргумента РАЗОБРАТЬСЯ ГДЕ ПЕРВЫЙ БАЙТ ГДЕ ПОСЛЕДНИЙ</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-83"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0X00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">// CRC</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-84"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">while</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="o">!=</span><span class="cn">0x01</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//ожидание сигнала о принятия команды</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-85"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-86"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="c">//CMD41&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-87"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0X69</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//индекс команды cmd41&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-88"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x40</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//первый байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-89"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//второй байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-90"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//третий байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-91"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//четвертый байт пустого аргумента РАЗОБРАТЬСЯ ГДЕ ПЕРВЫЙ БАЙТ ГДЕ ПОСЛЕДНИЙ</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-92"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0XFF</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">// CRC </span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-93"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-94"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//сдвигаем на один байт</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-95"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">status_</span><span class="h"> </span><span class="o">=</span><span class="h"> </span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="sy">;</span><span class="h">&nbsp;&nbsp;</span><span class="c">//ответ на команду ACMD41</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-96"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-97"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="st">while</span><span class="h"> </span><span class="sy">(</span><span class="i">status_</span><span class="o">!=</span><span class="h"> </span><span class="cn">0X00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//шлем команду ACMD41 до тех пор, пока не получим ответ 0x00</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-98"><span class="h">&nbsp;&nbsp;</span><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-99"><span class="h">&nbsp;&nbsp;</span><span class="c">//------конец инициализации карты SD v.2&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-100"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-101"><span class="h">&nbsp;&nbsp;</span><span class="i">Serial</span><span class="sy">.</span><span class="e">println</span><span class="sy">(</span><span class="s">"USPEH!"</span><span class="sy">)</span><span class="sy">;</span><span class="h">&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-102"><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-103"><span class="h">&nbsp;&nbsp;</span><span class="e">digitalWrite</span><span class="sy">(</span><span class="cn">4</span><span class="sy">,</span><span class="h"> </span><span class="i">HIGH</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//выставим логическую еденицу на CS&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-104"><span class="h"> </span><span class="c">/////////////////////////////////////КОНЕЦ ИНИЦИАЛИЗАЦИИ///////////////////////////////////////////</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-105">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa875-106"><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-107">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa875-108"><span class="t">void</span><span class="h"> </span><span class="e">loop</span><span class="sy">(</span><span class="sy">)</span><span class="h"> </span><span class="sy">{</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-109"><span class="h"> </span><span class="e">delay</span><span class="sy">(</span><span class="cn">100</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-110"><span class="sy">}</span></div></div></td>
  563. </tr>
  564. </tbody></table>
  565. </div>
  566. </div>
  567. <!-- [Format Time: 0.0109 seconds] -->
  568. <p></p>
  569. <p>&nbsp;</p>
  570. <p><a href="#6">Где я могу проверить данный код, если у меня нет ATmega328P?</a></p>
  571. <p>&nbsp;</p>
  572. <p>Все, инициализация завершена, теперь можно передавать и считать данные с SD карты. Но учтите, <strong>простой карты после инициализации должен быть не более 5 мс</strong>, иначе вам нужно <strong>заново подать команду инициализация SD карты, т.е. CMD1 или ACMD41 в зависимости от версии.</strong></p>
  573. <p>&nbsp;</p>
  574. <p>&nbsp;</p>
  575. <h1 id="3">Как писать данные на SD карту?</h1>
  576. <p>&nbsp;</p>
  577. <p>Писать данные можно <strong>по одному блоку</strong> и <strong>сразу множество блоков</strong>.</p>
  578. <p>Один блок данных <strong>по умолчанию равен 512 байт</strong> (т.е. данные будут помещаться в <strong>512 пакетов SPI</strong>). Размер блока можно изменить с помощью команды <strong>CMD16</strong>, но это подходит только для SD карт «старого образца» до 4 Гб с одноименным поколением – «<strong>SD</strong>» (так и пишется на наклейки)</p>
  579. <p>&nbsp;</p>
  580. <p>В большинство современных <strong>SD</strong> карт, т.е. поколения <strong>SDHC</strong>, <strong>SDXC</strong> (см. наклейку на карте) данная <strong>функция не поддерживается</strong> и один блок памяти неизменно равен <strong>512 байт</strong>.</p>
  581. <p>&nbsp;</p>
  582. <p>Мы разберемся <strong>как писать данные по одному блоку</strong>, как записать сразу множество блоков читайте в документации.</p>
  583. <p>&nbsp;</p>
  584. <p>&nbsp;</p>
  585. <h3>Запись данных по одному блоку</h3>
  586. <p>&nbsp;</p>
  587. <p>Для записи данных по одному блоку, используется команда <strong>CMD24</strong>, в качестве её аргумента используется:</p>
  588. <p>&nbsp;</p>
  589. <p>-Для «<strong>старых</strong>» карт поколения «<strong>SD</strong>» (до 4 Гб) &nbsp;используется <strong>адрес необходимого сектора</strong>. Адресуются сектора в SD <strong>побайтно</strong>,
  590. т.е. размер одного сектора – один байт. Но т.к. данные в SD карту
  591. пишутся не побайтно, а блоками, с размером 512 байт, то адрес сектора
  592. фактически означает – <strong>адрес первого байта блока</strong>.</p>
  593. <p>&nbsp;</p>
  594. <p>-Для «<strong>современных</strong>» карт, т.е. <strong>SDHC</strong>, <strong>SDXC</strong> в качестве аргумент используется <strong>номер 512 байтного блока</strong>. Блоки нумеруются с <strong>нуля</strong>.</p>
  595. <p>&nbsp;</p>
  596. <p>В данном посте мы будем рассматривать как писать данные в <strong>SD карты «старого образца»</strong> (поколение SD, их размер не выше 4 Гб).</p>
  597. <p>&nbsp;</p>
  598. <p>Пример для ясности, мы хотим<strong> записать данные в первый блок</strong> (размер блока по умолчанию 512 байт), адрес блока – <strong>0х0000</strong>. Теперь мы хотим <strong>записать данные во второй блок</strong>, который идет вслед первого стык в стык, адрес блока – 0×0000+0×200=<strong>0×0200</strong>. Откуда я взял <strong>0×200</strong>? Это число <strong>512</strong> вшестнадцатиричной системе исчисления. Тогда адрес третьего блока 0×0200+0×200=<strong>0×0400</strong>, и т.д.</p>
  599. <p>&nbsp;</p>
  600. <p>Так как записать блок данных? Алгоритм работы:</p>
  601. <p>&nbsp;</p>
  602. <p><strong>1.</strong> Выставляем на <strong>CS логический ноль</strong> (после инициализации была выставлена единица)</p>
  603. <p>&nbsp;</p>
  604. <p><strong>2.</strong> Далее отправим карте команду <strong>CMD24 с аргументом – адрес сектора с которого мы будем писать наш блок данных</strong>. CRC код у нас произвольный, т.к. в режиме SPI карта его не учитывает.</p>
  605. <p>Пример, нам нужно записать блок данных, начиная с <strong>первого сектора</strong> SD карты. Мы отправляем карте<strong> CMD24</strong> c адресом <strong>0×0000</strong> и<strong> произвольным CRC</strong>.</p>
  606. <p>Т.е. мы посылаем SD карте следующие SPI пакеты.</p>
  607. <p><strong>0х58 0х00 0х00 0х00 0х00 0х00 </strong>(CRC как 0×00 выбран произвольно)</p>
  608. <p>&nbsp;</p>
  609. <p>Ожидаем байт ответа, &nbsp;что команда принята удачно, мы должны получить значение</p>
  610. <p><strong>0×00</strong></p>
  611. <p>&nbsp;</p>
  612. <p>Пример “фрагмент кода для Arduino”</p>
  613. <p>&nbsp;</p><!-- Crayon Syntax Highlighter v1.17 -->
  614. <div id="crayon-55a8b9b3aa89d" class="crayon-syntax crayon-theme-ado crayon-font-monaco crayon-os-pc print-yes" data-settings=" scroll-mouseover" style=" margin-top: 12px; margin-bottom: 12px; float: none; clear: both; font-size: 12px !important; line-height: 15px !important;">
  615. <div class="crayon-toolbar" data-settings=" mouseover overlay delay" style="height: 18px !important; line-height: 18px !important;">
  616. <div class="crayon-tools"><a class="crayon-copy-button crayon-button" data-text="Нажмите %s для копирования, %s для вставки" title="Копировать как текст"></a><a class="crayon-popup-button crayon-button" title="Показать код в новом окне" onclick="return false;"></a></div></div>
  617. <div class="crayon-info" style="min-height: 15px !important; line-height: 15px !important;"></div>
  618. <div class="crayon-plain-wrap"><textarea class="crayon-plain print-no" data-settings=" show-plain-default" readonly="readonly" style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;" wrap="off"> SPI.transfer(0x58);
  619. SPI.transfer(0x00); //первый байт аргумента
  620. SPI.transfer(0x00); //второй байт аргумента
  621. SPI.transfer(0x00); //третий байт аргумента
  622. SPI.transfer(0x00); //четвертый байт аргумента
  623. SPI.transfer(0x00);
  624. while (SPI.transfer(0xFF)!=0x00); //ожидание сигнала о принятия команды</textarea></div>
  625. <div class="crayon-main" style="">
  626. <table class="crayon-table">
  627. <tbody><tr class="crayon-row">
  628. <td class="crayon-nums " data-settings="hide" style="font-size: 12px !important; line-height: 15px !important;">
  629. <div class="crayon-nums-content"><div class="crayon-num" data-line="crayon-55a8b9b3aa89d-1">1</div><div class="crayon-num" data-line="crayon-55a8b9b3aa89d-2">2</div><div class="crayon-num" data-line="crayon-55a8b9b3aa89d-3">3</div><div class="crayon-num" data-line="crayon-55a8b9b3aa89d-4">4</div><div class="crayon-num" data-line="crayon-55a8b9b3aa89d-5">5</div><div class="crayon-num" data-line="crayon-55a8b9b3aa89d-6">6</div><div class="crayon-num" data-line="crayon-55a8b9b3aa89d-7">7</div><div class="crayon-num" data-line="crayon-55a8b9b3aa89d-8">8</div></div>
  630. </td>
  631. <td class="crayon-code"><div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important;"><div class="crayon-line" id="crayon-55a8b9b3aa89d-1"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x58</span><span class="sy">)</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa89d-2"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//первый байт аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa89d-3"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//второй байт аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa89d-4"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//третий байт аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa89d-5"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//четвертый байт аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa89d-6"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa89d-7">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa89d-8"><span class="h">&nbsp;&nbsp;</span><span class="st">while</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="o">!=</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//ожидание сигнала о принятия команды</span></div></div></td>
  632. </tr>
  633. </tbody></table>
  634. </div>
  635. </div>
  636. <!-- [Format Time: 0.0011 seconds] -->
  637. <p>&nbsp;</p>
  638. <p>P.S. Первый, второй, третий байт адреса и т.п. я нумеровал с лева, т.е. если вас интересует адрес 0×200, то аргумент будет</p>
  639. <p>SPI.transfer(0×00); //первый байт пустого аргумента</p>
  640. <p>SPI.transfer(0×00); //второй байт пустого аргумента</p>
  641. <p>SPI.transfer(0×02); //третий байт пустого аргумента</p>
  642. <p>SPI.transfer(0×00); //четвертый байт пустого аргумента</p>
  643. <p>Т.е. 0×00000200</p>
  644. <p>&nbsp;</p>
  645. <p><strong>3.</strong> Далее ожидание в один байт и передаем пакет данных.</p>
  646. <p>Пакет данных имеет следующую структуру</p>
  647. <p><a href="http://s-engineer.ru/mikrokontroller-rabotaem-s-sd-kartoj-bez-fajlovoj-sistemoj/spi_sd_packet/" rel="attachment wp-att-3939"><img class="aligncenter size-full wp-image-3939" alt="SPI_SD_packet" src="%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D0%BA%D0%B8%20%D0%B8%D0%BD%D0%B6%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%20%C2%BB%20%D0%90%D1%80%D1%85%D0%B8%D0%B2%20%D1%81%D0%B0%D0%B9%D1%82%D0%B0%20%C2%BB%20%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%BB%D0%B5%D1%80%20%E2%80%93%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D0%BC%20%D1%81%20SD%20%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D0%B9%20%D0%B1%D0%B5%D0%B7%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%BE%D0%B9%20%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_files/SPI_SD_packet.jpg" height="74" width="334"></a></p>
  648. <p>Перед блоком данных должна стоять метка. Метки бывают следующих типов:</p>
  649. <p><a href="http://s-engineer.ru/mikrokontroller-rabotaem-s-sd-kartoj-bez-fajlovoj-sistemoj/spi_sd_mark/" rel="attachment wp-att-3940"><img class="aligncenter size-full wp-image-3940" alt="SPI_SD_mark" src="%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D0%BA%D0%B8%20%D0%B8%D0%BD%D0%B6%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%20%C2%BB%20%D0%90%D1%80%D1%85%D0%B8%D0%B2%20%D1%81%D0%B0%D0%B9%D1%82%D0%B0%20%C2%BB%20%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%BB%D0%B5%D1%80%20%E2%80%93%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D0%BC%20%D1%81%20SD%20%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D0%B9%20%D0%B1%D0%B5%D0%B7%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%BE%D0%B9%20%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_files/SPI_SD_mark.jpg" height="101" width="343"></a></p>
  650. <p>Для нашего случая (запись блока данных, т.е. <strong>CMD24</strong>) подходит метка <strong>11111110</strong>, т.е. <strong>0xFE</strong>. В качестве <strong>CRC</strong>, мы будем использовать произвольное число <strong>0×00</strong>, т.к. в режиме SPI карта не учитывает CRC.</p>
  651. <p>&nbsp;</p>
  652. <p>Например нам нужно записать блок данных, состоящий из <strong>512-ть 0xAB</strong>, для этого на <strong>SD карту</strong> мы посылаем следующие<strong> SPI пакеты</strong>:</p>
  653. <p>Пошлем один байт, для ожидания</p>
  654. <p><strong>0xFF</strong></p>
  655. <p>&nbsp;</p>
  656. <p>Далее посылаем пакет данных</p>
  657. <p><strong>0xFE 0xAB ..510 раз.. 0xAB 0×00 0×00</strong></p>
  658. <p>&nbsp;</p>
  659. <p>Пример “фрагмент кода для Arduino”</p>
  660. <p>&nbsp;</p><!-- Crayon Syntax Highlighter v1.17 -->
  661. <div id="crayon-55a8b9b3aa8b1" class="crayon-syntax crayon-theme-ado crayon-font-monaco crayon-os-pc print-yes" data-settings=" scroll-mouseover" style=" margin-top: 12px; margin-bottom: 12px; float: none; clear: both; font-size: 12px !important; line-height: 15px !important;">
  662. <div class="crayon-toolbar" data-settings=" mouseover overlay delay" style="height: 18px !important; line-height: 18px !important;">
  663. <div class="crayon-tools"><a class="crayon-copy-button crayon-button" data-text="Нажмите %s для копирования, %s для вставки" title="Копировать как текст"></a><a class="crayon-popup-button crayon-button" title="Показать код в новом окне" onclick="return false;"></a></div></div>
  664. <div class="crayon-info" style="min-height: 15px !important; line-height: 15px !important;"></div>
  665. <div class="crayon-plain-wrap"><textarea class="crayon-plain print-no" data-settings=" show-plain-default" readonly="readonly" style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;" wrap="off">SPI.transfer(0xFF); //посылаем один байт ожидания
  666. SPI.transfer(0xFE); //посылаем метку о начале пакета данных
  667. for (int i=0; i&lt;512; i++)
  668. SPI.transfer(0xAB); //блок данных
  669. SPI.transfer(0x00); //1-ый байт CRC
  670. SPI.transfer(0x00); //2-ой байт CRC</textarea></div>
  671. <div class="crayon-main" style="">
  672. <table class="crayon-table">
  673. <tbody><tr class="crayon-row">
  674. <td class="crayon-nums " data-settings="hide" style="font-size: 12px !important; line-height: 15px !important;">
  675. <div class="crayon-nums-content"><div class="crayon-num" data-line="crayon-55a8b9b3aa8b1-1">1</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8b1-2">2</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8b1-3">3</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8b1-4">4</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8b1-5">5</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8b1-6">6</div></div>
  676. </td>
  677. <td class="crayon-code"><div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important;"><div class="crayon-line" id="crayon-55a8b9b3aa8b1-1"><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//посылаем один байт ожидания</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8b1-2"><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFE</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//посылаем метку о начале пакета данных</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8b1-3"><span class="st">for</span><span class="h"> </span><span class="sy">(</span><span class="t">int</span><span class="h"> </span><span class="i">i</span><span class="o">=</span><span class="cn">0</span><span class="sy">;</span><span class="h"> </span><span class="i">i</span><span class="o">&lt;</span><span class="cn">512</span><span class="sy">;</span><span class="h"> </span><span class="i">i</span><span class="o">++</span><span class="sy">)</span><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa8b1-4"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xAB</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//блок данных</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8b1-5"><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//1-ый байт CRC</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8b1-6"><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//2-ой байт CRC</span></div></div></td>
  678. </tr>
  679. </tbody></table>
  680. </div>
  681. </div>
  682. <!-- [Format Time: 0.0009 seconds] -->
  683. <p>&nbsp;</p>
  684. <p><strong>4.</strong> Ожидаем байт приема данных и окончания записи.</p>
  685. <p>&nbsp;</p>
  686. <p>Байт приема данных <strong>должен придти сразу после</strong> окончания пакета данных, он имеет следующую структуру</p>
  687. <p><a href="http://s-engineer.ru/mikrokontroller-rabotaem-s-sd-kartoj-bez-fajlovoj-sistemoj/spi_sd_return/" rel="attachment wp-att-3942"><img class="aligncenter size-full wp-image-3942" alt="SPI_SD_return" src="%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D0%BA%D0%B8%20%D0%B8%D0%BD%D0%B6%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%20%C2%BB%20%D0%90%D1%80%D1%85%D0%B8%D0%B2%20%D1%81%D0%B0%D0%B9%D1%82%D0%B0%20%C2%BB%20%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%BB%D0%B5%D1%80%20%E2%80%93%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D0%BC%20%D1%81%20SD%20%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D0%B9%20%D0%B1%D0%B5%D0%B7%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%BE%D0%B9%20%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_files/SPI_SD_return.jpg" height="106" width="488"></a></p>
  688. <p>Если данные приняты, байт приема данных должен иметь вид <strong>00000101</strong> или <strong>0×05</strong>.</p>
  689. <p>&nbsp;</p>
  690. <p>Пример ожидания байта о приеме данных на Arduino</p><!-- Crayon Syntax Highlighter v1.17 -->
  691. <div id="crayon-55a8b9b3aa8c3" class="crayon-syntax crayon-theme-ado crayon-font-monaco crayon-os-pc print-yes" data-settings=" scroll-mouseover" style=" margin-top: 12px; margin-bottom: 12px; float: none; clear: both; font-size: 12px !important; line-height: 15px !important;">
  692. <div class="crayon-toolbar" data-settings=" mouseover overlay delay" style="height: 18px !important; line-height: 18px !important;">
  693. <div class="crayon-tools"><a class="crayon-copy-button crayon-button" data-text="Нажмите %s для копирования, %s для вставки" title="Копировать как текст"></a><a class="crayon-popup-button crayon-button" title="Показать код в новом окне" onclick="return false;"></a></div></div>
  694. <div class="crayon-info" style="min-height: 15px !important; line-height: 15px !important;"></div>
  695. <div class="crayon-plain-wrap"><textarea class="crayon-plain print-no" data-settings=" show-plain-default" readonly="readonly" style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;" wrap="off">while (SPI.transfer(0xFF)!=0x05); //ожидание сигнала о принятия команды</textarea></div>
  696. <div class="crayon-main" style="">
  697. <table class="crayon-table">
  698. <tbody><tr class="crayon-row">
  699. <td class="crayon-nums " data-settings="hide" style="font-size: 12px !important; line-height: 15px !important;">
  700. <div class="crayon-nums-content"><div class="crayon-num" data-line="crayon-55a8b9b3aa8c3-1">1</div></div>
  701. </td>
  702. <td class="crayon-code"><div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important;"><div class="crayon-line" id="crayon-55a8b9b3aa8c3-1"><span class="st">while</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="o">!=</span><span class="cn">0x05</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//ожидание сигнала о принятия команды</span></div></div></td>
  703. </tr>
  704. </tbody></table>
  705. </div>
  706. </div>
  707. <!-- [Format Time: 0.0003 seconds] -->
  708. <p>&nbsp;</p>
  709. <p>Окончание записи данных <strong>занимает некоторое время</strong>. Пока микросхема SD карты занята записью данных, на выходе карты мы получаем <strong>0xFF</strong>. Наша задача подавать <strong>0xFF</strong> <strong>на карту</strong> и ожидать пока она <strong>не закончит запись</strong>, т.е. пока мы на выходе не получим <strong>0×00</strong>. После чего можно отправлять новую команду с новыми данными, начиная с пункта 1.</p>
  710. <p>&nbsp;</p>
  711. <p>Пример ожидания окончания записи данных на Arduino</p><!-- Crayon Syntax Highlighter v1.17 -->
  712. <div id="crayon-55a8b9b3aa8d7" class="crayon-syntax crayon-theme-ado crayon-font-monaco crayon-os-pc print-yes" data-settings=" scroll-mouseover" style=" margin-top: 12px; margin-bottom: 12px; float: none; clear: both; font-size: 12px !important; line-height: 15px !important;">
  713. <div class="crayon-toolbar" data-settings=" mouseover overlay delay" style="height: 18px !important; line-height: 18px !important;">
  714. <div class="crayon-tools"><a class="crayon-copy-button crayon-button" data-text="Нажмите %s для копирования, %s для вставки" title="Копировать как текст"></a><a class="crayon-popup-button crayon-button" title="Показать код в новом окне" onclick="return false;"></a></div></div>
  715. <div class="crayon-info" style="min-height: 15px !important; line-height: 15px !important;"></div>
  716. <div class="crayon-plain-wrap"><textarea class="crayon-plain print-no" data-settings=" show-plain-default" readonly="readonly" style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;" wrap="off">while (SPI.transfer(0xFF)!=0x00); //ожидание сигнала о принятия команды</textarea></div>
  717. <div class="crayon-main" style="">
  718. <table class="crayon-table">
  719. <tbody><tr class="crayon-row">
  720. <td class="crayon-nums " data-settings="hide" style="font-size: 12px !important; line-height: 15px !important;">
  721. <div class="crayon-nums-content"><div class="crayon-num" data-line="crayon-55a8b9b3aa8d7-1">1</div></div>
  722. </td>
  723. <td class="crayon-code"><div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important;"><div class="crayon-line" id="crayon-55a8b9b3aa8d7-1"><span class="st">while</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="o">!=</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//ожидание сигнала о принятия команды</span></div></div></td>
  724. </tr>
  725. </tbody></table>
  726. </div>
  727. </div>
  728. <!-- [Format Time: 0.0003 seconds] -->
  729. <p>&nbsp;</p>
  730. <p><strong>5.</strong> Выставляем логическую <strong>единицу на CS</strong></p>
  731. <p>&nbsp;</p>
  732. <p>Итак выложу полный <strong>код записи данных по блокам на Arduino</strong></p>
  733. <p>&nbsp;</p><!-- Crayon Syntax Highlighter v1.17 -->
  734. <div id="crayon-55a8b9b3aa8fd" class="crayon-syntax crayon-theme-ado crayon-font-monaco crayon-os-pc print-yes" data-settings=" scroll-mouseover" style=" margin-top: 12px; margin-bottom: 12px; float: none; clear: both; font-size: 12px !important; line-height: 15px !important;">
  735. <div class="crayon-toolbar" data-settings=" mouseover overlay delay" style="height: 18px !important; line-height: 18px !important;">
  736. <div class="crayon-tools"><a class="crayon-copy-button crayon-button" data-text="Нажмите %s для копирования, %s для вставки" title="Копировать как текст"></a><a class="crayon-popup-button crayon-button" title="Показать код в новом окне" onclick="return false;"></a></div></div>
  737. <div class="crayon-info" style="min-height: 15px !important; line-height: 15px !important;"></div>
  738. <div class="crayon-plain-wrap"><textarea class="crayon-plain print-no" data-settings=" show-plain-default" readonly="readonly" style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;" wrap="off">#include &lt;SPI.h&gt;
  739. uint8_t status_;
  740. int type_SD=0;
  741. void setup() {
  742. Serial.begin(9600);
  743. delay(5); //ждем, пока питающее напряжение на карте не будет номинально
  744. pinMode(4, OUTPUT); //в качестве CS мы будем использовать 4-пин Arduino (или PD4 или 6-оый выход ATmega328P)
  745. digitalWrite(4, HIGH); //выставим логическую еденицу на CS
  746. SPI.begin(); // инициализация SPI
  747. SPI.setDataMode(SPI_MODE0); //SD карта работает в режиме SPI-0
  748. SPI.setClockDivider(SPI_CLOCK_DIV128);
  749. for (int i = 0; i &lt; 10; i++) //подадим 80 тактовых импульсов
  750. SPI.transfer(0XFF); //хотя требуется не менее 74
  751. /////////////////////////////////////НАЧАЛО ИНИЦИАЛИЗАЦИИ///////////////////////////////////////////
  752. digitalWrite(4, LOW); //выставим на CS логический ноль
  753. //-----команда CDM0 - програмный сброс
  754. SPI.transfer(0x40); //индекс команды cmd0
  755. SPI.transfer(0x00); //первый байт пустого аргумента
  756. SPI.transfer(0x00); //второй байт пустого аргумента
  757. SPI.transfer(0x00); //третий байт пустого аргумента
  758. SPI.transfer(0x00); //четвертый байт пустого аргумента
  759. SPI.transfer(0x95); // CRC
  760. while (SPI.transfer(0xFF)!=0x01); //ожидание сигнала о принятия команды (ответ R1 - один байт)
  761. //-----конец команды CDM0 - програмный сброс
  762. //-----команда CDM8 - проверяем версию SD карты
  763. delay(300);
  764. SPI.transfer(0x48); //индекс команды cmd8
  765. SPI.transfer(0x00); //первый байт пустого аргумента
  766. SPI.transfer(0x00); //второй байт пустого аргумента
  767. SPI.transfer(0x01); //третий байт пустого аргумента
  768. SPI.transfer(0xAA); //четвертый байт пустого аргумента РАЗОБРАТЬСЯ ГДЕ ПЕРВЫЙ БАЙТ ГДЕ ПОСЛЕДНИЙ
  769. SPI.transfer(0X87); // CRC
  770. do { //ожидание сигнала о принятия команды (ответ R7 - 5 байт (1-ый байт это R1, далее 4-е байта нам не интересны))
  771. status_=SPI.transfer(0xFF);
  772. //если ответ R1 0x04 - "com are error", значит SD v.1
  773. if (status_==0x04) {
  774. Serial.println("SD V1");
  775. type_SD=1; //карта SD версии 1, иниализировать карту будем с помощьюу команды CDM1
  776. }
  777. //если ответ R1 0x01 - "in idle state", значит SD v.2
  778. if (status_==0x01) {
  779. Serial.println("SD V2");
  780. type_SD=2; //карта SD версии 2, иниализировать карту будем с помощью команды ACDM41 (CMD55 + CMD41)
  781. }
  782. } while((status_!=0x01) and (status_!=0x04));
  783. //-----конец команды CDM8 - проверяем версию SD карты
  784. //-----инициализация карты SD v.1, с помощью команды CMD1
  785. if (type_SD==1) {
  786. while (true) {
  787. if (SPI.transfer(0x41)==0x00) break; //бесконечное число раз
  788. if (SPI.transfer(0x00)==0x00) break; //отправляем команды CMD1
  789. if (SPI.transfer(0x00)==0x00) break; //с пустым аргументом и
  790. if (SPI.transfer(0x00)==0x00) break; //произвольным CRC
  791. if (SPI.transfer(0x00)==0x00) break; //до тех пор, пока не получим
  792. if (SPI.transfer(0x00)==0x00) break; //ответ 0x00
  793. }
  794. }
  795. //-----конец инициализации карты SD v.1
  796. //-----инициализация карты SD v.2, с помощью команды ACDM41 (CMD55 + CMD41)
  797. if (type_SD==2) {
  798. for (uint8_t i = 0; i &lt; 4; SPI.transfer(0xFF),i++); //свдигаем 4-е байта ответа от CMD8, нам они не нужны
  799. do {
  800. //CMD55
  801. SPI.transfer(0X77); //индекс команды cmd55
  802. SPI.transfer(0x00); //первый байт пустого аргумента
  803. SPI.transfer(0x00); //второй байт пустого аргумента
  804. SPI.transfer(0x00); //третий байт пустого аргумента
  805. SPI.transfer(0x00); //четвертый байт пустого аргумента РАЗОБРАТЬСЯ ГДЕ ПЕРВЫЙ БАЙТ ГДЕ ПОСЛЕДНИЙ
  806. SPI.transfer(0X00); // CRC
  807. while (SPI.transfer(0xFF)!=0x01); //ожидание сигнала о принятия команды
  808. //CMD41
  809. SPI.transfer(0X69); //индекс команды cmd41
  810. SPI.transfer(0x40); //первый байт пустого аргумента
  811. SPI.transfer(0x00); //второй байт пустого аргумента
  812. SPI.transfer(0x00); //третий байт пустого аргумента
  813. SPI.transfer(0x00); //четвертый байт пустого аргумента РАЗОБРАТЬСЯ ГДЕ ПЕРВЫЙ БАЙТ ГДЕ ПОСЛЕДНИЙ
  814. SPI.transfer(0XFF); // CRC
  815. SPI.transfer(0xFF); //сдвигаем на один байт
  816. status_ = SPI.transfer(0xFF); //ответ на команду ACMD41
  817. }
  818. while (status_!= 0X00); //шлем команду ACMD41 до тех пор, пока не получим ответ 0x00
  819. }
  820. //------конец инициализации карты SD v.2
  821. Serial.println("USPEH!");
  822. digitalWrite(4, HIGH); //выставим логическую еденицу на CS
  823. /////////////////////////////////////КОНЕЦ ИНИЦИАЛИЗАЦИИ///////////////////////////////////////////
  824. //ЗАПИСЬ БЛОКА--------------------------------------------------
  825. digitalWrite(4, LOW);
  826. // команда - сmd24, запись блока данных
  827. SPI.transfer(0x58);
  828. SPI.transfer(0x00); //первый байт аргумента
  829. SPI.transfer(0x00); //второй байт аргумента
  830. SPI.transfer(0x00); //третий байт аргумента
  831. SPI.transfer(0x00); //четвертый байт аргумента
  832. SPI.transfer(0x00);
  833. while (SPI.transfer(0xFF)!=0x00); //ожидание сигнала о принятия команды
  834. SPI.transfer(0xFF); //один байт ожидания
  835. SPI.transfer(0xFE); //метка начала пакета данных
  836. for (int i=0; i&lt;512; i++)
  837. SPI.transfer(0xAB); //блок данных
  838. SPI.transfer(0x00); //1-ый байт CRC
  839. SPI.transfer(0x00); //2-ой байт CRC
  840. while (SPI.transfer(0xFF)!=0x05); //ожидание сигнала о принятия команды
  841. while (SPI.transfer(0xFF)!=0x00); //ожидание сигнала о окончания записи данных
  842. digitalWrite(4, HIGH);
  843. //КОНЕЦ ЗАПИСЬ БЛОКА--------------------------------------------------
  844. }
  845. void loop() {
  846. delay(100);
  847. }</textarea></div>
  848. <div class="crayon-main" style="">
  849. <table class="crayon-table">
  850. <tbody><tr class="crayon-row">
  851. <td class="crayon-nums " data-settings="hide" style="font-size: 12px !important; line-height: 15px !important;">
  852. <div class="crayon-nums-content"><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-1">1</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-2">2</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-3">3</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-4">4</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-5">5</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-6">6</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-7">7</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-8">8</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-9">9</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-10">10</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-11">11</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-12">12</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-13">13</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-14">14</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-15">15</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-16">16</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-17">17</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-18">18</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-19">19</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-20">20</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-21">21</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-22">22</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-23">23</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-24">24</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-25">25</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-26">26</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-27">27</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-28">28</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-29">29</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-30">30</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-31">31</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-32">32</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-33">33</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-34">34</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-35">35</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-36">36</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-37">37</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-38">38</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-39">39</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-40">40</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-41">41</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-42">42</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-43">43</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-44">44</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-45">45</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-46">46</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-47">47</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-48">48</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-49">49</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-50">50</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-51">51</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-52">52</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-53">53</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-54">54</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-55">55</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-56">56</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-57">57</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-58">58</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-59">59</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-60">60</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-61">61</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-62">62</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-63">63</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-64">64</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-65">65</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-66">66</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-67">67</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-68">68</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-69">69</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-70">70</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-71">71</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-72">72</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-73">73</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-74">74</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-75">75</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-76">76</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-77">77</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-78">78</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-79">79</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-80">80</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-81">81</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-82">82</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-83">83</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-84">84</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-85">85</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-86">86</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-87">87</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-88">88</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-89">89</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-90">90</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-91">91</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-92">92</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-93">93</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-94">94</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-95">95</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-96">96</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-97">97</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-98">98</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-99">99</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-100">100</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-101">101</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-102">102</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-103">103</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-104">104</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-105">105</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-106">106</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-107">107</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-108">108</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-109">109</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-110">110</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-111">111</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-112">112</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-113">113</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-114">114</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-115">115</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-116">116</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-117">117</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-118">118</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-119">119</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-120">120</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-121">121</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-122">122</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-123">123</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-124">124</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-125">125</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-126">126</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-127">127</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-128">128</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-129">129</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-130">130</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-131">131</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-132">132</div><div class="crayon-num" data-line="crayon-55a8b9b3aa8fd-133">133</div></div>
  853. </td>
  854. <td class="crayon-code"><div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important;"><div class="crayon-line" id="crayon-55a8b9b3aa8fd-1"><span class="p">#include &lt;SPI.h&gt;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-2">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-3"><span class="e">uint8_t </span><span class="i">status_</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-4"><span class="t">int</span><span class="h"> </span><span class="i">type_SD</span><span class="o">=</span><span class="cn">0</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-5">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-6"><span class="t">void</span><span class="h"> </span><span class="e">setup</span><span class="sy">(</span><span class="sy">)</span><span class="h"> </span><span class="sy">{</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-7">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-8"><span class="h">&nbsp;&nbsp;</span><span class="i">Serial</span><span class="sy">.</span><span class="e">begin</span><span class="sy">(</span><span class="cn">9600</span><span class="sy">)</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-9"><span class="h">&nbsp;&nbsp;</span><span class="e">delay</span><span class="sy">(</span><span class="cn">5</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//ждем, пока питающее напряжение на карте не будет номинально</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-10">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-11"><span class="h">&nbsp;&nbsp;</span><span class="e">pinMode</span><span class="sy">(</span><span class="cn">4</span><span class="sy">,</span><span class="h"> </span><span class="i">OUTPUT</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//в качестве CS мы будем использовать 4-пин Arduino (или PD4 или 6-оый выход ATmega328P)</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-12"><span class="h">&nbsp;&nbsp;</span><span class="e">digitalWrite</span><span class="sy">(</span><span class="cn">4</span><span class="sy">,</span><span class="h"> </span><span class="i">HIGH</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//выставим логическую еденицу на CS&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-13">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-14"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">begin</span><span class="sy">(</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">// инициализация SPI </span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-15"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">setDataMode</span><span class="sy">(</span><span class="i">SPI_MODE0</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//SD карта работает в режиме SPI-0</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-16"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">setClockDivider</span><span class="sy">(</span><span class="i">SPI_CLOCK_DIV128</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-17">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-18"><span class="h">&nbsp;&nbsp;</span><span class="st">for</span><span class="h"> </span><span class="sy">(</span><span class="t">int</span><span class="h"> </span><span class="i">i</span><span class="h"> </span><span class="o">=</span><span class="h"> </span><span class="cn">0</span><span class="sy">;</span><span class="h"> </span><span class="i">i</span><span class="h"> </span><span class="o">&lt;</span><span class="h"> </span><span class="cn">10</span><span class="sy">;</span><span class="h"> </span><span class="i">i</span><span class="o">++</span><span class="sy">)</span><span class="h">&nbsp;&nbsp;</span><span class="c">//подадим 80 тактовых импульсов</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-19"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0XFF</span><span class="sy">)</span><span class="sy">;</span><span class="h">&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="c">//хотя требуется не менее 74</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-20">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-21"><span class="h"> </span><span class="c">/////////////////////////////////////НАЧАЛО ИНИЦИАЛИЗАЦИИ///////////////////////////////////////////</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-22"><span class="h">&nbsp;&nbsp;</span><span class="e">digitalWrite</span><span class="sy">(</span><span class="cn">4</span><span class="sy">,</span><span class="h"> </span><span class="i">LOW</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//выставим на CS логический ноль</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-23">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-24"><span class="h">&nbsp;&nbsp;</span><span class="c">//-----команда CDM0 - програмный сброс</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-25"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x40</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//индекс команды cmd0</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-26"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//первый байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-27"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//второй байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-28"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//третий байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-29"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//четвертый байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-30"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x95</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">// CRC</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-31"><span class="h">&nbsp;&nbsp;</span><span class="st">while</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="o">!=</span><span class="cn">0x01</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//ожидание сигнала о принятия команды (ответ R1 - один байт)</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-32"><span class="h">&nbsp;&nbsp;</span><span class="c">//-----конец команды CDM0 - програмный сброс</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-33"><span class="h">&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-34"><span class="h">&nbsp;&nbsp;</span><span class="c">//-----команда CDM8 - проверяем версию SD карты</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-35"><span class="h">&nbsp;&nbsp;</span><span class="e">delay</span><span class="sy">(</span><span class="cn">300</span><span class="sy">)</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-36"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x48</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//индекс команды cmd8</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-37"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//первый байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-38"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//второй байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-39"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x01</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//третий байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-40"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xAA</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//четвертый байт пустого аргумента РАЗОБРАТЬСЯ ГДЕ ПЕРВЫЙ БАЙТ ГДЕ ПОСЛЕДНИЙ</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-41"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0X87</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">// CRC</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-42"><span class="h">&nbsp;&nbsp;</span><span class="st">do</span><span class="h"> </span><span class="sy">{</span><span class="h"> </span><span class="c">//ожидание сигнала о принятия команды (ответ R7 - 5 байт (1-ый байт это R1, далее 4-е байта нам не интересны))</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-43"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">status_</span><span class="o">=</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-44"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-45"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="c">//если ответ R1 0x04 - "com are error", значит SD v.1 </span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-46"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">status_</span><span class="o">==</span><span class="cn">0x04</span><span class="sy">)</span><span class="h"> </span><span class="sy">{</span><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-47"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">Serial</span><span class="sy">.</span><span class="e">println</span><span class="sy">(</span><span class="s">"SD V1"</span><span class="sy">)</span><span class="sy">;</span><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-48"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">type_SD</span><span class="o">=</span><span class="cn">1</span><span class="sy">;</span><span class="h"> </span><span class="c">//карта SD версии 1, иниализировать карту будем с помощьюу команды CDM1</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-49"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="sy">}</span><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-50"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="c">//если ответ R1 0x01 - "in idle state", значит SD v.2</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-51"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">status_</span><span class="o">==</span><span class="cn">0x01</span><span class="sy">)</span><span class="h"> </span><span class="sy">{</span><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-52"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">Serial</span><span class="sy">.</span><span class="e">println</span><span class="sy">(</span><span class="s">"SD V2"</span><span class="sy">)</span><span class="sy">;</span><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-53"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">type_SD</span><span class="o">=</span><span class="cn">2</span><span class="sy">;</span><span class="h"> </span><span class="c">//карта SD версии 2, иниализировать карту будем с помощью команды ACDM41 (CMD55 + CMD41)</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-54"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-55"><span class="h">&nbsp;&nbsp;</span><span class="sy">}</span><span class="h"> </span><span class="st">while</span><span class="sy">(</span><span class="sy">(</span><span class="i">status_</span><span class="o">!=</span><span class="cn">0x01</span><span class="sy">)</span><span class="h"> </span><span class="st">and</span><span class="h"> </span><span class="sy">(</span><span class="i">status_</span><span class="o">!=</span><span class="cn">0x04</span><span class="sy">)</span><span class="sy">)</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-56"><span class="h">&nbsp;&nbsp;</span><span class="c">//-----конец команды CDM8 - проверяем версию SD карты</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-57"><span class="h">&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-58"><span class="h">&nbsp;&nbsp;</span><span class="c">//-----инициализация карты SD v.1, с помощью команды CMD1&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-59"><span class="h">&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">type_SD</span><span class="o">==</span><span class="cn">1</span><span class="sy">)</span><span class="h"> </span><span class="sy">{</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-60"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">while</span><span class="h"> </span><span class="sy">(</span><span class="t">true</span><span class="sy">)</span><span class="h"> </span><span class="sy">{</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-61"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x41</span><span class="sy">)</span><span class="o">==</span><span class="cn">0x00</span><span class="sy">)</span><span class="h"> </span><span class="st">break</span><span class="sy">;</span><span class="h"> </span><span class="c">//бесконечное число раз</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-62"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="o">==</span><span class="cn">0x00</span><span class="sy">)</span><span class="h"> </span><span class="st">break</span><span class="sy">;</span><span class="h"> </span><span class="c">//отправляем команды CMD1</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-63"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="o">==</span><span class="cn">0x00</span><span class="sy">)</span><span class="h"> </span><span class="st">break</span><span class="sy">;</span><span class="h"> </span><span class="c">//с пустым аргументом и </span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-64"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="o">==</span><span class="cn">0x00</span><span class="sy">)</span><span class="h"> </span><span class="st">break</span><span class="sy">;</span><span class="h"> </span><span class="c">//произвольным CRC</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-65"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="o">==</span><span class="cn">0x00</span><span class="sy">)</span><span class="h"> </span><span class="st">break</span><span class="sy">;</span><span class="h"> </span><span class="c">//до тех пор, пока не получим</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-66"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="o">==</span><span class="cn">0x00</span><span class="sy">)</span><span class="h"> </span><span class="st">break</span><span class="sy">;</span><span class="h"> </span><span class="c">//ответ 0x00</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-67"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-68"><span class="h">&nbsp;&nbsp;</span><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-69"><span class="h">&nbsp;&nbsp;</span><span class="c">//-----конец инициализации карты SD v.1&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-70"><span class="h">&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-71"><span class="h">&nbsp;&nbsp;</span><span class="c">//-----инициализация карты SD v.2, с помощью команды ACDM41 (CMD55 + CMD41)&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-72"><span class="h">&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">type_SD</span><span class="o">==</span><span class="cn">2</span><span class="sy">)</span><span class="h"> </span><span class="sy">{</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-73"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">for</span><span class="h"> </span><span class="sy">(</span><span class="i">uint8_t</span><span class="h"> </span><span class="i">i</span><span class="h"> </span><span class="o">=</span><span class="h"> </span><span class="cn">0</span><span class="sy">;</span><span class="h"> </span><span class="i">i</span><span class="h"> </span><span class="o">&lt;</span><span class="h"> </span><span class="cn">4</span><span class="sy">;</span><span class="h"> </span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="sy">,</span><span class="i">i</span><span class="o">++</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//свдигаем 4-е байта ответа от CMD8, нам они не нужны</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-74"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="st">do</span><span class="h"> </span><span class="sy">{</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-75"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="c">//CMD55</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-76"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0X77</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//индекс команды cmd55</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-77"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//первый байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-78"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//второй байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-79"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//третий байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-80"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//четвертый байт пустого аргумента РАЗОБРАТЬСЯ ГДЕ ПЕРВЫЙ БАЙТ ГДЕ ПОСЛЕДНИЙ</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-81"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0X00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">// CRC</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-82"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">while</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="o">!=</span><span class="cn">0x01</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//ожидание сигнала о принятия команды</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-83"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-84"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="c">//CMD41&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-85"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0X69</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//индекс команды cmd41&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-86"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x40</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//первый байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-87"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//второй байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-88"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//третий байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-89"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//четвертый байт пустого аргумента РАЗОБРАТЬСЯ ГДЕ ПЕРВЫЙ БАЙТ ГДЕ ПОСЛЕДНИЙ</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-90"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0XFF</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">// CRC </span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-91"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-92"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//сдвигаем на один байт</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-93"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">status_</span><span class="h"> </span><span class="o">=</span><span class="h"> </span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="sy">;</span><span class="h">&nbsp;&nbsp;</span><span class="c">//ответ на команду ACMD41</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-94"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-95"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="st">while</span><span class="h"> </span><span class="sy">(</span><span class="i">status_</span><span class="o">!=</span><span class="h"> </span><span class="cn">0X00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//шлем команду ACMD41 до тех пор, пока не получим ответ 0x00</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-96"><span class="h">&nbsp;&nbsp;</span><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-97"><span class="h">&nbsp;&nbsp;</span><span class="c">//------конец инициализации карты SD v.2&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-98"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-99"><span class="h">&nbsp;&nbsp;</span><span class="i">Serial</span><span class="sy">.</span><span class="e">println</span><span class="sy">(</span><span class="s">"USPEH!"</span><span class="sy">)</span><span class="sy">;</span><span class="h">&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-100"><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-101"><span class="h">&nbsp;&nbsp;</span><span class="e">digitalWrite</span><span class="sy">(</span><span class="cn">4</span><span class="sy">,</span><span class="h"> </span><span class="i">HIGH</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//выставим логическую еденицу на CS&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-102"><span class="h"> </span><span class="c">/////////////////////////////////////КОНЕЦ ИНИЦИАЛИЗАЦИИ///////////////////////////////////////////</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-103">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-104"><span class="h">&nbsp;&nbsp;</span><span class="c">//ЗАПИСЬ БЛОКА--------------------------------------------------</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-105"><span class="h">&nbsp;&nbsp;</span><span class="e">digitalWrite</span><span class="sy">(</span><span class="cn">4</span><span class="sy">,</span><span class="h"> </span><span class="i">LOW</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-106">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-107"><span class="h">&nbsp;&nbsp;</span><span class="c">// команда - сmd24, запись блока данных</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-108"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x58</span><span class="sy">)</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-109"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//первый байт аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-110"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//второй байт аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-111"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//третий байт аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-112"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//четвертый байт аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-113"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-114"><span class="h">&nbsp;&nbsp;</span><span class="st">while</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="o">!=</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//ожидание сигнала о принятия команды</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-115">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-116"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//один байт ожидания</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-117"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFE</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//метка начала пакета данных</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-118"><span class="h">&nbsp;&nbsp;</span><span class="st">for</span><span class="h"> </span><span class="sy">(</span><span class="t">int</span><span class="h"> </span><span class="i">i</span><span class="o">=</span><span class="cn">0</span><span class="sy">;</span><span class="h"> </span><span class="i">i</span><span class="o">&lt;</span><span class="cn">512</span><span class="sy">;</span><span class="h"> </span><span class="i">i</span><span class="o">++</span><span class="sy">)</span><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-119"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xAB</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//блок данных</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-120"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//1-ый байт CRC</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-121"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//2-ой байт CRC</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-122"><span class="h">&nbsp;&nbsp;</span><span class="st">while</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="o">!=</span><span class="cn">0x05</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//ожидание сигнала о принятия команды</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-123">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-124"><span class="h">&nbsp;&nbsp;</span><span class="st">while</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="o">!=</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//ожидание сигнала о окончания записи данных</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-125">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-126"><span class="h">&nbsp;&nbsp;</span><span class="e">digitalWrite</span><span class="sy">(</span><span class="cn">4</span><span class="sy">,</span><span class="h"> </span><span class="i">HIGH</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-127"><span class="h">&nbsp;&nbsp;</span><span class="c">//КОНЕЦ ЗАПИСЬ БЛОКА--------------------------------------------------</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-128">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-129"><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-130">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-131"><span class="t">void</span><span class="h"> </span><span class="e">loop</span><span class="sy">(</span><span class="sy">)</span><span class="h"> </span><span class="sy">{</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-132"><span class="h"> </span><span class="e">delay</span><span class="sy">(</span><span class="cn">100</span><span class="sy">)</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-133"><span class="sy">}</span></div></div></td>
  855. </tr>
  856. </tbody></table>
  857. </div>
  858. </div>
  859. <!-- [Format Time: 0.0133 seconds] -->
  860. <p>&nbsp;</p>
  861. <p><a href="#6">Где я могу проверить данный код, если у меня нет ATmega328P?</a></p>
  862. <p>&nbsp;</p>
  863. <p>&nbsp;</p>
  864. <p>&nbsp;</p>
  865. <h1 id="4">Как читать данные с SD карты?</h1>
  866. <p>&nbsp;</p>
  867. <p>Читать данные можно аналогично как и писать: <strong>по одному блоку</strong> или <strong>сразу множество блоков</strong>.</p>
  868. <p>Повторю, один блок данных по умолчанию равен <strong>512 байт</strong> (т.е. данные будут помещаться в 512 пакетов SPI). Размер блока можно изменить с помощью команды <strong>CMD16</strong>, но это подходит только для <strong>SD карт «старого образца»</strong> до 4 Гб с одноименным поколением – «<strong>SD</strong>» (так и пишется на наклейки)</p>
  869. <p>&nbsp;</p>
  870. <p>В большинство современных <strong>SD карт</strong>, т.е. поколения <strong>SDHC</strong>, <strong>SDXC</strong> (см. наклейку на карте) данная функция не поддерживается и один блок памяти <strong>неизменно равен 512 байт</strong>.</p>
  871. <p>&nbsp;</p>
  872. <p>Мы разберемся как <strong>читать данные по одному блоку</strong>, как прочесть сразу множество блоков читайте в документации.</p>
  873. <p>&nbsp;</p>
  874. <p>&nbsp;</p>
  875. <h3>Чтение данных по блокам</h3>
  876. <p>&nbsp;</p>
  877. <p>Чтение как и запись происходит по аналогии, но я на всякий случай
  878. опишу также подробно (для тех кто попал сюда по ссылке с начало поста)</p>
  879. <p>&nbsp;</p>
  880. <p>Для чтения данных по блокам, используется команда <strong>CMD17</strong>, в качестве её аргумента используется:</p>
  881. <p>&nbsp;</p>
  882. <p>-Для «<strong>старых</strong>» карт поколения «<strong>SD</strong>» (до 4 Гб) в качестве аргумента используется <strong>адрес необходимого сектора</strong>. Адресуются сектора в SD <strong>побайтно</strong>, т.е. размер одного сектора – один байт. Но т.к. данные в SD карту считываются не побайтно, а блоками, с размером 512 байт, <strong>то адрес сектора фактически означает – адрес первого байта блока</strong>.</p>
  883. <p>&nbsp;</p>
  884. <p>-Для «<strong>современных</strong>» карт, т.е. <strong>SDHC</strong>, <strong>SDXC</strong> в качестве аргумент используется <strong>номер 512 байтного блока</strong>. Блоки нумеруются с нуля.</p>
  885. <p>В данном посте мы будем рассматривать как писать данные в <strong>SD</strong> карты «<strong>старого образца</strong>» (поколение SD, их размер не выше 4 Гб).</p>
  886. <p>&nbsp;</p>
  887. <p>Пример для ясности, мы хотим прочитать <strong>первый блок</strong> (размер блока по умолчанию 512 байт), адрес блока – <strong>0х0000</strong>. Далее, мы хотим <strong>прочитать данные второго блока</strong>, который идет вслед первого стык в стык, адрес блока – 0×0000+0×200=<strong>0×0200</strong>. Откуда я взял <strong>0×200</strong>? Это число <strong>512</strong> в шестнадцатиричной системе исчисления. Тогда адрес третьего блока 0×0200+0×200=<strong>0×0400</strong>, и т.д.</p>
  888. <p>&nbsp;</p>
  889. <p>Так как считать блок данных? Алгоритм работы:</p>
  890. <p>&nbsp;</p>
  891. <p><strong>1.</strong> Первым делом выставляем на <strong>CS логический ноль</strong></p>
  892. <p>&nbsp;</p>
  893. <p><strong>2.</strong> Далее отправим карте команду <strong>CMD17</strong> <strong>с аргументом – адрес сектора с которого начинается считываемый блок данных</strong>. CRC код у нас произвольный, т.к. в режиме SPI карта его не учитывает.</p>
  894. <p>Пример, нам нужно прочесть блок данных, начинающийся с первого
  895. сектора SD карты. Мы отправляем карте CMD17 c адресом 0×0000 и
  896. произвольным CRC.</p>
  897. <p>Т.е. мы посылаем SD карте следующие SPI пакеты.</p>
  898. <p><strong>0х51 0х00 0х00 0х00 0х00 0х00</strong> (CRC как 0×00 выбран произвольно)</p>
  899. <p>&nbsp;</p>
  900. <p>Ожидаем байт ответа, что команда принята удачно, мы должны получить значение</p>
  901. <p><strong>0×00</strong></p>
  902. <p>&nbsp;</p>
  903. <p>Пример “фрагмент кода для Arduino”</p>
  904. <p>&nbsp;</p><!-- Crayon Syntax Highlighter v1.17 -->
  905. <div id="crayon-55a8b9b3aa91a" class="crayon-syntax crayon-theme-ado crayon-font-monaco crayon-os-pc print-yes" data-settings=" scroll-mouseover" style=" margin-top: 12px; margin-bottom: 12px; float: none; clear: both; font-size: 12px !important; line-height: 15px !important;">
  906. <div class="crayon-toolbar" data-settings=" mouseover overlay delay" style="height: 18px !important; line-height: 18px !important;">
  907. <div class="crayon-tools"><a class="crayon-copy-button crayon-button" data-text="Нажмите %s для копирования, %s для вставки" title="Копировать как текст"></a><a class="crayon-popup-button crayon-button" title="Показать код в новом окне" onclick="return false;"></a></div></div>
  908. <div class="crayon-info" style="min-height: 15px !important; line-height: 15px !important;"></div>
  909. <div class="crayon-plain-wrap"><textarea class="crayon-plain print-no" data-settings=" show-plain-default" readonly="readonly" style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;" wrap="off"> SPI.transfer(0x51);
  910. SPI.transfer(0x00); //первый байт аргумента
  911. SPI.transfer(0x00); //второй байт аргумента
  912. SPI.transfer(0x00); //третий байт аргумента
  913. SPI.transfer(0x00); //четвертый байт аргумента
  914. SPI.transfer(0x00);
  915. while (SPI.transfer(0xFF)!=0x00); //ожидание сигнала о принятия команды</textarea></div>
  916. <div class="crayon-main" style="">
  917. <table class="crayon-table">
  918. <tbody><tr class="crayon-row">
  919. <td class="crayon-nums " data-settings="hide" style="font-size: 12px !important; line-height: 15px !important;">
  920. <div class="crayon-nums-content"><div class="crayon-num" data-line="crayon-55a8b9b3aa91a-1">1</div><div class="crayon-num" data-line="crayon-55a8b9b3aa91a-2">2</div><div class="crayon-num" data-line="crayon-55a8b9b3aa91a-3">3</div><div class="crayon-num" data-line="crayon-55a8b9b3aa91a-4">4</div><div class="crayon-num" data-line="crayon-55a8b9b3aa91a-5">5</div><div class="crayon-num" data-line="crayon-55a8b9b3aa91a-6">6</div><div class="crayon-num" data-line="crayon-55a8b9b3aa91a-7">7</div><div class="crayon-num" data-line="crayon-55a8b9b3aa91a-8">8</div></div>
  921. </td>
  922. <td class="crayon-code"><div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important;"><div class="crayon-line" id="crayon-55a8b9b3aa91a-1"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x51</span><span class="sy">)</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa91a-2"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//первый байт аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa91a-3"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//второй байт аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa91a-4"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//третий байт аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa91a-5"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//четвертый байт аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa91a-6"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa91a-7">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa91a-8"><span class="h">&nbsp;&nbsp;</span><span class="st">while</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="o">!=</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//ожидание сигнала о принятия команды</span></div></div></td>
  923. </tr>
  924. </tbody></table>
  925. </div>
  926. </div>
  927. <!-- [Format Time: 0.0010 seconds] -->
  928. <p>&nbsp;</p>
  929. <p>P.S. Первый, второй, третий байт адреса и т.п. я нумеровал с лева,
  930. т.е. если вас интересует например адрес 0×200, то аргумент будет</p>
  931. <p>SPI.transfer(0×00); //первый байт пустого аргумента</p>
  932. <p>SPI.transfer(0×00); //второй байт пустого аргумента</p>
  933. <p>SPI.transfer(0×02); //третий байт пустого аргумента</p>
  934. <p>SPI.transfer(0×00); //четвертый байт пустого аргумента</p>
  935. <p>Т.е. 0×00000200</p>
  936. <p>&nbsp;</p>
  937. <p><strong>3.</strong> Далее ожидание начала пакета данных и прием данных</p>
  938. <p>Пакет данных имеет следующую структуру</p>
  939. <p><a href="http://s-engineer.ru/mikrokontroller-rabotaem-s-sd-kartoj-bez-fajlovoj-sistemoj/spi_sd_packet/" rel="attachment wp-att-3939"><img class="aligncenter size-full wp-image-3939" alt="SPI_SD_packet" src="%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D0%BA%D0%B8%20%D0%B8%D0%BD%D0%B6%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%20%C2%BB%20%D0%90%D1%80%D1%85%D0%B8%D0%B2%20%D1%81%D0%B0%D0%B9%D1%82%D0%B0%20%C2%BB%20%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%BB%D0%B5%D1%80%20%E2%80%93%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D0%BC%20%D1%81%20SD%20%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D0%B9%20%D0%B1%D0%B5%D0%B7%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%BE%D0%B9%20%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_files/SPI_SD_packet.jpg" height="74" width="334"></a></p>
  940. <p>&nbsp;</p>
  941. <p>Перед блоком данных должна стоять метка. Метки бывают следующих типов:</p>
  942. <p><a href="http://s-engineer.ru/mikrokontroller-rabotaem-s-sd-kartoj-bez-fajlovoj-sistemoj/spi_sd_mark/" rel="attachment wp-att-3940"><img class="aligncenter size-full wp-image-3940" alt="SPI_SD_mark" src="%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D0%BA%D0%B8%20%D0%B8%D0%BD%D0%B6%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%20%C2%BB%20%D0%90%D1%80%D1%85%D0%B8%D0%B2%20%D1%81%D0%B0%D0%B9%D1%82%D0%B0%20%C2%BB%20%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%BB%D0%B5%D1%80%20%E2%80%93%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D0%BC%20%D1%81%20SD%20%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D0%B9%20%D0%B1%D0%B5%D0%B7%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%BE%D0%B9%20%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_files/SPI_SD_mark.jpg" height="101" width="343"></a></p>
  943. <p>&nbsp;</p>
  944. <p>Для нашего случая (чтение блока данных, т.е. <strong>CMD17</strong>) подходит метка <strong>11111110</strong>, т.е. <strong>0xFE</strong>. В качестве <strong>CRC</strong>, мы будем использовать произвольное число <strong>0×00</strong>, т.к. в режиме SPI карта не учитывает CRC.</p>
  945. <p>&nbsp;</p>
  946. <p>Т.е. под ожиданием начала пакета данных, подразумевается <strong>ожидание метки 11111110 </strong>или&nbsp;<strong>0xFE</strong>.</p>
  947. <p>&nbsp;</p>
  948. <p>Пример мы отправили команду <strong>CMD17</strong> и нам нужно принять пакет данных:</p><!-- Crayon Syntax Highlighter v1.17 -->
  949. <div id="crayon-55a8b9b3aa930" class="crayon-syntax crayon-theme-ado crayon-font-monaco crayon-os-pc print-yes" data-settings=" scroll-mouseover" style=" margin-top: 12px; margin-bottom: 12px; float: none; clear: both; font-size: 12px !important; line-height: 15px !important;">
  950. <div class="crayon-toolbar" data-settings=" mouseover overlay delay" style="height: 18px !important; line-height: 18px !important;">
  951. <div class="crayon-tools"><a class="crayon-copy-button crayon-button" data-text="Нажмите %s для копирования, %s для вставки" title="Копировать как текст"></a><a class="crayon-popup-button crayon-button" title="Показать код в новом окне" onclick="return false;"></a></div></div>
  952. <div class="crayon-info" style="min-height: 15px !important; line-height: 15px !important;"></div>
  953. <div class="crayon-plain-wrap"><textarea class="crayon-plain print-no" data-settings=" show-plain-default" readonly="readonly" style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;" wrap="off"> while (SPI.transfer(0xFF)!=0xFE); //ожидание метки о начале пакета данных
  954. for (int i=0; i&lt;512; i++)
  955. block[i]=SPI.transfer(0xFF); //считываем блок данных в массив block с размером 512 элементов типа byte.</textarea></div>
  956. <div class="crayon-main" style="">
  957. <table class="crayon-table">
  958. <tbody><tr class="crayon-row">
  959. <td class="crayon-nums " data-settings="hide" style="font-size: 12px !important; line-height: 15px !important;">
  960. <div class="crayon-nums-content"><div class="crayon-num" data-line="crayon-55a8b9b3aa930-1">1</div><div class="crayon-num" data-line="crayon-55a8b9b3aa930-2">2</div><div class="crayon-num" data-line="crayon-55a8b9b3aa930-3">3</div><div class="crayon-num" data-line="crayon-55a8b9b3aa930-4">4</div></div>
  961. </td>
  962. <td class="crayon-code"><div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important;"><div class="crayon-line" id="crayon-55a8b9b3aa930-1"><span class="h">&nbsp;&nbsp;</span><span class="st">while</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="o">!=</span><span class="cn">0xFE</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//ожидание метки о начале пакета данных</span></div><div class="crayon-line" id="crayon-55a8b9b3aa930-2">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa930-3"><span class="h">&nbsp;&nbsp;</span><span class="st">for</span><span class="h"> </span><span class="sy">(</span><span class="t">int</span><span class="h"> </span><span class="i">i</span><span class="o">=</span><span class="cn">0</span><span class="sy">;</span><span class="h"> </span><span class="i">i</span><span class="o">&lt;</span><span class="cn">512</span><span class="sy">;</span><span class="h"> </span><span class="i">i</span><span class="o">++</span><span class="sy">)</span></div><div class="crayon-line" id="crayon-55a8b9b3aa930-4"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">block</span><span class="sy">[</span><span class="i">i</span><span class="sy">]</span><span class="o">=</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//считываем блок данных в массив block с размером 512 элементов типа byte.</span></div></div></td>
  963. </tr>
  964. </tbody></table>
  965. </div>
  966. </div>
  967. <!-- [Format Time: 0.0008 seconds] -->
  968. <p>&nbsp;</p>
  969. <p>После чего, нам нужно еще подождать <strong>2-а байта</strong>, это <strong>CRC</strong> код, мы его не проверяем, но принять обязаны.</p><!-- Crayon Syntax Highlighter v1.17 -->
  970. <div id="crayon-55a8b9b3aa942" class="crayon-syntax crayon-theme-ado crayon-font-monaco crayon-os-pc print-yes" data-settings=" scroll-mouseover" style=" margin-top: 12px; margin-bottom: 12px; float: none; clear: both; font-size: 12px !important; line-height: 15px !important;">
  971. <div class="crayon-toolbar" data-settings=" mouseover overlay delay" style="height: 18px !important; line-height: 18px !important;">
  972. <div class="crayon-tools"><a class="crayon-copy-button crayon-button" data-text="Нажмите %s для копирования, %s для вставки" title="Копировать как текст"></a><a class="crayon-popup-button crayon-button" title="Показать код в новом окне" onclick="return false;"></a></div></div>
  973. <div class="crayon-info" style="min-height: 15px !important; line-height: 15px !important;"></div>
  974. <div class="crayon-plain-wrap"><textarea class="crayon-plain print-no" data-settings=" show-plain-default" readonly="readonly" style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;" wrap="off"> //сдвинем еще на два байта, это CRC
  975. SPI.transfer(0xFF);
  976. SPI.transfer(0xFF);</textarea></div>
  977. <div class="crayon-main" style="">
  978. <table class="crayon-table">
  979. <tbody><tr class="crayon-row">
  980. <td class="crayon-nums " data-settings="hide" style="font-size: 12px !important; line-height: 15px !important;">
  981. <div class="crayon-nums-content"><div class="crayon-num" data-line="crayon-55a8b9b3aa942-1">1</div><div class="crayon-num" data-line="crayon-55a8b9b3aa942-2">2</div><div class="crayon-num" data-line="crayon-55a8b9b3aa942-3">3</div></div>
  982. </td>
  983. <td class="crayon-code"><div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important;"><div class="crayon-line" id="crayon-55a8b9b3aa942-1"><span class="h"> </span><span class="c">//сдвинем еще на два байта, это CRC</span></div><div class="crayon-line" id="crayon-55a8b9b3aa942-2"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa942-3"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="sy">;</span></div></div></td>
  984. </tr>
  985. </tbody></table>
  986. </div>
  987. </div>
  988. <!-- [Format Time: 0.0003 seconds] -->
  989. <p>&nbsp;</p>
  990. <p>P.S. Если при чтение произошла ошибка, то вместо пакета данных мы получим маркер ошибки:</p>
  991. <p><a href="http://s-engineer.ru/mikrokontroller-rabotaem-s-sd-kartoj-bez-fajlovoj-sistemoj/spi_sd_mark_error/" rel="attachment wp-att-3946"><img class="aligncenter size-full wp-image-3946" alt="SPI_SD_mark_error" src="%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D0%BA%D0%B8%20%D0%B8%D0%BD%D0%B6%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%20%C2%BB%20%D0%90%D1%80%D1%85%D0%B8%D0%B2%20%D1%81%D0%B0%D0%B9%D1%82%D0%B0%20%C2%BB%20%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%BB%D0%B5%D1%80%20%E2%80%93%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D0%BC%20%D1%81%20SD%20%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D0%B9%20%D0%B1%D0%B5%D0%B7%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%BE%D0%B9%20%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_files/SPI_SD_mark_error.jpg" height="167" width="321"></a></p>
  992. <p>&nbsp;</p>
  993. <p>&nbsp;</p>
  994. <p><strong>4.</strong> Выставляем логическую<strong> единицу на CS</strong></p>
  995. <p>&nbsp;</p>
  996. <p>&nbsp;</p>
  997. <p>Итак, выложу полный<strong> код</strong> в котором мы сначала <strong>запишем блок данных в SD карту, а потом прочтем его</strong>. Код для Arduino</p>
  998. <p>&nbsp;</p><!-- Crayon Syntax Highlighter v1.17 -->
  999. <div id="crayon-55a8b9b3aa954" class="crayon-syntax crayon-theme-ado crayon-font-monaco crayon-os-pc print-yes" data-settings=" scroll-mouseover" style=" margin-top: 12px; margin-bottom: 12px; float: none; clear: both; font-size: 12px !important; line-height: 15px !important;">
  1000. <div class="crayon-toolbar" data-settings=" mouseover overlay delay" style="height: 18px !important; line-height: 18px !important;">
  1001. <div class="crayon-tools"><a class="crayon-copy-button crayon-button" data-text="Нажмите %s для копирования, %s для вставки" title="Копировать как текст"></a><a class="crayon-popup-button crayon-button" title="Показать код в новом окне" onclick="return false;"></a></div></div>
  1002. <div class="crayon-info" style="min-height: 15px !important; line-height: 15px !important;"></div>
  1003. <div class="crayon-plain-wrap"><textarea class="crayon-plain print-no" data-settings=" show-plain-default" readonly="readonly" style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;" wrap="off">#include
  1004. &lt;SPI.h&gt;
  1005. byte block[512]; //куда будем считывать блок данных с SD
  1006. uint8_t status_;
  1007. int type_SD=0;
  1008. void setup() {
  1009. Serial.begin(9600);
  1010. delay(5); //ждем, пока питающее напряжение на карте не будет
  1011. номинально
  1012. pinMode(4, OUTPUT); //в качестве CS мы будем использовать 4-пин
  1013. Arduino (или PD4 или 6-оый выход ATmega328P)
  1014. digitalWrite(4, HIGH); //выставим логическую еденицу на CS
  1015. SPI.begin(); // инициализация SPI
  1016. SPI.setDataMode(SPI_MODE0); //SD карта работает в режиме SPI-0
  1017. SPI.setClockDivider(SPI_CLOCK_DIV128);
  1018. for (int i = 0; i &lt; 10; i++) //подадим 80 тактовых импульсов
  1019. SPI.transfer(0XFF); //хотя требуется не менее 74
  1020. /////////////////////////////////////НАЧАЛО
  1021. ИНИЦИАЛИЗАЦИИ///////////////////////////////////////////
  1022. digitalWrite(4, LOW); //выставим на CS логический ноль
  1023. //-----команда CDM0 - програмный сброс
  1024. SPI.transfer(0x40); //индекс команды cmd0
  1025. SPI.transfer(0x00); //первый байт пустого аргумента
  1026. SPI.transfer(0x00); //второй байт пустого аргумента
  1027. SPI.transfer(0x00); //третий байт пустого аргумента
  1028. SPI.transfer(0x00); //четвертый байт пустого аргумента
  1029. SPI.transfer(0x95); // CRC
  1030. while (SPI.transfer(0xFF)!=0x01); //ожидание сигнала о принятия
  1031. команды (ответ R1 - один байт)
  1032. //-----конец команды CDM0 - програмный сброс
  1033. //-----команда CDM8 - проверяем версию SD карты
  1034. delay(300);
  1035. SPI.transfer(0x48); //индекс команды cmd8
  1036. SPI.transfer(0x00); //первый байт пустого аргумента
  1037. SPI.transfer(0x00); //второй байт пустого аргумента
  1038. SPI.transfer(0x01); //третий байт пустого аргумента
  1039. SPI.transfer(0xAA); //четвертый байт пустого аргумента РАЗОБРАТЬСЯ ГДЕ
  1040. ПЕРВЫЙ БАЙТ ГДЕ ПОСЛЕДНИЙ
  1041. SPI.transfer(0X87); // CRC
  1042. do { //ожидание сигнала о принятия команды (ответ R7 - 5 байт (1-ый
  1043. байт это R1, далее 4-е байта нам не интересны))
  1044. status_=SPI.transfer(0xFF);
  1045. //если ответ R1 0x04 - "com are error", значит SD v.1
  1046. if (status_==0x04) {
  1047. Serial.println("SD V1");
  1048. type_SD=1; //карта SD версии 1, иниализировать карту будем с
  1049. помощьюу команды CDM1
  1050. }
  1051. //если ответ R1 0x01 - "in idle state", значит SD v.2
  1052. if (status_==0x01) {
  1053. Serial.println("SD V2");
  1054. type_SD=2; //карта SD версии 2, иниализировать карту будем с
  1055. помощью команды ACDM41 (CMD55 + CMD41)
  1056. }
  1057. } while((status_!=0x01) and (status_!=0x04));
  1058. //-----конец команды CDM8 - проверяем версию SD карты
  1059. //-----инициализация карты SD v.1, с помощью команды CMD1
  1060. if (type_SD==1) {
  1061. while (true) {
  1062. if (SPI.transfer(0x41)==0x00) break; //бесконечное число раз
  1063. if (SPI.transfer(0x00)==0x00) break; //отправляем команды CMD1
  1064. if (SPI.transfer(0x00)==0x00) break; //с пустым аргументом и
  1065. if (SPI.transfer(0x00)==0x00) break; //произвольным CRC
  1066. if (SPI.transfer(0x00)==0x00) break; //до тех пор, пока не получим
  1067. if (SPI.transfer(0x00)==0x00) break; //ответ 0x00
  1068. }
  1069. }
  1070. //-----конец инициализации карты SD v.1
  1071. //-----инициализация карты SD v.2, с помощью команды ACDM41 (CMD55 +
  1072. CMD41)
  1073. if (type_SD==2) {
  1074. for (uint8_t i = 0; i &lt; 4; SPI.transfer(0xFF),i++); //свдигаем
  1075. 4-е байта ответа от CMD8, нам они не нужны
  1076. do {
  1077. //CMD55
  1078. SPI.transfer(0X77); //индекс команды cmd55
  1079. SPI.transfer(0x00); //первый байт пустого аргумента
  1080. SPI.transfer(0x00); //второй байт пустого аргумента
  1081. SPI.transfer(0x00); //третий байт пустого аргумента
  1082. SPI.transfer(0x00); //четвертый байт пустого аргумента
  1083. РАЗОБРАТЬСЯ ГДЕ ПЕРВЫЙ БАЙТ ГДЕ ПОСЛЕДНИЙ
  1084. SPI.transfer(0X00); // CRC
  1085. while (SPI.transfer(0xFF)!=0x01); //ожидание сигнала о
  1086. принятия команды
  1087. //CMD41
  1088. SPI.transfer(0X69); //индекс команды cmd41
  1089. SPI.transfer(0x40); //первый байт пустого аргумента
  1090. SPI.transfer(0x00); //второй байт пустого аргумента
  1091. SPI.transfer(0x00); //третий байт пустого аргумента
  1092. SPI.transfer(0x00); //четвертый байт пустого аргумента
  1093. РАЗОБРАТЬСЯ ГДЕ ПЕРВЫЙ БАЙТ ГДЕ ПОСЛЕДНИЙ
  1094. SPI.transfer(0XFF); // CRC
  1095. SPI.transfer(0xFF); //сдвигаем на один байт
  1096. status_ = SPI.transfer(0xFF); //ответ на команду ACMD41
  1097. }
  1098. while (status_!= 0X00); //шлем команду ACMD41 до тех пор, пока не
  1099. получим ответ 0x00
  1100. }
  1101. //------конец инициализации карты SD v.2
  1102. Serial.println("USPEH!");
  1103. digitalWrite(4, HIGH); //выставим логическую еденицу на CS
  1104. /////////////////////////////////////КОНЕЦ
  1105. ИНИЦИАЛИЗАЦИИ///////////////////////////////////////////
  1106. //ЗАПИСЬ БЛОКА--------------------------------------------------
  1107. digitalWrite(4, LOW);
  1108. // команда - сmd24, запись блока данных
  1109. SPI.transfer(0x58);
  1110. SPI.transfer(0x00); //аргумент, адрес блока
  1111. SPI.transfer(0x00);
  1112. SPI.transfer(0x00);
  1113. SPI.transfer(0x00);
  1114. SPI.transfer(0x00);
  1115. while (SPI.transfer(0xFF)!=0x00); //ожидание сигнала о принятия
  1116. команды
  1117. SPI.transfer(0xFF); //один байт ожидания
  1118. SPI.transfer(0xFE); //метка начала пакета данных
  1119. for (int i=0; i&lt;512; i++)
  1120. SPI.transfer(0xAB); //блок данных
  1121. SPI.transfer(0x00); //1-ый байт CRC
  1122. SPI.transfer(0x00); //2-ой байт CRC
  1123. while (SPI.transfer(0xFF)!=0x05); //ожидание сигнала о принятия
  1124. команды
  1125. while (SPI.transfer(0xFF)!=0x00); //ожидание сигнала о окончания
  1126. записи данных
  1127. digitalWrite(4, HIGH);
  1128. //КОНЕЦ ЗАПИСЬ БЛОКА--------------------------------------------------
  1129. //ЧТЕНИЕ БЛОКА--------------------------------------------------
  1130. digitalWrite(4, LOW);
  1131. // команда - сmd17, чтение блока данных
  1132. SPI.transfer(0x51);
  1133. SPI.transfer(0x00); //аргумент, адрес блока
  1134. SPI.transfer(0x00);
  1135. SPI.transfer(0x00);
  1136. SPI.transfer(0x00);
  1137. SPI.transfer(0x00);
  1138. while (SPI.transfer(0xFF)!=0x00); //ожидание сигнала о принятия
  1139. команды
  1140. while (SPI.transfer(0xFF)!=0xFE); //ожидание сигнала о начале пакета
  1141. данных
  1142. for (int i=0; i&lt;512; i++)
  1143. block[i]=SPI.transfer(0xFF); //считываем блок данных в массив block с
  1144. размером 512 элементов типа byte.//считываем блок данных в массив block
  1145. с размером 512 элементов типа byte.
  1146. //сдвинем еще на два байта, это CRC
  1147. SPI.transfer(0xFF);
  1148. SPI.transfer(0xFF);
  1149. digitalWrite(4, HIGH);
  1150. //КОНЕЦ ЧТЕНИЯ БЛОКА--------------------------------------------------
  1151. }
  1152. void loop() {
  1153. delay(100);
  1154. }</textarea></div>
  1155. <div class="crayon-main" style="">
  1156. <table class="crayon-table">
  1157. <tbody><tr class="crayon-row">
  1158. <td class="crayon-nums " data-settings="hide" style="font-size: 12px !important; line-height: 15px !important;">
  1159. <div class="crayon-nums-content"><div class="crayon-num" data-line="crayon-55a8b9b3aa954-1">1</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-2">2</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-3">3</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-4">4</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-5">5</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-6">6</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-7">7</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-8">8</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-9">9</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-10">10</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-11">11</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-12">12</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-13">13</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-14">14</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-15">15</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-16">16</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-17">17</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-18">18</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-19">19</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-20">20</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-21">21</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-22">22</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-23">23</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-24">24</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-25">25</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-26">26</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-27">27</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-28">28</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-29">29</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-30">30</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-31">31</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-32">32</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-33">33</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-34">34</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-35">35</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-36">36</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-37">37</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-38">38</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-39">39</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-40">40</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-41">41</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-42">42</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-43">43</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-44">44</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-45">45</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-46">46</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-47">47</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-48">48</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-49">49</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-50">50</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-51">51</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-52">52</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-53">53</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-54">54</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-55">55</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-56">56</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-57">57</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-58">58</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-59">59</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-60">60</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-61">61</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-62">62</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-63">63</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-64">64</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-65">65</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-66">66</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-67">67</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-68">68</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-69">69</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-70">70</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-71">71</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-72">72</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-73">73</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-74">74</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-75">75</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-76">76</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-77">77</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-78">78</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-79">79</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-80">80</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-81">81</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-82">82</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-83">83</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-84">84</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-85">85</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-86">86</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-87">87</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-88">88</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-89">89</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-90">90</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-91">91</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-92">92</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-93">93</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-94">94</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-95">95</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-96">96</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-97">97</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-98">98</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-99">99</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-100">100</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-101">101</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-102">102</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-103">103</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-104">104</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-105">105</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-106">106</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-107">107</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-108">108</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-109">109</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-110">110</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-111">111</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-112">112</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-113">113</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-114">114</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-115">115</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-116">116</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-117">117</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-118">118</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-119">119</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-120">120</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-121">121</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-122">122</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-123">123</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-124">124</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-125">125</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-126">126</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-127">127</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-128">128</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-129">129</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-130">130</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-131">131</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-132">132</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-133">133</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-134">134</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-135">135</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-136">136</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-137">137</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-138">138</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-139">139</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-140">140</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-141">141</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-142">142</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-143">143</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-144">144</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-145">145</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-146">146</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-147">147</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-148">148</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-149">149</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-150">150</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-151">151</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-152">152</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-153">153</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-154">154</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-155">155</div><div class="crayon-num" data-line="crayon-55a8b9b3aa954-156">156</div></div>
  1160. </td>
  1161. <td class="crayon-code"><div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important;"><div class="crayon-line" id="crayon-55a8b9b3aa954-1"><span class="p">#include &lt;SPI.h&gt;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-2">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa954-3"><span class="t">byte</span><span class="h"> </span><span class="i">block</span><span class="sy">[</span><span class="cn">512</span><span class="sy">]</span><span class="sy">;</span><span class="h"> </span><span class="c">//куда будем считывать блок данных с SD</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-4"><span class="e">uint8_t </span><span class="i">status_</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-5"><span class="t">int</span><span class="h"> </span><span class="i">type_SD</span><span class="o">=</span><span class="cn">0</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-6">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa954-7"><span class="t">void</span><span class="h"> </span><span class="e">setup</span><span class="sy">(</span><span class="sy">)</span><span class="h"> </span><span class="sy">{</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-8">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa954-9"><span class="h">&nbsp;&nbsp;</span><span class="i">Serial</span><span class="sy">.</span><span class="e">begin</span><span class="sy">(</span><span class="cn">9600</span><span class="sy">)</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-10"><span class="h">&nbsp;&nbsp;</span><span class="e">delay</span><span class="sy">(</span><span class="cn">5</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//ждем, пока питающее напряжение на карте не будет номинально</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-11">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa954-12"><span class="h">&nbsp;&nbsp;</span><span class="e">pinMode</span><span class="sy">(</span><span class="cn">4</span><span class="sy">,</span><span class="h"> </span><span class="i">OUTPUT</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//в качестве CS мы будем использовать 4-пин Arduino (или PD4 или 6-оый выход ATmega328P)</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-13"><span class="h">&nbsp;&nbsp;</span><span class="e">digitalWrite</span><span class="sy">(</span><span class="cn">4</span><span class="sy">,</span><span class="h"> </span><span class="i">HIGH</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//выставим логическую еденицу на CS&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-14">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa954-15"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">begin</span><span class="sy">(</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">// инициализация SPI </span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-16"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">setDataMode</span><span class="sy">(</span><span class="i">SPI_MODE0</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//SD карта работает в режиме SPI-0</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-17"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">setClockDivider</span><span class="sy">(</span><span class="i">SPI_CLOCK_DIV128</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-18">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa954-19"><span class="h">&nbsp;&nbsp;</span><span class="st">for</span><span class="h"> </span><span class="sy">(</span><span class="t">int</span><span class="h"> </span><span class="i">i</span><span class="h"> </span><span class="o">=</span><span class="h"> </span><span class="cn">0</span><span class="sy">;</span><span class="h"> </span><span class="i">i</span><span class="h"> </span><span class="o">&lt;</span><span class="h"> </span><span class="cn">10</span><span class="sy">;</span><span class="h"> </span><span class="i">i</span><span class="o">++</span><span class="sy">)</span><span class="h">&nbsp;&nbsp;</span><span class="c">//подадим 80 тактовых импульсов</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-20"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0XFF</span><span class="sy">)</span><span class="sy">;</span><span class="h">&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="c">//хотя требуется не менее 74</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-21">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa954-22"><span class="h"> </span><span class="c">/////////////////////////////////////НАЧАЛО ИНИЦИАЛИЗАЦИИ///////////////////////////////////////////</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-23"><span class="h">&nbsp;&nbsp;</span><span class="e">digitalWrite</span><span class="sy">(</span><span class="cn">4</span><span class="sy">,</span><span class="h"> </span><span class="i">LOW</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//выставим на CS логический ноль</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-24">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa954-25"><span class="h">&nbsp;&nbsp;</span><span class="c">//-----команда CDM0 - програмный сброс</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-26"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x40</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//индекс команды cmd0</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-27"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//первый байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-28"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//второй байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-29"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//третий байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-30"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//четвертый байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-31"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x95</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">// CRC</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-32"><span class="h">&nbsp;&nbsp;</span><span class="st">while</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="o">!=</span><span class="cn">0x01</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//ожидание сигнала о принятия команды (ответ R1 - один байт)</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-33"><span class="h">&nbsp;&nbsp;</span><span class="c">//-----конец команды CDM0 - програмный сброс</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-34"><span class="h">&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-35"><span class="h">&nbsp;&nbsp;</span><span class="c">//-----команда CDM8 - проверяем версию SD карты</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-36"><span class="h">&nbsp;&nbsp;</span><span class="e">delay</span><span class="sy">(</span><span class="cn">300</span><span class="sy">)</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-37"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x48</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//индекс команды cmd8</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-38"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//первый байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-39"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//второй байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-40"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x01</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//третий байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-41"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xAA</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//четвертый байт пустого аргумента РАЗОБРАТЬСЯ ГДЕ ПЕРВЫЙ БАЙТ ГДЕ ПОСЛЕДНИЙ</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-42"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0X87</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">// CRC</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-43"><span class="h">&nbsp;&nbsp;</span><span class="st">do</span><span class="h"> </span><span class="sy">{</span><span class="h"> </span><span class="c">//ожидание сигнала о принятия команды (ответ R7 - 5 байт (1-ый байт это R1, далее 4-е байта нам не интересны))</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-44"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">status_</span><span class="o">=</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-45"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-46"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="c">//если ответ R1 0x04 - "com are error", значит SD v.1 </span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-47"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">status_</span><span class="o">==</span><span class="cn">0x04</span><span class="sy">)</span><span class="h"> </span><span class="sy">{</span><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-48"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">Serial</span><span class="sy">.</span><span class="e">println</span><span class="sy">(</span><span class="s">"SD V1"</span><span class="sy">)</span><span class="sy">;</span><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-49"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">type_SD</span><span class="o">=</span><span class="cn">1</span><span class="sy">;</span><span class="h"> </span><span class="c">//карта SD версии 1, иниализировать карту будем с помощьюу команды CDM1</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-50"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="sy">}</span><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-51"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="c">//если ответ R1 0x01 - "in idle state", значит SD v.2</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-52"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">status_</span><span class="o">==</span><span class="cn">0x01</span><span class="sy">)</span><span class="h"> </span><span class="sy">{</span><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-53"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">Serial</span><span class="sy">.</span><span class="e">println</span><span class="sy">(</span><span class="s">"SD V2"</span><span class="sy">)</span><span class="sy">;</span><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-54"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">type_SD</span><span class="o">=</span><span class="cn">2</span><span class="sy">;</span><span class="h"> </span><span class="c">//карта SD версии 2, иниализировать карту будем с помощью команды ACDM41 (CMD55 + CMD41)</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-55"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-56"><span class="h">&nbsp;&nbsp;</span><span class="sy">}</span><span class="h"> </span><span class="st">while</span><span class="sy">(</span><span class="sy">(</span><span class="i">status_</span><span class="o">!=</span><span class="cn">0x01</span><span class="sy">)</span><span class="h"> </span><span class="st">and</span><span class="h"> </span><span class="sy">(</span><span class="i">status_</span><span class="o">!=</span><span class="cn">0x04</span><span class="sy">)</span><span class="sy">)</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-57"><span class="h">&nbsp;&nbsp;</span><span class="c">//-----конец команды CDM8 - проверяем версию SD карты</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-58"><span class="h">&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-59"><span class="h">&nbsp;&nbsp;</span><span class="c">//-----инициализация карты SD v.1, с помощью команды CMD1&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-60"><span class="h">&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">type_SD</span><span class="o">==</span><span class="cn">1</span><span class="sy">)</span><span class="h"> </span><span class="sy">{</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-61"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">while</span><span class="h"> </span><span class="sy">(</span><span class="t">true</span><span class="sy">)</span><span class="h"> </span><span class="sy">{</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-62"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x41</span><span class="sy">)</span><span class="o">==</span><span class="cn">0x00</span><span class="sy">)</span><span class="h"> </span><span class="st">break</span><span class="sy">;</span><span class="h"> </span><span class="c">//бесконечное число раз</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-63"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="o">==</span><span class="cn">0x00</span><span class="sy">)</span><span class="h"> </span><span class="st">break</span><span class="sy">;</span><span class="h"> </span><span class="c">//отправляем команды CMD1</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-64"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="o">==</span><span class="cn">0x00</span><span class="sy">)</span><span class="h"> </span><span class="st">break</span><span class="sy">;</span><span class="h"> </span><span class="c">//с пустым аргументом и </span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-65"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="o">==</span><span class="cn">0x00</span><span class="sy">)</span><span class="h"> </span><span class="st">break</span><span class="sy">;</span><span class="h"> </span><span class="c">//произвольным CRC</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-66"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="o">==</span><span class="cn">0x00</span><span class="sy">)</span><span class="h"> </span><span class="st">break</span><span class="sy">;</span><span class="h"> </span><span class="c">//до тех пор, пока не получим</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-67"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="o">==</span><span class="cn">0x00</span><span class="sy">)</span><span class="h"> </span><span class="st">break</span><span class="sy">;</span><span class="h"> </span><span class="c">//ответ 0x00</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-68"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-69"><span class="h">&nbsp;&nbsp;</span><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-70"><span class="h">&nbsp;&nbsp;</span><span class="c">//-----конец инициализации карты SD v.1&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-71"><span class="h">&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-72"><span class="h">&nbsp;&nbsp;</span><span class="c">//-----инициализация карты SD v.2, с помощью команды ACDM41 (CMD55 + CMD41)&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-73"><span class="h">&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">type_SD</span><span class="o">==</span><span class="cn">2</span><span class="sy">)</span><span class="h"> </span><span class="sy">{</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-74"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">for</span><span class="h"> </span><span class="sy">(</span><span class="i">uint8_t</span><span class="h"> </span><span class="i">i</span><span class="h"> </span><span class="o">=</span><span class="h"> </span><span class="cn">0</span><span class="sy">;</span><span class="h"> </span><span class="i">i</span><span class="h"> </span><span class="o">&lt;</span><span class="h"> </span><span class="cn">4</span><span class="sy">;</span><span class="h"> </span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="sy">,</span><span class="i">i</span><span class="o">++</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//свдигаем 4-е байта ответа от CMD8, нам они не нужны</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-75"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="st">do</span><span class="h"> </span><span class="sy">{</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-76"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="c">//CMD55</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-77"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0X77</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//индекс команды cmd55</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-78"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//первый байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-79"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//второй байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-80"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//третий байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-81"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//четвертый байт пустого аргумента РАЗОБРАТЬСЯ ГДЕ ПЕРВЫЙ БАЙТ ГДЕ ПОСЛЕДНИЙ</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-82"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0X00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">// CRC</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-83"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">while</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="o">!=</span><span class="cn">0x01</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//ожидание сигнала о принятия команды</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-84"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-85"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="c">//CMD41&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-86"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0X69</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//индекс команды cmd41&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-87"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x40</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//первый байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-88"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//второй байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-89"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//третий байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-90"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//четвертый байт пустого аргумента РАЗОБРАТЬСЯ ГДЕ ПЕРВЫЙ БАЙТ ГДЕ ПОСЛЕДНИЙ</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-91"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0XFF</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">// CRC </span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-92"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-93"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//сдвигаем на один байт</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-94"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">status_</span><span class="h"> </span><span class="o">=</span><span class="h"> </span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="sy">;</span><span class="h">&nbsp;&nbsp;</span><span class="c">//ответ на команду ACMD41</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-95"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-96"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="st">while</span><span class="h"> </span><span class="sy">(</span><span class="i">status_</span><span class="o">!=</span><span class="h"> </span><span class="cn">0X00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//шлем команду ACMD41 до тех пор, пока не получим ответ 0x00</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-97"><span class="h">&nbsp;&nbsp;</span><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-98"><span class="h">&nbsp;&nbsp;</span><span class="c">//------конец инициализации карты SD v.2&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-99"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-100"><span class="h">&nbsp;&nbsp;</span><span class="i">Serial</span><span class="sy">.</span><span class="e">println</span><span class="sy">(</span><span class="s">"USPEH!"</span><span class="sy">)</span><span class="sy">;</span><span class="h">&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-101"><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-102"><span class="h">&nbsp;&nbsp;</span><span class="e">digitalWrite</span><span class="sy">(</span><span class="cn">4</span><span class="sy">,</span><span class="h"> </span><span class="i">HIGH</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//выставим логическую еденицу на CS&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-103"><span class="h"> </span><span class="c">/////////////////////////////////////КОНЕЦ ИНИЦИАЛИЗАЦИИ///////////////////////////////////////////</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-104">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa954-105"><span class="h">&nbsp;&nbsp;</span><span class="c">//ЗАПИСЬ БЛОКА--------------------------------------------------</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-106"><span class="h">&nbsp;&nbsp;</span><span class="e">digitalWrite</span><span class="sy">(</span><span class="cn">4</span><span class="sy">,</span><span class="h"> </span><span class="i">LOW</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-107">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa954-108"><span class="h">&nbsp;&nbsp;</span><span class="c">// команда - сmd24, запись блока данных</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-109"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x58</span><span class="sy">)</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-110"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//аргумент, адрес блока</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-111"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-112"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-113"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-114"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-115"><span class="h">&nbsp;&nbsp;</span><span class="st">while</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="o">!=</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//ожидание сигнала о принятия команды</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-116">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa954-117"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//один байт ожидания</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-118"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFE</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//метка начала пакета данных</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-119"><span class="h">&nbsp;&nbsp;</span><span class="st">for</span><span class="h"> </span><span class="sy">(</span><span class="t">int</span><span class="h"> </span><span class="i">i</span><span class="o">=</span><span class="cn">0</span><span class="sy">;</span><span class="h"> </span><span class="i">i</span><span class="o">&lt;</span><span class="cn">512</span><span class="sy">;</span><span class="h"> </span><span class="i">i</span><span class="o">++</span><span class="sy">)</span><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-120"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xAB</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//блок данных</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-121"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//1-ый байт CRC</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-122"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//2-ой байт CRC</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-123"><span class="h">&nbsp;&nbsp;</span><span class="st">while</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="o">!=</span><span class="cn">0x05</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//ожидание сигнала о принятия команды</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-124">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa954-125"><span class="h">&nbsp;&nbsp;</span><span class="st">while</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="o">!=</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//ожидание сигнала о окончания записи данных</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-126">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa954-127"><span class="h">&nbsp;&nbsp;</span><span class="e">digitalWrite</span><span class="sy">(</span><span class="cn">4</span><span class="sy">,</span><span class="h"> </span><span class="i">HIGH</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-128"><span class="h">&nbsp;&nbsp;</span><span class="c">//КОНЕЦ ЗАПИСЬ БЛОКА--------------------------------------------------</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-129">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa954-130"><span class="h">&nbsp;&nbsp;</span><span class="c">//ЧТЕНИЕ БЛОКА--------------------------------------------------</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-131"><span class="h">&nbsp;&nbsp;</span><span class="e">digitalWrite</span><span class="sy">(</span><span class="cn">4</span><span class="sy">,</span><span class="h"> </span><span class="i">LOW</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-132">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa954-133"><span class="h">&nbsp;&nbsp;</span><span class="c">// команда - сmd17, чтение блока данных</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-134"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x51</span><span class="sy">)</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-135"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//аргумент, адрес блока</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-136"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-137"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-138"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-139"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-140"><span class="h">&nbsp;&nbsp;</span><span class="st">while</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="o">!=</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//ожидание сигнала о принятия команды</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-141">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa954-142"><span class="h">&nbsp;&nbsp;</span><span class="st">while</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="o">!=</span><span class="cn">0xFE</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//ожидание сигнала о начале пакета данных</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-143">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa954-144"><span class="h">&nbsp;&nbsp;</span><span class="st">for</span><span class="h"> </span><span class="sy">(</span><span class="t">int</span><span class="h"> </span><span class="i">i</span><span class="o">=</span><span class="cn">0</span><span class="sy">;</span><span class="h"> </span><span class="i">i</span><span class="o">&lt;</span><span class="cn">512</span><span class="sy">;</span><span class="h"> </span><span class="i">i</span><span class="o">++</span><span class="sy">)</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-145"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">block</span><span class="sy">[</span><span class="i">i</span><span class="sy">]</span><span class="o">=</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//считываем блок данных в массив block с размером 512 элементов типа byte.//считываем блок данных в массив block с размером 512 элементов типа byte.</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-146">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa954-147"><span class="h">&nbsp;&nbsp;</span><span class="c">//сдвинем еще на два байта, это CRC</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-148"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-149"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-150"><span class="h">&nbsp;&nbsp;</span><span class="e">digitalWrite</span><span class="sy">(</span><span class="cn">4</span><span class="sy">,</span><span class="h"> </span><span class="i">HIGH</span><span class="sy">)</span><span class="sy">;</span><span class="h">&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-151"><span class="h">&nbsp;&nbsp;</span><span class="c">//КОНЕЦ ЧТЕНИЯ БЛОКА--------------------------------------------------&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-152"><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-153">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa954-154"><span class="t">void</span><span class="h"> </span><span class="e">loop</span><span class="sy">(</span><span class="sy">)</span><span class="h"> </span><span class="sy">{</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-155"><span class="h"> </span><span class="e">delay</span><span class="sy">(</span><span class="cn">100</span><span class="sy">)</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-156"><span class="sy">}</span></div></div></td>
  1162. </tr>
  1163. </tbody></table>
  1164. </div>
  1165. </div>
  1166. <!-- [Format Time: 0.0160 seconds] -->
  1167. <p>&nbsp;</p>
  1168. <p><a href="#6">Где я могу проверить данный код, если у меня нет ATmega328P?</a></p>
  1169. <p>&nbsp;</p>
  1170. <p>&nbsp;</p>
  1171. <p>&nbsp;</p>
  1172. <h1 id="5">Как читать регистры SD карты?</h1>
  1173. <p>&nbsp;</p>
  1174. <p>В SD карте есть программно доступные регистры, в которых храниться<strong> параметры карты и её настройки</strong>. Мы можем читать регистры и узнать какую-нибудь полезную информацию. Регистров около 10-и, в <a href="#1">спецификации</a> вы можете узнать о каждом из них.</p>
  1175. <p>&nbsp;</p>
  1176. <p>Наиболее интересные регистры:</p>
  1177. <p>&nbsp;</p>
  1178. <p>—Регистр <strong>CID</strong> (Card identification data): содержит
  1179. данные, по которым можно идентифицировать карту памяти (серийный номер,
  1180. ID производителя, дату изготовления и т.д.)<br>
  1181. —Регистр <strong>CSD</strong> (Card-specific data): содержит
  1182. всевозможную информацию о карте памяти (от размера сектора карты памяти
  1183. до потребления в режиме чтения/записи).<br>
  1184. —Регистр <strong>OCR</strong> (Operation Conditions Register): содержит
  1185. напряжения питания карты памяти, тип питания карты памяти, статус
  1186. процесса инициализации карты</p>
  1187. <p>&nbsp;</p>
  1188. <p>Чтение регистров, похоже на чтение блока памяти, отличие заключается лишь в размере возвращаемых данных.</p>
  1189. <p>&nbsp;</p>
  1190. <p>Я приведу пример <strong>как прочесть регистр CID</strong>.</p>
  1191. <p>&nbsp;</p>
  1192. <p>&nbsp;</p>
  1193. <h3>Читаем CID</h3>
  1194. <p>&nbsp;</p>
  1195. <p>Для того, что бы прочесть регистр <strong>CID</strong>, карте необходимо послать команду <strong>CMD10</strong>. В результате чего, <strong>SD</strong> карта вернет<strong> пакет данных с размером 16 байт</strong>. Определить начало пакета мы можем по метке <strong>0xFE</strong>.</p>
  1196. <p>&nbsp;</p>
  1197. <p>Не буду разжевывать, здесь все по аналогии с «чтением данных по блокам». Приведу сразу полный код чтения CID на Arduino</p>
  1198. <p>&nbsp;</p><!-- Crayon Syntax Highlighter v1.17 -->
  1199. <div id="crayon-55a8b9b3aa96b" class="crayon-syntax crayon-theme-ado crayon-font-monaco crayon-os-pc print-yes" data-settings=" scroll-mouseover" style=" margin-top: 12px; margin-bottom: 12px; float: none; clear: both; font-size: 12px !important; line-height: 15px !important;">
  1200. <div class="crayon-toolbar" data-settings=" mouseover overlay delay" style="height: 18px !important; line-height: 18px !important;">
  1201. <div class="crayon-tools"><a class="crayon-copy-button crayon-button" data-text="Нажмите %s для копирования, %s для вставки" title="Копировать как текст"></a><a class="crayon-popup-button crayon-button" title="Показать код в новом окне" onclick="return false;"></a></div></div>
  1202. <div class="crayon-info" style="min-height: 15px !important; line-height: 15px !important;"></div>
  1203. <div class="crayon-plain-wrap"><textarea class="crayon-plain print-no" data-settings=" show-plain-default" readonly="readonly" style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;" wrap="off">#include &lt;SPI.h&gt;
  1204. byte block16[16]; //куда будем считывать блок данных с значением регистра CID
  1205. uint8_t status_;
  1206. int type_SD=0;
  1207. void setup() {
  1208. Serial.begin(9600);
  1209. delay(5); //ждем, пока питающее напряжение на карте не будет номинально
  1210. pinMode(4, OUTPUT); //в качестве CS мы будем использовать 4-пин Arduino (или PD4 или 6-оый выход ATmega328P)
  1211. digitalWrite(4, HIGH); //выставим логическую еденицу на CS
  1212. SPI.begin(); // инициализация SPI
  1213. SPI.setDataMode(SPI_MODE0); //SD карта работает в режиме SPI-0
  1214. SPI.setClockDivider(SPI_CLOCK_DIV128);
  1215. for (int i = 0; i &lt; 10; i++) //подадим 80 тактовых импульсов
  1216. SPI.transfer(0XFF); //хотя требуется не менее 74
  1217. /////////////////////////////////////НАЧАЛО ИНИЦИАЛИЗАЦИИ///////////////////////////////////////////
  1218. digitalWrite(4, LOW); //выставим на CS логический ноль
  1219. //-----команда CDM0 - програмный сброс
  1220. SPI.transfer(0x40); //индекс команды cmd0
  1221. SPI.transfer(0x00); //первый байт пустого аргумента
  1222. SPI.transfer(0x00); //второй байт пустого аргумента
  1223. SPI.transfer(0x00); //третий байт пустого аргумента
  1224. SPI.transfer(0x00); //четвертый байт пустого аргумента
  1225. SPI.transfer(0x95); // CRC
  1226. while (SPI.transfer(0xFF)!=0x01); //ожидание сигнала о принятия команды (ответ R1 - один байт)
  1227. //-----конец команды CDM0 - програмный сброс
  1228. //-----команда CDM8 - проверяем версию SD карты
  1229. delay(300);
  1230. SPI.transfer(0x48); //индекс команды cmd8
  1231. SPI.transfer(0x00); //первый байт пустого аргумента
  1232. SPI.transfer(0x00); //второй байт пустого аргумента
  1233. SPI.transfer(0x01); //третий байт пустого аргумента
  1234. SPI.transfer(0xAA); //четвертый байт пустого аргумента РАЗОБРАТЬСЯ ГДЕ ПЕРВЫЙ БАЙТ ГДЕ ПОСЛЕДНИЙ
  1235. SPI.transfer(0X87); // CRC
  1236. do { //ожидание сигнала о принятия команды (ответ R7 - 5 байт (1-ый байт это R1, далее 4-е байта нам не интересны))
  1237. status_=SPI.transfer(0xFF);
  1238. //если ответ R1 0x04 - "com are error", значит SD v.1
  1239. if (status_==0x04) {
  1240. Serial.println("SD V1");
  1241. type_SD=1; //карта SD версии 1, иниализировать карту будем с помощьюу команды CDM1
  1242. }
  1243. //если ответ R1 0x01 - "in idle state", значит SD v.2
  1244. if (status_==0x01) {
  1245. Serial.println("SD V2");
  1246. type_SD=2; //карта SD версии 2, иниализировать карту будем с помощью команды ACDM41 (CMD55 + CMD41)
  1247. }
  1248. } while((status_!=0x01) and (status_!=0x04));
  1249. //-----конец команды CDM8 - проверяем версию SD карты
  1250. //-----инициализация карты SD v.1, с помощью команды CMD1
  1251. if (type_SD==1) {
  1252. while (true) {
  1253. if (SPI.transfer(0x41)==0x00) break; //бесконечное число раз
  1254. if (SPI.transfer(0x00)==0x00) break; //отправляем команды CMD1
  1255. if (SPI.transfer(0x00)==0x00) break; //с пустым аргументом и
  1256. if (SPI.transfer(0x00)==0x00) break; //произвольным CRC
  1257. if (SPI.transfer(0x00)==0x00) break; //до тех пор, пока не получим
  1258. if (SPI.transfer(0x00)==0x00) break; //ответ 0x00
  1259. }
  1260. }
  1261. //-----конец инициализации карты SD v.1
  1262. //-----инициализация карты SD v.2, с помощью команды ACDM41 (CMD55 + CMD41)
  1263. if (type_SD==2) {
  1264. for (uint8_t i = 0; i &lt; 4; SPI.transfer(0xFF),i++); //свдигаем 4-е байта ответа от CMD8, нам они не нужны
  1265. do {
  1266. //CMD55
  1267. SPI.transfer(0X77); //индекс команды cmd55
  1268. SPI.transfer(0x00); //первый байт пустого аргумента
  1269. SPI.transfer(0x00); //второй байт пустого аргумента
  1270. SPI.transfer(0x00); //третий байт пустого аргумента
  1271. SPI.transfer(0x00); //четвертый байт пустого аргумента РАЗОБРАТЬСЯ ГДЕ ПЕРВЫЙ БАЙТ ГДЕ ПОСЛЕДНИЙ
  1272. SPI.transfer(0X00); // CRC
  1273. while (SPI.transfer(0xFF)!=0x01); //ожидание сигнала о принятия команды
  1274. //CMD41
  1275. SPI.transfer(0X69); //индекс команды cmd41
  1276. SPI.transfer(0x40); //первый байт пустого аргумента
  1277. SPI.transfer(0x00); //второй байт пустого аргумента
  1278. SPI.transfer(0x00); //третий байт пустого аргумента
  1279. SPI.transfer(0x00); //четвертый байт пустого аргумента РАЗОБРАТЬСЯ ГДЕ ПЕРВЫЙ БАЙТ ГДЕ ПОСЛЕДНИЙ
  1280. SPI.transfer(0XFF); // CRC
  1281. SPI.transfer(0xFF); //сдвигаем на один байт
  1282. status_ = SPI.transfer(0xFF); //ответ на команду ACMD41
  1283. }
  1284. while (status_!= 0X00); //шлем команду ACMD41 до тех пор, пока не получим ответ 0x00
  1285. }
  1286. //------конец инициализации карты SD v.2
  1287. Serial.println("USPEH!");
  1288. digitalWrite(4, HIGH); //выставим логическую еденицу на CS
  1289. /////////////////////////////////////КОНЕЦ ИНИЦИАЛИЗАЦИИ///////////////////////////////////////////
  1290. //ЧИТАЕМ РЕГИСТР CID--------------------------------------------------
  1291. digitalWrite(4, LOW); //выставим на CS логический ноль
  1292. //команда CDM10
  1293. SPI.transfer(0x4A); //индекс команды cmd10
  1294. SPI.transfer(0x00); //первый байт пустого аргумента
  1295. SPI.transfer(0x00); //второй байт пустого аргумента
  1296. SPI.transfer(0x00); //третий байт пустого аргумента
  1297. SPI.transfer(0x00); //четвертый байт пустого аргумента
  1298. SPI.transfer(0x00); // CRC
  1299. while (SPI.transfer(0xFF)!=0x00); //ожидание сигнала о принятия команды
  1300. while (SPI.transfer(0xFF)!=0xFE); //ожидание сигнала о начале пакета данных
  1301. for (int i=0; i&lt;16; i++)
  1302. block16[i]=SPI.transfer(0xFF); //считываем блок данных в массив block16 с размером 16 элементов типа byte.
  1303. //сдвинем еще на два байта, это CRC
  1304. SPI.transfer(0xFF);
  1305. SPI.transfer(0xFF);
  1306. digitalWrite(4, HIGH);
  1307. //КОНЕЦ ЧИТАЕМ РЕГИСТР CID--------------------------------------------
  1308. }
  1309. void loop() {
  1310. delay(100);
  1311. }</textarea></div>
  1312. <div class="crayon-main" style="">
  1313. <table class="crayon-table">
  1314. <tbody><tr class="crayon-row">
  1315. <td class="crayon-nums " data-settings="hide" style="font-size: 12px !important; line-height: 15px !important;">
  1316. <div class="crayon-nums-content"><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-1">1</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-2">2</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-3">3</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-4">4</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-5">5</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-6">6</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-7">7</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-8">8</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-9">9</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-10">10</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-11">11</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-12">12</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-13">13</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-14">14</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-15">15</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-16">16</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-17">17</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-18">18</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-19">19</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-20">20</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-21">21</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-22">22</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-23">23</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-24">24</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-25">25</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-26">26</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-27">27</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-28">28</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-29">29</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-30">30</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-31">31</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-32">32</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-33">33</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-34">34</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-35">35</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-36">36</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-37">37</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-38">38</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-39">39</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-40">40</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-41">41</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-42">42</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-43">43</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-44">44</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-45">45</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-46">46</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-47">47</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-48">48</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-49">49</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-50">50</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-51">51</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-52">52</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-53">53</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-54">54</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-55">55</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-56">56</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-57">57</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-58">58</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-59">59</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-60">60</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-61">61</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-62">62</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-63">63</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-64">64</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-65">65</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-66">66</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-67">67</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-68">68</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-69">69</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-70">70</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-71">71</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-72">72</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-73">73</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-74">74</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-75">75</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-76">76</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-77">77</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-78">78</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-79">79</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-80">80</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-81">81</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-82">82</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-83">83</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-84">84</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-85">85</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-86">86</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-87">87</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-88">88</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-89">89</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-90">90</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-91">91</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-92">92</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-93">93</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-94">94</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-95">95</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-96">96</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-97">97</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-98">98</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-99">99</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-100">100</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-101">101</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-102">102</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-103">103</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-104">104</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-105">105</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-106">106</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-107">107</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-108">108</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-109">109</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-110">110</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-111">111</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-112">112</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-113">113</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-114">114</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-115">115</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-116">116</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-117">117</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-118">118</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-119">119</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-120">120</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-121">121</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-122">122</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-123">123</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-124">124</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-125">125</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-126">126</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-127">127</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-128">128</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-129">129</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-130">130</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-131">131</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-132">132</div><div class="crayon-num" data-line="crayon-55a8b9b3aa96b-133">133</div></div>
  1317. </td>
  1318. <td class="crayon-code"><div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important;"><div class="crayon-line" id="crayon-55a8b9b3aa96b-1"><span class="p">#include &lt;SPI.h&gt;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-2">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa96b-3"><span class="t">byte</span><span class="h"> </span><span class="i">block16</span><span class="sy">[</span><span class="cn">16</span><span class="sy">]</span><span class="sy">;</span><span class="h"> </span><span class="c">//куда будем считывать блок данных с значением регистра CID</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-4"><span class="e">uint8_t </span><span class="i">status_</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-5"><span class="t">int</span><span class="h"> </span><span class="i">type_SD</span><span class="o">=</span><span class="cn">0</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-6">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa96b-7"><span class="t">void</span><span class="h"> </span><span class="e">setup</span><span class="sy">(</span><span class="sy">)</span><span class="h"> </span><span class="sy">{</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-8">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa96b-9"><span class="h">&nbsp;&nbsp;</span><span class="i">Serial</span><span class="sy">.</span><span class="e">begin</span><span class="sy">(</span><span class="cn">9600</span><span class="sy">)</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-10"><span class="h">&nbsp;&nbsp;</span><span class="e">delay</span><span class="sy">(</span><span class="cn">5</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//ждем, пока питающее напряжение на карте не будет номинально</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-11">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa96b-12"><span class="h">&nbsp;&nbsp;</span><span class="e">pinMode</span><span class="sy">(</span><span class="cn">4</span><span class="sy">,</span><span class="h"> </span><span class="i">OUTPUT</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//в качестве CS мы будем использовать 4-пин Arduino (или PD4 или 6-оый выход ATmega328P)</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-13"><span class="h">&nbsp;&nbsp;</span><span class="e">digitalWrite</span><span class="sy">(</span><span class="cn">4</span><span class="sy">,</span><span class="h"> </span><span class="i">HIGH</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//выставим логическую еденицу на CS&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-14">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa96b-15"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">begin</span><span class="sy">(</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">// инициализация SPI </span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-16"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">setDataMode</span><span class="sy">(</span><span class="i">SPI_MODE0</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//SD карта работает в режиме SPI-0</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-17"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">setClockDivider</span><span class="sy">(</span><span class="i">SPI_CLOCK_DIV128</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-18">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa96b-19"><span class="h">&nbsp;&nbsp;</span><span class="st">for</span><span class="h"> </span><span class="sy">(</span><span class="t">int</span><span class="h"> </span><span class="i">i</span><span class="h"> </span><span class="o">=</span><span class="h"> </span><span class="cn">0</span><span class="sy">;</span><span class="h"> </span><span class="i">i</span><span class="h"> </span><span class="o">&lt;</span><span class="h"> </span><span class="cn">10</span><span class="sy">;</span><span class="h"> </span><span class="i">i</span><span class="o">++</span><span class="sy">)</span><span class="h">&nbsp;&nbsp;</span><span class="c">//подадим 80 тактовых импульсов</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-20"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0XFF</span><span class="sy">)</span><span class="sy">;</span><span class="h">&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="c">//хотя требуется не менее 74</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-21">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa96b-22"><span class="h"> </span><span class="c">/////////////////////////////////////НАЧАЛО ИНИЦИАЛИЗАЦИИ///////////////////////////////////////////</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-23"><span class="h">&nbsp;&nbsp;</span><span class="e">digitalWrite</span><span class="sy">(</span><span class="cn">4</span><span class="sy">,</span><span class="h"> </span><span class="i">LOW</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//выставим на CS логический ноль</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-24">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa96b-25"><span class="h">&nbsp;&nbsp;</span><span class="c">//-----команда CDM0 - програмный сброс</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-26"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x40</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//индекс команды cmd0</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-27"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//первый байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-28"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//второй байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-29"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//третий байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-30"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//четвертый байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-31"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x95</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">// CRC</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-32"><span class="h">&nbsp;&nbsp;</span><span class="st">while</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="o">!=</span><span class="cn">0x01</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//ожидание сигнала о принятия команды (ответ R1 - один байт)</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-33"><span class="h">&nbsp;&nbsp;</span><span class="c">//-----конец команды CDM0 - програмный сброс</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-34"><span class="h">&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-35"><span class="h">&nbsp;&nbsp;</span><span class="c">//-----команда CDM8 - проверяем версию SD карты</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-36"><span class="h">&nbsp;&nbsp;</span><span class="e">delay</span><span class="sy">(</span><span class="cn">300</span><span class="sy">)</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-37"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x48</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//индекс команды cmd8</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-38"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//первый байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-39"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//второй байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-40"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x01</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//третий байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-41"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xAA</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//четвертый байт пустого аргумента РАЗОБРАТЬСЯ ГДЕ ПЕРВЫЙ БАЙТ ГДЕ ПОСЛЕДНИЙ</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-42"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0X87</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">// CRC</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-43"><span class="h">&nbsp;&nbsp;</span><span class="st">do</span><span class="h"> </span><span class="sy">{</span><span class="h"> </span><span class="c">//ожидание сигнала о принятия команды (ответ R7 - 5 байт (1-ый байт это R1, далее 4-е байта нам не интересны))</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-44"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">status_</span><span class="o">=</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-45"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-46"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="c">//если ответ R1 0x04 - "com are error", значит SD v.1 </span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-47"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">status_</span><span class="o">==</span><span class="cn">0x04</span><span class="sy">)</span><span class="h"> </span><span class="sy">{</span><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-48"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">Serial</span><span class="sy">.</span><span class="e">println</span><span class="sy">(</span><span class="s">"SD V1"</span><span class="sy">)</span><span class="sy">;</span><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-49"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">type_SD</span><span class="o">=</span><span class="cn">1</span><span class="sy">;</span><span class="h"> </span><span class="c">//карта SD версии 1, иниализировать карту будем с помощьюу команды CDM1</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-50"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="sy">}</span><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-51"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="c">//если ответ R1 0x01 - "in idle state", значит SD v.2</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-52"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">status_</span><span class="o">==</span><span class="cn">0x01</span><span class="sy">)</span><span class="h"> </span><span class="sy">{</span><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-53"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">Serial</span><span class="sy">.</span><span class="e">println</span><span class="sy">(</span><span class="s">"SD V2"</span><span class="sy">)</span><span class="sy">;</span><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-54"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">type_SD</span><span class="o">=</span><span class="cn">2</span><span class="sy">;</span><span class="h"> </span><span class="c">//карта SD версии 2, иниализировать карту будем с помощью команды ACDM41 (CMD55 + CMD41)</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-55"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-56"><span class="h">&nbsp;&nbsp;</span><span class="sy">}</span><span class="h"> </span><span class="st">while</span><span class="sy">(</span><span class="sy">(</span><span class="i">status_</span><span class="o">!=</span><span class="cn">0x01</span><span class="sy">)</span><span class="h"> </span><span class="st">and</span><span class="h"> </span><span class="sy">(</span><span class="i">status_</span><span class="o">!=</span><span class="cn">0x04</span><span class="sy">)</span><span class="sy">)</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-57"><span class="h">&nbsp;&nbsp;</span><span class="c">//-----конец команды CDM8 - проверяем версию SD карты</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-58"><span class="h">&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-59"><span class="h">&nbsp;&nbsp;</span><span class="c">//-----инициализация карты SD v.1, с помощью команды CMD1&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-60"><span class="h">&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">type_SD</span><span class="o">==</span><span class="cn">1</span><span class="sy">)</span><span class="h"> </span><span class="sy">{</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-61"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">while</span><span class="h"> </span><span class="sy">(</span><span class="t">true</span><span class="sy">)</span><span class="h"> </span><span class="sy">{</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-62"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x41</span><span class="sy">)</span><span class="o">==</span><span class="cn">0x00</span><span class="sy">)</span><span class="h"> </span><span class="st">break</span><span class="sy">;</span><span class="h"> </span><span class="c">//бесконечное число раз</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-63"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="o">==</span><span class="cn">0x00</span><span class="sy">)</span><span class="h"> </span><span class="st">break</span><span class="sy">;</span><span class="h"> </span><span class="c">//отправляем команды CMD1</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-64"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="o">==</span><span class="cn">0x00</span><span class="sy">)</span><span class="h"> </span><span class="st">break</span><span class="sy">;</span><span class="h"> </span><span class="c">//с пустым аргументом и </span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-65"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="o">==</span><span class="cn">0x00</span><span class="sy">)</span><span class="h"> </span><span class="st">break</span><span class="sy">;</span><span class="h"> </span><span class="c">//произвольным CRC</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-66"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="o">==</span><span class="cn">0x00</span><span class="sy">)</span><span class="h"> </span><span class="st">break</span><span class="sy">;</span><span class="h"> </span><span class="c">//до тех пор, пока не получим</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-67"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="o">==</span><span class="cn">0x00</span><span class="sy">)</span><span class="h"> </span><span class="st">break</span><span class="sy">;</span><span class="h"> </span><span class="c">//ответ 0x00</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-68"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-69"><span class="h">&nbsp;&nbsp;</span><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-70"><span class="h">&nbsp;&nbsp;</span><span class="c">//-----конец инициализации карты SD v.1&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-71"><span class="h">&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-72"><span class="h">&nbsp;&nbsp;</span><span class="c">//-----инициализация карты SD v.2, с помощью команды ACDM41 (CMD55 + CMD41)&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-73"><span class="h">&nbsp;&nbsp;</span><span class="st">if</span><span class="h"> </span><span class="sy">(</span><span class="i">type_SD</span><span class="o">==</span><span class="cn">2</span><span class="sy">)</span><span class="h"> </span><span class="sy">{</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-74"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">for</span><span class="h"> </span><span class="sy">(</span><span class="i">uint8_t</span><span class="h"> </span><span class="i">i</span><span class="h"> </span><span class="o">=</span><span class="h"> </span><span class="cn">0</span><span class="sy">;</span><span class="h"> </span><span class="i">i</span><span class="h"> </span><span class="o">&lt;</span><span class="h"> </span><span class="cn">4</span><span class="sy">;</span><span class="h"> </span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="sy">,</span><span class="i">i</span><span class="o">++</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//свдигаем 4-е байта ответа от CMD8, нам они не нужны</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-75"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="st">do</span><span class="h"> </span><span class="sy">{</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-76"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="c">//CMD55</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-77"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0X77</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//индекс команды cmd55</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-78"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//первый байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-79"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//второй байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-80"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//третий байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-81"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//четвертый байт пустого аргумента РАЗОБРАТЬСЯ ГДЕ ПЕРВЫЙ БАЙТ ГДЕ ПОСЛЕДНИЙ</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-82"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0X00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">// CRC</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-83"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="st">while</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="o">!=</span><span class="cn">0x01</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//ожидание сигнала о принятия команды</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-84"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-85"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="c">//CMD41&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-86"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0X69</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//индекс команды cmd41&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-87"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x40</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//первый байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-88"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//второй байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-89"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//третий байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-90"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//четвертый байт пустого аргумента РАЗОБРАТЬСЯ ГДЕ ПЕРВЫЙ БАЙТ ГДЕ ПОСЛЕДНИЙ</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-91"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0XFF</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">// CRC </span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-92"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-93"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//сдвигаем на один байт</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-94"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">status_</span><span class="h"> </span><span class="o">=</span><span class="h"> </span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="sy">;</span><span class="h">&nbsp;&nbsp;</span><span class="c">//ответ на команду ACMD41</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-95"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-96"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="st">while</span><span class="h"> </span><span class="sy">(</span><span class="i">status_</span><span class="o">!=</span><span class="h"> </span><span class="cn">0X00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//шлем команду ACMD41 до тех пор, пока не получим ответ 0x00</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-97"><span class="h">&nbsp;&nbsp;</span><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-98"><span class="h">&nbsp;&nbsp;</span><span class="c">//------конец инициализации карты SD v.2&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-99"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-100"><span class="h">&nbsp;&nbsp;</span><span class="i">Serial</span><span class="sy">.</span><span class="e">println</span><span class="sy">(</span><span class="s">"USPEH!"</span><span class="sy">)</span><span class="sy">;</span><span class="h">&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-101"><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-102"><span class="h">&nbsp;&nbsp;</span><span class="e">digitalWrite</span><span class="sy">(</span><span class="cn">4</span><span class="sy">,</span><span class="h"> </span><span class="i">HIGH</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//выставим логическую еденицу на CS&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-103"><span class="h"> </span><span class="c">/////////////////////////////////////КОНЕЦ ИНИЦИАЛИЗАЦИИ///////////////////////////////////////////</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-104">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa96b-105"><span class="h">&nbsp;&nbsp;</span><span class="c">//ЧИТАЕМ РЕГИСТР CID--------------------------------------------------&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-106"><span class="h">&nbsp;&nbsp;</span><span class="e">digitalWrite</span><span class="sy">(</span><span class="cn">4</span><span class="sy">,</span><span class="h"> </span><span class="i">LOW</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//выставим на CS логический ноль</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-107">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa96b-108"><span class="h">&nbsp;&nbsp;</span><span class="c">//команда CDM10</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-109"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x4A</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//индекс команды cmd10</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-110"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//первый байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-111"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//второй байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-112"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//третий байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-113"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//четвертый байт пустого аргумента</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-114"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">// CRC</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-115"><span class="h">&nbsp;&nbsp;</span><span class="st">while</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="o">!=</span><span class="cn">0x00</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//ожидание сигнала о принятия команды&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-116">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa96b-117"><span class="h">&nbsp;&nbsp;</span><span class="st">while</span><span class="h"> </span><span class="sy">(</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="o">!=</span><span class="cn">0xFE</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//ожидание сигнала о начале пакета данных</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-118">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa96b-119"><span class="h">&nbsp;&nbsp;</span><span class="st">for</span><span class="h"> </span><span class="sy">(</span><span class="t">int</span><span class="h"> </span><span class="i">i</span><span class="o">=</span><span class="cn">0</span><span class="sy">;</span><span class="h"> </span><span class="i">i</span><span class="o">&lt;</span><span class="cn">16</span><span class="sy">;</span><span class="h"> </span><span class="i">i</span><span class="o">++</span><span class="sy">)</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-120"><span class="h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="i">block16</span><span class="sy">[</span><span class="i">i</span><span class="sy">]</span><span class="o">=</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//считываем блок данных в массив block16 с размером 16 элементов типа byte.</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-121">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa96b-122"><span class="h">&nbsp;&nbsp;</span><span class="c">//сдвинем еще на два байта, это CRC</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-123"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-124"><span class="h">&nbsp;&nbsp;</span><span class="i">SPI</span><span class="sy">.</span><span class="e">transfer</span><span class="sy">(</span><span class="cn">0xFF</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-125">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa96b-126"><span class="h">&nbsp;&nbsp;</span><span class="e">digitalWrite</span><span class="sy">(</span><span class="cn">4</span><span class="sy">,</span><span class="h"> </span><span class="i">HIGH</span><span class="sy">)</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-127"><span class="h">&nbsp;&nbsp;</span><span class="c">//КОНЕЦ ЧИТАЕМ РЕГИСТР CID--------------------------------------------&nbsp;&nbsp;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-128">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa96b-129"><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-130">&nbsp;</div><div class="crayon-line" id="crayon-55a8b9b3aa96b-131"><span class="t">void</span><span class="h"> </span><span class="e">loop</span><span class="sy">(</span><span class="sy">)</span><span class="h"> </span><span class="sy">{</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-132"><span class="h"> </span><span class="e">delay</span><span class="sy">(</span><span class="cn">100</span><span class="sy">)</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-133"><span class="sy">}</span></div></div></td>
  1319. </tr>
  1320. </tbody></table>
  1321. </div>
  1322. </div>
  1323. <!-- [Format Time: 0.0147 seconds] -->
  1324. <p>&nbsp;</p>
  1325. <p><a href="#6">Где я могу проверить данный код, если у меня нет ATmega328P?</a></p>
  1326. <p>&nbsp;</p>
  1327. <p>&nbsp;</p>
  1328. <p>Структура CID регистра следующая</p>
  1329. <p>&nbsp;</p>
  1330. <p><a href="http://s-engineer.ru/mikrokontroller-rabotaem-s-sd-kartoj-bez-fajlovoj-sistemoj/cid_registror/" rel="attachment wp-att-3950"><img class="aligncenter size-full wp-image-3950" alt="CID_Registror" src="%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D0%BA%D0%B8%20%D0%B8%D0%BD%D0%B6%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%20%C2%BB%20%D0%90%D1%80%D1%85%D0%B8%D0%B2%20%D1%81%D0%B0%D0%B9%D1%82%D0%B0%20%C2%BB%20%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%BB%D0%B5%D1%80%20%E2%80%93%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D0%BC%20%D1%81%20SD%20%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D0%B9%20%D0%B1%D0%B5%D0%B7%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%BE%D0%B9%20%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_files/CID_Registror.jpg" height="328" width="817"></a></p>
  1331. <p>&nbsp;</p>
  1332. <p>&nbsp;</p>
  1333. <p>Расшифровать данные регистра можно на сайте <a href="http://goughlui.com/static/cidecode.htm" rel="nofollow">http://goughlui.com/static/cidecode.htm</a></p>
  1334. <p>&nbsp;</p>
  1335. <p>&nbsp;</p>
  1336. <h3 id="6">У меня нет железа, на чем я могу попробовать данные исходные коды?</h3>
  1337. <p>&nbsp;</p>
  1338. <p>Проверить приведенные здесь исходные коды вы можете в программе <strong>Proteus</strong>.
  1339. Для этого вам необходимо скомпилировать нужный вам исходный код(в среде
  1340. разработки Arduino вам нужно нажать на кнопку “Проверить”, в результате
  1341. компилируется&nbsp;исходный код и в папке “C:\Users\Admin\Local
  1342. Settings\Temp\buildXXXXXXXX.tmp” создается бинарный файл
  1343. “имя_скетча.cpp.elf”).</p>
  1344. <p>Далее указать контроллеру <strong>бинарный файл прошивки</strong> (два раза кликните на контроллер <strong>ATmega328P</strong> и в «<strong>Program File</strong>» укажите бинарный файл прошивки). Для <strong>SD</strong> карты необходимо указать <strong>файл образ</strong>, вы можете использовать «<strong>sample_sd.mmc</strong>» (лежит в корне проекта). Для запуска моделирования нажмите на значок «<strong>Play</strong>» в левом нижнем углу.</p>
  1345. <p><a href="http://s-engineer.ru/mikrokontroller-rabotaem-s-sd-kartoj-bez-fajlovoj-sistemoj/proteus/" rel="attachment wp-att-3959"><img class="aligncenter size-full wp-image-3959" alt="Proteus" src="%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D0%BA%D0%B8%20%D0%B8%D0%BD%D0%B6%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%20%C2%BB%20%D0%90%D1%80%D1%85%D0%B8%D0%B2%20%D1%81%D0%B0%D0%B9%D1%82%D0%B0%20%C2%BB%20%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%BB%D0%B5%D1%80%20%E2%80%93%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D0%BC%20%D1%81%20SD%20%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D0%B9%20%D0%B1%D0%B5%D0%B7%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%BE%D0%B9%20%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_files/Proteus.jpg" height="602" width="800"></a></p>
  1346. <p>&nbsp;</p>
  1347. <p>В проекте к ножкам <strong>MISO</strong>, <strong>MOSI</strong>, <strong>SCL</strong> и <strong>6-ой ноге</strong> в качестве <strong>CS</strong> микроконтроллера <strong>ATmega328P</strong> подключена <strong>SD</strong> карта с именем <strong>М1</strong>. Также к этим же ножкам &nbsp;подключен «<strong>SPI анализатор</strong>» и <strong>осциллограф</strong> для удобной отладки приложений. В качестве вывода информации вы можете использовать последовательный порт (<strong>UART</strong>), для вывода виртуальный терминал «<strong>1</strong>».</p>
  1348. <p>&nbsp;<br>
  1349. <a href="http://s-engineer.ru/Stand_SPI_practical_SD.zip" rel="">Ссылка на проект</a><br>
  1350. В архиве Arduino_STAND.DSN – файл проекта, sample_sd.mmc – образ SD
  1351. карты, Write_Read_SD.elf – тестовый бинарник по исх. кодам “записи и
  1352. чтения блока с SD карты”, папка empty_sample_sd_card с чистым
  1353. sample_sd.mmc, ведь после первого запуска текущий образ SD карты будет
  1354. заполнен данными “АВ”.<br>
  1355. &nbsp;</p>
  1356. <p>&nbsp;</p>
  1357. <br><br><div class="yarpp-related">
  1358. <h3>Вам будет интересно:</h3>
  1359. <br><div class="yarpp-thumbnails-horizontal">
  1360. <a class="yarpp-thumbnail" href="http://s-engineer.ru/mikrokontroller-rabotaem-na-sd-karte-c-fat16-na-nizkom-urovne/" title="Микроконтроллер – работаем на SD карте c FAT16 на низком уровне">
  1361. <img src="%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D0%BA%D0%B8%20%D0%B8%D0%BD%D0%B6%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%20%C2%BB%20%D0%90%D1%80%D1%85%D0%B8%D0%B2%20%D1%81%D0%B0%D0%B9%D1%82%D0%B0%20%C2%BB%20%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%BB%D0%B5%D1%80%20%E2%80%93%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D0%BC%20%D1%81%20SD%20%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D0%B9%20%D0%B1%D0%B5%D0%B7%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%BE%D0%B9%20%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_files/microcontroller_sd_fat16.jpg" class="attachment-yarpp-thumbnail wp-post-image" alt="microcontroller_sd_fat16" height="120" width="94"><span class="yarpp-thumbnail-title">Микроконтроллер – работаем на SD карте c FAT16 на низком уровне</span></a>
  1362. </div>
  1363. </div>
  1364. <br>
  1365. <!-- google adsense -->
  1366. <script async="" src="%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D0%BA%D0%B8%20%D0%B8%D0%BD%D0%B6%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%20%C2%BB%20%D0%90%D1%80%D1%85%D0%B8%D0%B2%20%D1%81%D0%B0%D0%B9%D1%82%D0%B0%20%C2%BB%20%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%BB%D0%B5%D1%80%20%E2%80%93%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D0%BC%20%D1%81%20SD%20%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D0%B9%20%D0%B1%D0%B5%D0%B7%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%BE%D0%B9%20%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_files/adsbygoogle.js"></script>
  1367. <!-- s-engineer.ru -->
  1368. <ins class="adsbygoogle" style="display:inline-block;width:728px;height:90px" data-ad-client="ca-pub-7548259700415477" data-ad-slot="8779678947"></ins>
  1369. <script>
  1370. (adsbygoogle = window.adsbygoogle || []).push({});
  1371. </script>
  1372. <!-- end google adsense -->
  1373. <br><br><b>Буду признателен если вы поделитесь данным постом</b>
  1374. <br>
  1375. <!-- Yandex buttons share -->
  1376. <div style="margin:0 auto" class="yashare-auto-init" data-yasharel10n="ru" data-yasharetype="none" data-yasharequickservices="yaru,vkontakte,facebook,twitter,odnoklassniki,moimir,lj,gplus,surfingbird">
  1377. </div>
  1378. <!-- /Yandex buttons share -->
  1379. </div>
  1380. <div class="longmeta">
  1381. <!-- You can start editing here. -->
  1382. <div id="comments" class="post">
  1383. <!-- If comments are open, but there are no comments. -->
  1384. </div>
  1385. <!-- end comments -->
  1386. <div id="respond">
  1387. <br>
  1388. <h2 class="">Ваш комментарий</h2>
  1389. <br>
  1390. <div>
  1391. <form action="http://s-engineer.ru/wp-comments-post.php" method="post" id="commentform">
  1392. <p><input name="author" id="author" size="22" tabindex="1" type="text">
  1393. <label for="author"><small>Имя *</small></label></p>
  1394. <p><input name="email" id="email" size="22" tabindex="2" type="text">
  1395. <label for="email"><small>Почта (скрыта) *</small></label></p>
  1396. <p><input name="url" id="url" size="22" tabindex="3" type="text">
  1397. <label for="url"><small>Сайт</small></label></p>
  1398. <!--<p><small><strong>XHTML:</strong> Вы можете использовать следующие теги: <code>&lt;a href=&quot;&quot; title=&quot;&quot;&gt; &lt;abbr title=&quot;&quot;&gt; &lt;acronym title=&quot;&quot;&gt; &lt;b&gt; &lt;blockquote cite=&quot;&quot;&gt; &lt;cite&gt; &lt;code&gt; &lt;del datetime=&quot;&quot;&gt; &lt;em&gt; &lt;i&gt; &lt;q cite=&quot;&quot;&gt; &lt;strike&gt; &lt;strong&gt; </code></small></p>-->
  1399. <p><textarea name="comment" id="comment" cols="100%" rows="10" tabindex="4" style="width: 480px;"></textarea></p>
  1400. <p><input name="submit" id="submit" tabindex="5" value="Отправить" type="submit">
  1401. <input name="comment_post_ID" value="3845" type="hidden">
  1402. </p>
  1403. <p style="display: none;"><input id="akismet_comment_nonce" name="akismet_comment_nonce" value="ccc12cca77" type="hidden"></p><p class="cptch_block"><label>Введите ответ в цифрах<span class="required"> </span></label><br> <input name="cptch_result" value="os2J" type="hidden">
  1404. <input name="cptch_time" value="1437120947" type="hidden">
  1405. <input value="Version: 2.4" type="hidden">
  1406. восемь × 3 = <input id="cptch_input" autocomplete="off" name="cptch_number" maxlength="2" size="2" aria-required="true" required="required" style="margin-bottom:0;display:inline;font-size: 12px;width: 40px;" type="text"> </p>
  1407. </form>
  1408. </div>
  1409. </div>
  1410. <!-- end respond -->
  1411. </div>
  1412. </div>
  1413. </div>
  1414. <!-- end content -->
  1415. <div id="sidebar">
  1416. <!--баннер vds24 -->
  1417. <div style="margin-left: 15px;margin-top: -10px;">
  1418. <a href="http://vds24.net/vds-hosting/" rel="nofollow" target="_blank">
  1419. <img title="[vds24.net] VDS Хостинг для Ваших проектов" style="border: 1px solid rgb(255, 204, 204); background-repeat: no-repeat; background-position: center center; background-image: url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9gMFRANL5LXnioAAAJWSURBVDjLnZI/ixtXFMV/972ZNzPSrmTtalexlsWBGMfEYOzaVciXyKdIkW/hFKnS22WafIDUxk0g2AQSgm0csIPWK42ktaSRNPP+pRBK5SLOqS7cew7ccw4xxrPJ+8XdHx4+7AE8e3Cj++zLm71fvrqT8x+QAK35dJr2n/x89urTa+eDm/cS+eI2y3eT+Lx/bt8u1vNqfDH++teXdk/6ThAfUUBIgL9ku75z/8WL7LOlhXIGJ0Pyw75wMcnGv//xSQ2DH4ddu9k01dXWsWzcofhYaiiViLjiWi9UWQa1gzcjWF7hgfzzW5ydnXB62JLjg0PTLfJertNepnQSIA+gE4Cs03UuNYYQYP4e5jPogmSG9vA6rrjC+0AxN2i5Qk0DpXVJhCQB0EVRrzqdFgB1DZfvCDHixiV2NqO6LHHKIKnQMoaWbFBgIrQVgIXaDc+JCHgP5QRZr4jzGWFbo6yncRYviiiQKUhBRch3Lyix4bgPWsAkcDkmZAV2OiE0DaI1WoEShRKF3sWnmt01pFBnJydEpZDEwHSGt47lYsls43AIXjTWV9R1Qx0DGahqLyAhbqrj0/ib0nRzXNoyCo0Kkor2llV0eKOwdUMg4pSQA7JPQXvnJv1B+GlwOvrGlaXB6fV2lb5t6qOtike56DSJgYDGBQcOAsQAfueBMeHR48fhadb1j/58HWARdt6yBv7+/vpBe2o5OogxlcaKdt5aKCNsk309W0WxKQjmQ33/9mJVAdWHdmo/tNvtRZIkfCz+ZQwGg6rT6Zj/LTAajTbD4bD5WIF/AAseEisPFO8uAAAAAElFTkSuQmCC&quot;);" alt="VDS Хостинг для Ваших проектов" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" height="250" width="250">
  1420. </a>
  1421. </div>
  1422. <br>
  1423. <!--конец баннеру vds24 -->
  1424. <center>Подписаться и читать нас можно в: </center>
  1425. <ul id="buttons">
  1426. <li><br>
  1427. <a id="RSS" rel="nofollow" target="_blank" href="http://feeds.feedburner.com/s-engineer" title="RSS сайта s-engineer.ru"></a>
  1428. <a id="E-mail" rel="nofollow" target="_blank" href="http://feedburner.google.com/fb/a/mailverify?uri=s-engineer&amp;loc=ru_RU" title="Подписаться по e-mail"></a>
  1429. <a id="vk" rel="nofollow" target="_blank" href="http://vk.com/sengineerru" title="s-engineer.ru В Контакте"></a>
  1430. <a id="twitter" rel="nofollow" target="_blank" href="https://twitter.com/@sengineerru" title="s-engineer.ru в Twitter"></a>
  1431. <a id="facebook" rel="nofollow" target="_blank" href="https://www.facebook.com/sengineerru" title="s-engineer.ru в Facebook"></a>
  1432. <a id="googlep" rel="nofollow" target="_blank" href="https://plus.google.com/103670875452035719286" title="s-engineer.ru в Google+"></a>
  1433. </li>
  1434. </ul>
  1435. <ul>
  1436. <li id="search-2" class="widget widget_search"><form method="get" id="search" action="http://s-engineer.ru/">
  1437. <div><input name="s" id="search-text" type="text">
  1438. <input id="search-submit" value="Ок" type="submit">
  1439. </div>
  1440. </form>
  1441. <div style="padding-bottom: 10px;">&nbsp;</div>
  1442. </li><!-- Wordpress Popular Posts Plugin v2.3.7 [W] [all] [views] [regular] -->
  1443. <li id="wpp-3" class="widget popular-posts">
  1444. <h2 class="widgettitle">Популярные посты</h2> <script type="text/javascript">
  1445. /* <![CDATA[ */
  1446. jQuery(document).ready(function(){
  1447. jQuery.get('http://s-engineer.ru/wp-admin/admin-ajax.php', {action: 'wpp_ajax_get_popular', id: '3'}, function(data){
  1448. jQuery('#wpp-3').append(data);
  1449. });
  1450. });
  1451. /* ]]> */
  1452. </script>
  1453. </li>
  1454. <!-- End Wordpress Popular Posts Plugin v2.3.7 -->
  1455. </ul>
  1456. <br><br><br><h2 class="widgettitle">Посты</h2><ul id="posts"><li><ul><li>1С-Битрикс</li><li id="post"><a href="http://s-engineer.ru/poleznye-melochi-v-1s-bitriks/">Полезные мелочи в 1с-Битрикс</a></li><li id="post"><a href="http://s-engineer.ru/formiruem-strukturu-sajta-i-napolnyaem-ego-soderzhimym-2/">Формируем структуру сайта 1С-Битрикс и наполняем его содержимым</a></li><li id="post"><a href="http://s-engineer.ru/kak-perenesti-shablon-sajta-na-drugoj-xosting-s-ustanovlennym-1s-bitriks/">Как перенести шаблон сайта на другой хостинг с установленным 1С-Битрикс?</a></li><li id="post"><a href="http://s-engineer.ru/korzina/">Корзина в 1С-Битрикс</a></li><li id="post"><a href="http://s-engineer.ru/vertikalnoe-menyu-proizvoditeli/">Вертикальное меню «Производители» в 1С-Битрикс</a></li><li id="post"><a href="http://s-engineer.ru/katalog/">Каталог (витрина) в 1С-Битрикс</a></li><li id="post"><a href="http://s-engineer.ru/poslednie-postupleniya/">Последние поступления в 1С-Битрикс</a></li><li id="post"><a href="http://s-engineer.ru/slajder/">Слайдер в 1С-Битрикс</a></li><li id="post"><a href="http://s-engineer.ru/specialnoe-predlozhenie/">Специальное предложение в 1С-Битрикс</a></li><li id="post"><a href="http://s-engineer.ru/podpiska-po-e-mail/">Подписка по e-mail в 1С-Битрикс</a></li><li id="post"><a href="http://s-engineer.ru/forma-poiska/">Форма поиска в 1С-Битрикс</a></li><li id="post"><a href="http://s-engineer.ru/vklyuchaemye-oblasti/">Включаемые области в 1С-Битрикс</a></li><li id="post"><a href="http://s-engineer.ru/vertikalnoe-menyu/">Вертикальное меню в 1С-Битрикс</a></li><li id="post"><a href="http://s-engineer.ru/gorizontalnoe-menyu/">Горизонтальное меню в 1С-Битрикс</a></li><li id="post"><a href="http://s-engineer.ru/integraciya-komponentov/">Интеграция компонентов в 1С-Битрикс</a></li><li id="post"><a href="http://s-engineer.ru/vybor-komponentov-dlya-shablona/">Подбор компонентов для шаблона в 1С-Битрикс</a></li><li id="post"><a href="http://s-engineer.ru/sozdaem-skelet-shablona/">Создаем скелет шаблона в 1С-Битрикс</a></li><li id="post"><a href="http://s-engineer.ru/kak-ustanovit-1s-bitriks/">Как установить 1С-Битрикс?</a></li><li id="post"><a href="http://s-engineer.ru/integraciya-htmlcss-shablona-v-cms-1s-bitriks/">Интеграция html+css шаблона в CMS 1С-Битрикс</a></li><li id="post"><a href="http://s-engineer.ru/obzor-1s-bitriks-princip-raboty/">Обзор 1С-Битрикс, принцип работы</a></li></ul></li><li><ul><li>Joomla</li><li id="post"><a href="http://s-engineer.ru/zabyli-parol-administratora-v-joomla-vostanovitsbrosit-parol-joomla/">Забыли пароль администратора в joomla? (востановить/сбросить пароль joomla)</a></li></ul></li><li><ul><li>OpenCart</li><li id="post"><a href="http://s-engineer.ru/kak-izmenit-logiku-formirovanie-ceny-v-opencart/">Как изменить логику формирование цены в OpenCart</a></li><li id="post"><a href="http://s-engineer.ru/dinamicheskaya-cena-tovara-v-opencart/">Динамическая цена товара в OpenCart</a></li><li id="post"><a href="http://s-engineer.ru/sozdaem-modul-v-opencart/">Создаем модуль в OpenCart</a></li><li id="post"><a href="http://s-engineer.ru/metodika-verstki-shablona-pod-opencart-ch-2/">Методика верстки шаблона под OpenCart ч.2</a></li><li id="post"><a href="http://s-engineer.ru/struktura-opencart/">Структура OpenCart</a></li><li id="post"><a href="http://s-engineer.ru/metodika-verstki-shablona-pod-opencart/">Методика верстки шаблона под OpenCart</a></li><li id="post"><a href="http://s-engineer.ru/opencart-prikruchivaem-model-k-kontrolleru/">OpenCart, прикручиваем модель к контроллеру</a></li><li id="post"><a href="http://s-engineer.ru/opencart-prikruchivaem-predstavlenie-k-kontrolleru/">OpenCart, прикручиваем представление к контроллеру</a></li><li id="post"><a href="http://s-engineer.ru/dobavlyaem-novuyu-stranicu-sxemu-v-opencart/">Добавляем новую страницу (схему) в OpenCart</a></li><li id="post"><a href="http://s-engineer.ru/opencart-dobavlyaem-nastrojki-v-panel-administratora/">Opencart, добавляем настройки в панель администратора</a></li><li id="post"><a href="http://s-engineer.ru/peremennye-cms-opencart/">Переменные CMS OpenCart</a></li></ul></li><li><ul><li>PHP, JavaScipt, HTML, CSS, SQL</li><li id="post"><a href="http://s-engineer.ru/struktura-i-sintaksis-sql-vyzhimka/">Структура и синтаксис SQL (выжимка)</a></li><li id="post"><a href="http://s-engineer.ru/teoreticheskie-azy-bd-vvedenie-v-sql/">Теоретические азы БД (введение в SQL)</a></li><li id="post"><a href="http://s-engineer.ru/oop-v-php-obshhie-ponyatiya/">ООП в PHP (общие понятия)</a></li><li id="post"><a href="http://s-engineer.ru/struktura-i-sintaksis-php-vyzhimka/">Структура и синтаксис PHP (выжимка)</a></li><li id="post"><a href="http://s-engineer.ru/otpravit-xml-json-jsonp-metodom-post-get-s-pomoshhyu-php-javascript-obrabotka-i-priem/">Отправить xml / json / jsonp методом POST / GET с помощью PHP / JavaScript, обработка и прием</a></li><li id="post"><a href="http://s-engineer.ru/otlavlivaem-postget-zapros/">Отлавливаем POST/GET запрос</a></li><li id="post"><a href="http://s-engineer.ru/nasledovanie-kaskadirovanie-i-specifichnost-css/">Наследование, каскадирование и специфичность CSS</a></li><li id="post"><a href="http://s-engineer.ru/struktura-i-sintaksis-javascript-vyzhimka/">Структура и синтаксис JavaScript (выжимка)</a></li><li id="post"><a href="http://s-engineer.ru/vnutrennyaya-optimizaciya-sajta-seo/">Внутренняя оптимизация сайта (SEO)</a></li></ul></li><li><ul><li>WordPress</li><li id="post"><a href="http://s-engineer.ru/bekap-rezervnoe-kopirovaniya-sajta-na-wordpress/">Бэкап (резервное копирования) сайта на wordpress</a></li><li id="post"><a href="http://s-engineer.ru/kak-rusificirovat-wordpress/">Как русифицировать WordPress</a></li><li id="post"><a href="http://s-engineer.ru/vyravnivanie-teksta-po-shirine-wordpress/">Выравнивание текста по ширине wordpress</a></li><li id="post"><a href="http://s-engineer.ru/perenos-sajta-wordpress-na-drugoj-xosting/">Перенос сайта wordpress на другой хостинг</a></li><li id="post"><a href="http://s-engineer.ru/sozdanie-sajta-na-wordpress-1/">Создание сайта на WordPress ч.1</a></li><li id="post"><a href="http://s-engineer.ru/sozdanie-sajta-na-wordpress-2/">Создание сайта на WordPress ч.2</a></li><li id="post"><a href="http://s-engineer.ru/ftp-server-na-ubuntu/">Загрузка плагинов и тем в WordPress по ftp</a></li><li id="post"><a href="http://s-engineer.ru/ustanovka-wordpress-po-ssh/">Установка WordPress по ssh</a></li></ul></li><li><ul><li>Администрирование Linux/Unix/Windows</li><li id="post"><a href="http://s-engineer.ru/ssh-dostup-po-klyuchu-freebsd/">SSH-доступ по ключу (FreeBSD)</a></li><li id="post"><a href="http://s-engineer.ru/kak-rabotat-s-mysql/">Как работать с MySQL?</a></li><li id="post"><a href="http://s-engineer.ru/poleznye-fragmenty-shell-skriptov-v-freebsd/">Полезные фрагменты shell скриптов (FreeBSD)</a></li><li id="post"><a href="http://s-engineer.ru/kak-primontirovat-usb-fleshku-flash/">Как примонтировать USB флешку (flash)</a></li><li id="post"><a href="http://s-engineer.ru/ustanovka-i-udalenie-programm-v-freebsd/">Установка и удаление программ в FreeBSD, коллекция портов (ports), установка пакетов (tbz)</a></li><li id="post"><a href="http://s-engineer.ru/kak-sbrosit-parol-root-na-freebsd/">Как сбросить пароль root на FreeBSD</a></li><li id="post"><a href="http://s-engineer.ru/ftp-server-na-freebsd/">FTP сервер на FreeBSD</a></li><li id="post"><a href="http://s-engineer.ru/pamyatka-komandy-linuxunix/">Памятка – команды Linux и Unix</a></li><li id="post"><a href="http://s-engineer.ru/kak-zaparolit-direktoriyu-v-apache/">Как запаролить директорию в Apache</a></li><li id="post"><a href="http://s-engineer.ru/osnovy-bezopasnosti-lighttpd/">Основы безопасности lighttpd</a></li></ul></li><li><ul><li>Ближе к железу ...</li><li id="post"><a href="http://s-engineer.ru/mikrokontroller-podklyuchaem-ps2-klaviaturu/">Микроконтроллер – подключаем PS/2 клавиатуру</a></li><li id="post"><a href="http://s-engineer.ru/interfejs-spi/">Интерфейс SPI</a></li><li id="post"><a href="http://s-engineer.ru/mikrokontroller-rabotaem-s-sd-kartoj-bez-fajlovoj-sistemoj/">Микроконтроллер – работаем с SD картой без файловой системы</a></li><li id="post"><a href="http://s-engineer.ru/kak-podklyuchit-sd-kartu-k-mikrokontrolleru-primitivnyj-sposob/">Как подключить SD карту к микроконтроллеру? (примитивный способ)</a></li><li id="post"><a href="http://s-engineer.ru/mikrokontroller-rabotaem-na-sd-karte-c-fat16-na-nizkom-urovne/">Микроконтроллер – работаем на SD карте c FAT16 на низком уровне</a></li><li id="post"><a href="http://s-engineer.ru/opisanie-fajlovoj-sistemy-fat16/">Описание файловой системы FAT16</a></li><li id="post"><a href="http://s-engineer.ru/iz-sre-v-bin/">Из .sre в .bin</a></li></ul></li></ul>
  1457. </div>
  1458. <!-- end sidebar -->
  1459. <div style="clear: both; height: 20px;">&nbsp;</div>
  1460. </div></div>
  1461. <!-- end page -->
  1462. </div>
  1463. <div id="footer">
  1464. <div id="footer-wrap">
  1465. <!-- Yandex.Metrika informer -->
  1466. <a href="http://metrika.yandex.ru/stat/?id=18982588&amp;from=informer" target="_blank" rel="nofollow"><img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" style="width: 88px; height: 31px; border: 1px solid rgb(255, 204, 204); background-repeat: no-repeat; background-position: center center; background-image: url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9gMFRANL5LXnioAAAJWSURBVDjLnZI/ixtXFMV/972ZNzPSrmTtalexlsWBGMfEYOzaVciXyKdIkW/hFKnS22WafIDUxk0g2AQSgm0csIPWK42ktaSRNPP+pRBK5SLOqS7cew7ccw4xxrPJ+8XdHx4+7AE8e3Cj++zLm71fvrqT8x+QAK35dJr2n/x89urTa+eDm/cS+eI2y3eT+Lx/bt8u1vNqfDH++teXdk/6ThAfUUBIgL9ku75z/8WL7LOlhXIGJ0Pyw75wMcnGv//xSQ2DH4ddu9k01dXWsWzcofhYaiiViLjiWi9UWQa1gzcjWF7hgfzzW5ydnXB62JLjg0PTLfJertNepnQSIA+gE4Cs03UuNYYQYP4e5jPogmSG9vA6rrjC+0AxN2i5Qk0DpXVJhCQB0EVRrzqdFgB1DZfvCDHixiV2NqO6LHHKIKnQMoaWbFBgIrQVgIXaDc+JCHgP5QRZr4jzGWFbo6yncRYviiiQKUhBRch3Lyix4bgPWsAkcDkmZAV2OiE0DaI1WoEShRKF3sWnmt01pFBnJydEpZDEwHSGt47lYsls43AIXjTWV9R1Qx0DGahqLyAhbqrj0/ib0nRzXNoyCo0Kkor2llV0eKOwdUMg4pSQA7JPQXvnJv1B+GlwOvrGlaXB6fV2lb5t6qOtike56DSJgYDGBQcOAsQAfueBMeHR48fhadb1j/58HWARdt6yBv7+/vpBe2o5OogxlcaKdt5aKCNsk309W0WxKQjmQ33/9mJVAdWHdmo/tNvtRZIkfCz+ZQwGg6rT6Zj/LTAajTbD4bD5WIF/AAseEisPFO8uAAAAAElFTkSuQmCC&quot;);" alt="Яндекс.Метрика" title="[bs.yandex.ru] Яндекс.Метрика: данные за сегодня (просмотры, визиты и уникальные посетители) Яндекс.Метрика" onclick="try{Ya.Metrika.informer({i:this,id:18982588,lang:'ru'});return false}catch(e){}" height="50" width="50"></a>
  1467. <!-- /Yandex.Metrika informer -->
  1468. <!--LiveInternet counter--><script type="text/javascript"><!--
  1469. document.write("<a href='http://www.liveinternet.ru/click' "+
  1470. "target=_blank><img src='//counter.yadro.ru/hit?t38.6;r"+
  1471. escape(document.referrer)+((typeof(screen)=="undefined")?"":
  1472. ";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth?
  1473. screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+
  1474. ";"+Math.random()+
  1475. "' alt='' title='LiveInternet' "+
  1476. "border='0' width='31' height='31'><\/a>")
  1477. //--></script><!--/LiveInternet-->
  1478. <!-- begin of Top100 code -->
  1479. <script id="top100Counter" type="text/javascript" src="%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D0%BA%D0%B8%20%D0%B8%D0%BD%D0%B6%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%20%C2%BB%20%D0%90%D1%80%D1%85%D0%B8%D0%B2%20%D1%81%D0%B0%D0%B9%D1%82%D0%B0%20%C2%BB%20%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%BB%D0%B5%D1%80%20%E2%80%93%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D0%BC%20%D1%81%20SD%20%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D0%B9%20%D0%B1%D0%B5%D0%B7%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%BE%D0%B9%20%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_files/top100.js"></script>
  1480. <noscript>
  1481. <a href="http://top100.rambler.ru/navi/2961615/">
  1482. <img title="[counter.rambler.ru] Rambler's Top100" style="border: 1px solid rgb(255, 204, 204); background-repeat: no-repeat; background-position: center center; background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9gMFRANL5LXnioAAAJWSURBVDjLnZI/ixtXFMV/972ZNzPSrmTtalexlsWBGMfEYOzaVciXyKdIkW/hFKnS22WafIDUxk0g2AQSgm0csIPWK42ktaSRNPP+pRBK5SLOqS7cew7ccw4xxrPJ+8XdHx4+7AE8e3Cj++zLm71fvrqT8x+QAK35dJr2n/x89urTa+eDm/cS+eI2y3eT+Lx/bt8u1vNqfDH++teXdk/6ThAfUUBIgL9ku75z/8WL7LOlhXIGJ0Pyw75wMcnGv//xSQ2DH4ddu9k01dXWsWzcofhYaiiViLjiWi9UWQa1gzcjWF7hgfzzW5ydnXB62JLjg0PTLfJertNepnQSIA+gE4Cs03UuNYYQYP4e5jPogmSG9vA6rrjC+0AxN2i5Qk0DpXVJhCQB0EVRrzqdFgB1DZfvCDHixiV2NqO6LHHKIKnQMoaWbFBgIrQVgIXaDc+JCHgP5QRZr4jzGWFbo6yncRYviiiQKUhBRch3Lyix4bgPWsAkcDkmZAV2OiE0DaI1WoEShRKF3sWnmt01pFBnJydEpZDEwHSGt47lYsls43AIXjTWV9R1Qx0DGahqLyAhbqrj0/ib0nRzXNoyCo0Kkor2llV0eKOwdUMg4pSQA7JPQXvnJv1B+GlwOvrGlaXB6fV2lb5t6qOtike56DSJgYDGBQcOAsQAfueBMeHR48fhadb1j/58HWARdt6yBv7+/vpBe2o5OogxlcaKdt5aKCNsk309W0WxKQjmQ33/9mJVAdWHdmo/tNvtRZIkfCz+ZQwGg6rT6Zj/LTAajTbD4bD5WIF/AAseEisPFO8uAAAAAElFTkSuQmCC");" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" alt="Rambler's Top100" border="0" height="50" width="50">
  1483. </a>
  1484. </noscript>
  1485. <!-- end of Top100 code -->
  1486. <!-- Rating@Mail.ru logo -->
  1487. <a href="http://top.mail.ru/jump?from=2423022">
  1488. <img title="[top-fwz1.mail.ru] Рейтинг@Mail.ru" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" style="border: 1px solid rgb(255, 204, 204); background-repeat: no-repeat; background-position: center center; background-image: url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9gMFRANL5LXnioAAAJWSURBVDjLnZI/ixtXFMV/972ZNzPSrmTtalexlsWBGMfEYOzaVciXyKdIkW/hFKnS22WafIDUxk0g2AQSgm0csIPWK42ktaSRNPP+pRBK5SLOqS7cew7ccw4xxrPJ+8XdHx4+7AE8e3Cj++zLm71fvrqT8x+QAK35dJr2n/x89urTa+eDm/cS+eI2y3eT+Lx/bt8u1vNqfDH++teXdk/6ThAfUUBIgL9ku75z/8WL7LOlhXIGJ0Pyw75wMcnGv//xSQ2DH4ddu9k01dXWsWzcofhYaiiViLjiWi9UWQa1gzcjWF7hgfzzW5ydnXB62JLjg0PTLfJertNepnQSIA+gE4Cs03UuNYYQYP4e5jPogmSG9vA6rrjC+0AxN2i5Qk0DpXVJhCQB0EVRrzqdFgB1DZfvCDHixiV2NqO6LHHKIKnQMoaWbFBgIrQVgIXaDc+JCHgP5QRZr4jzGWFbo6yncRYviiiQKUhBRch3Lyix4bgPWsAkcDkmZAV2OiE0DaI1WoEShRKF3sWnmt01pFBnJydEpZDEwHSGt47lYsls43AIXjTWV9R1Qx0DGahqLyAhbqrj0/ib0nRzXNoyCo0Kkor2llV0eKOwdUMg4pSQA7JPQXvnJv1B+GlwOvrGlaXB6fV2lb5t6qOtike56DSJgYDGBQcOAsQAfueBMeHR48fhadb1j/58HWARdt6yBv7+/vpBe2o5OogxlcaKdt5aKCNsk309W0WxKQjmQ33/9mJVAdWHdmo/tNvtRZIkfCz+ZQwGg6rT6Zj/LTAajTbD4bD5WIF/AAseEisPFO8uAAAAAElFTkSuQmCC&quot;);" alt="Рейтинг@Mail.ru" height="31" width="38"></a>
  1489. <!-- //Rating@Mail.ru logo -->
  1490. </div>
  1491. </div>
  1492. © s-engineer.ru, 2012-2015 | Все права защищены
  1493. </body></html>