Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

STM32F103 + FatFs + SPI2 - gdzie jest błąd?

ezbig 28 Jun 2017 01:14 2163 5
  • #1
    ezbig
    Level 20  
    Mam problem z najnowszą biblioteką FatFs. Wszystko działa idealnie na SPI1, a na SPI2 nie chce chodzić. Może ktoś z doświadczonych kolegów zerknie na konfigurację. Przy ustawieniu SPI_CH na 1 wszystko śmiga jak należy, przy 2 tylko rozpoznaje, że karta jest włożona lub wyjęta. Przyglądam się temu i nie widzę błędu. Co tu jest nie tak?
    Code: c
    Log in, to see the code

    Wprowadziłem tylko jedną poprawkę do oryginału. Zmieniłem port dla MMC_CD z PD8 (nie mam takowego) na PC4 (tak jak jest przy konfiguracji dla SPI1). Nie wiem dlaczego to nie chce działać dla SPI2.

    Poniżej cała oryginalna biblioteka.
    Code: c
    Log in, to see the code
  • #2
    Sparrowhawk
    Level 22  
    Tu konfigurujesz PD8:
    Code: c
    Log in, to see the code
    Po za tym nie stosuj takich zapisów: _BV(x). Za chwilę nie będziesz pamiętał, co robi bit x w rejestrze y ;-)
  • #3
    Freddie Chopin
    MCUs specialist
    Sparrowhawk wrote:
    Tu konfigurujesz PD8

    no i? Przeczytałeś dokładnie pierwszego posta?

    ezbig wrote:
    #define FCLK_SLOW() { SPIx_CR1 = (SPIx_CR1 & ~0x38) | 0x28; } /* Set SCLK = PCLK / 64 */
    #define FCLK_FAST() { SPIx_CR1 = (SPIx_CR1 & ~0x38) | 0x00; } /* Set SCLK = PCLK / 2 */

    Warto zauważyć, że SPI1 jest na szybszej magistrali niż SPI2. Zakładając "typową" konfigurację RCC, powyższe dwa makra dadzą w przypadku SPI2 2x mniejszą prędkość. Nie sądzę aby to było problemem (przy mniejszej powinno i tak działać), no ale może.

    Cały kod jest napisany "wybitnie" optymalnie - te wszystkie bloki z makrami różnią się trzema znaczkami na krzyż, ale zamiast użyć makr właśnie do tych kilku miejsc, ktoś ostro robi ctrl+c + ctrl+v dla całych bloków. Znaczenia wszystkich magicznych cyferek w _BV() nawet nie sprawdzałem.
  • #4
    BlueDraco
    MCUs specialist
    Czepiasz się, to taki skrót: 1<<12 to aż 5 znaków do napisania, a _BV(12) - tylko 7. Zysk jest oczywisty. ;)
  • #5
    grko
    Level 33  
    @BlueDraco Warto byłoby dodać, że prawie każdy coding standard nakazuje wstawianie spacji przed i po operatorze. Wiem, że nie wpisuje się to w Twój superoptymalny styl pisania programów ale tak właśnie jest.
  • #6
    BlueDraco
    MCUs specialist
    Gdybm wiedział, że będzie to czytał grko, napisałbym i o spacjach (nawet miałem zamiar, ale się powstrzymałem). Tak się składa, że akurat ja używam spacji zawsze dokoła operatorów, no ale grko wie zawsze lepiej niż ja, jak ja piszę programy...
    Policz naciśnięcia i zwolnienia Shift w obu przypadkach.