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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-01-17T22:26:12+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=46&amp;t=5531&amp;mode</id>
<entry>
<author><name><![CDATA[Giani91]]></name></author>
<updated>2014-01-17T22:26:12+01:00</updated>
<published>2014-01-17T22:26:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5531&amp;p=65374#p65374</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5531&amp;p=65374#p65374"/>
<title type="html"><![CDATA[Re: STM32F4 + FatFs: problem z inicjalizacją]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5531&amp;p=65374#p65374"><![CDATA[
Problem rozwiązany. Błąd polegał na zbyt krótkim czasie oczekiwania po wysłaniu komendy CMD0. Zmiana z 10 na 100 długości transmisji SPI pomogła.<br /><br />Temat zamykam.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2415">Giani91</a> — 17 sty 2014, o 22:26</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SunRiver]]></name></author>
<updated>2014-01-12T21:50:08+01:00</updated>
<published>2014-01-12T21:50:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5531&amp;p=64844#p64844</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5531&amp;p=64844#p64844"/>
<title type="html"><![CDATA[Re: STM32F4 + FatFs: problem z inicjalizacją]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5531&amp;p=64844#p64844"><![CDATA[
najpierw go popraw ... kody umieszczamy w znacznikach syntax  bo tego sie nie da czytać<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=58">SunRiver</a> — 12 sty 2014, o 21:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Giani91]]></name></author>
<updated>2014-01-12T22:33:43+01:00</updated>
<published>2014-01-12T21:09:18+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5531&amp;p=64834#p64834</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5531&amp;p=64834#p64834"/>
<title type="html"><![CDATA[STM32F4 + FatFs: problem z inicjalizacją]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5531&amp;p=64834#p64834"><![CDATA[
Witam, na początku chciałbym się przywitać, ponieważ jest to mój pierwszy post na tym forum <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Niestety problem jaki mam zmusił mnie do poproszenia o pomoc bardziej doświadczonych użytkowników... próbuję dobrać się do karty pamięci jednakże nie udaje mi się utworzyć na karcie SD pliku. Może najpierw pokażę kod a potem wyjaśnię gdzie jest problem.<br /><br />Inicjalizacja SPI<br />[syntax=c]void SPI_SD_Init( void )<br />{<br /> RCC-&gt;AHB1ENR |= RCC_AHB1ENR_GPIOBEN;<br /> RCC-&gt;APB1ENR |= RCC_APB1ENR_SPI2EN;<br /> <br />GPIOB-&gt;MODER |= GPIO_MODER_MODER11_0;<br />GPIOB-&gt;OSPEEDR |= GPIO_OSPEEDER_OSPEEDR11;<br /> <br /> <br />GPIO_InitTypeDef GPIO_InitStruct;<br /> <br />GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);<br />GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;<br />GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;<br />GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;<br />GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;<br />GPIO_Init(GPIOB, &amp;GPIO_InitStruct);<br /> <br /> <br />GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);<br />GPIO_InitStruct.GPIO_Pin = GPIO_Pin_14;<br />GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;<br />GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;<br />GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;<br />GPIO_Init(GPIOB, &amp;GPIO_InitStruct);<br /> <br /> <br />GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);<br />GPIO_InitStruct.GPIO_Pin = GPIO_Pin_15;<br />GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;<br />GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;<br />GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;<br />GPIO_Init(GPIOB, &amp;GPIO_InitStruct);<br /> <br /> <br />SPI_InitTypeDef SPI_InitStruct;<br /> <br />SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;<br />SPI_InitStruct.SPI_Mode = SPI_Mode_Master;<br />SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;<br />SPI_InitStruct.SPI_CPOL = SPI_CPOL_High;<br />SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;<br />SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;<br />SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;<br />SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;<br />SPI_InitStruct.SPI_CRCPolynomial = 7;<br />SPI_Init(SPI2, &amp;SPI_InitStruct);<br /> <br />SPI_CalculateCRC(SPI2, DISABLE);<br />SPI_Cmd(SPI2, ENABLE);<br /> <br /> <br />DESELECT();<br />}[/syntax]<br />Funkcja DESELECT() powoduje ustawienie CS karty na 1.<br /><br /><br />disk_initialize()<br />[syntax=c]DSTATUS disk_initialize (<br />    BYTE drv        /* Physical drive nmuber (0) */<br />)<br />{<br />    BYTE n, ty, ocr&#91;4&#93;;<br /><br /><br />    if (drv) return STA_NOINIT;            /* Supports only single drive */<br />    if (Stat &amp; STA_NODISK) return Stat;    /* No card in the socket */<br /><br />    power_on();                            /* Force socket power on */<br />    //send_initial_clock_train();<br /><br />    SELECT();                /* CS = L */<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) {    /* SDC Ver2+ */<br />            for (n = 0; n &lt; 4; n++) ocr&#91;n&#93; = rcvr_spi();<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 />                do {<br />                    if (send_cmd(CMD55, 0) &lt;= 1 &amp;&amp; send_cmd(CMD41, 1UL &lt;&lt; 30) == 0)    break;    /* ACMD41 with HCS bit */<br />                } while (Timer1);<br />                if (Timer1 &amp;&amp; send_cmd(CMD58, 0) == 0) {    /* Check CCS bit */<br />                    for (n = 0; n &lt; 4; n++) ocr&#91;n&#93; = rcvr_spi();<br />                    ty = (ocr&#91;0&#93; &amp; 0x40) ? 6 : 2;<br />                }<br />            }<br />        } else {                            /* SDC Ver1 or MMC */<br />            ty = (send_cmd(CMD55, 0) &lt;= 1 &amp;&amp; send_cmd(CMD41, 0) &lt;= 1) ? 2 : 1;    /* SDC : MMC */<br />            do {<br />                if (ty == 2) {<br />                    if (send_cmd(CMD55, 0) &lt;= 1 &amp;&amp; send_cmd(CMD41, 0) == 0) break;    /* ACMD41 */<br />                } else {<br />                    if (send_cmd(CMD1, 0) == 0) break;                                /* CMD1 */<br />                }<br />            } while (Timer1);<br />            if (!Timer1 || send_cmd(CMD16, 512) != 0)    /* Select R/W block length */<br />                ty = 0;<br />        }<br />    }<br />    CardType = ty;<br />    DESELECT();            /* CS = H */<br />    rcvr_spi();            /* Idle (Release DO) */<br /><br />    if (ty)           /* Initialization succeded */<br />        {Stat &amp;= ~STA_NOINIT;<br />    FCLK_FAST();}/* Clear STA_NOINIT */<br />else          /* Initialization failed */<br />        power_off();<br /><br />    return Stat;<br />}[/syntax]<br /><br /><br />FCLK - oba<br />[syntax=c]static void FCLK_SLOW(void) /* Set slow clock (100k-400k) */<br />{<br />DWORD tmp;<br /><br />tmp = SPI2-&gt;CR1;<br />tmp = ( tmp | SPI_BaudRatePrescaler_256 | SPI_BaudRatePrescaler_4);<br />SPI2-&gt;CR1 = tmp;<br />}<br /><br />static void FCLK_FAST(void) /* Set fast clock (depends on the CSD) */<br />{<br />DWORD tmp;<br /><br />tmp = SPI2-&gt;CR1;<br />tmp = ( tmp &amp; ~SPI_BaudRatePrescaler_256 ) | SPI_BaudRatePrescaler_16; // 168MHz/16 here<br />SPI2-&gt;CR1 = tmp;<br />}[/syntax]<br /><br /><br />power_on()<br />[syntax=c]static<br />void power_on (void)<br />{<br />u8 i;<br /> <br />  DESELECT();      // CS = 1<br />  FCLK_SLOW();<br />  //Wyslanie 10 razy 0xFF co daje ponad 80 (&gt;74) cykle zegara <br />  //wymagane przez specyfikacje SD<br />  for (i = 0; i &lt; 10; i++)<br />    xmit_spi(0xFF);<br /><br />  PowerFlag = 1;<br />}[/syntax]<br /><br />oraz main<br />[syntax]int main ()<br />{<br /><br />system_init();<br />delay_init(168);<br />pll_start(8000000,168000000);<br />Initialize_Data_GPIO();<br />Initialize_Control_GPIO();<br />Initialize_SSD1963();<br />SPI_SD_Init();<br /><br /><br />    SysTick_Config(SysTick_Frequency / 100);<br />    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);<br /><br /><br />Write_Command(0x2C);<br />Clear_Screen(0x001F);<br />delay_ms(1000);<br />intro();<br /><br />Wynik = disk_initialize(0);<br />if(Wynik == STA_NOINIT)<br />{<br />Put_Char(50,50,'k',0xF800,0xFFFF);<br />}<br /><br />fresult = f_mount(0, &amp;g_sFatFs);<br />if(fresult == FR_OK)<br />{<br />Put_Char(100,50,'o',0xF800,0xFFFF);<br />fresult = f_open(&amp;plik, &quot;plik.txt&quot;, FA_CREATE_ALWAYS);<br />if(fresult == FR_OK)<br />{<br />Put_Char(109,50,'0',0xF800,0xFFFF);<br />}<br />else if(fresult == FR_DISK_ERR)<br />{<br />Put_Char(109,50,'1',0xF800,0xFFFF);<br />}<br />else if(fresult == FR_INT_ERR)<br />{<br />Put_Char(109,50,'2',0xF800,0xFFFF);<br />}<br />else if(fresult == FR_NOT_READY)<br />{<br />Put_Char(109,50,'3',0xF800,0xFFFF);<br />}<br />else if(fresult == FR_NO_FILE)<br />{<br />Put_Char(109,50,'4',0xF800,0xFFFF);<br />}<br />else if(fresult == FR_NO_PATH)<br />{<br />Put_Char(109,50,'5',0xF800,0xFFFF);<br />}<br />else if(fresult == FR_INVALID_NAME)<br />{<br />Put_Char(109,50,'6',0xF800,0xFFFF);<br />}<br />else if(fresult == FR_DENIED)<br />{<br />Put_Char(109,50,'7',0xF800,0xFFFF);<br />}<br />else if(fresult == FR_EXIST)<br />{<br />Put_Char(109,50,'8',0xF800,0xFFFF);<br />}<br />else if(fresult == FR_INVALID_OBJECT)<br />{<br />Put_Char(109,50,'9',0xF800,0xFFFF);<br />}<br />else if(fresult == FR_WRITE_PROTECTED)<br />{<br />Put_Char(109,50,'A',0xF800,0xFFFF);<br />}<br />else if(fresult == FR_INVALID_DRIVE)<br />{<br />Put_Char(109,50,'B',0xF800,0xFFFF);<br />}<br />else if(fresult == FR_NOT_ENABLED)<br />{<br />Put_Char(109,50,'C',0xF800,0xFFFF);<br />}<br />else if(fresult == FR_NO_FILESYSTEM)<br />{<br />Put_Char(109,50,'D',0xF800,0xFFFF);<br />}<br />else if(fresult == FR_MKFS_ABORTED)<br />{<br />Put_Char(109,50,'E',0xF800,0xFFFF);<br />}<br />else if(fresult == FR_TIMEOUT)<br />{<br />Put_Char(109,50,'F',0xF800,0xFFFF);<br />}<br />else if(fresult == FR_LOCKED)<br />{<br />Put_Char(109,50,'G',0xF800,0xFFFF);<br />}<br />else if(fresult == FR_NOT_ENOUGH_CORE)<br />{<br />Put_Char(109,50,'H',0xF800,0xFFFF);<br />}<br />else if(fresult == FR_TOO_MANY_OPEN_FILES)<br />{<br />Put_Char(109,50,'I',0xF800,0xFFFF);<br />}<br />}[/syntax]<br /><br />na wyświetlaczu pojawia mi się literka 'k' znacząca o nieudanej inicjalizacji disk_init... oraz 'o3' znaczące kolejno FR_OK z z f_mount oraz FR_NOT_READY z f_open &lt;- skutek błędnej inicjalizacji. dodatkowo ustaliłem, że karta nie wchodzi w stan natywny, ponieważ po użyciu kodu:<br />[syntax=c]DSTATUS disk_initialize (<br />    BYTE drv        /* Physical drive nmuber (0) */<br />)<br />{<br />    BYTE n, ty, ocr&#91;4&#93;;<br /> <br /> <br />    if (drv) return STA_NOINIT;            /* Supports only single drive */<br />    if (Stat &amp; STA_NODISK) return Stat;    /* No card in the socket */<br /> <br />    power_on();                            /* Force socket power on */<br />    //send_initial_clock_train();<br />Put_Char(40,50,'1',0xF800,0xFFFF);<br />    SELECT();                /* CS = L */<br />    ty = 0;<br />    if (send_cmd(CMD0, 0) == 1) {            /* Enter Idle state */<br />        Timer1 = 100;                        /* Initialization timeout of 1000 msec */<br />Put_Char(40,70,'2',0xF800,0xFFFF);<br />        if (send_cmd(CMD8, 0x1AA) == 1) {    /* SDC Ver2+ */<br />Put_Char(40,90,'3',0xF800,0xFFFF);<br />            for (n = 0; n &lt; 4; n++) ocr&#91;n&#93; = rcvr_spi();<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 />                do {<br />                    if (send_cmd(CMD55, 0) &lt;= 1 &amp;&amp; send_cmd(CMD41, 1UL &lt;&lt; 30) == 0)    break;    /* ACMD41 with HCS bit */<br />                } while (Timer1);<br />                if (Timer1 &amp;&amp; send_cmd(CMD58, 0) == 0) {    /* Check CCS bit */<br />                    for (n = 0; n &lt; 4; n++) ocr&#91;n&#93; = rcvr_spi();<br />                    ty = (ocr&#91;0&#93; &amp; 0x40) ? 6 : 2;<br />                }<br />            }<br />        } else {                            /* SDC Ver1 or MMC */<br />Put_Char(40,110,'4',0xF800,0xFFFF);<br />            ty = (send_cmd(CMD55, 0) &lt;= 1 &amp;&amp; send_cmd(CMD41, 0) &lt;= 1) ? 2 : 1;    /* SDC : MMC */<br />            do {<br />                if (ty == 2) {<br />                    if (send_cmd(CMD55, 0) &lt;= 1 &amp;&amp; send_cmd(CMD41, 0) == 0) break;    /* ACMD41 */<br />                } else {<br />                    if (send_cmd(CMD1, 0) == 0) break;                                /* CMD1 */<br />                }<br />            } while (Timer1);<br />            if (!Timer1 || send_cmd(CMD16, 512) != 0)    /* Select R/W block length */<br />                ty = 0;<br />        }<br />    }<br />Put_Char(40,130,'5',0xF800,0xFFFF);<br />    CardType = ty;<br />    DESELECT();            /* CS = H */<br />    rcvr_spi();            /* Idle (Release DO) */<br /> <br />    if (ty)           /* Initialization succeded */<br />        Stat &amp;= ~STA_NOINIT;        /* Clear STA_NOINIT */<br />else          /* Initialization failed */<br />        power_off();<br /> <br />    return Stat;<br />}[/syntax]<br />otrzymuje cyfry 1 oraz 5. Tak więc warunek dotyczący CMD0 nie jest spełniony. <br /><br />Jak widzicie funkcji jest sporo, zależności pomiędzy nimi również. Próbowałem już wielu rzeczy i nie bardzo wiem gdzie jest problem. Gdyby ktoś mógł zerknąć na kod i coś mi podpowiedzieć byłbym wielce wdzięczny<br /><br />EDIT:<br />Poprawione <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Pozdrawiam<br />Giani91<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2415">Giani91</a> — 12 sty 2014, o 21:09</p><hr />
]]></content>
</entry>
</feed>