Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 8 sty 2025, o 09:00


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 2 ] 
Autor Wiadomość
PostNapisane: 25 wrz 2016, o 21:46 
Offline
Nowy

Dołączył(a): 25 wrz 2016
Posty: 1
Pomógł: 0

Witajcie, próbóję podłączyć do stm32 kartę microsd, przez slot zamontowany na wykonanej płytce drukowanej, PIN CS mam na PE15, SCK -PB13 , MISO - PB14, MOSI - PB15

zastanawiam się czy CS nie powinien być na PB12, tak pokazuje cubeMx w podpowiedziach kiedy zaznaczam NSS. Niestety płytka jest już gotowa, czy ktoś ma pomysł jak to "przepinować", czy można zrobić zworkę z pinu PE15 na pin PB12 ?

korzystam z gotowego programu na fatfs przez spi, lecz niestety fresult ciągle ukazuje wartość "FR_NOT_READY" a na końcu FR_INVALID_OBJECT, nie wiem gdzie szukać problemu.

zmiana na inną kartę pamięci 2gb nie pomaga.

mam pytanie wszystkie linie podłączone są bezpośrednio do portów, jedynie SD CS podniesione jest przez rezystor 10kΩ do +3V.
czy linię MISO,MOSI,SCK też trzeba podnieść ? i czy można to zrobić programowo ?

konfiguracja SPI
Kod:
void SPI_SD_Init( void )
{
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); //taktowanie dla SPI2
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE); //taktowanie dla B

    // GPIOB - PE15( CS )
        GPIOE->MODER |= GPIO_MODER_MODER15_0;
        GPIOE->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR15;

    //sck
        GPIO_InitTypeDef GPIO_InitStruct;

        GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_Init(GPIOB, &GPIO_InitStruct);

    //MISO
        GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_14;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_Init(GPIOB, &GPIO_InitStruct);
    //MOSI
        GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_15;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_Init(GPIOB, &GPIO_InitStruct);

    //SPI
        SPI_InitTypeDef SPI_InitStruct;

        SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
        SPI_InitStruct.SPI_Mode = SPI_Mode_Master;
        SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;
        SPI_InitStruct.SPI_CPOL = SPI_CPOL_High;
        SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;
        SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;
        SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
        SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;
        SPI_InitStruct.SPI_CRCPolynomial = 7;
        SPI_Init(SPI2, &SPI_InitStruct);

        SPI_CalculateCRC(SPI2, DISABLE);
        SPI_Cmd(SPI2, ENABLE);

        RCC->APB1RSTR |= RCC_APB1RSTR_SPI2RST;
        delay_ms( 10 );
        RCC->APB1RSTR &= ~RCC_APB1RSTR_SPI2RST;


    DESELECT();
}

static
void xmit_spi (BYTE Data)  // Wyslanie bajtu do SD
{
    u8 D = 0;

    while( !( SPI2->SR & SPI_SR_TXE ));
    SPI2->DR = Data;
    while( !( SPI2->SR & SPI_SR_RXNE ));
    D = SPI2->DR;
}

static
BYTE rcvr_spi (void)         // Odebranie bajtu z SD
{
  u8 Data = 0;
u8 i;
    while( !( SPI2->SR & SPI_SR_TXE ));
    SPI2->DR = 0xFF;
    while( !( SPI2->SR & SPI_SR_RXNE ));
    for(i=0;i<10;i++);
    Data = SPI2->DR;

  return Data;
}


Main.

Kod:
/*
 * main.c
 *      Author: Grzegorz H.
 */
#include "stm32f4xx.h"
#include "system_stm32f4xx.h"
#include "delay.h"
#include "fpu.h"
#include "spi_sd.h"
#include "ff.h"

#define SysTick_Frequency 21000000

FATFS fatfs;
FIL plik;
FRESULT fresult;
UINT zapisanych_bajtow = 0;
UINT zapianie_bajtow = 0;
char * buffor = "123456789abcdef\r\n";
uint16_t i;

int main( void )
{
    SystemInit();



    fpu_enable();
    delay_init( 168 );
    SPI_SD_Init();

    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
     SysTick_Config(SysTick_Frequency / 100);

    fresult = f_mount( 0, &fatfs );
    fresult = f_open( &plik, "demo.wav", FA_OPEN_ALWAYS | FA_WRITE );
    if( fresult == FR_OK )
    {
        for( i = 0; i < 1000; i++ )
            fresult = f_write( &plik, ( const void * ) buffor, 17, &zapisanych_bajtow );
    }

    fresult = f_close( &plik );

    for(;;)
    {

    }

    return 0;
}

void SysTick_Handler()
{
    disk_timerproc();
}



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 wrz 2016, o 12:06 
Online
Moderator zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 18 lip 2012
Posty: 3209
Lokalizacja: Kraków - obok FAB5 ATMEL'a
Pomógł: 91

topic7402.html

_________________
http://www.jaglarz.info



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 2 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 4 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO