12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682 |
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml" lang="ru-RU"><head profile="http://gmpg.org/xfn/11">
- <meta name="yandex-verification" content="79f59c6192737b18">
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>Записки инженера » Архив сайта » Микроконтроллер – работаем с SD картой без файловой системы</title>
- <meta name="description" content="Все о разработке web сайтов доступным и понятным языком. Администрирование Linux/Unix.">
- <meta name="keywords" content="OpenCart, 1С-Битрикс ,HTML, WEB, PHP, JavaScript, MySQL, SQL, CSS, POST, GET, Linux, Unix, Wordpress ">
- <meta name="generator" content="WordPress 3.5"><!-- leave this for stats -->
- <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">
- <link rel="alternate" type="application/rss+xml" title="Записки инженера RSS Feed" href="http://s-engineer.ru/feed/">
- <link rel="pingback" href="http://s-engineer.ru/xmlrpc.php">
- <link rel="alternate" type="application/rss+xml" title="Записки инженера » Лента комментариев к «Микроконтроллер – работаем с SD картой без файловой системы»" href="http://s-engineer.ru/mikrokontroller-rabotaem-s-sd-kartoj-bez-fajlovoj-sistemoj/feed/">
- <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">
- <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">
- <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">
- <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">
- <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">
- <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">
- <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">
- <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>
- <script type="text/javascript">
- /* <![CDATA[ */
- 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"};
- /* ]]> */
- </script>
- <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>
- <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>
- <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>
- <link rel="EditURI" type="application/rsd+xml" title="RSD" href="http://s-engineer.ru/xmlrpc.php?rsd">
- <link rel="wlwmanifest" type="application/wlwmanifest+xml" href="http://s-engineer.ru/wp-includes/wlwmanifest.xml">
- <link rel="prev" title="Как подключить SD карту к микроконтроллеру? (примитивный способ)" href="http://s-engineer.ru/kak-podklyuchit-sd-kartu-k-mikrokontrolleru-primitivnyj-sposob/">
- <link rel="next" title="SSH-доступ по ключу (FreeBSD)" href="http://s-engineer.ru/ssh-dostup-po-klyuchu-freebsd/">
- <meta name="generator" content="WordPress 3.5">
- <link rel="canonical" href="http://s-engineer.ru/mikrokontroller-rabotaem-s-sd-kartoj-bez-fajlovoj-sistemoj/">
- <link rel="shortlink" href="http://s-engineer.ru/?p=3845">
- <!-- Wordpress Popular Posts v2.3.7 -->
- <script type="text/javascript">
- /* <![CDATA[ */
- jQuery.post('http://s-engineer.ru/wp-admin/admin-ajax.php', {action: 'wpp_update', token: 'addd2087ce', id: 3845}, function(data){/*alert(data);*/});
- /* ]]> */
- </script>
- <!-- End Wordpress Popular Posts v2.3.7 -->
-
- <!-- Yandex buttons share -->
- <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>
- <!-- /Yandex buttons share -->
- </head>
- <body>
- <!-- СЧЕТЧИК -->
- <!-- Yandex.Metrika counter -->
- <script type="text/javascript">
- (function (d, w, c) {
- (w[c] = w[c] || []).push(function() {
- try {
- w.yaCounter18982588 = new Ya.Metrika({id:18982588,
- webvisor:true,
- clickmap:true,
- trackLinks:true,
- accurateTrackBounce:true});
- } catch(e) { }
- });
- var n = d.getElementsByTagName("script")[0],
- s = d.createElement("script"),
- f = function () { n.parentNode.insertBefore(s, n); };
- s.type = "text/javascript";
- s.async = true;
- s.src = (d.location.protocol == "https:" ? "https:" : "http:") + "//mc.yandex.ru/metrika/watch.js";
- if (w.opera == "[object Opera]") {
- d.addEventListener("DOMContentLoaded", f, false);
- } else { f(); }
- })(document, window, "yandex_metrika_callbacks");
- </script>
- <noscript><div><img src="//mc.yandex.ru/watch/18982588" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
- <!-- /Yandex.Metrika counter -->
- <!-- Rating@Mail.ru counter -->
- <script type="text/javascript">//<![CDATA[
- var _tmr = _tmr || [];
- _tmr.push({id: "2423022", type: "pageView", start: (new Date()).getTime()});
- (function (d, w) {
- var ts = d.createElement("script"); ts.type = "text/javascript"; ts.async = true;
- ts.src = (d.location.protocol == "https:" ? "https:" : "http:") + "//top-fwz1.mail.ru/js/code.js";
- var f = function () {var s = d.getElementsByTagName("script")[0]; s.parentNode.insertBefore(ts, s);};
- if (w.opera == "[object Opera]") { d.addEventListener("DOMContentLoaded", f, false); } else { f(); }
- })(document, window);
- //]]></script><noscript><div style="position:absolute;left:-10000px;">
- <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">
- </div></noscript>
- <!-- //Rating@Mail.ru counter -->
- <!-- КОНЕЦ СЧЕТЧИКУ -->
- <!-- слой для баннера vds24 -->
- <div id="layer_for_banner" style="position:relative; width:940px; margin: 0px auto;">
- <div id="header">
- <div id="logo">
- <h1><a href="http://s-engineer.ru/">Записки инженера</a></h1>
- <p>заметки по IT технологиям</p>
- </div>
- </div>
- <!-- end header -->
- <div id="menu">
- <ul>
- <li class="current_page_item"><a href="http://s-engineer.ru/" class="current_page_item">Главная</a></li>
- <li class="page_item page-item-1911"><a href="http://s-engineer.ru/karta-sajta/">Карта сайта</a></li>
- <li class="page_item page-item-3901"><a href="http://s-engineer.ru/xtkem/">ХТКЭМ</a></li>
- </ul>
- </div>
- <!-- end menu -->
- <!--баннер vds24 -->
- <!-- <div style="position:absolute; bottom:0px; right:0px;">
- <a href="http://vds24.net/vds-hosting/" rel="nofollow" target="_blank">
- <img alt="VDS Хостинг для Ваших проектов" src="http://vds24.net/wp-content/uploads/2013/06/ee5TJL5E8ZRwjcRx8mbH.gif" width="250" height="250" />
- </a>
- </div> -->
- <!--конец баннеру vds24 -->
- </div>
- <!--конец слой для баннера vds24 -->
- <div id="wrapper">
- <div id="page">
- <div id="page-bgtop">
- <div id="content">
-
- <center>
- </center>
- <div class="post" id="post-3845">
- <h2 class="title"><a href="http://s-engineer.ru/mikrokontroller-rabotaem-s-sd-kartoj-bez-fajlovoj-sistemoj/" rel="bookmark" title="Постоянная ссылка: Микроконтроллер – работаем с SD картой без файловой системы">Микроконтроллер – работаем с SD картой без файловой системы</a></h2>
- <div class="entry">
- <p> <br>
- <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>
- <br>
- В данном посте, я расскажу как работать с SD картой без файловой системы. Я покажу как:</p>
- <p> </p>
- <p><a href="#2">Как проводить инициализацию SD карты?</a></p>
- <p><a href="#3">Как писать данные на SD карту?</a></p>
- <p><a href="#4">Как читать данные с SD карты?</a></p>
- <p><a href="#5">Как читать регистры SD карты (на примере регистра CID)?</a><br>
- <span id="more-3845"></span><br>
- </p>
- <p> </p>
- <div><div style="padding:8px 0px 8px 8px;">
- <!-- google adsense (top2) -->
- <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>
- <ins class="adsbygoogle" style="display:inline-block;width:468px;height:60px" data-ad-client="ca-pub-7548259700415477" data-ad-slot="4246257742"></ins>
- <script>
- (adsbygoogle = window.adsbygoogle || []).push({});
- </script>
- <!-- end google adsense (top2) -->
- </div></div><p>В качестве контроллера я буду использовать<strong> ATmega328P</strong> (или Arduino UNO). Поехали…<br>
- <!--more--><br>
- </p>
- <p> </p>
- <h2 id="1">Откуда я беру информацию?</h2>
- <p> </p>
- <p>Итак, как всегда, первым делом я укажу <a href="https://www.sdcard.org/" rel="nofollow">официальной источник информации по SD картам</a>, который расскажет о том как работать с данными картами памяти.</p>
- <p>На сайте, в левой колонки перейдите в раздел <strong>Downloads</strong> -><strong> Simplifed Specifications</strong>, соглашаетесь и жмете «<strong>I Accept</strong>» и качаете «<strong>Physical Layer Simplified Specification</strong>».</p>
- <p>В результате вы скачаете pdf документ – спецификацию на SD карты, в
- ней все подробным образом раскачано какие бывают карты и как с ними
- работать.</p>
- <p> </p>
- <div><div style="padding:8px 0px 8px 8px;">
- <!-- google adsense (top3) -->
- <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>
- <!-- s-engineer (top3) -->
- <ins class="adsbygoogle" style="display:inline-block;width:468px;height:60px" data-ad-client="ca-pub-7548259700415477" data-ad-slot="8519818945"></ins>
- <script>
- (adsbygoogle = window.adsbygoogle || []).push({});
- </script>
- <!-- end google adsense (top3) -->
- </div></div><p>Информацию для данного поста я черпал из данной спецификации, форумов и личного опыта.</p>
- <p> </p>
- <p> </p>
- <h2>Кратко о SD карте</h2>
- <p> </p>
- <p>SD карта (или Secure Digital Memory Card – безопасная цифровая
- карта памяти) представляет собой микроконтроллер и микросхему FLASH
- памяти.</p>
- <p> </p>
- <p>SD карта может работать в двух режимах</p>
- <ul>
- <li><strong>режим SD</strong> (свой родной протокол обмена данными)</li>
- <li><strong>режим SPI</strong> (в качестве интерфейса SD карта использует – SPI)</li>
- </ul>
- <p>Мы будем рассматривать работу<strong> с картой в режиме SPI</strong>. Что это за интерфейс и как с ним работать вы можете прочесть в посте “интерфейс SPI”.</p>
- <p>С точки зрения интерфейса SPI, SD карта имеет следующие разъемы:</p>
- <p> </p>
- <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>
- <p>Где</p>
- <p><strong>DO</strong> – разъем для получения данных с SD карты</p>
- <p><strong>DI</strong> – разъем для передачи данных SD карты</p>
- <p><strong>SCLK</strong> – разъем для синхроимпульсов</p>
- <p><strong>CS</strong> – разъем “выбор ведомого”</p>
- <p><strong>Vss</strong> – земля</p>
- <p><strong>Vdd</strong> – разъем питания, от <strong>2.7</strong> до <strong>3.6</strong> <strong>В</strong>.</p>
- <p> </p>
- <p>P.S. Повторюсь, карта работает при питание от<strong> 2.7</strong> до <strong>3.6 В</strong>, потреблению по току не более <strong>100 мА</strong>. Входные данные и тактовый сигнал, также должен быть в этом диапазоне.</p>
- <p> </p>
- <p><a title="Как подключить SD карту к микроконтроллеру? (примитивный способ)" href="http://s-engineer.ru/kak-podklyuchit-sd-kartu-k-mikrokontrolleru-primitivnyj-sposob/">Как подключить SD карту?</a> (отдельный пост)<br>
- <a href="#6">Где я могу проверить данный код, если у меня нет ATmega328P?</a></p>
- <p> </p>
- <p>Подходим к сути поста, с SD картой можно работать<strong> напрямую</strong> (без применения файловой системы) как с<strong> простым элементом памяти</strong>. Принцип прост, если нам нужно<strong> считать что-либо</strong>, то мы отсылаем<strong> команду-запрос на чтение</strong> определенного блока памяти, далее<strong> карта возвращает этот блок данных</strong>. Если нужно <strong>записать что-то</strong>, то мы отправляем <strong>команду-запрос на запись</strong> с указанием куда писать данные. Далее после небольшого ожидания, отправляем<strong> блок данных который нужно записать на карту</strong>. Остается только разобраться в технических подробностях, как эти команды отсылать и как получать/передавать данные.</p>
- <p> </p>
- <p>Разбираемся далее…</p>
- <p> </p>
- <p> </p>
- <h2>Как общаются с SD картами?</h2>
- <p> </p>
- <p> </p>
- <h3>Взгляд из далека…</h3>
- <p> </p>
- <p>С помощью интерфейса <strong>SPI</strong> на <strong>SD карту</strong> посылают <strong>кадр-команду, </strong>которая<strong> </strong>имеет длину <strong>6 байт</strong>, т.е. <strong>6 пакетов SPI</strong>. В результате переданной команды, <strong>SD карта через некоторое время</strong> (которое может длиться от 0 до 8 байт или от 0-ля до 8-ми пакетов SPI) <strong>возвращает ответ</strong>. Ответ может быть как отчет об ошибках так и отчет о удачной полученной команды.</p>
- <p><strong>После переданной команды</strong>, SD карте можно <strong>передавать данные для записи</strong> или<strong> получать считанные данные</strong>. Данные передаются<strong> всегда блоками по 512 байт</strong> (или по <strong>512 пакетов SPI</strong>). Послать или получить<strong> 1-ин байт</strong> данных <strong>нам не удаться</strong>, мы манипулируем <strong>только 512-и байтными блоками</strong> данных. Опять-же, если вам нужно изменить<strong> несколько байтов</strong> на SD карте, то для начала вы должны <strong>прочесть 512 байтный</strong> блок, <strong>изменить</strong> нужные байт, далее его <strong>записать обратно</strong>, иначе ни как.</p>
- <p> </p>
- <p> </p>
- <h3>Погрузимся по глубже…</h3>
- <p> </p>
- <p>Я уже не раз повторял команды… команды записи/чтения, давайте разберемся какие бывают команды?</p>
- <p>Приведу некоторые, наиболее часто используемые, полных список вы можете <a href="#1">найти в спецификации на SD карты</a></p>
- <p style="text-align: center;"> (картинка кликабельна)</p>
- <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>
- <p> </p>
- <p>Команда имеет следующую структуру:</p>
- <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>
- <p> </p>
- <p>Сначала идет <strong>01</strong>, далее <strong>индекс команды</strong>, который соответствует <strong>порядковому номеру команды</strong>, т.е. CMD0, CMD1, CMD2, CMD3 и т.п. На этом кончился первый байт команды, далее идет <strong>4-е байтовый аргумент</strong>. Последний байт <strong>это контрольная сумма по алгоритму CRC</strong>.</p>
- <p> </p>
- <p> </p>
- <h1 id="2">Как проводить инициализацию SD карты?</h1>
- <p> </p>
- <p>SD карта это не просто кусок пластика, как может показаться на первый
- взгляд, повторюсь, внутри неё находиться собственный контроллер с
- своим программным обеспечением. А как любой компьютер его надо еще
- запустить или проинициализировать, причем в нужном нам режиме. Я приведу
- <strong>порядок действий</strong>, который нужно <strong>совершить с SD картой</strong>, для её<strong> инициализации</strong>.</p>
- <p> </p>
- <p><strong>1.</strong> После подключения карты к питанию нужно дождаться
- пока питающие напряжение на карте не достигнет рабочего, обычно для
- этого надо <strong>подождать несколько миллисекунд</strong>.</p>
- <p><strong>2</strong>. Далее нужно <strong>проинициализировать SPI в режиме 0-ль</strong> (что это за режим? вы можете прочесть в “интерфейс SPI”)</p>
- <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>
- <p> </p>
- <p>Как это делается?</p>
- <p>Установить логическую <strong>единицу на выход контролера CS проблем быть не должно</strong>, а вот как установить <strong>логическую единицу на MOSI</strong> и <strong>подать 74-е синхроимпульса может немного озадачить</strong>. Обычно это делается так: в теле цикла в <strong>регистр данных SPI записывают значение 0xFF</strong>, условие цикла должно соответствовать <strong>не менее 10 итерациям</strong>. Далее на <strong>CS устанавливают логический ноль</strong>.</p>
- <p> </p>
- <p>Пример “фрагмент кода для Arduino”:</p><!-- Crayon Syntax Highlighter v1.17 -->
- <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;">
-
- <div class="crayon-toolbar" data-settings=" mouseover overlay delay" style="height: 18px !important; line-height: 18px !important;">
- <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>
- <div class="crayon-info" style="min-height: 15px !important; line-height: 15px !important;"></div>
- <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); //ждем, пока питающее напряжение на карте не будет номинально
- pinMode(4, OUTPUT); //в качестве CS мы будем использовать 4-пин Arduino (или PD4 или 6-оый выход ATmega328P)
- digitalWrite(4, HIGH); //выставим логическую единицу на CS
- SPI.begin(); // инициализация SPI
- SPI.setDataMode(SPI_MODE0); //SD карта работает в режиме SPI-0
- SPI.setClockDivider(SPI_CLOCK_DIV128);
- for (int i = 0; i < 10; i++) //подадим 80 тактовых импульсов
- SPI.transfer(0XFF); //хотя требуется не менее 74
- digitalWrite(4, LOW); //выставим на CS логический ноль</textarea></div>
- <div class="crayon-main" style="">
- <table class="crayon-table">
- <tbody><tr class="crayon-row">
- <td class="crayon-nums " data-settings="hide" style="font-size: 12px !important; line-height: 15px !important;">
- <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>
- </td>
- <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"> </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"> </div><div class="crayon-line" id="crayon-55a8b9b3aa7f6-3"><span class="h"> </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"> </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 class="crayon-line" id="crayon-55a8b9b3aa7f6-5"> </div><div class="crayon-line" id="crayon-55a8b9b3aa7f6-6"><span class="h"> </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"> </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"> </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"> </div><div class="crayon-line" id="crayon-55a8b9b3aa7f6-10"><span class="h"> </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"><</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"> </span><span class="c">//подадим 80 тактовых импульсов</span></div><div class="crayon-line" id="crayon-55a8b9b3aa7f6-11"><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"> </span><span class="c">//хотя требуется не менее 74</span></div><div class="crayon-line" id="crayon-55a8b9b3aa7f6-12"> </div><div class="crayon-line" id="crayon-55a8b9b3aa7f6-13"><span class="h"> </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>
- </tr>
- </tbody></table>
- </div>
- </div>
- <!-- [Format Time: 0.0017 seconds] -->
- <p> </p>
- <p>Почему именно 10 итераций?</p>
- <p>Дело в том, что за <strong>10 итераций будет сгенерировано 8*10=80 синхроимпульсов</strong>, а нам нужно <strong>не менее 74</strong>. При 9-и итерациях будет сгенерировано 9*8=<strong>72</strong> синхроимпульса, <strong>что есть меньше 74</strong>. Мы просто взяли один из наименьших вариантов, хотя работать будет при любом количестве больше чем 10-и итераций.</p>
- <p> </p>
- <p>Физически, это процесс выглядит так:</p>
- <p>(к сожалению у меня нет реального осциллографа, поэтому я
- продемонстрирую процесс инициализации с помощью виртуального
- осциллографа САПР Proteus)</p>
- <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>
- <p> </p>
- <p>На диаграмме нас интересует только <strong>SCK</strong>, <strong>MOSI</strong> и <strong>CS</strong> Как видно на <strong>CS мы устанавливаем логическую единицу, а на SCK и MOSI видно что мы </strong><strong>посылаем 10 пакетов с значением 0xFF</strong> (другими словам посылаем не менее 74-е синхроимпульса с единицами на MOSI)</p>
- <p> </p>
- <p><strong>4</strong>. Далее, нужно подать команду <strong>CMD0 с пустым аргументом и соответствующим CRC равным 0×95 для программного сброса</strong>, SD карта должна вернуть байт ответа с значением <strong>0×01</strong>. Это означает, что карта <strong>перешла в режим SPI</strong>, она <strong>находится в состояние покоя и готова к процессу инициализации</strong>.</p>
- <p> </p>
- <p>Еще раз, SD карте мы посылаем следующие SPI пакеты</p>
- <p><strong>0х40 0х00 0х00 0х00 0х00 0х95</strong></p>
- <p> </p>
- <p>Через некоторое время SD карта возвращает ответ:</p>
- <p><strong>0х01</strong></p>
- <p> </p>
- <p>Пример “фрагмент кода для Arduino”:</p><!-- Crayon Syntax Highlighter v1.17 -->
- <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;">
-
- <div class="crayon-toolbar" data-settings=" mouseover overlay delay" style="height: 18px !important; line-height: 18px !important;">
- <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>
- <div class="crayon-info" style="min-height: 15px !important; line-height: 15px !important;"></div>
- <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
- SPI.transfer(0x40); //индекс команды cmd0
- SPI.transfer(0x00); //первый байт пустого аргумента
- SPI.transfer(0x00); //второй байт пустого аргумента
- SPI.transfer(0x00); //третий байт пустого аргумента
- SPI.transfer(0x00); //четвертый байт пустого аргумента
- SPI.transfer(0x95); // CRC
- while (SPI.transfer(0xFF)!=0x01); //ожидание сигнала о принятия команды</textarea></div>
- <div class="crayon-main" style="">
- <table class="crayon-table">
- <tbody><tr class="crayon-row">
- <td class="crayon-nums " data-settings="hide" style="font-size: 12px !important; line-height: 15px !important;">
- <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>
- </td>
- <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"> </span><span class="c">//команда CDM0</span></div><div class="crayon-line" id="crayon-55a8b9b3aa813-2"><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">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"> </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"> </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"> </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"> </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"> </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"> </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>
- </tr>
- </tbody></table>
- </div>
- </div>
- <!-- [Format Time: 0.0013 seconds] -->
- <p> </p>
- <p>Физически, это процесс выглядит так:</p>
- <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>
- <p> </p>
- <p>как видно ответ SD карты приходит на втором пакете, увеличим развертку на этом фрагменте….</p>
- <p> </p>
- <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>
- <p> </p>
- <p>Видно, что <strong>SD</strong> карта отвечает <strong>0×01</strong> (8-ой бит равен единицы).</p>
- <p> </p>
- <p><strong>5.</strong> В состояние покоя, карта может принимать только <strong>CMD0</strong>, <strong>CMD1</strong>, <strong>CMD58</strong>. Для запуска инициализации нужно узнать что за версия карты: <strong>v.1</strong> или <strong>v.2</strong> (более современные версии <strong>3.0</strong> и более мы рассматривать не будем), т.к. процесс инициализации для <strong>них разный</strong>.</p>
- <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>
- <p>Пример “фрагмент кода для Arduino”:</p><!-- Crayon Syntax Highlighter v1.17 -->
- <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;">
-
- <div class="crayon-toolbar" data-settings=" mouseover overlay delay" style="height: 18px !important; line-height: 18px !important;">
- <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>
- <div class="crayon-info" style="min-height: 15px !important; line-height: 15px !important;"></div>
- <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
- SPI.transfer(0x00); //первый байт пустого аргумента
- SPI.transfer(0x00); //второй байт пустого аргумента
- SPI.transfer(0x01); //третий байт пустого аргумента
- SPI.transfer(0xAA); //четвертый байт пустого аргумента РАЗОБРАТЬСЯ ГДЕ ПЕРВЫЙ БАЙТ ГДЕ ПОСЛЕДНИЙ
- SPI.transfer(0X87); // CRC
- do { //ожидание сигнала о принятия команды (ответ R7 - 5 байт (1-ый байт это R1, далее 4-е байта нам не интересны))
- status_=SPI.transfer(0xFF);
-
- //если ответ R1 0x04 - "com are error", значит SD v.1
- if (status_==0x04) {
- Serial.println("SD V1");
- type_SD=1; //карта SD версии 1, иниализировать карту будем с помощьюу команды CDM1
- }
- //если ответ R1 0x01 - "in idle state", значит SD v.2
- if (status_==0x01) {
- Serial.println("SD V2");
- type_SD=2; //карта SD версии 2, иниализировать карту будем с помощью команды ACDM41 (CMD55 + CMD41)
- }
- } while((status_!=0x01) and (status_!=0x04));</textarea></div>
- <div class="crayon-main" style="">
- <table class="crayon-table">
- <tbody><tr class="crayon-row">
- <td class="crayon-nums " data-settings="hide" style="font-size: 12px !important; line-height: 15px !important;">
- <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>
- </td>
- <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"> </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"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa826-10"><span class="h"> </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"> </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"> </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"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa826-13"><span class="h"> </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"> </span><span class="sy">}</span><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa826-15"><span class="h"> </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"> </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"> </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"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa826-18"><span class="h"> </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"> </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>
- </tr>
- </tbody></table>
- </div>
- </div>
- <!-- [Format Time: 0.0022 seconds] -->
- <p> <br>
- Результат мы запишем в переменную <strong>status_</strong>, далее в зависимости от её значения мы будем проводить <strong>инициализацию тем или иным образом</strong>.</p>
- <p>Если карта <strong>v.1</strong>, то для инициализации нам нужно подать <strong>CMD1</strong> <strong>с пустым аргументом и любым CRC</strong>
- (т.к. карта уже перешла в режим SPI, а находясь в нем, CRC код не
- проверяется, включить проверку можно с помощью команды CMD59). Постоянно
- посылаем <strong>карте команду CMD1</strong> <strong>с пустым аргументом и любым CRC</strong>, до тех пор пока не получим байт <strong>ответа с значением 0×00</strong>, что означает инициализация завершена.</p>
- <p> </p>
- <p>Пример “фрагмент кода для Arduino”:</p><!-- Crayon Syntax Highlighter v1.17 -->
- <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;">
-
- <div class="crayon-toolbar" data-settings=" mouseover overlay delay" style="height: 18px !important; line-height: 18px !important;">
- <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>
- <div class="crayon-info" style="min-height: 15px !important; line-height: 15px !important;"></div>
- <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) {
- if (SPI.transfer(0x41)==0x00) break; //бесконечное число раз
- if (SPI.transfer(0x00)==0x00) break; //отправляем команды CMD1
- if (SPI.transfer(0x00)==0x00) break; //с пустым аргументом и
- if (SPI.transfer(0x00)==0x00) break; //произвольным CRC
- if (SPI.transfer(0x00)==0x00) break; //до тех пор, пока не получим
- if (SPI.transfer(0x00)==0x00) break; //ответ 0x00
- }</textarea></div>
- <div class="crayon-main" style="">
- <table class="crayon-table">
- <tbody><tr class="crayon-row">
- <td class="crayon-nums " data-settings="hide" style="font-size: 12px !important; line-height: 15px !important;">
- <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>
- </td>
- <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"> </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"> </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"> </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"> </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"> </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"> </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"> </span><span class="sy">}</span></div></div></td>
- </tr>
- </tbody></table>
- </div>
- </div>
- <!-- [Format Time: 0.0017 seconds] -->
- <p> </p>
- <p>Физически, это процесс выглядит так:</p>
- <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>
- <p> </p>
- <p> </p>
- <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>
- <p> </p>
- <p>Пример “фрагмент кода для Arduino”:</p>
- <p> </p>
- <p></p><!-- Crayon Syntax Highlighter v1.17 -->
- <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;">
-
- <div class="crayon-toolbar" data-settings=" mouseover overlay delay" style="height: 18px !important; line-height: 18px !important;">
- <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>
- <div class="crayon-info" style="min-height: 15px !important; line-height: 15px !important;"></div>
- <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 < 4; SPI.transfer(0xFF),i++); //свдигаем 4-е байта ответа от CMD8, нам они не нужны
- do {
- //CMD55
- SPI.transfer(0X77); //индекс команды cmd55
- SPI.transfer(0x00); //первый байт пустого аргумента
- SPI.transfer(0x00); //второй байт пустого аргумента
- SPI.transfer(0x00); //третий байт пустого аргумента
- SPI.transfer(0x00); //четвертый байт пустого аргумента РАЗОБРАТЬСЯ ГДЕ ПЕРВЫЙ БАЙТ ГДЕ ПОСЛЕДНИЙ
- SPI.transfer(0X00); // CRC
- while (SPI.transfer(0xFF)!=0x01); //ожидание сигнала о принятия команды
-
- //CMD41
- SPI.transfer(0X69); //индекс команды cmd41
- SPI.transfer(0x40); //первый байт пустого аргумента
- SPI.transfer(0x00); //второй байт пустого аргумента
- SPI.transfer(0x00); //третий байт пустого аргумента
- SPI.transfer(0x00); //четвертый байт пустого аргумента РАЗОБРАТЬСЯ ГДЕ ПЕРВЫЙ БАЙТ ГДЕ ПОСЛЕДНИЙ
- SPI.transfer(0XFF); // CRC
-
- SPI.transfer(0xFF); //сдвигаем на один байт
- status_ = SPI.transfer(0xFF); //ответ на команду ACMD41
- }
- while (status_!= 0X00); //шлем команду ACMD41 до тех пор, пока не получим ответ 0x00</textarea></div>
- <div class="crayon-main" style="">
- <table class="crayon-table">
- <tbody><tr class="crayon-row">
- <td class="crayon-nums " data-settings="hide" style="font-size: 12px !important; line-height: 15px !important;">
- <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>
- </td>
- <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"><</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"> </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"> </span><span class="c">//CMD55</span></div><div class="crayon-line" id="crayon-55a8b9b3aa853-4"><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">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"> </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"> </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"> </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"> </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"> </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"> </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"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa853-12"><span class="h"> </span><span class="c">//CMD41 </span></div><div class="crayon-line" id="crayon-55a8b9b3aa853-13"><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">0X69</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//индекс команды cmd41 </span></div><div class="crayon-line" id="crayon-55a8b9b3aa853-14"><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">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"> </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"> </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"> </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"> </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"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa853-20"><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"> </span><span class="c">//сдвигаем на один байт</span></div><div class="crayon-line" id="crayon-55a8b9b3aa853-21"><span class="h"> </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"> </span><span class="c">//ответ на команду ACMD41</span></div><div class="crayon-line" id="crayon-55a8b9b3aa853-22"><span class="h"> </span><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa853-23"><span class="h"> </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>
- </tr>
- </tbody></table>
- </div>
- </div>
- <!-- [Format Time: 0.0031 seconds] -->
- <p> <br>
- После инициализации нужно выставить логическую единицу на CS<br>
- </p>
- <p></p><!-- Crayon Syntax Highlighter v1.17 -->
- <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;">
-
- <div class="crayon-toolbar" data-settings=" mouseover overlay delay" style="height: 18px !important; line-height: 18px !important;">
- <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>
- <div class="crayon-info" style="min-height: 15px !important; line-height: 15px !important;"></div>
- <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>
- <div class="crayon-main" style="">
- <table class="crayon-table">
- <tbody><tr class="crayon-row">
- <td class="crayon-nums " data-settings="hide" style="font-size: 12px !important; line-height: 15px !important;">
- <div class="crayon-nums-content"><div class="crayon-num" data-line="crayon-55a8b9b3aa864-1">1</div></div>
- </td>
- <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"> </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>
- </tr>
- </tbody></table>
- </div>
- </div>
- <!-- [Format Time: 0.0003 seconds] -->
- <p> </p>
- <p>Приведу результирующий код на Arduino – “инициализация SD карты”</p><!-- Crayon Syntax Highlighter v1.17 -->
- <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;">
-
- <div class="crayon-toolbar" data-settings=" mouseover overlay delay" style="height: 18px !important; line-height: 18px !important;">
- <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>
- <div class="crayon-info" style="min-height: 15px !important; line-height: 15px !important;"></div>
- <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 <SPI.h>
- uint8_t status_;
- int type_SD=0;
- void setup() {
-
- uint8_t st;
- Serial.begin(9600);
-
- delay(5); //ждем, пока питающее напряжение на карте не будет номинально
- pinMode(4, OUTPUT); //в качестве CS мы будем использовать 4-пин Arduino (или PD4 или 6-оый выход ATmega328P)
- digitalWrite(4, HIGH); //выставим логическую еденицу на CS
- SPI.begin(); // инициализация SPI
- SPI.setDataMode(SPI_MODE0); //SD карта работает в режиме SPI-0
- SPI.setClockDivider(SPI_CLOCK_DIV128);
- for (int i = 0; i < 10; i++) //подадим 80 тактовых импульсов
- SPI.transfer(0XFF); //хотя требуется не менее 74
- /////////////////////////////////////НАЧАЛО ИНИЦИАЛИЗАЦИИ///////////////////////////////////////////
- digitalWrite(4, LOW); //выставим на CS логический ноль
- //-----команда CDM0 - програмный сброс
- SPI.transfer(0x40); //индекс команды cmd0
- SPI.transfer(0x00); //первый байт пустого аргумента
- SPI.transfer(0x00); //второй байт пустого аргумента
- SPI.transfer(0x00); //третий байт пустого аргумента
- SPI.transfer(0x00); //четвертый байт пустого аргумента
- SPI.transfer(0x95); // CRC
- while (SPI.transfer(0xFF)!=0x01); //ожидание сигнала о принятия команды (ответ R1 - один байт)
- //-----конец команды CDM0 - програмный сброс
-
- //-----команда CDM8 - проверяем версию SD карты
- delay(300);
- SPI.transfer(0x48); //индекс команды cmd8
- SPI.transfer(0x00); //первый байт пустого аргумента
- SPI.transfer(0x00); //второй байт пустого аргумента
- SPI.transfer(0x01); //третий байт пустого аргумента
- SPI.transfer(0xAA); //четвертый байт пустого аргумента РАЗОБРАТЬСЯ ГДЕ ПЕРВЫЙ БАЙТ ГДЕ ПОСЛЕДНИЙ
- SPI.transfer(0X87); // CRC
- do { //ожидание сигнала о принятия команды (ответ R7 - 5 байт (1-ый байт это R1, далее 4-е байта нам не интересны))
- status_=SPI.transfer(0xFF);
-
- //если ответ R1 0x04 - "com are error", значит SD v.1
- if (status_==0x04) {
- Serial.println("SD V1");
- type_SD=1; //карта SD версии 1, иниализировать карту будем с помощьюу команды CDM1
- }
- //если ответ R1 0x01 - "in idle state", значит SD v.2
- if (status_==0x01) {
- Serial.println("SD V2");
- type_SD=2; //карта SD версии 2, иниализировать карту будем с помощью команды ACDM41 (CMD55 + CMD41)
- }
- } while((status_!=0x01) and (status_!=0x04));
- //-----конец команды CDM8 - проверяем версию SD карты
-
- //-----инициализация карты SD v.1, с помощью команды CMD1
- if (type_SD==1) {
- while (true) {
- if (SPI.transfer(0x41)==0x00) break; //бесконечное число раз
- if (SPI.transfer(0x00)==0x00) break; //отправляем команды CMD1
- if (SPI.transfer(0x00)==0x00) break; //с пустым аргументом и
- if (SPI.transfer(0x00)==0x00) break; //произвольным CRC
- if (SPI.transfer(0x00)==0x00) break; //до тех пор, пока не получим
- if (SPI.transfer(0x00)==0x00) break; //ответ 0x00
- }
- }
- //-----конец инициализации карты SD v.1
-
- //-----инициализация карты SD v.2, с помощью команды ACDM41 (CMD55 + CMD41)
- if (type_SD==2) {
- for (uint8_t i = 0; i < 4; SPI.transfer(0xFF),i++); //свдигаем 4-е байта ответа от CMD8, нам они не нужны
- do {
- //CMD55
- SPI.transfer(0X77); //индекс команды cmd55
- SPI.transfer(0x00); //первый байт пустого аргумента
- SPI.transfer(0x00); //второй байт пустого аргумента
- SPI.transfer(0x00); //третий байт пустого аргумента
- SPI.transfer(0x00); //четвертый байт пустого аргумента РАЗОБРАТЬСЯ ГДЕ ПЕРВЫЙ БАЙТ ГДЕ ПОСЛЕДНИЙ
- SPI.transfer(0X00); // CRC
- while (SPI.transfer(0xFF)!=0x01); //ожидание сигнала о принятия команды
-
- //CMD41
- SPI.transfer(0X69); //индекс команды cmd41
- SPI.transfer(0x40); //первый байт пустого аргумента
- SPI.transfer(0x00); //второй байт пустого аргумента
- SPI.transfer(0x00); //третий байт пустого аргумента
- SPI.transfer(0x00); //четвертый байт пустого аргумента РАЗОБРАТЬСЯ ГДЕ ПЕРВЫЙ БАЙТ ГДЕ ПОСЛЕДНИЙ
- SPI.transfer(0XFF); // CRC
-
- SPI.transfer(0xFF); //сдвигаем на один байт
- status_ = SPI.transfer(0xFF); //ответ на команду ACMD41
- }
- while (status_!= 0X00); //шлем команду ACMD41 до тех пор, пока не получим ответ 0x00
- }
- //------конец инициализации карты SD v.2
-
- Serial.println("USPEH!");
-
- digitalWrite(4, HIGH); //выставим логическую еденицу на CS
- /////////////////////////////////////КОНЕЦ ИНИЦИАЛИЗАЦИИ///////////////////////////////////////////
- }
- void loop() {
- delay(100);
- }</textarea></div>
- <div class="crayon-main" style="">
- <table class="crayon-table">
- <tbody><tr class="crayon-row">
- <td class="crayon-nums " data-settings="hide" style="font-size: 12px !important; line-height: 15px !important;">
- <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>
- </td>
- <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 <SPI.h></span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-2"> </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"> </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"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-8"><span class="h"> </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"> </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"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-11"><span class="h"> </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"> </div><div class="crayon-line" id="crayon-55a8b9b3aa875-13"><span class="h"> </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"> </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 class="crayon-line" id="crayon-55a8b9b3aa875-15"> </div><div class="crayon-line" id="crayon-55a8b9b3aa875-16"><span class="h"> </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"> </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"> </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"> </div><div class="crayon-line" id="crayon-55a8b9b3aa875-20"><span class="h"> </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"><</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"> </span><span class="c">//подадим 80 тактовых импульсов</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-21"><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"> </span><span class="c">//хотя требуется не менее 74</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-22"> </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"> </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"> </div><div class="crayon-line" id="crayon-55a8b9b3aa875-26"><span class="h"> </span><span class="c">//-----команда CDM0 - програмный сброс</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-27"><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">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"> </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"> </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"> </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"> </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"> </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"> </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"> </span><span class="c">//-----конец команды CDM0 - програмный сброс</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-35"><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-36"><span class="h"> </span><span class="c">//-----команда CDM8 - проверяем версию SD карты</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-37"><span class="h"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-47"><span class="h"> </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"> </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"> </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"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-50"><span class="h"> </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"> </span><span class="sy">}</span><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-52"><span class="h"> </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"> </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"> </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"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-55"><span class="h"> </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"> </span><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-57"><span class="h"> </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"> </span><span class="c">//-----конец команды CDM8 - проверяем версию SD карты</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-59"><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-60"><span class="h"> </span><span class="c">//-----инициализация карты SD v.1, с помощью команды CMD1 </span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-61"><span class="h"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </span><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-70"><span class="h"> </span><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-71"><span class="h"> </span><span class="c">//-----конец инициализации карты SD v.1 </span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-72"><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-73"><span class="h"> </span><span class="c">//-----инициализация карты SD v.2, с помощью команды ACDM41 (CMD55 + CMD41) </span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-74"><span class="h"> </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"> </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"><</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"> </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"> </span><span class="c">//CMD55</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-78"><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">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"> </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"> </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"> </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"> </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"> </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"> </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"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-86"><span class="h"> </span><span class="c">//CMD41 </span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-87"><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">0X69</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//индекс команды cmd41 </span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-88"><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">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"> </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"> </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"> </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"> </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"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-94"><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"> </span><span class="c">//сдвигаем на один байт</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-95"><span class="h"> </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"> </span><span class="c">//ответ на команду ACMD41</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-96"><span class="h"> </span><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-97"><span class="h"> </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"> </span><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-99"><span class="h"> </span><span class="c">//------конец инициализации карты SD v.2 </span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-100"><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-101"><span class="h"> </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"> </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"> </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 class="crayon-line" id="crayon-55a8b9b3aa875-104"><span class="h"> </span><span class="c">/////////////////////////////////////КОНЕЦ ИНИЦИАЛИЗАЦИИ///////////////////////////////////////////</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-105"> </div><div class="crayon-line" id="crayon-55a8b9b3aa875-106"><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa875-107"> </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>
- </tr>
- </tbody></table>
- </div>
- </div>
- <!-- [Format Time: 0.0109 seconds] -->
- <p></p>
- <p> </p>
- <p><a href="#6">Где я могу проверить данный код, если у меня нет ATmega328P?</a></p>
- <p> </p>
- <p>Все, инициализация завершена, теперь можно передавать и считать данные с SD карты. Но учтите, <strong>простой карты после инициализации должен быть не более 5 мс</strong>, иначе вам нужно <strong>заново подать команду инициализация SD карты, т.е. CMD1 или ACMD41 в зависимости от версии.</strong></p>
- <p> </p>
- <p> </p>
- <h1 id="3">Как писать данные на SD карту?</h1>
- <p> </p>
- <p>Писать данные можно <strong>по одному блоку</strong> и <strong>сразу множество блоков</strong>.</p>
- <p>Один блок данных <strong>по умолчанию равен 512 байт</strong> (т.е. данные будут помещаться в <strong>512 пакетов SPI</strong>). Размер блока можно изменить с помощью команды <strong>CMD16</strong>, но это подходит только для SD карт «старого образца» до 4 Гб с одноименным поколением – «<strong>SD</strong>» (так и пишется на наклейки)</p>
- <p> </p>
- <p>В большинство современных <strong>SD</strong> карт, т.е. поколения <strong>SDHC</strong>, <strong>SDXC</strong> (см. наклейку на карте) данная <strong>функция не поддерживается</strong> и один блок памяти неизменно равен <strong>512 байт</strong>.</p>
- <p> </p>
- <p>Мы разберемся <strong>как писать данные по одному блоку</strong>, как записать сразу множество блоков читайте в документации.</p>
- <p> </p>
- <p> </p>
- <h3>Запись данных по одному блоку</h3>
- <p> </p>
- <p>Для записи данных по одному блоку, используется команда <strong>CMD24</strong>, в качестве её аргумента используется:</p>
- <p> </p>
- <p>-Для «<strong>старых</strong>» карт поколения «<strong>SD</strong>» (до 4 Гб) используется <strong>адрес необходимого сектора</strong>. Адресуются сектора в SD <strong>побайтно</strong>,
- т.е. размер одного сектора – один байт. Но т.к. данные в SD карту
- пишутся не побайтно, а блоками, с размером 512 байт, то адрес сектора
- фактически означает – <strong>адрес первого байта блока</strong>.</p>
- <p> </p>
- <p>-Для «<strong>современных</strong>» карт, т.е. <strong>SDHC</strong>, <strong>SDXC</strong> в качестве аргумент используется <strong>номер 512 байтного блока</strong>. Блоки нумеруются с <strong>нуля</strong>.</p>
- <p> </p>
- <p>В данном посте мы будем рассматривать как писать данные в <strong>SD карты «старого образца»</strong> (поколение SD, их размер не выше 4 Гб).</p>
- <p> </p>
- <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>
- <p> </p>
- <p>Так как записать блок данных? Алгоритм работы:</p>
- <p> </p>
- <p><strong>1.</strong> Выставляем на <strong>CS логический ноль</strong> (после инициализации была выставлена единица)</p>
- <p> </p>
- <p><strong>2.</strong> Далее отправим карте команду <strong>CMD24 с аргументом – адрес сектора с которого мы будем писать наш блок данных</strong>. CRC код у нас произвольный, т.к. в режиме SPI карта его не учитывает.</p>
- <p>Пример, нам нужно записать блок данных, начиная с <strong>первого сектора</strong> SD карты. Мы отправляем карте<strong> CMD24</strong> c адресом <strong>0×0000</strong> и<strong> произвольным CRC</strong>.</p>
- <p>Т.е. мы посылаем SD карте следующие SPI пакеты.</p>
- <p><strong>0х58 0х00 0х00 0х00 0х00 0х00 </strong>(CRC как 0×00 выбран произвольно)</p>
- <p> </p>
- <p>Ожидаем байт ответа, что команда принята удачно, мы должны получить значение</p>
- <p><strong>0×00</strong></p>
- <p> </p>
- <p>Пример “фрагмент кода для Arduino”</p>
- <p> </p><!-- Crayon Syntax Highlighter v1.17 -->
- <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;">
-
- <div class="crayon-toolbar" data-settings=" mouseover overlay delay" style="height: 18px !important; line-height: 18px !important;">
- <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>
- <div class="crayon-info" style="min-height: 15px !important; line-height: 15px !important;"></div>
- <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);
- SPI.transfer(0x00); //первый байт аргумента
- SPI.transfer(0x00); //второй байт аргумента
- SPI.transfer(0x00); //третий байт аргумента
- SPI.transfer(0x00); //четвертый байт аргумента
- SPI.transfer(0x00);
- while (SPI.transfer(0xFF)!=0x00); //ожидание сигнала о принятия команды</textarea></div>
- <div class="crayon-main" style="">
- <table class="crayon-table">
- <tbody><tr class="crayon-row">
- <td class="crayon-nums " data-settings="hide" style="font-size: 12px !important; line-height: 15px !important;">
- <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>
- </td>
- <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"> </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"> </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"> </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"> </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"> </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"> </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"> </div><div class="crayon-line" id="crayon-55a8b9b3aa89d-8"><span class="h"> </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>
- </tr>
- </tbody></table>
- </div>
- </div>
- <!-- [Format Time: 0.0011 seconds] -->
- <p> </p>
- <p>P.S. Первый, второй, третий байт адреса и т.п. я нумеровал с лева, т.е. если вас интересует адрес 0×200, то аргумент будет</p>
- <p>SPI.transfer(0×00); //первый байт пустого аргумента</p>
- <p>SPI.transfer(0×00); //второй байт пустого аргумента</p>
- <p>SPI.transfer(0×02); //третий байт пустого аргумента</p>
- <p>SPI.transfer(0×00); //четвертый байт пустого аргумента</p>
- <p>Т.е. 0×00000200</p>
- <p> </p>
- <p><strong>3.</strong> Далее ожидание в один байт и передаем пакет данных.</p>
- <p>Пакет данных имеет следующую структуру</p>
- <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>
- <p>Перед блоком данных должна стоять метка. Метки бывают следующих типов:</p>
- <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>
- <p>Для нашего случая (запись блока данных, т.е. <strong>CMD24</strong>) подходит метка <strong>11111110</strong>, т.е. <strong>0xFE</strong>. В качестве <strong>CRC</strong>, мы будем использовать произвольное число <strong>0×00</strong>, т.к. в режиме SPI карта не учитывает CRC.</p>
- <p> </p>
- <p>Например нам нужно записать блок данных, состоящий из <strong>512-ть 0xAB</strong>, для этого на <strong>SD карту</strong> мы посылаем следующие<strong> SPI пакеты</strong>:</p>
- <p>Пошлем один байт, для ожидания</p>
- <p><strong>0xFF</strong></p>
- <p> </p>
- <p>Далее посылаем пакет данных</p>
- <p><strong>0xFE 0xAB ..510 раз.. 0xAB 0×00 0×00</strong></p>
- <p> </p>
- <p>Пример “фрагмент кода для Arduino”</p>
- <p> </p><!-- Crayon Syntax Highlighter v1.17 -->
- <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;">
-
- <div class="crayon-toolbar" data-settings=" mouseover overlay delay" style="height: 18px !important; line-height: 18px !important;">
- <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>
- <div class="crayon-info" style="min-height: 15px !important; line-height: 15px !important;"></div>
- <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); //посылаем один байт ожидания
- SPI.transfer(0xFE); //посылаем метку о начале пакета данных
- for (int i=0; i<512; i++)
- SPI.transfer(0xAB); //блок данных
- SPI.transfer(0x00); //1-ый байт CRC
- SPI.transfer(0x00); //2-ой байт CRC</textarea></div>
- <div class="crayon-main" style="">
- <table class="crayon-table">
- <tbody><tr class="crayon-row">
- <td class="crayon-nums " data-settings="hide" style="font-size: 12px !important; line-height: 15px !important;">
- <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>
- </td>
- <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"><</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"> </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>
- </tr>
- </tbody></table>
- </div>
- </div>
- <!-- [Format Time: 0.0009 seconds] -->
- <p> </p>
- <p><strong>4.</strong> Ожидаем байт приема данных и окончания записи.</p>
- <p> </p>
- <p>Байт приема данных <strong>должен придти сразу после</strong> окончания пакета данных, он имеет следующую структуру</p>
- <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>
- <p>Если данные приняты, байт приема данных должен иметь вид <strong>00000101</strong> или <strong>0×05</strong>.</p>
- <p> </p>
- <p>Пример ожидания байта о приеме данных на Arduino</p><!-- Crayon Syntax Highlighter v1.17 -->
- <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;">
-
- <div class="crayon-toolbar" data-settings=" mouseover overlay delay" style="height: 18px !important; line-height: 18px !important;">
- <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>
- <div class="crayon-info" style="min-height: 15px !important; line-height: 15px !important;"></div>
- <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>
- <div class="crayon-main" style="">
- <table class="crayon-table">
- <tbody><tr class="crayon-row">
- <td class="crayon-nums " data-settings="hide" style="font-size: 12px !important; line-height: 15px !important;">
- <div class="crayon-nums-content"><div class="crayon-num" data-line="crayon-55a8b9b3aa8c3-1">1</div></div>
- </td>
- <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>
- </tr>
- </tbody></table>
- </div>
- </div>
- <!-- [Format Time: 0.0003 seconds] -->
- <p> </p>
- <p>Окончание записи данных <strong>занимает некоторое время</strong>. Пока микросхема SD карты занята записью данных, на выходе карты мы получаем <strong>0xFF</strong>. Наша задача подавать <strong>0xFF</strong> <strong>на карту</strong> и ожидать пока она <strong>не закончит запись</strong>, т.е. пока мы на выходе не получим <strong>0×00</strong>. После чего можно отправлять новую команду с новыми данными, начиная с пункта 1.</p>
- <p> </p>
- <p>Пример ожидания окончания записи данных на Arduino</p><!-- Crayon Syntax Highlighter v1.17 -->
- <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;">
-
- <div class="crayon-toolbar" data-settings=" mouseover overlay delay" style="height: 18px !important; line-height: 18px !important;">
- <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>
- <div class="crayon-info" style="min-height: 15px !important; line-height: 15px !important;"></div>
- <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>
- <div class="crayon-main" style="">
- <table class="crayon-table">
- <tbody><tr class="crayon-row">
- <td class="crayon-nums " data-settings="hide" style="font-size: 12px !important; line-height: 15px !important;">
- <div class="crayon-nums-content"><div class="crayon-num" data-line="crayon-55a8b9b3aa8d7-1">1</div></div>
- </td>
- <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>
- </tr>
- </tbody></table>
- </div>
- </div>
- <!-- [Format Time: 0.0003 seconds] -->
- <p> </p>
- <p><strong>5.</strong> Выставляем логическую <strong>единицу на CS</strong></p>
- <p> </p>
- <p>Итак выложу полный <strong>код записи данных по блокам на Arduino</strong></p>
- <p> </p><!-- Crayon Syntax Highlighter v1.17 -->
- <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;">
-
- <div class="crayon-toolbar" data-settings=" mouseover overlay delay" style="height: 18px !important; line-height: 18px !important;">
- <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>
- <div class="crayon-info" style="min-height: 15px !important; line-height: 15px !important;"></div>
- <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 <SPI.h>
- uint8_t status_;
- int type_SD=0;
- void setup() {
- Serial.begin(9600);
- delay(5); //ждем, пока питающее напряжение на карте не будет номинально
- pinMode(4, OUTPUT); //в качестве CS мы будем использовать 4-пин Arduino (или PD4 или 6-оый выход ATmega328P)
- digitalWrite(4, HIGH); //выставим логическую еденицу на CS
- SPI.begin(); // инициализация SPI
- SPI.setDataMode(SPI_MODE0); //SD карта работает в режиме SPI-0
- SPI.setClockDivider(SPI_CLOCK_DIV128);
- for (int i = 0; i < 10; i++) //подадим 80 тактовых импульсов
- SPI.transfer(0XFF); //хотя требуется не менее 74
- /////////////////////////////////////НАЧАЛО ИНИЦИАЛИЗАЦИИ///////////////////////////////////////////
- digitalWrite(4, LOW); //выставим на CS логический ноль
- //-----команда CDM0 - програмный сброс
- SPI.transfer(0x40); //индекс команды cmd0
- SPI.transfer(0x00); //первый байт пустого аргумента
- SPI.transfer(0x00); //второй байт пустого аргумента
- SPI.transfer(0x00); //третий байт пустого аргумента
- SPI.transfer(0x00); //четвертый байт пустого аргумента
- SPI.transfer(0x95); // CRC
- while (SPI.transfer(0xFF)!=0x01); //ожидание сигнала о принятия команды (ответ R1 - один байт)
- //-----конец команды CDM0 - програмный сброс
-
- //-----команда CDM8 - проверяем версию SD карты
- delay(300);
- SPI.transfer(0x48); //индекс команды cmd8
- SPI.transfer(0x00); //первый байт пустого аргумента
- SPI.transfer(0x00); //второй байт пустого аргумента
- SPI.transfer(0x01); //третий байт пустого аргумента
- SPI.transfer(0xAA); //четвертый байт пустого аргумента РАЗОБРАТЬСЯ ГДЕ ПЕРВЫЙ БАЙТ ГДЕ ПОСЛЕДНИЙ
- SPI.transfer(0X87); // CRC
- do { //ожидание сигнала о принятия команды (ответ R7 - 5 байт (1-ый байт это R1, далее 4-е байта нам не интересны))
- status_=SPI.transfer(0xFF);
-
- //если ответ R1 0x04 - "com are error", значит SD v.1
- if (status_==0x04) {
- Serial.println("SD V1");
- type_SD=1; //карта SD версии 1, иниализировать карту будем с помощьюу команды CDM1
- }
- //если ответ R1 0x01 - "in idle state", значит SD v.2
- if (status_==0x01) {
- Serial.println("SD V2");
- type_SD=2; //карта SD версии 2, иниализировать карту будем с помощью команды ACDM41 (CMD55 + CMD41)
- }
- } while((status_!=0x01) and (status_!=0x04));
- //-----конец команды CDM8 - проверяем версию SD карты
-
- //-----инициализация карты SD v.1, с помощью команды CMD1
- if (type_SD==1) {
- while (true) {
- if (SPI.transfer(0x41)==0x00) break; //бесконечное число раз
- if (SPI.transfer(0x00)==0x00) break; //отправляем команды CMD1
- if (SPI.transfer(0x00)==0x00) break; //с пустым аргументом и
- if (SPI.transfer(0x00)==0x00) break; //произвольным CRC
- if (SPI.transfer(0x00)==0x00) break; //до тех пор, пока не получим
- if (SPI.transfer(0x00)==0x00) break; //ответ 0x00
- }
- }
- //-----конец инициализации карты SD v.1
-
- //-----инициализация карты SD v.2, с помощью команды ACDM41 (CMD55 + CMD41)
- if (type_SD==2) {
- for (uint8_t i = 0; i < 4; SPI.transfer(0xFF),i++); //свдигаем 4-е байта ответа от CMD8, нам они не нужны
- do {
- //CMD55
- SPI.transfer(0X77); //индекс команды cmd55
- SPI.transfer(0x00); //первый байт пустого аргумента
- SPI.transfer(0x00); //второй байт пустого аргумента
- SPI.transfer(0x00); //третий байт пустого аргумента
- SPI.transfer(0x00); //четвертый байт пустого аргумента РАЗОБРАТЬСЯ ГДЕ ПЕРВЫЙ БАЙТ ГДЕ ПОСЛЕДНИЙ
- SPI.transfer(0X00); // CRC
- while (SPI.transfer(0xFF)!=0x01); //ожидание сигнала о принятия команды
-
- //CMD41
- SPI.transfer(0X69); //индекс команды cmd41
- SPI.transfer(0x40); //первый байт пустого аргумента
- SPI.transfer(0x00); //второй байт пустого аргумента
- SPI.transfer(0x00); //третий байт пустого аргумента
- SPI.transfer(0x00); //четвертый байт пустого аргумента РАЗОБРАТЬСЯ ГДЕ ПЕРВЫЙ БАЙТ ГДЕ ПОСЛЕДНИЙ
- SPI.transfer(0XFF); // CRC
-
- SPI.transfer(0xFF); //сдвигаем на один байт
- status_ = SPI.transfer(0xFF); //ответ на команду ACMD41
- }
- while (status_!= 0X00); //шлем команду ACMD41 до тех пор, пока не получим ответ 0x00
- }
- //------конец инициализации карты SD v.2
-
- Serial.println("USPEH!");
-
- digitalWrite(4, HIGH); //выставим логическую еденицу на CS
- /////////////////////////////////////КОНЕЦ ИНИЦИАЛИЗАЦИИ///////////////////////////////////////////
- //ЗАПИСЬ БЛОКА--------------------------------------------------
- digitalWrite(4, LOW);
- // команда - сmd24, запись блока данных
- SPI.transfer(0x58);
- SPI.transfer(0x00); //первый байт аргумента
- SPI.transfer(0x00); //второй байт аргумента
- SPI.transfer(0x00); //третий байт аргумента
- SPI.transfer(0x00); //четвертый байт аргумента
- SPI.transfer(0x00);
- while (SPI.transfer(0xFF)!=0x00); //ожидание сигнала о принятия команды
- SPI.transfer(0xFF); //один байт ожидания
- SPI.transfer(0xFE); //метка начала пакета данных
- for (int i=0; i<512; i++)
- SPI.transfer(0xAB); //блок данных
- SPI.transfer(0x00); //1-ый байт CRC
- SPI.transfer(0x00); //2-ой байт CRC
- while (SPI.transfer(0xFF)!=0x05); //ожидание сигнала о принятия команды
- while (SPI.transfer(0xFF)!=0x00); //ожидание сигнала о окончания записи данных
- digitalWrite(4, HIGH);
- //КОНЕЦ ЗАПИСЬ БЛОКА--------------------------------------------------
- }
- void loop() {
- delay(100);
- }</textarea></div>
- <div class="crayon-main" style="">
- <table class="crayon-table">
- <tbody><tr class="crayon-row">
- <td class="crayon-nums " data-settings="hide" style="font-size: 12px !important; line-height: 15px !important;">
- <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>
- </td>
- <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 <SPI.h></span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-2"> </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"> </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"> </div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-8"><span class="h"> </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"> </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"> </div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-11"><span class="h"> </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"> </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 class="crayon-line" id="crayon-55a8b9b3aa8fd-13"> </div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-14"><span class="h"> </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"> </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"> </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"> </div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-18"><span class="h"> </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"><</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"> </span><span class="c">//подадим 80 тактовых импульсов</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-19"><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"> </span><span class="c">//хотя требуется не менее 74</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-20"> </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"> </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"> </div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-24"><span class="h"> </span><span class="c">//-----команда CDM0 - програмный сброс</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-25"><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">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"> </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"> </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"> </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"> </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"> </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"> </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"> </span><span class="c">//-----конец команды CDM0 - програмный сброс</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-33"><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-34"><span class="h"> </span><span class="c">//-----команда CDM8 - проверяем версию SD карты</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-35"><span class="h"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-45"><span class="h"> </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"> </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"> </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"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-48"><span class="h"> </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"> </span><span class="sy">}</span><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-50"><span class="h"> </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"> </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"> </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"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-53"><span class="h"> </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"> </span><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-55"><span class="h"> </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"> </span><span class="c">//-----конец команды CDM8 - проверяем версию SD карты</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-57"><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-58"><span class="h"> </span><span class="c">//-----инициализация карты SD v.1, с помощью команды CMD1 </span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-59"><span class="h"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </span><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-68"><span class="h"> </span><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-69"><span class="h"> </span><span class="c">//-----конец инициализации карты SD v.1 </span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-70"><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-71"><span class="h"> </span><span class="c">//-----инициализация карты SD v.2, с помощью команды ACDM41 (CMD55 + CMD41) </span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-72"><span class="h"> </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"> </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"><</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"> </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"> </span><span class="c">//CMD55</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-76"><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">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"> </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"> </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"> </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"> </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"> </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"> </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"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-84"><span class="h"> </span><span class="c">//CMD41 </span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-85"><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">0X69</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//индекс команды cmd41 </span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-86"><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">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"> </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"> </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"> </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"> </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"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-92"><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"> </span><span class="c">//сдвигаем на один байт</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-93"><span class="h"> </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"> </span><span class="c">//ответ на команду ACMD41</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-94"><span class="h"> </span><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-95"><span class="h"> </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"> </span><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-97"><span class="h"> </span><span class="c">//------конец инициализации карты SD v.2 </span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-98"><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-99"><span class="h"> </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"> </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"> </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 class="crayon-line" id="crayon-55a8b9b3aa8fd-102"><span class="h"> </span><span class="c">/////////////////////////////////////КОНЕЦ ИНИЦИАЛИЗАЦИИ///////////////////////////////////////////</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-103"> </div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-104"><span class="h"> </span><span class="c">//ЗАПИСЬ БЛОКА--------------------------------------------------</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-105"><span class="h"> </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"> </div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-107"><span class="h"> </span><span class="c">// команда - сmd24, запись блока данных</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-108"><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">0x58</span><span class="sy">)</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-109"><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">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"> </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"> </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"> </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"> </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"> </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"> </div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-116"><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"> </span><span class="c">//один байт ожидания</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-117"><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">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"> </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"><</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"> </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"> </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"> </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"> </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"> </div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-124"><span class="h"> </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"> </div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-126"><span class="h"> </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"> </span><span class="c">//КОНЕЦ ЗАПИСЬ БЛОКА--------------------------------------------------</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-128"> </div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-129"><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa8fd-130"> </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>
- </tr>
- </tbody></table>
- </div>
- </div>
- <!-- [Format Time: 0.0133 seconds] -->
- <p> </p>
- <p><a href="#6">Где я могу проверить данный код, если у меня нет ATmega328P?</a></p>
- <p> </p>
- <p> </p>
- <p> </p>
- <h1 id="4">Как читать данные с SD карты?</h1>
- <p> </p>
- <p>Читать данные можно аналогично как и писать: <strong>по одному блоку</strong> или <strong>сразу множество блоков</strong>.</p>
- <p>Повторю, один блок данных по умолчанию равен <strong>512 байт</strong> (т.е. данные будут помещаться в 512 пакетов SPI). Размер блока можно изменить с помощью команды <strong>CMD16</strong>, но это подходит только для <strong>SD карт «старого образца»</strong> до 4 Гб с одноименным поколением – «<strong>SD</strong>» (так и пишется на наклейки)</p>
- <p> </p>
- <p>В большинство современных <strong>SD карт</strong>, т.е. поколения <strong>SDHC</strong>, <strong>SDXC</strong> (см. наклейку на карте) данная функция не поддерживается и один блок памяти <strong>неизменно равен 512 байт</strong>.</p>
- <p> </p>
- <p>Мы разберемся как <strong>читать данные по одному блоку</strong>, как прочесть сразу множество блоков читайте в документации.</p>
- <p> </p>
- <p> </p>
- <h3>Чтение данных по блокам</h3>
- <p> </p>
- <p>Чтение как и запись происходит по аналогии, но я на всякий случай
- опишу также подробно (для тех кто попал сюда по ссылке с начало поста)</p>
- <p> </p>
- <p>Для чтения данных по блокам, используется команда <strong>CMD17</strong>, в качестве её аргумента используется:</p>
- <p> </p>
- <p>-Для «<strong>старых</strong>» карт поколения «<strong>SD</strong>» (до 4 Гб) в качестве аргумента используется <strong>адрес необходимого сектора</strong>. Адресуются сектора в SD <strong>побайтно</strong>, т.е. размер одного сектора – один байт. Но т.к. данные в SD карту считываются не побайтно, а блоками, с размером 512 байт, <strong>то адрес сектора фактически означает – адрес первого байта блока</strong>.</p>
- <p> </p>
- <p>-Для «<strong>современных</strong>» карт, т.е. <strong>SDHC</strong>, <strong>SDXC</strong> в качестве аргумент используется <strong>номер 512 байтного блока</strong>. Блоки нумеруются с нуля.</p>
- <p>В данном посте мы будем рассматривать как писать данные в <strong>SD</strong> карты «<strong>старого образца</strong>» (поколение SD, их размер не выше 4 Гб).</p>
- <p> </p>
- <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>
- <p> </p>
- <p>Так как считать блок данных? Алгоритм работы:</p>
- <p> </p>
- <p><strong>1.</strong> Первым делом выставляем на <strong>CS логический ноль</strong></p>
- <p> </p>
- <p><strong>2.</strong> Далее отправим карте команду <strong>CMD17</strong> <strong>с аргументом – адрес сектора с которого начинается считываемый блок данных</strong>. CRC код у нас произвольный, т.к. в режиме SPI карта его не учитывает.</p>
- <p>Пример, нам нужно прочесть блок данных, начинающийся с первого
- сектора SD карты. Мы отправляем карте CMD17 c адресом 0×0000 и
- произвольным CRC.</p>
- <p>Т.е. мы посылаем SD карте следующие SPI пакеты.</p>
- <p><strong>0х51 0х00 0х00 0х00 0х00 0х00</strong> (CRC как 0×00 выбран произвольно)</p>
- <p> </p>
- <p>Ожидаем байт ответа, что команда принята удачно, мы должны получить значение</p>
- <p><strong>0×00</strong></p>
- <p> </p>
- <p>Пример “фрагмент кода для Arduino”</p>
- <p> </p><!-- Crayon Syntax Highlighter v1.17 -->
- <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;">
-
- <div class="crayon-toolbar" data-settings=" mouseover overlay delay" style="height: 18px !important; line-height: 18px !important;">
- <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>
- <div class="crayon-info" style="min-height: 15px !important; line-height: 15px !important;"></div>
- <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);
- SPI.transfer(0x00); //первый байт аргумента
- SPI.transfer(0x00); //второй байт аргумента
- SPI.transfer(0x00); //третий байт аргумента
- SPI.transfer(0x00); //четвертый байт аргумента
- SPI.transfer(0x00);
- while (SPI.transfer(0xFF)!=0x00); //ожидание сигнала о принятия команды</textarea></div>
- <div class="crayon-main" style="">
- <table class="crayon-table">
- <tbody><tr class="crayon-row">
- <td class="crayon-nums " data-settings="hide" style="font-size: 12px !important; line-height: 15px !important;">
- <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>
- </td>
- <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"> </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"> </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"> </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"> </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"> </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"> </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"> </div><div class="crayon-line" id="crayon-55a8b9b3aa91a-8"><span class="h"> </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>
- </tr>
- </tbody></table>
- </div>
- </div>
- <!-- [Format Time: 0.0010 seconds] -->
- <p> </p>
- <p>P.S. Первый, второй, третий байт адреса и т.п. я нумеровал с лева,
- т.е. если вас интересует например адрес 0×200, то аргумент будет</p>
- <p>SPI.transfer(0×00); //первый байт пустого аргумента</p>
- <p>SPI.transfer(0×00); //второй байт пустого аргумента</p>
- <p>SPI.transfer(0×02); //третий байт пустого аргумента</p>
- <p>SPI.transfer(0×00); //четвертый байт пустого аргумента</p>
- <p>Т.е. 0×00000200</p>
- <p> </p>
- <p><strong>3.</strong> Далее ожидание начала пакета данных и прием данных</p>
- <p>Пакет данных имеет следующую структуру</p>
- <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>
- <p> </p>
- <p>Перед блоком данных должна стоять метка. Метки бывают следующих типов:</p>
- <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>
- <p> </p>
- <p>Для нашего случая (чтение блока данных, т.е. <strong>CMD17</strong>) подходит метка <strong>11111110</strong>, т.е. <strong>0xFE</strong>. В качестве <strong>CRC</strong>, мы будем использовать произвольное число <strong>0×00</strong>, т.к. в режиме SPI карта не учитывает CRC.</p>
- <p> </p>
- <p>Т.е. под ожиданием начала пакета данных, подразумевается <strong>ожидание метки 11111110 </strong>или <strong>0xFE</strong>.</p>
- <p> </p>
- <p>Пример мы отправили команду <strong>CMD17</strong> и нам нужно принять пакет данных:</p><!-- Crayon Syntax Highlighter v1.17 -->
- <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;">
-
- <div class="crayon-toolbar" data-settings=" mouseover overlay delay" style="height: 18px !important; line-height: 18px !important;">
- <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>
- <div class="crayon-info" style="min-height: 15px !important; line-height: 15px !important;"></div>
- <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); //ожидание метки о начале пакета данных
- for (int i=0; i<512; i++)
- block[i]=SPI.transfer(0xFF); //считываем блок данных в массив block с размером 512 элементов типа byte.</textarea></div>
- <div class="crayon-main" style="">
- <table class="crayon-table">
- <tbody><tr class="crayon-row">
- <td class="crayon-nums " data-settings="hide" style="font-size: 12px !important; line-height: 15px !important;">
- <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>
- </td>
- <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"> </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"> </div><div class="crayon-line" id="crayon-55a8b9b3aa930-3"><span class="h"> </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"><</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"> </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>
- </tr>
- </tbody></table>
- </div>
- </div>
- <!-- [Format Time: 0.0008 seconds] -->
- <p> </p>
- <p>После чего, нам нужно еще подождать <strong>2-а байта</strong>, это <strong>CRC</strong> код, мы его не проверяем, но принять обязаны.</p><!-- Crayon Syntax Highlighter v1.17 -->
- <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;">
-
- <div class="crayon-toolbar" data-settings=" mouseover overlay delay" style="height: 18px !important; line-height: 18px !important;">
- <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>
- <div class="crayon-info" style="min-height: 15px !important; line-height: 15px !important;"></div>
- <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
- SPI.transfer(0xFF);
- SPI.transfer(0xFF);</textarea></div>
- <div class="crayon-main" style="">
- <table class="crayon-table">
- <tbody><tr class="crayon-row">
- <td class="crayon-nums " data-settings="hide" style="font-size: 12px !important; line-height: 15px !important;">
- <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>
- </td>
- <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"> </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"> </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>
- </tr>
- </tbody></table>
- </div>
- </div>
- <!-- [Format Time: 0.0003 seconds] -->
- <p> </p>
- <p>P.S. Если при чтение произошла ошибка, то вместо пакета данных мы получим маркер ошибки:</p>
- <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>
- <p> </p>
- <p> </p>
- <p><strong>4.</strong> Выставляем логическую<strong> единицу на CS</strong></p>
- <p> </p>
- <p> </p>
- <p>Итак, выложу полный<strong> код</strong> в котором мы сначала <strong>запишем блок данных в SD карту, а потом прочтем его</strong>. Код для Arduino</p>
- <p> </p><!-- Crayon Syntax Highlighter v1.17 -->
- <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;">
-
- <div class="crayon-toolbar" data-settings=" mouseover overlay delay" style="height: 18px !important; line-height: 18px !important;">
- <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>
- <div class="crayon-info" style="min-height: 15px !important; line-height: 15px !important;"></div>
- <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
- <SPI.h>
- byte block[512]; //куда будем считывать блок данных с SD
- uint8_t status_;
- int type_SD=0;
- void setup() {
- Serial.begin(9600);
- delay(5); //ждем, пока питающее напряжение на карте не будет
- номинально
- pinMode(4, OUTPUT); //в качестве CS мы будем использовать 4-пин
- Arduino (или PD4 или 6-оый выход ATmega328P)
- digitalWrite(4, HIGH); //выставим логическую еденицу на CS
- SPI.begin(); // инициализация SPI
- SPI.setDataMode(SPI_MODE0); //SD карта работает в режиме SPI-0
- SPI.setClockDivider(SPI_CLOCK_DIV128);
- for (int i = 0; i < 10; i++) //подадим 80 тактовых импульсов
- SPI.transfer(0XFF); //хотя требуется не менее 74
- /////////////////////////////////////НАЧАЛО
- ИНИЦИАЛИЗАЦИИ///////////////////////////////////////////
- digitalWrite(4, LOW); //выставим на CS логический ноль
- //-----команда CDM0 - програмный сброс
- SPI.transfer(0x40); //индекс команды cmd0
- SPI.transfer(0x00); //первый байт пустого аргумента
- SPI.transfer(0x00); //второй байт пустого аргумента
- SPI.transfer(0x00); //третий байт пустого аргумента
- SPI.transfer(0x00); //четвертый байт пустого аргумента
- SPI.transfer(0x95); // CRC
- while (SPI.transfer(0xFF)!=0x01); //ожидание сигнала о принятия
- команды (ответ R1 - один байт)
- //-----конец команды CDM0 - програмный сброс
-
- //-----команда CDM8 - проверяем версию SD карты
- delay(300);
- SPI.transfer(0x48); //индекс команды cmd8
- SPI.transfer(0x00); //первый байт пустого аргумента
- SPI.transfer(0x00); //второй байт пустого аргумента
- SPI.transfer(0x01); //третий байт пустого аргумента
- SPI.transfer(0xAA); //четвертый байт пустого аргумента РАЗОБРАТЬСЯ ГДЕ
- ПЕРВЫЙ БАЙТ ГДЕ ПОСЛЕДНИЙ
- SPI.transfer(0X87); // CRC
- do { //ожидание сигнала о принятия команды (ответ R7 - 5 байт (1-ый
- байт это R1, далее 4-е байта нам не интересны))
- status_=SPI.transfer(0xFF);
-
- //если ответ R1 0x04 - "com are error", значит SD v.1
- if (status_==0x04) {
- Serial.println("SD V1");
- type_SD=1; //карта SD версии 1, иниализировать карту будем с
- помощьюу команды CDM1
- }
- //если ответ R1 0x01 - "in idle state", значит SD v.2
- if (status_==0x01) {
- Serial.println("SD V2");
- type_SD=2; //карта SD версии 2, иниализировать карту будем с
- помощью команды ACDM41 (CMD55 + CMD41)
- }
- } while((status_!=0x01) and (status_!=0x04));
- //-----конец команды CDM8 - проверяем версию SD карты
-
- //-----инициализация карты SD v.1, с помощью команды CMD1
- if (type_SD==1) {
- while (true) {
- if (SPI.transfer(0x41)==0x00) break; //бесконечное число раз
- if (SPI.transfer(0x00)==0x00) break; //отправляем команды CMD1
- if (SPI.transfer(0x00)==0x00) break; //с пустым аргументом и
- if (SPI.transfer(0x00)==0x00) break; //произвольным CRC
- if (SPI.transfer(0x00)==0x00) break; //до тех пор, пока не получим
- if (SPI.transfer(0x00)==0x00) break; //ответ 0x00
- }
- }
- //-----конец инициализации карты SD v.1
-
- //-----инициализация карты SD v.2, с помощью команды ACDM41 (CMD55 +
- CMD41)
- if (type_SD==2) {
- for (uint8_t i = 0; i < 4; SPI.transfer(0xFF),i++); //свдигаем
- 4-е байта ответа от CMD8, нам они не нужны
- do {
- //CMD55
- SPI.transfer(0X77); //индекс команды cmd55
- SPI.transfer(0x00); //первый байт пустого аргумента
- SPI.transfer(0x00); //второй байт пустого аргумента
- SPI.transfer(0x00); //третий байт пустого аргумента
- SPI.transfer(0x00); //четвертый байт пустого аргумента
- РАЗОБРАТЬСЯ ГДЕ ПЕРВЫЙ БАЙТ ГДЕ ПОСЛЕДНИЙ
- SPI.transfer(0X00); // CRC
- while (SPI.transfer(0xFF)!=0x01); //ожидание сигнала о
- принятия команды
-
- //CMD41
- SPI.transfer(0X69); //индекс команды cmd41
- SPI.transfer(0x40); //первый байт пустого аргумента
- SPI.transfer(0x00); //второй байт пустого аргумента
- SPI.transfer(0x00); //третий байт пустого аргумента
- SPI.transfer(0x00); //четвертый байт пустого аргумента
- РАЗОБРАТЬСЯ ГДЕ ПЕРВЫЙ БАЙТ ГДЕ ПОСЛЕДНИЙ
- SPI.transfer(0XFF); // CRC
-
- SPI.transfer(0xFF); //сдвигаем на один байт
- status_ = SPI.transfer(0xFF); //ответ на команду ACMD41
- }
- while (status_!= 0X00); //шлем команду ACMD41 до тех пор, пока не
- получим ответ 0x00
- }
- //------конец инициализации карты SD v.2
-
- Serial.println("USPEH!");
-
- digitalWrite(4, HIGH); //выставим логическую еденицу на CS
- /////////////////////////////////////КОНЕЦ
- ИНИЦИАЛИЗАЦИИ///////////////////////////////////////////
- //ЗАПИСЬ БЛОКА--------------------------------------------------
- digitalWrite(4, LOW);
- // команда - сmd24, запись блока данных
- SPI.transfer(0x58);
- SPI.transfer(0x00); //аргумент, адрес блока
- SPI.transfer(0x00);
- SPI.transfer(0x00);
- SPI.transfer(0x00);
- SPI.transfer(0x00);
- while (SPI.transfer(0xFF)!=0x00); //ожидание сигнала о принятия
- команды
- SPI.transfer(0xFF); //один байт ожидания
- SPI.transfer(0xFE); //метка начала пакета данных
- for (int i=0; i<512; i++)
- SPI.transfer(0xAB); //блок данных
- SPI.transfer(0x00); //1-ый байт CRC
- SPI.transfer(0x00); //2-ой байт CRC
- while (SPI.transfer(0xFF)!=0x05); //ожидание сигнала о принятия
- команды
- while (SPI.transfer(0xFF)!=0x00); //ожидание сигнала о окончания
- записи данных
- digitalWrite(4, HIGH);
- //КОНЕЦ ЗАПИСЬ БЛОКА--------------------------------------------------
- //ЧТЕНИЕ БЛОКА--------------------------------------------------
- digitalWrite(4, LOW);
- // команда - сmd17, чтение блока данных
- SPI.transfer(0x51);
- SPI.transfer(0x00); //аргумент, адрес блока
- SPI.transfer(0x00);
- SPI.transfer(0x00);
- SPI.transfer(0x00);
- SPI.transfer(0x00);
- while (SPI.transfer(0xFF)!=0x00); //ожидание сигнала о принятия
- команды
- while (SPI.transfer(0xFF)!=0xFE); //ожидание сигнала о начале пакета
- данных
- for (int i=0; i<512; i++)
- block[i]=SPI.transfer(0xFF); //считываем блок данных в массив block с
- размером 512 элементов типа byte.//считываем блок данных в массив block
- с размером 512 элементов типа byte.
- //сдвинем еще на два байта, это CRC
- SPI.transfer(0xFF);
- SPI.transfer(0xFF);
- digitalWrite(4, HIGH);
- //КОНЕЦ ЧТЕНИЯ БЛОКА--------------------------------------------------
-
- }
- void loop() {
- delay(100);
- }</textarea></div>
- <div class="crayon-main" style="">
- <table class="crayon-table">
- <tbody><tr class="crayon-row">
- <td class="crayon-nums " data-settings="hide" style="font-size: 12px !important; line-height: 15px !important;">
- <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>
- </td>
- <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 <SPI.h></span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-2"> </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"> </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"> </div><div class="crayon-line" id="crayon-55a8b9b3aa954-9"><span class="h"> </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"> </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"> </div><div class="crayon-line" id="crayon-55a8b9b3aa954-12"><span class="h"> </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"> </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 class="crayon-line" id="crayon-55a8b9b3aa954-14"> </div><div class="crayon-line" id="crayon-55a8b9b3aa954-15"><span class="h"> </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"> </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"> </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"> </div><div class="crayon-line" id="crayon-55a8b9b3aa954-19"><span class="h"> </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"><</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"> </span><span class="c">//подадим 80 тактовых импульсов</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-20"><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"> </span><span class="c">//хотя требуется не менее 74</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-21"> </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"> </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"> </div><div class="crayon-line" id="crayon-55a8b9b3aa954-25"><span class="h"> </span><span class="c">//-----команда CDM0 - програмный сброс</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-26"><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">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"> </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"> </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"> </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"> </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"> </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"> </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"> </span><span class="c">//-----конец команды CDM0 - програмный сброс</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-34"><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-35"><span class="h"> </span><span class="c">//-----команда CDM8 - проверяем версию SD карты</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-36"><span class="h"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-46"><span class="h"> </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"> </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"> </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"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-49"><span class="h"> </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"> </span><span class="sy">}</span><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-51"><span class="h"> </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"> </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"> </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"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-54"><span class="h"> </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"> </span><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-56"><span class="h"> </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"> </span><span class="c">//-----конец команды CDM8 - проверяем версию SD карты</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-58"><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-59"><span class="h"> </span><span class="c">//-----инициализация карты SD v.1, с помощью команды CMD1 </span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-60"><span class="h"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </span><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-69"><span class="h"> </span><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-70"><span class="h"> </span><span class="c">//-----конец инициализации карты SD v.1 </span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-71"><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-72"><span class="h"> </span><span class="c">//-----инициализация карты SD v.2, с помощью команды ACDM41 (CMD55 + CMD41) </span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-73"><span class="h"> </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"> </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"><</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"> </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"> </span><span class="c">//CMD55</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-77"><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">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"> </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"> </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"> </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"> </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"> </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"> </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"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-85"><span class="h"> </span><span class="c">//CMD41 </span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-86"><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">0X69</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//индекс команды cmd41 </span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-87"><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">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"> </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"> </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"> </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"> </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"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-93"><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"> </span><span class="c">//сдвигаем на один байт</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-94"><span class="h"> </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"> </span><span class="c">//ответ на команду ACMD41</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-95"><span class="h"> </span><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-96"><span class="h"> </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"> </span><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-98"><span class="h"> </span><span class="c">//------конец инициализации карты SD v.2 </span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-99"><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-100"><span class="h"> </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"> </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"> </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 class="crayon-line" id="crayon-55a8b9b3aa954-103"><span class="h"> </span><span class="c">/////////////////////////////////////КОНЕЦ ИНИЦИАЛИЗАЦИИ///////////////////////////////////////////</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-104"> </div><div class="crayon-line" id="crayon-55a8b9b3aa954-105"><span class="h"> </span><span class="c">//ЗАПИСЬ БЛОКА--------------------------------------------------</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-106"><span class="h"> </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"> </div><div class="crayon-line" id="crayon-55a8b9b3aa954-108"><span class="h"> </span><span class="c">// команда - сmd24, запись блока данных</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-109"><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">0x58</span><span class="sy">)</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-110"><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">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"> </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"> </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"> </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"> </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"> </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"> </div><div class="crayon-line" id="crayon-55a8b9b3aa954-117"><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"> </span><span class="c">//один байт ожидания</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-118"><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">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"> </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"><</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"> </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"> </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"> </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"> </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"> </div><div class="crayon-line" id="crayon-55a8b9b3aa954-125"><span class="h"> </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"> </div><div class="crayon-line" id="crayon-55a8b9b3aa954-127"><span class="h"> </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"> </span><span class="c">//КОНЕЦ ЗАПИСЬ БЛОКА--------------------------------------------------</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-129"> </div><div class="crayon-line" id="crayon-55a8b9b3aa954-130"><span class="h"> </span><span class="c">//ЧТЕНИЕ БЛОКА--------------------------------------------------</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-131"><span class="h"> </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"> </div><div class="crayon-line" id="crayon-55a8b9b3aa954-133"><span class="h"> </span><span class="c">// команда - сmd17, чтение блока данных</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-134"><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">0x51</span><span class="sy">)</span><span class="sy">;</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-135"><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">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"> </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"> </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"> </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"> </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"> </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"> </div><div class="crayon-line" id="crayon-55a8b9b3aa954-142"><span class="h"> </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"> </div><div class="crayon-line" id="crayon-55a8b9b3aa954-144"><span class="h"> </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"><</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"> </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"> </div><div class="crayon-line" id="crayon-55a8b9b3aa954-147"><span class="h"> </span><span class="c">//сдвинем еще на два байта, это CRC</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-148"><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"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-149"><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"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-150"><span class="h"> </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-151"><span class="h"> </span><span class="c">//КОНЕЦ ЧТЕНИЯ БЛОКА-------------------------------------------------- </span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-152"><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa954-153"> </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>
- </tr>
- </tbody></table>
- </div>
- </div>
- <!-- [Format Time: 0.0160 seconds] -->
- <p> </p>
- <p><a href="#6">Где я могу проверить данный код, если у меня нет ATmega328P?</a></p>
- <p> </p>
- <p> </p>
- <p> </p>
- <h1 id="5">Как читать регистры SD карты?</h1>
- <p> </p>
- <p>В SD карте есть программно доступные регистры, в которых храниться<strong> параметры карты и её настройки</strong>. Мы можем читать регистры и узнать какую-нибудь полезную информацию. Регистров около 10-и, в <a href="#1">спецификации</a> вы можете узнать о каждом из них.</p>
- <p> </p>
- <p>Наиболее интересные регистры:</p>
- <p> </p>
- <p>—Регистр <strong>CID</strong> (Card identification data): содержит
- данные, по которым можно идентифицировать карту памяти (серийный номер,
- ID производителя, дату изготовления и т.д.)<br>
- —Регистр <strong>CSD</strong> (Card-specific data): содержит
- всевозможную информацию о карте памяти (от размера сектора карты памяти
- до потребления в режиме чтения/записи).<br>
- —Регистр <strong>OCR</strong> (Operation Conditions Register): содержит
- напряжения питания карты памяти, тип питания карты памяти, статус
- процесса инициализации карты</p>
- <p> </p>
- <p>Чтение регистров, похоже на чтение блока памяти, отличие заключается лишь в размере возвращаемых данных.</p>
- <p> </p>
- <p>Я приведу пример <strong>как прочесть регистр CID</strong>.</p>
- <p> </p>
- <p> </p>
- <h3>Читаем CID</h3>
- <p> </p>
- <p>Для того, что бы прочесть регистр <strong>CID</strong>, карте необходимо послать команду <strong>CMD10</strong>. В результате чего, <strong>SD</strong> карта вернет<strong> пакет данных с размером 16 байт</strong>. Определить начало пакета мы можем по метке <strong>0xFE</strong>.</p>
- <p> </p>
- <p>Не буду разжевывать, здесь все по аналогии с «чтением данных по блокам». Приведу сразу полный код чтения CID на Arduino</p>
- <p> </p><!-- Crayon Syntax Highlighter v1.17 -->
- <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;">
-
- <div class="crayon-toolbar" data-settings=" mouseover overlay delay" style="height: 18px !important; line-height: 18px !important;">
- <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>
- <div class="crayon-info" style="min-height: 15px !important; line-height: 15px !important;"></div>
- <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 <SPI.h>
- byte block16[16]; //куда будем считывать блок данных с значением регистра CID
- uint8_t status_;
- int type_SD=0;
- void setup() {
- Serial.begin(9600);
- delay(5); //ждем, пока питающее напряжение на карте не будет номинально
- pinMode(4, OUTPUT); //в качестве CS мы будем использовать 4-пин Arduino (или PD4 или 6-оый выход ATmega328P)
- digitalWrite(4, HIGH); //выставим логическую еденицу на CS
- SPI.begin(); // инициализация SPI
- SPI.setDataMode(SPI_MODE0); //SD карта работает в режиме SPI-0
- SPI.setClockDivider(SPI_CLOCK_DIV128);
- for (int i = 0; i < 10; i++) //подадим 80 тактовых импульсов
- SPI.transfer(0XFF); //хотя требуется не менее 74
- /////////////////////////////////////НАЧАЛО ИНИЦИАЛИЗАЦИИ///////////////////////////////////////////
- digitalWrite(4, LOW); //выставим на CS логический ноль
- //-----команда CDM0 - програмный сброс
- SPI.transfer(0x40); //индекс команды cmd0
- SPI.transfer(0x00); //первый байт пустого аргумента
- SPI.transfer(0x00); //второй байт пустого аргумента
- SPI.transfer(0x00); //третий байт пустого аргумента
- SPI.transfer(0x00); //четвертый байт пустого аргумента
- SPI.transfer(0x95); // CRC
- while (SPI.transfer(0xFF)!=0x01); //ожидание сигнала о принятия команды (ответ R1 - один байт)
- //-----конец команды CDM0 - програмный сброс
-
- //-----команда CDM8 - проверяем версию SD карты
- delay(300);
- SPI.transfer(0x48); //индекс команды cmd8
- SPI.transfer(0x00); //первый байт пустого аргумента
- SPI.transfer(0x00); //второй байт пустого аргумента
- SPI.transfer(0x01); //третий байт пустого аргумента
- SPI.transfer(0xAA); //четвертый байт пустого аргумента РАЗОБРАТЬСЯ ГДЕ ПЕРВЫЙ БАЙТ ГДЕ ПОСЛЕДНИЙ
- SPI.transfer(0X87); // CRC
- do { //ожидание сигнала о принятия команды (ответ R7 - 5 байт (1-ый байт это R1, далее 4-е байта нам не интересны))
- status_=SPI.transfer(0xFF);
-
- //если ответ R1 0x04 - "com are error", значит SD v.1
- if (status_==0x04) {
- Serial.println("SD V1");
- type_SD=1; //карта SD версии 1, иниализировать карту будем с помощьюу команды CDM1
- }
- //если ответ R1 0x01 - "in idle state", значит SD v.2
- if (status_==0x01) {
- Serial.println("SD V2");
- type_SD=2; //карта SD версии 2, иниализировать карту будем с помощью команды ACDM41 (CMD55 + CMD41)
- }
- } while((status_!=0x01) and (status_!=0x04));
- //-----конец команды CDM8 - проверяем версию SD карты
-
- //-----инициализация карты SD v.1, с помощью команды CMD1
- if (type_SD==1) {
- while (true) {
- if (SPI.transfer(0x41)==0x00) break; //бесконечное число раз
- if (SPI.transfer(0x00)==0x00) break; //отправляем команды CMD1
- if (SPI.transfer(0x00)==0x00) break; //с пустым аргументом и
- if (SPI.transfer(0x00)==0x00) break; //произвольным CRC
- if (SPI.transfer(0x00)==0x00) break; //до тех пор, пока не получим
- if (SPI.transfer(0x00)==0x00) break; //ответ 0x00
- }
- }
- //-----конец инициализации карты SD v.1
-
- //-----инициализация карты SD v.2, с помощью команды ACDM41 (CMD55 + CMD41)
- if (type_SD==2) {
- for (uint8_t i = 0; i < 4; SPI.transfer(0xFF),i++); //свдигаем 4-е байта ответа от CMD8, нам они не нужны
- do {
- //CMD55
- SPI.transfer(0X77); //индекс команды cmd55
- SPI.transfer(0x00); //первый байт пустого аргумента
- SPI.transfer(0x00); //второй байт пустого аргумента
- SPI.transfer(0x00); //третий байт пустого аргумента
- SPI.transfer(0x00); //четвертый байт пустого аргумента РАЗОБРАТЬСЯ ГДЕ ПЕРВЫЙ БАЙТ ГДЕ ПОСЛЕДНИЙ
- SPI.transfer(0X00); // CRC
- while (SPI.transfer(0xFF)!=0x01); //ожидание сигнала о принятия команды
-
- //CMD41
- SPI.transfer(0X69); //индекс команды cmd41
- SPI.transfer(0x40); //первый байт пустого аргумента
- SPI.transfer(0x00); //второй байт пустого аргумента
- SPI.transfer(0x00); //третий байт пустого аргумента
- SPI.transfer(0x00); //четвертый байт пустого аргумента РАЗОБРАТЬСЯ ГДЕ ПЕРВЫЙ БАЙТ ГДЕ ПОСЛЕДНИЙ
- SPI.transfer(0XFF); // CRC
-
- SPI.transfer(0xFF); //сдвигаем на один байт
- status_ = SPI.transfer(0xFF); //ответ на команду ACMD41
- }
- while (status_!= 0X00); //шлем команду ACMD41 до тех пор, пока не получим ответ 0x00
- }
- //------конец инициализации карты SD v.2
-
- Serial.println("USPEH!");
-
- digitalWrite(4, HIGH); //выставим логическую еденицу на CS
- /////////////////////////////////////КОНЕЦ ИНИЦИАЛИЗАЦИИ///////////////////////////////////////////
- //ЧИТАЕМ РЕГИСТР CID--------------------------------------------------
- digitalWrite(4, LOW); //выставим на CS логический ноль
- //команда CDM10
- SPI.transfer(0x4A); //индекс команды cmd10
- SPI.transfer(0x00); //первый байт пустого аргумента
- SPI.transfer(0x00); //второй байт пустого аргумента
- SPI.transfer(0x00); //третий байт пустого аргумента
- SPI.transfer(0x00); //четвертый байт пустого аргумента
- SPI.transfer(0x00); // CRC
- while (SPI.transfer(0xFF)!=0x00); //ожидание сигнала о принятия команды
- while (SPI.transfer(0xFF)!=0xFE); //ожидание сигнала о начале пакета данных
- for (int i=0; i<16; i++)
- block16[i]=SPI.transfer(0xFF); //считываем блок данных в массив block16 с размером 16 элементов типа byte.
- //сдвинем еще на два байта, это CRC
- SPI.transfer(0xFF);
- SPI.transfer(0xFF);
- digitalWrite(4, HIGH);
- //КОНЕЦ ЧИТАЕМ РЕГИСТР CID--------------------------------------------
- }
- void loop() {
- delay(100);
- }</textarea></div>
- <div class="crayon-main" style="">
- <table class="crayon-table">
- <tbody><tr class="crayon-row">
- <td class="crayon-nums " data-settings="hide" style="font-size: 12px !important; line-height: 15px !important;">
- <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>
- </td>
- <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 <SPI.h></span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-2"> </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"> </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"> </div><div class="crayon-line" id="crayon-55a8b9b3aa96b-9"><span class="h"> </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"> </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"> </div><div class="crayon-line" id="crayon-55a8b9b3aa96b-12"><span class="h"> </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"> </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 class="crayon-line" id="crayon-55a8b9b3aa96b-14"> </div><div class="crayon-line" id="crayon-55a8b9b3aa96b-15"><span class="h"> </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"> </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"> </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"> </div><div class="crayon-line" id="crayon-55a8b9b3aa96b-19"><span class="h"> </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"><</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"> </span><span class="c">//подадим 80 тактовых импульсов</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-20"><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"> </span><span class="c">//хотя требуется не менее 74</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-21"> </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"> </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"> </div><div class="crayon-line" id="crayon-55a8b9b3aa96b-25"><span class="h"> </span><span class="c">//-----команда CDM0 - програмный сброс</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-26"><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">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"> </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"> </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"> </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"> </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"> </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"> </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"> </span><span class="c">//-----конец команды CDM0 - програмный сброс</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-34"><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-35"><span class="h"> </span><span class="c">//-----команда CDM8 - проверяем версию SD карты</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-36"><span class="h"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-46"><span class="h"> </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"> </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"> </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"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-49"><span class="h"> </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"> </span><span class="sy">}</span><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-51"><span class="h"> </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"> </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"> </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"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-54"><span class="h"> </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"> </span><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-56"><span class="h"> </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"> </span><span class="c">//-----конец команды CDM8 - проверяем версию SD карты</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-58"><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-59"><span class="h"> </span><span class="c">//-----инициализация карты SD v.1, с помощью команды CMD1 </span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-60"><span class="h"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </span><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-69"><span class="h"> </span><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-70"><span class="h"> </span><span class="c">//-----конец инициализации карты SD v.1 </span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-71"><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-72"><span class="h"> </span><span class="c">//-----инициализация карты SD v.2, с помощью команды ACDM41 (CMD55 + CMD41) </span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-73"><span class="h"> </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"> </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"><</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"> </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"> </span><span class="c">//CMD55</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-77"><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">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"> </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"> </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"> </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"> </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"> </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"> </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"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-85"><span class="h"> </span><span class="c">//CMD41 </span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-86"><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">0X69</span><span class="sy">)</span><span class="sy">;</span><span class="h"> </span><span class="c">//индекс команды cmd41 </span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-87"><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">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"> </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"> </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"> </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"> </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"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-93"><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"> </span><span class="c">//сдвигаем на один байт</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-94"><span class="h"> </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"> </span><span class="c">//ответ на команду ACMD41</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-95"><span class="h"> </span><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-96"><span class="h"> </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"> </span><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-98"><span class="h"> </span><span class="c">//------конец инициализации карты SD v.2 </span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-99"><span class="h"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-100"><span class="h"> </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"> </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"> </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 class="crayon-line" id="crayon-55a8b9b3aa96b-103"><span class="h"> </span><span class="c">/////////////////////////////////////КОНЕЦ ИНИЦИАЛИЗАЦИИ///////////////////////////////////////////</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-104"> </div><div class="crayon-line" id="crayon-55a8b9b3aa96b-105"><span class="h"> </span><span class="c">//ЧИТАЕМ РЕГИСТР CID-------------------------------------------------- </span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-106"><span class="h"> </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"> </div><div class="crayon-line" id="crayon-55a8b9b3aa96b-108"><span class="h"> </span><span class="c">//команда CDM10</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-109"><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">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"> </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"> </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"> </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"> </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"> </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"> </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-55a8b9b3aa96b-116"> </div><div class="crayon-line" id="crayon-55a8b9b3aa96b-117"><span class="h"> </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"> </div><div class="crayon-line" id="crayon-55a8b9b3aa96b-119"><span class="h"> </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"><</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"> </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"> </div><div class="crayon-line" id="crayon-55a8b9b3aa96b-122"><span class="h"> </span><span class="c">//сдвинем еще на два байта, это CRC</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-123"><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"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-124"><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"> </span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-125"> </div><div class="crayon-line" id="crayon-55a8b9b3aa96b-126"><span class="h"> </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"> </span><span class="c">//КОНЕЦ ЧИТАЕМ РЕГИСТР CID-------------------------------------------- </span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-128"> </div><div class="crayon-line" id="crayon-55a8b9b3aa96b-129"><span class="sy">}</span></div><div class="crayon-line" id="crayon-55a8b9b3aa96b-130"> </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>
- </tr>
- </tbody></table>
- </div>
- </div>
- <!-- [Format Time: 0.0147 seconds] -->
- <p> </p>
- <p><a href="#6">Где я могу проверить данный код, если у меня нет ATmega328P?</a></p>
- <p> </p>
- <p> </p>
- <p>Структура CID регистра следующая</p>
- <p> </p>
- <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>
- <p> </p>
- <p> </p>
- <p>Расшифровать данные регистра можно на сайте <a href="http://goughlui.com/static/cidecode.htm" rel="nofollow">http://goughlui.com/static/cidecode.htm</a></p>
- <p> </p>
- <p> </p>
- <h3 id="6">У меня нет железа, на чем я могу попробовать данные исходные коды?</h3>
- <p> </p>
- <p>Проверить приведенные здесь исходные коды вы можете в программе <strong>Proteus</strong>.
- Для этого вам необходимо скомпилировать нужный вам исходный код(в среде
- разработки Arduino вам нужно нажать на кнопку “Проверить”, в результате
- компилируется исходный код и в папке “C:\Users\Admin\Local
- Settings\Temp\buildXXXXXXXX.tmp” создается бинарный файл
- “имя_скетча.cpp.elf”).</p>
- <p>Далее указать контроллеру <strong>бинарный файл прошивки</strong> (два раза кликните на контроллер <strong>ATmega328P</strong> и в «<strong>Program File</strong>» укажите бинарный файл прошивки). Для <strong>SD</strong> карты необходимо указать <strong>файл образ</strong>, вы можете использовать «<strong>sample_sd.mmc</strong>» (лежит в корне проекта). Для запуска моделирования нажмите на значок «<strong>Play</strong>» в левом нижнем углу.</p>
- <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>
- <p> </p>
- <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>. Также к этим же ножкам подключен «<strong>SPI анализатор</strong>» и <strong>осциллограф</strong> для удобной отладки приложений. В качестве вывода информации вы можете использовать последовательный порт (<strong>UART</strong>), для вывода виртуальный терминал «<strong>1</strong>».</p>
- <p> <br>
- <a href="http://s-engineer.ru/Stand_SPI_practical_SD.zip" rel="">Ссылка на проект</a><br>
- В архиве Arduino_STAND.DSN – файл проекта, sample_sd.mmc – образ SD
- карты, Write_Read_SD.elf – тестовый бинарник по исх. кодам “записи и
- чтения блока с SD карты”, папка empty_sample_sd_card с чистым
- sample_sd.mmc, ведь после первого запуска текущий образ SD карты будет
- заполнен данными “АВ”.<br>
- </p>
- <p> </p>
- <br><br><div class="yarpp-related">
- <h3>Вам будет интересно:</h3>
- <br><div class="yarpp-thumbnails-horizontal">
- <a class="yarpp-thumbnail" href="http://s-engineer.ru/mikrokontroller-rabotaem-na-sd-karte-c-fat16-na-nizkom-urovne/" title="Микроконтроллер – работаем на SD карте c FAT16 на низком уровне">
- <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>
- </div>
- </div>
-
- <br>
- <!-- google adsense -->
- <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>
- <!-- s-engineer.ru -->
- <ins class="adsbygoogle" style="display:inline-block;width:728px;height:90px" data-ad-client="ca-pub-7548259700415477" data-ad-slot="8779678947"></ins>
- <script>
- (adsbygoogle = window.adsbygoogle || []).push({});
- </script>
- <!-- end google adsense -->
- <br><br><b>Буду признателен если вы поделитесь данным постом</b>
- <br>
- <!-- Yandex buttons share -->
- <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">
- </div>
- <!-- /Yandex buttons share -->
- </div>
- <div class="longmeta">
-
- <!-- You can start editing here. -->
- <div id="comments" class="post">
- <!-- If comments are open, but there are no comments. -->
- </div>
- <!-- end comments -->
- <div id="respond">
- <br>
- <h2 class="">Ваш комментарий</h2>
- <br>
- <div>
- <form action="http://s-engineer.ru/wp-comments-post.php" method="post" id="commentform">
- <p><input name="author" id="author" size="22" tabindex="1" type="text">
- <label for="author"><small>Имя *</small></label></p>
- <p><input name="email" id="email" size="22" tabindex="2" type="text">
- <label for="email"><small>Почта (скрыта) *</small></label></p>
- <p><input name="url" id="url" size="22" tabindex="3" type="text">
- <label for="url"><small>Сайт</small></label></p>
- <!--<p><small><strong>XHTML:</strong> Вы можете использовать следующие теги: <code><a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> </code></small></p>-->
- <p><textarea name="comment" id="comment" cols="100%" rows="10" tabindex="4" style="width: 480px;"></textarea></p>
- <p><input name="submit" id="submit" tabindex="5" value="Отправить" type="submit">
- <input name="comment_post_ID" value="3845" type="hidden">
- </p>
- <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">
- <input name="cptch_time" value="1437120947" type="hidden">
- <input value="Version: 2.4" type="hidden">
- восемь × 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>
- </form>
- </div>
- </div>
- <!-- end respond -->
- </div>
- </div>
-
- </div>
- <!-- end content -->
- <div id="sidebar">
- <!--баннер vds24 -->
- <div style="margin-left: 15px;margin-top: -10px;">
- <a href="http://vds24.net/vds-hosting/" rel="nofollow" target="_blank">
- <img title="[vds24.net] VDS Хостинг для Ваших проектов" 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="VDS Хостинг для Ваших проектов" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" height="250" width="250">
- </a>
- </div>
- <br>
- <!--конец баннеру vds24 -->
- <center>Подписаться и читать нас можно в: </center>
- <ul id="buttons">
- <li><br>
- <a id="RSS" rel="nofollow" target="_blank" href="http://feeds.feedburner.com/s-engineer" title="RSS сайта s-engineer.ru"></a>
- <a id="E-mail" rel="nofollow" target="_blank" href="http://feedburner.google.com/fb/a/mailverify?uri=s-engineer&loc=ru_RU" title="Подписаться по e-mail"></a>
- <a id="vk" rel="nofollow" target="_blank" href="http://vk.com/sengineerru" title="s-engineer.ru В Контакте"></a>
- <a id="twitter" rel="nofollow" target="_blank" href="https://twitter.com/@sengineerru" title="s-engineer.ru в Twitter"></a>
- <a id="facebook" rel="nofollow" target="_blank" href="https://www.facebook.com/sengineerru" title="s-engineer.ru в Facebook"></a>
- <a id="googlep" rel="nofollow" target="_blank" href="https://plus.google.com/103670875452035719286" title="s-engineer.ru в Google+"></a>
- </li>
- </ul>
- <ul>
- <li id="search-2" class="widget widget_search"><form method="get" id="search" action="http://s-engineer.ru/">
- <div><input name="s" id="search-text" type="text">
- <input id="search-submit" value="Ок" type="submit">
- </div>
- </form>
- <div style="padding-bottom: 10px;"> </div>
- </li><!-- Wordpress Popular Posts Plugin v2.3.7 [W] [all] [views] [regular] -->
- <li id="wpp-3" class="widget popular-posts">
- <h2 class="widgettitle">Популярные посты</h2> <script type="text/javascript">
- /* <![CDATA[ */
- jQuery(document).ready(function(){
- jQuery.get('http://s-engineer.ru/wp-admin/admin-ajax.php', {action: 'wpp_ajax_get_popular', id: '3'}, function(data){
- jQuery('#wpp-3').append(data);
- });
- });
- /* ]]> */
- </script>
- </li>
- <!-- End Wordpress Popular Posts Plugin v2.3.7 -->
- </ul>
-
- <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>
- </div>
- <!-- end sidebar -->
- <div style="clear: both; height: 20px;"> </div>
- </div></div>
- <!-- end page -->
- </div>
- <div id="footer">
- <div id="footer-wrap">
- <!-- Yandex.Metrika informer -->
- <a href="http://metrika.yandex.ru/stat/?id=18982588&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("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="Яндекс.Метрика" title="[bs.yandex.ru] Яндекс.Метрика: данные за сегодня (просмотры, визиты и уникальные посетители) Яндекс.Метрика" onclick="try{Ya.Metrika.informer({i:this,id:18982588,lang:'ru'});return false}catch(e){}" height="50" width="50"></a>
- <!-- /Yandex.Metrika informer -->
- <!--LiveInternet counter--><script type="text/javascript"><!--
- document.write("<a href='http://www.liveinternet.ru/click' "+
- "target=_blank><img src='//counter.yadro.ru/hit?t38.6;r"+
- escape(document.referrer)+((typeof(screen)=="undefined")?"":
- ";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth?
- screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+
- ";"+Math.random()+
- "' alt='' title='LiveInternet' "+
- "border='0' width='31' height='31'><\/a>")
- //--></script><!--/LiveInternet-->
- <!-- begin of Top100 code -->
- <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>
- <noscript>
- <a href="http://top100.rambler.ru/navi/2961615/">
- <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">
- </a>
- </noscript>
- <!-- end of Top100 code -->
- <!-- Rating@Mail.ru logo -->
- <a href="http://top.mail.ru/jump?from=2423022">
- <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="31" width="38"></a>
- <!-- //Rating@Mail.ru logo -->
- </div>
- </div>
- © s-engineer.ru, 2012-2015 | Все права защищены
- </body></html>
|