<?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=46&amp;t=23261&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2020-07-25T01:14:04+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=46&amp;t=23261&amp;mode</id>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2020-07-25T01:14:04+01:00</updated>
<published>2020-07-25T01:14:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23261&amp;p=228406#p228406</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23261&amp;p=228406#p228406"/>
<title type="html"><![CDATA[Re: STM32 + SPI + PEtitFS = problem :(]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23261&amp;p=228406#p228406"><![CDATA[
<div class="quotetitle">amilo_pa napisał(a):</div><div class="quotecontent"><br />Dzięki za korektę  Jak znalazłes ten błąd i co oznacza zapis:<br />gpio_mode_input_pull_up = 8|16<br /></div><br />Jeśli dobrze pamiętam, nie działał mi chyba PullUp dla wejścia i po przeglądnięciu RM zauważyłem braki w funkcji.<br />Sam zapis to zwykła suma bitowa, w ten sposób zapisałem sobie wzorzec, który sprawdzam w funkcji za pomocą maskowania.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 25 lip 2020, o 01:14</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[amilo_pa]]></name></author>
<updated>2020-07-24T23:28:41+01:00</updated>
<published>2020-07-24T23:28:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23261&amp;p=228405#p228405</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23261&amp;p=228405#p228405"/>
<title type="html"><![CDATA[Re: STM32 + SPI + PEtitFS = problem :(]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23261&amp;p=228405#p228405"><![CDATA[
Napisałem prosty kod i wszystko na to wygląda, że SPI działa:<br />[syntax=c]static const uint16_t data&#91;&#93; = {0xa, 0xb, 0xc, 0x34};<br />uint32_t i = 0;<br /><br />while(1)<br />{<br />slaveSelect_ctrl(select);<br />for(i = 0 ; i &lt; 4; i++) spi_rw( data&#91;i&#93; );<br />slaveSelect_ctrl(deselect);<br />delay(3);<br />}[/syntax]<br /><br /><a href="https://obrazkiforum.atnel.pl/3824/483b1515bb0587ea8dbcd9254d796c5b.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/3824/483b1515bb0587ea8dbcd9254d796c5b.png" alt="Obrazek" /></a><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 55 minutach ]</span></strong><br /><br /><div class="quotetitle">Zealota napisał(a):</div><div class="quotecontent"><br />Widzę, że kod zaczerpnięty z poradnika Szczywronka i powinien być poprawny przy wysyłaniu.<br /></div><br />Skądś trzeba czerpac wiedze <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> <br /><br /><br /><div class="quotetitle">Zealota napisał(a):</div><div class="quotecontent"><br />Przed chwilą sprawdziłem na BluePill i u mnie działa wysyłanie poprzez spi_write().<br />Z tego wynika, że musisz mieć zwarcie na linii MOSI i dlatego cały czas ten sam stan. Nie można też wykluczyć uszkodzenia pinu mikrokontrolera, ale zacząłbym od sprawdzenia połączeń oraz modułu SD, jeśli to moduł.<br /></div><br />Teraz sprawdziłęm jeszcze raz stykówkę i okazało się, że miałem odwrotnie podpięte piny MISO i MOSI w samym chińskim analizatorze &quot;saleae&quot;. Grafika z pierwszego postu powinna wyglądać następująco (A więc na MOSI pojawia się wartość 0xFF) Jutro ( a właściwie dzisiaj rano) podepnę oscyloskop to dokładniej zobacze przebiegi bo ten analizator coś oszukuje. <br /><a href="https://obrazkiforum.atnel.pl/3824/933c0c47fc7b98a10fa19b2e64a66e20.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/3824/933c0c47fc7b98a10fa19b2e64a66e20.png" alt="Obrazek" /></a><br /><br /><br /><div class="quotetitle">Zealota napisał(a):</div><div class="quotecontent"><br />Ciekawe też jak realizujesz podciąganie dla linii MISO, w module od Atnela do SD, jeśli dobrze pamiętam, były zewnętrzne rezystory.<br /></div><br />Rzuciłem teraz okiem na płytkę ATB to nie zauważyłem tam żadnego rezystora:<br /><a href="https://obrazkiforum.atnel.pl/3824/71ee7112a41d9aed68b5e62f8da096bd.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/3824/71ee7112a41d9aed68b5e62f8da096bd.png" alt="Obrazek" /></a><br />A ja korzystam z chińskiej przejściówki.<br /><a href="https://obrazkiforum.atnel.pl/3824/70579778c980781b91573b91ff78c4e0.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/3824/70579778c980781b91573b91ff78c4e0.png" alt="Obrazek" /></a><br />Aczkolwiek podłączałem czytnik z płytki ATB i był taki sam efekt - czyli karta nie przechodziła inicjalizacji.<br /><br /><br /><div class="quotetitle">Zealota napisał(a):</div><div class="quotecontent"><br />Niestety do odbierania możesz mieć kłopot, bo funkcja gpio_pin_cfg jest w poradniku niepoprawnie, źle ustawia podciąganie dla pinu jako wejścia, tak wygląda poprawna:<br />[syntax=c]typedef enum {<br />/* Push-Pull */<br />gpio_mode_output_PP_2MHz = 2,<br />gpio_mode_output_PP_10MHz = 1,<br />gpio_mode_output_PP_50MHz = 3,<br />/* Open-Drain */<br />gpio_mode_output_OD_2MHz = 6,<br />gpio_mode_output_OD_10MHz = 5,<br />gpio_mode_output_OD_50MHz = 7,<br />/* Push-Pull */<br />gpio_mode_alternate_PP_2MHz = 10,<br />gpio_mode_alternate_PP_10MHz = 9,<br />gpio_mode_alternate_PP_50MHz = 11,<br />/* Open-Drain */<br />gpio_mode_alternate_OD_2MHz = 14,<br />gpio_mode_alternate_OD_10MHz = 13,<br />gpio_mode_alternate_OD_50MHz = 15,<br />/* Analog input (ADC) */<br />gpio_mode_input_analog = 0,<br />/* Floating digital input. */<br />gpio_mode_input_floating = 4,<br /><br />// Tu zaczyna się poprawka<br />/* Digital input with pull-up/down (depending on the ODR reg.). */<br />gpio_mode_input_pull_down = 8,<br />gpio_mode_input_pull_up = 8|16<br />} T_GPIO_MODE;<br /><br />void gpio_pin_cfg( GPIO_TypeDef * const port, T_GPIO_PIN pin, T_GPIO_MODE mode ) {<br />T_GPIO_PIN pinTmp = pin;<br />pin = __builtin_ctz(pin) * 4;<br />uint32_t volatile * cr_reg;<br />uint32_t cr_val;<br />cr_reg = &amp;port-&gt;CRL;<br />if (pin &gt; 28) {<br />pin -= 32;<br />cr_reg = &amp;port-&gt;CRH;<br />}<br />cr_val = *cr_reg;<br />cr_val &amp;= ~((uint32_t) (0x0f &lt;&lt; pin));<br />cr_val |= (uint32_t) (mode &lt;&lt; pin);<br />*cr_reg = cr_val;<br /><br />// Tu zaczyna się poprawka<br />if ( (mode &amp; ((uint32_t)16|8)) == ((uint32_t)16|8) ) {<br />port-&gt;ODR |= pinTmp;<br />}<br />}[/syntax]<br /></div><br /><br />Dzięki za korektę <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />  Jak znalazłes ten błąd i co oznacza zapis: [syntax=c]gpio_mode_input_pull_up = 8|16[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3824">amilo_pa</a> — 24 lip 2020, o 23:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2020-07-24T22:49:28+01:00</updated>
<published>2020-07-24T22:49:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23261&amp;p=228404#p228404</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23261&amp;p=228404#p228404"/>
<title type="html"><![CDATA[Re: STM32 + SPI + PEtitFS = problem :(]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23261&amp;p=228404#p228404"><![CDATA[
Widzę, że kod zaczerpnięty z poradnika Szczywronka i powinien być poprawny przy wysyłaniu.<br />Przed chwilą sprawdziłem na BluePill i u mnie działa wysyłanie poprzez spi_write().<br />Z tego wynika, że musisz mieć zwarcie na linii MOSI i dlatego cały czas ten sam stan. Nie można też wykluczyć uszkodzenia pinu mikrokontrolera, ale zacząłbym od sprawdzenia połączeń oraz modułu SD, jeśli to moduł.<br />Ciekawe też jak realizujesz podciąganie dla linii MISO, w module od Atnela do SD, jeśli dobrze pamiętam, były zewnętrzne rezystory.<br /><br />Niestety do odbierania możesz mieć kłopot, bo funkcja gpio_pin_cfg jest w poradniku niepoprawnie, źle ustawia podciąganie dla pinu jako wejścia, tak wygląda poprawna:<br />[syntax=c]typedef enum {<br />/* Push-Pull */<br />gpio_mode_output_PP_2MHz = 2,<br />gpio_mode_output_PP_10MHz = 1,<br />gpio_mode_output_PP_50MHz = 3,<br />/* Open-Drain */<br />gpio_mode_output_OD_2MHz = 6,<br />gpio_mode_output_OD_10MHz = 5,<br />gpio_mode_output_OD_50MHz = 7,<br />/* Push-Pull */<br />gpio_mode_alternate_PP_2MHz = 10,<br />gpio_mode_alternate_PP_10MHz = 9,<br />gpio_mode_alternate_PP_50MHz = 11,<br />/* Open-Drain */<br />gpio_mode_alternate_OD_2MHz = 14,<br />gpio_mode_alternate_OD_10MHz = 13,<br />gpio_mode_alternate_OD_50MHz = 15,<br />/* Analog input (ADC) */<br />gpio_mode_input_analog = 0,<br />/* Floating digital input. */<br />gpio_mode_input_floating = 4,<br /><br />// Tu zaczyna się poprawka<br />/* Digital input with pull-up/down (depending on the ODR reg.). */<br />gpio_mode_input_pull_down = 8,<br />gpio_mode_input_pull_up = 8|16<br />} T_GPIO_MODE;<br /><br />void gpio_pin_cfg( GPIO_TypeDef * const port, T_GPIO_PIN pin, T_GPIO_MODE mode ) {<br />T_GPIO_PIN pinTmp = pin;<br />pin = __builtin_ctz(pin) * 4;<br />uint32_t volatile * cr_reg;<br />uint32_t cr_val;<br />cr_reg = &amp;port-&gt;CRL;<br />if (pin &gt; 28) {<br />pin -= 32;<br />cr_reg = &amp;port-&gt;CRH;<br />}<br />cr_val = *cr_reg;<br />cr_val &amp;= ~((uint32_t) (0x0f &lt;&lt; pin));<br />cr_val |= (uint32_t) (mode &lt;&lt; pin);<br />*cr_reg = cr_val;<br /><br />// Tu zaczyna się poprawka<br />if ( (mode &amp; ((uint32_t)16|8)) == ((uint32_t)16|8) ) {<br />port-&gt;ODR |= pinTmp;<br />}<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 24 lip 2020, o 22:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jez2000]]></name></author>
<updated>2020-07-24T19:24:15+01:00</updated>
<published>2020-07-24T19:24:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23261&amp;p=228399#p228399</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23261&amp;p=228399#p228399"/>
<title type="html"><![CDATA[Re: STM32 + SPI + PEtitFS = problem :(]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23261&amp;p=228399#p228399"><![CDATA[
Pierwsze co bym zrobiłem to zaczął od sprawdzenia SPI. Wyslij kilka bajtów i zobacz czy one lecą po mosi. Tym bardziej że masz analizator to problemu nie bedzie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11828">jez2000</a> — 24 lip 2020, o 19:24</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[amilo_pa]]></name></author>
<updated>2020-07-24T18:41:59+01:00</updated>
<published>2020-07-24T18:41:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23261&amp;p=228398#p228398</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23261&amp;p=228398#p228398"/>
<title type="html"><![CDATA[Re: STM32 + SPI + PEtitFS = problem :(]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23261&amp;p=228398#p228398"><![CDATA[
Generalnie chcę się nauczyć pracy na rejestrach żeby lepiej poznać architekturę procka.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3824">amilo_pa</a> — 24 lip 2020, o 18:41</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[landrynek]]></name></author>
<updated>2020-07-24T17:44:18+01:00</updated>
<published>2020-07-24T17:44:18+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23261&amp;p=228397#p228397</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23261&amp;p=228397#p228397"/>
<title type="html"><![CDATA[Re: STM32 + SPI + PEtitFS = problem :(]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23261&amp;p=228397#p228397"><![CDATA[
sam w problem nie mam czasu się wbijać - ale skoro i tak korzystasz z gotowej biblioteki (z BB) - to czemu nie skorzystać z rzeczy od ST - w CubeMx możesz sobie dodać do projektu obsługę karty pamięci i skorzystać z tego co producent przygotował.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21329">landrynek</a> — 24 lip 2020, o 17:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[amilo_pa]]></name></author>
<updated>2020-07-24T13:32:04+01:00</updated>
<published>2020-07-24T13:32:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23261&amp;p=228396#p228396</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23261&amp;p=228396#p228396"/>
<title type="html"><![CDATA[STM32 + SPI + PEtitFS = problem :(]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23261&amp;p=228396#p228396"><![CDATA[
Witam, <br />Od kilku dni walczę z obsługą karty SD za pomocą SPI w STM32103 i nie mogę sobie poradzić.<br /><br /><br />Iniscjalizacja SPI:<br />[syntax=c]extern void SPI_init()<br />{<br /><br />RCC-&gt;APB2ENR |= RCC_APB2ENR_SPI1EN;//podłaczenie zegara SPI1<br />RCC-&gt;APB2ENR |= RCC_APB2ENR_IOPAEN;//podłaczenie zegara do portu A<br /><br /><br />gpio_pin_cfg(GPIOA, PA0, gpio_mode_output_PP_2MHz);// konfiguracja pinu PA0 jako wyjścia pływającego<br />gpio_pin_cfg(GPIOA, PA5, gpio_mode_alternate_PP_10MHz);// konfiguracja pinu PA5 jako alternatywnego /* SCK */<br />gpio_pin_cfg(GPIOA, PA6, gpio_mode_input_pull);// konfiguracja pinu PA6 jako wejścia /* MISO */<br />gpio_pin_cfg(GPIOA, PA7, gpio_mode_alternate_PP_10MHz); // konfiguracja pinu PA7 jako alternatywnego/* MOSI */<br /><br /><br />SPI1-&gt;CR1 |= SPI_CR1_SSM;//Linia NSS jest sterowana programowo<br />SPI1-&gt;CR1 |= SPI_CR1_SSI;//Stan lini NSS jest wystawiany na nóżke<br />SPI1-&gt;CR1 |= SPI_CR1_MSTR;//wybranie trybu typu master<br />SPI1-&gt;CR1 |= SPI_CR1_BR_0;<br />SPI1-&gt;CR1 |= SPI_CR1_SPE;//włączenie SPI<br /><br />}[/syntax]<br /><br />Wybieranie slave'a<br />[syntax=c]void slaveSelect_ctrl (uint8_t state)<br />{<br />if (state)<br />{<br />BB(GPIOA-&gt;ODR, PA0) = 0;// activate slave<br />}<br />else<br />{<br />while(SPI1-&gt;SR &amp; SPI_SR_BSY);<br />BB(GPIOA-&gt;ODR, PA0) = 1;// deactivate slave<br />}<br />}[/syntax]<br /><br />Funkcie do wysyałania i odbierania danych po SPI<br />[syntax=c]void spi_write (uint8_t data)<br />{<br />while(!(SPI1-&gt;SR &amp; SPI_SR_TXE));// sprawdzenie czy rejestr DR jest pusty<br />SPI1-&gt;DR = data;// wysłanie danych<br /><br />}<br />uint8_t spi_read (void)<br />{<br />uint8_t data;<br /><br />while(!(SPI1-&gt;SR &amp; SPI_SR_TXE));// sprawdzenie czy rejestr DR jest pusty<br />SPI1-&gt;DR = 0xFF;// wysłanie danych<br />while(!(SPI1-&gt;SR &amp; SPI_SR_RXNE));// oczekiwanie na flagę inforującą, że odebraliśmy dane<br />data = SPI1-&gt;DR;// przepisanie odebranych danych<br />return data;<br />}[/syntax]<br /><br />Do obsługi karty kozystam z biblioteki PetitFS z BB.<br />Jedyne zmiany jakie poczyniłem w tej biblitece to: zmiana wfunkcjach <em>xmit_spi</em>, <em>rcv_spi </em> (włożyłem tam moje funkcje do wysyłania i odbierania danych po SPI) oraz pozmieniałem definicje makr: <em>SELECT()</em>, <em>DESELECT()</em> oraz <em>MMC_SEL</em><br />[syntax=c]/* USI control functions (Defined in usi.S, Platform dependent) */<br />void xmit_spi (BYTE data)/* Send a byte */<br />{<br />spi_write(data);<br />}<br />BYTE rcv_spi (void)/* Send 0xFF and receive a byte */<br />{<br />return spi_read();<br />}<br /><br /><br />/* Port Controls (Platform dependent) */<br />#define SELECT()slaveSelect_ctrl(0);/* MMC CS = L */<br />#defineDESELECT()slaveSelect_ctrl(1);/* MMC CS = H */<br />#defineMMC_SEL!(GPIOA-&gt;IDR &amp; GPIO_IDR_IDR0)/* MMC CS status (true:selected) */<br />//#defineINIT_SPI(){ USICR = 0b00011000; }/* Initialize SPI port */[/syntax]<br /><br />Dla czytelności wklejam cały plik mmc.c<br />[syntax=c]/*-----------------------------------------------------------------------*/<br />/* PFF - Low level disk control module for ATtiny85     (C)ChaN, 2009    */<br />/*-----------------------------------------------------------------------*/<br /><br />#define _WRITE_FUNC1<br /><br />//#include &lt;avr/io.h&gt;<br />#include &quot;diskio.h&quot;<br />#include &quot;../UART/UART.h&quot;<br />#include &quot;../SPI/spi.h&quot;<br />//#include &quot;suart.h&quot;<br /><br /><br />/* Definitions for MMC/SDC command */<br />#define CMD0(0x40+0)/* GO_IDLE_STATE */<br />#define CMD1(0x40+1)/* SEND_OP_COND (MMC) */<br />#defineACMD41(0xC0+41)/* SEND_OP_COND (SDC) */<br />#define CMD8(0x40+8)/* SEND_IF_COND */<br />#define CMD16(0x40+16)/* SET_BLOCKLEN */<br />#define CMD17(0x40+17)/* READ_SINGLE_BLOCK */<br />#define CMD24(0x40+24)/* WRITE_BLOCK */<br />#define CMD55(0x40+55)/* APP_CMD */<br />#define CMD58(0x40+58)/* READ_OCR */<br /><br /><br />/* USI control functions (Defined in usi.S, Platform dependent) */<br />void xmit_spi (BYTE data)/* Send a byte */<br />{<br />spi_write(data);<br />}<br />BYTE rcv_spi (void)/* Send 0xFF and receive a byte */<br />{<br />return spi_read();<br />}<br /><br /><br />/* Port Controls (Platform dependent) */<br />#define SELECT()slaveSelect_ctrl(0);/* MMC CS = L */<br />#defineDESELECT()slaveSelect_ctrl(1);/* MMC CS = H */<br />#defineMMC_SEL!(GPIOA-&gt;IDR &amp; GPIO_IDR_IDR0)/* MMC CS status (true:selected) */<br />//#defineINIT_SPI(){ USICR = 0b00011000; }/* Initialize SPI port */<br /><br />/*--------------------------------------------------------------------------<br /><br />   Module Private Functions<br /><br />---------------------------------------------------------------------------*/<br /><br />static<br />BYTE CardType;<br /><br /><br />/*-----------------------------------------------------------------------*/<br />/* Deselect the card and release SPI bus                                 */<br />/*-----------------------------------------------------------------------*/<br /><br />static<br />void release_spi (void)<br />{<br />DESELECT();<br />rcv_spi();<br />}<br /><br /><br />/*-----------------------------------------------------------------------*/<br />/* Send a command packet to MMC                                          */<br />/*-----------------------------------------------------------------------*/<br /><br />static<br />BYTE send_cmd (<br />BYTE cmd,/* Command byte */<br />DWORD arg/* Argument */<br />)<br />{<br />BYTE n, res;<br /><br /><br />if (cmd &amp; 0x80) {/* ACMD&lt;n&gt; is the command sequense of CMD55-CMD&lt;n&gt; */<br />cmd &amp;= 0x7F;<br />res = send_cmd(CMD55, 0);<br />if (res &gt; 1) return res;<br />}<br /><br />/* Select the card */<br />DESELECT();<br />rcv_spi();<br />SELECT();<br />rcv_spi();<br /><br />/* Send a command packet */<br />xmit_spi(cmd);/* Start + Command index */<br />xmit_spi((BYTE)(arg &gt;&gt; 24));/* Argument&#91;31..24&#93; */<br />xmit_spi((BYTE)(arg &gt;&gt; 16));/* Argument&#91;23..16&#93; */<br />xmit_spi((BYTE)(arg &gt;&gt; 8));/* Argument&#91;15..8&#93; */<br />xmit_spi((BYTE)arg);/* Argument&#91;7..0&#93; */<br />n = 0x01;/* Dummy CRC + Stop */<br />if (cmd == CMD0) n = 0x95;/* Valid CRC for CMD0(0) */<br />if (cmd == CMD8) n = 0x87;/* Valid CRC for CMD8(0x1AA) */<br />xmit_spi(n);<br /><br />/* Receive a command response */<br />n = 10;/* Wait for a valid response in timeout of 10 attempts */<br />do {<br />res = rcv_spi();<br />} while ((res &amp; 0x80) &amp;&amp; --n);<br /><br />return res;/* Return with the response value */<br />}<br /><br /><br /><br />/*--------------------------------------------------------------------------<br /><br />   Public Functions<br /><br />---------------------------------------------------------------------------*/<br />#if _WRITE_FUNC<br /><br />void write_close(void)<br />{<br />BYTE res = disk_writep(0,0);<br />uint8_t i;<br />for (i=0; i&lt;100 &amp;&amp; res; i++) res = disk_writep(0,0);<br />}<br />#endif<br /><br />/*-----------------------------------------------------------------------*/<br />/* Initialize Disk Drive                                                 */<br />/*-----------------------------------------------------------------------*/<br /><br />DSTATUS disk_initialize (void)<br />{<br />BYTE n, cmd, ty, ocr&#91;4&#93;;<br />WORD tmr;<br /><br /><br />//INIT_SPI();<br /><br /><br />#if _WRITE_FUNC<br />if (MMC_SEL) disk_writep(0, 0);/* Finalize write process if it is in progress */<br /><br /><br />#endif<br />for (n = 100; n; n--) rcv_spi();/* Dummy clocks */<br /><br />ty = 0;<br />if (send_cmd(CMD0, 0) == 1) {/* Enter Idle state */<br />if (send_cmd(CMD8, 0x1AA) == 1) {/* SDv2 */<br />for (n = 0; n &lt; 4; n++) ocr&#91;n&#93; = rcv_spi();/* 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 />for (tmr = 12000; tmr &amp;&amp; send_cmd(ACMD41, 1UL &lt;&lt; 30); tmr--) ;/* Wait for leaving idle state (ACMD41 with HCS bit) */<br />if (tmr &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; = rcv_spi();<br />ty = (ocr&#91;0&#93; &amp; 0x40) ? CT_SD2 | CT_BLOCK : CT_SD2;/* SDv2 (HC or SC) */<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 />for (tmr = 25000; tmr &amp;&amp; send_cmd(cmd, 0); tmr--) ;/* Wait for leaving idle state */<br />if (!tmr || send_cmd(CMD16, 512) != 0)/* Set R/W block length to 512 */<br />ty = 0;<br />}<br />}<br />CardType = ty;<br />release_spi();<br /><br />return ty ? 0 : STA_NOINIT;<br />}<br /><br /><br /><br />/*-----------------------------------------------------------------------*/<br />/* Read partial sector                                                   */<br />/*-----------------------------------------------------------------------*/<br /><br />DRESULT disk_readp (<br />BYTE *buff,/* Pointer to the read buffer (NULL:Read bytes are forwarded to the stream) */<br />DWORD lba,/* Sector number (LBA) */<br />WORD ofs,/* Byte offset to read from (0..511) */<br />WORD cnt/* Number of bytes to read (ofs + cnt mus be &lt;= 512) */<br />)<br />{<br />DRESULT res;<br />BYTE rc;<br />WORD bc;<br /><br /><br />if (!(CardType &amp; CT_BLOCK)) lba *= 512;/* Convert to byte address if needed */<br /><br />res = RES_ERROR;<br />if (send_cmd(CMD17, lba) == 0) {/* READ_SINGLE_BLOCK */<br /><br />bc = 30000;<br />do {/* Wait for data packet in timeout of 100ms */<br />rc = rcv_spi();<br />} while (rc == 0xFF &amp;&amp; --bc);<br /><br />if (rc == 0xFE) {/* A data packet arrived */<br />bc = 514 - ofs - cnt;<br /><br />/* Skip leading bytes */<br />if (ofs) {<br />do rcv_spi(); while (--ofs);<br />}<br /><br />/* Receive a part of the sector */<br />if (buff) {/* Store data to the memory */<br />do<br />*buff++ = rcv_spi();<br />while (--cnt);<br />} else {/* Forward data to the outgoing stream (depends on the project) */<br />do<br />uart_putc(rcv_spi());/* (Console output) */<br />//xmit(rcv_spi());/* (Console output) */<br />while (--cnt);<br />}<br /><br />/* Skip trailing bytes and CRC */<br />do rcv_spi(); while (--bc);<br /><br />res = RES_OK;<br />}<br />}<br /><br />release_spi();<br /><br />return res;<br />}<br /><br /><br /><br />/*-----------------------------------------------------------------------*/<br />/* Write partial sector                                                  */<br />/*-----------------------------------------------------------------------*/<br />#if _WRITE_FUNC<br /><br />DRESULT disk_writep (<br />const BYTE *buff,/* Pointer to the bytes to be written (NULL:Initiate/Finalize sector write) */<br />DWORD sa/* Number of bytes to send, Sector number (LBA) or zero */<br />)<br />{<br />DRESULT res;<br />WORD bc;<br />static WORD wc;<br /><br /><br />res = RES_ERROR;<br /><br />if (buff) {/* Send data bytes */<br />bc = (WORD)sa;<br />while (bc &amp;&amp; wc) {/* Send data bytes to the card */<br />xmit_spi(*buff++);<br />wc--; bc--;<br />}<br />res = RES_OK;<br />} else {<br />if (sa) {/* Initiate sector write process */<br />if (!(CardType &amp; CT_BLOCK)) sa *= 512;/* Convert to byte address if needed */<br />if (send_cmd(CMD24, sa) == 0) {/* WRITE_SINGLE_BLOCK */<br />xmit_spi(0xFF); xmit_spi(0xFE);/* Data block header */<br />wc = 512;/* Set byte counter */<br />res = RES_OK;<br />}<br />} else {/* Finalize sector write process */<br />bc = wc + 2;<br />while (bc--) xmit_spi(0);/* Fill left bytes and CRC with zeros */<br />if ((rcv_spi() &amp; 0x1F) == 0x05) {/* Receive data resp and wait for end of write process in timeout of 300ms */<br />for (bc = 65000; rcv_spi() != 0xFF &amp;&amp; bc; bc--) ;/* Wait ready */<br />if (bc) res = RES_OK;<br />}<br />release_spi();<br />}<br />}<br /><br />return res;<br />}<br />#endif[/syntax]<br /><br />I teraz w pętli głównej chcę zrobić inicjalizację karty, odczyt zawartości, modyfikacja i zapis zmienionych danych:<br />[syntax=c]while ( i-- &amp;&amp; (res = disk_initialize()));/*inicjalizacja karty SD*/<br />if(res == FR_OK)/*sprawdzenie czy powiodła się inicjalizacja*/<br />{<br />res = pf_mount(&amp;fs);/*inicjalizacja napędu logicznego w strukturze fs*/<br />if (res == FR_OK)<br />{<br />res =  pf_open(file_name);/*otwarcie naszego pliku*/<br />if (res ==  FR_OK)<br />{<br />res = pf_read(bufor, sizeof(bufor), &amp;s1);/*odczyt danych z pliku do bufora*/<br />if(res == FR_OK)<br />{<br />bufor&#91;s1 + 1&#93; = 0;<br />uart_puts(bufor);/*wyświetlenie zawartosci bufora*/<br />//_delay_ms(3000);<br />uart_puts(&quot;\n\r&quot;);<br />uart_puts(&quot;zapis -&gt; test.txt&quot;);<br />uart_puts(&quot;\n\r&quot;);<br />if(bufor&#91;0&#93; == 't') sprintf(bufor, &quot;TEST ****&quot;);<br />elsesprintf(bufor, &quot;test ----&quot;);<br /><br />s1=4;<br />res = pf_write(bufor, sizeof(bufor), &amp;s1);<br />//pf_write(0, 0, &amp;w);<br /><br />if(res != FR_OK)uart_puts(&quot;write file error&quot;);<br />elseuart_puts(&quot;OK, zresetuj&quot;);<br />uart_puts(&quot;\n\r&quot;);<br /><br />pf_mount(NULL);<br />write_close();<br />}<br />else<br />{<br />uart_puts(&quot;read error&quot;);<br />uart_puts(&quot;\n\r&quot;);<br />}<br /><br />}<br />else<br />{<br />uart_puts(&quot;open file error&quot;);<br />uart_puts(&quot;\n\r&quot;);<br />}<br />}<br />else<br />{<br />uart_puts(&quot;mount error&quot;);<br />uart_puts(&quot;\n\r&quot;);<br />}<br />}<br />else<br />{<br />uart_puts(&quot;disk init error&quot;);<br />uart_puts(&quot;\n\r&quot;);<br />}[/syntax]<br /><br />Po tych operacjach otrzymuję informacje &quot;<em>disk init error</em>&quot;<br /><br />Na podglądzie magistrali, na linii MOSI procek cały czas wysyła 0x00 <br /><a href="https://obrazkiforum.atnel.pl/3824/e8494dee332d6722ac66416505fcbff0.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/3824/e8494dee332d6722ac66416505fcbff0.png" alt="Obrazek" /></a><br />A tak wygląda cały przebieg:<br /><a href="https://obrazkiforum.atnel.pl/3824/1d9bb8bb800ec3f9f90c68a651dc4fa0.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/3824/1d9bb8bb800ec3f9f90c68a651dc4fa0.png" alt="Obrazek" /></a><br /><br />Wnioskuję, że mam źle napisane funkcje do wysyłania i odbierania danych po SPI i/lub źle skonfugurowany port SPI.<br />Proszę o pomoc i o sprawdzenie moich wypocin <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3824">amilo_pa</a> — 24 lip 2020, o 13:32</p><hr />
]]></content>
</entry>
</feed>