<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=4&amp;t=12190&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-07-03T20:25:38+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=12190&amp;mode</id>
<entry>
<author><name><![CDATA[Atlantis]]></name></author>
<updated>2015-07-03T20:25:38+01:00</updated>
<published>2015-07-03T20:25:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12190&amp;p=133564#p133564</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12190&amp;p=133564#p133564"/>
<title type="html"><![CDATA[Re: FatFS dla AVR - jak tego używać?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12190&amp;p=133564#p133564"><![CDATA[
Hmm... Użyłem starszej wersji, już przerobionej, z Blue Booka.<br />Dodałem niewielkie modyfikacje, np. funkcję ustawiającą początkowe stany i kierunki pinów SD_CS i SD_PWR.<br />Magistrala SPI jest już wcześniej inicjowana przez ENC28J60 i działa, bo mam komunikację z tym układem.<br />Jednak nie mogę uruchomić karty SD... funkcje disk_initialize oraz f_open zwracają wartość 3, co oznacza:<br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />FR_NOT_READY,/* (3) The physical drive cannot work */<br /></div><br /><br />Ktoś wie co może być nie tak? Jak mogę zdebugować ten problem?<br /><br />Winy za taki stan rzeczy z całą pewnością nie ponosi sprzęt, bo PetitFS zastosowany w tym samym układzie bezproblemowo komunikuje się z kartą i czyta pliki. Ne chcę go jednak stosować z uwagi na to, że chciałbym mieć funkcję tworzenia pliku z logami w przypadku jego braku. Chciałbym też, żeby układ sprawnie radził sobie z dopisywaniem wartości do końca pliku, a jego rozmiar narastał sukcesywnie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2174">Atlantis</a> — 3 lip 2015, o 20:25</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[programek]]></name></author>
<updated>2015-07-03T18:31:34+01:00</updated>
<published>2015-07-03T18:31:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12190&amp;p=133551#p133551</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12190&amp;p=133551#p133551"/>
<title type="html"><![CDATA[Re: FatFS dla AVR - jak tego używać?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12190&amp;p=133551#p133551"><![CDATA[
Może wystarczy tylko chwilę poszukać na forum? <br /><a href="http://forum.atnel.pl/topic2972.html?hilit=%20data"  class="postlink">http://forum.atnel.pl/topic2972.html?hilit=%20data</a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1526">programek</a> — 3 lip 2015, o 18:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Atlantis]]></name></author>
<updated>2015-07-03T08:20:00+01:00</updated>
<published>2015-07-03T08:20:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12190&amp;p=133510#p133510</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12190&amp;p=133510#p133510"/>
<title type="html"><![CDATA[FatFS dla AVR - jak tego używać?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12190&amp;p=133510#p133510"><![CDATA[
Chciałbym dodać do jednego ze swoich urządzeń funkcję zapisu danych na karcie microSD.<br />Zależy mi na tym, żeby system sam sobie radził w przypadku włożenia pustej karty, tworzył plik, a potem sukcesywnie zwiększał jego rozmiar. Dlatego też preferuję jednak FatFS, a nie PetitFS (którego zastosowania nie wykluczam, ale jak na razie trzymam go w &quot;rezerwie&quot;). Posiadany hardware to Atmega644. Karta będzie musiała pracować na jednej magistrali z układem ENC28J60.<br /><br />Wprowadziłem już pewne poprawki do oryginalnych procedur.<br /><br />Plik mmc_arv.c:<br />[syntax=c]/* Port controls  (Platform dependent) */<br />#define CS_LOW()PORTB &amp;= ~(1 &lt;&lt; PORTB2)/* CS=low */<br />#defineCS_HIGH()PORTB |= (1&lt;&lt; PORTB2)/* CS=high */<br />#define MMC_CD(!(PINB &amp; PORTB0))/* Card detected.   yes:true, no:false, default:true */<br /><br />static<br />void power_on (void) {<br /><br />DDRB |= (1 &lt;&lt; PORTB1);<br />PORTB &amp;= ~(1 &lt;&lt; PORTB1);/* Socket power on (PB1=low) */<br />for (Timer1 = 2; Timer1; );/* Wait for 20ms */<br /><br />//SPI configuration already done by ENC driver<br />}<br /><br />static<br />void power_off (void) {<br /><br />// Do not disable SPI! ENC still need it!<br /><br />PORTB |= (1 &lt;&lt; PORTB1);<br />for (Timer1 = 20; Timer1; );/* Wait for 20ms */<br /><br />}<br /><br />DSTATUS disk_initialize (<br />BYTE pdrv/* Physical drive nmuber (0) */<br />)<br />{<br />BYTE n, cmd, ty, ocr&#91;4&#93;;<br /><br /><br />if (pdrv) return STA_NOINIT;/* Supports only single drive */<br />power_off();/* Turn off the socket power to reset the card */<br />if (Stat &amp; STA_NODISK) return Stat;/* No card in the socket */<br />power_on();/* Turn on the socket power */<br />FCLK_SLOW();<br />for (n = 10; n; n--) xchg_spi(0xFF);/* 80 dummy clocks */<br /><br />ty = 0;<br />if (send_cmd(CMD0, 0) == 1) {/* Enter Idle state */<br />Timer1 = 100;/* Initialization timeout of 1000 msec */<br />if (send_cmd(CMD8, 0x1AA) == 1) {/* SDv2? */<br />for (n = 0; n &lt; 4; n++) ocr&#91;n&#93; = xchg_spi(0xFF);/* Get trailing return value of R7 resp */<br />if (ocr&#91;2&#93; == 0x01 &amp;&amp; ocr&#91;3&#93; == 0xAA) {/* The card can work at vdd range of 2.7-3.6V */<br />while (Timer1 &amp;&amp; send_cmd(ACMD41, 1UL &lt;&lt; 30));/* Wait for leaving idle state (ACMD41 with HCS bit) */<br />if (Timer1 &amp;&amp; send_cmd(CMD58, 0) == 0) {/* Check CCS bit in the OCR */<br />for (n = 0; n &lt; 4; n++) ocr&#91;n&#93; = xchg_spi(0xFF);<br />ty = (ocr&#91;0&#93; &amp; 0x40) ? CT_SD2 | CT_BLOCK : CT_SD2;/* SDv2 */<br />}<br />}<br />} else {/* SDv1 or MMCv3 */<br />if (send_cmd(ACMD41, 0) &lt;= 1) {<br />ty = CT_SD1; cmd = ACMD41;/* SDv1 */<br />} else {<br />ty = CT_MMC; cmd = CMD1;/* MMCv3 */<br />}<br />while (Timer1 &amp;&amp; send_cmd(cmd, 0));/* Wait for leaving idle state */<br />if (!Timer1 || send_cmd(CMD16, 512) != 0)/* Set R/W block length to 512 */<br />ty = 0;<br />}<br />}<br />CardType = ty;<br />deselect();<br /><br />if (ty) {/* Initialization succeded */<br />Stat &amp;= ~STA_NOINIT;/* Clear STA_NOINIT */<br />} else {/* Initialization failed */<br />power_off();<br />}<br /><br />FCLK_FAST();//However it would end, we need fast bus for ENC<br />return Stat;<br />}<br /><br />void disk_timerproc (void)<br />{<br />BYTE n, s;<br /><br /><br />n = Timer1;/* 100Hz decrement timer */<br />if (n) Timer1 = --n;<br />n = Timer2;<br />if (n) Timer2 = --n;<br /><br />s = Stat;<br /><br />if (MMC_CD)/* Card inserted */<br />s &amp;= ~STA_NODISK;<br />else/* Socket empty */<br />s |= (STA_NODISK | STA_NOINIT);<br /><br />Stat = s;/* Update MMC status */<br />}[/syntax]<br /><br />Jak widać zmiany są stosunkowo niewielkie. W funkcjach power_on() i power_off() powyrzucałem fragmenty kodu odpowiedzialne za włączanie/wyłaczanie i konfigurację magistrali SPI. Ponieważ karta działa na jednej magistrali z ENC28J60, ta część będzie realizowana w innej części programu.<br />W disk_initialize() zmieniłem jedynie miejsce wywołania makra FCLK_FAST(), aby bez względu na wynik operacji przywracana była szybkość FCPU/2, z którą ma pracować ENC.<br />W disk_timerproc() usunąłem instrukcję sprawdzającą ustawienie blokady przed zapisem, ponieważ microSD i tak takowej nie posiada.<br /><br />Program się kompiluje, ale jeszcze nie udało mi się go jeszcze przetestować. Chciałbym tutaj prosić o pomoc, bo z tego co widzę, to:<br />1) Testowy kod z przykładu jest po prostu koszmarny. Służy on do testowania jakichś niskopoziomowych procedur przez UART, ale nie pokazuje jak to powinno wyglądać w TYPOWEJ aplikacji...<br />2) W Internecie jest sporo przykładów opartych na starszej wersji biblioteki, ale najwyraźniej od tamtego czasu sporo się zmieniło. Na przykład w chwili obecnej funkcja f_mount() przyjmuje trzy parametry, a nie dwa, tak jak kiedyś...<br />3) Widzę sporo sprzeczności. Na przykład w niektórych przykładach z sieci na początku funkcji main wywoływana jest funkcja disk_initialize(0). Tymczasem dokumentacja na stronie dość jasno podaje, że: &quot;Application program MUST NOT call this function, or FAT structure on the volume can be broken. To re-initialize the file system, use f_mount function instead.&quot;<br />4) Niestety nie jestem w stanie samemu rozgryźć do końca całego kodu tej biblioteki, śledząc do linijka po linijce...<br /><br />Czy ktoś może dysponuje już rozpracowaną wersją tej biblioteki, z jakimś dobrym przykładem aplikacji datalogera?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2174">Atlantis</a> — 3 lip 2015, o 08:20</p><hr />
]]></content>
</entry>
</feed>