AnsweredAssumed Answered

STM32F4 Discovery FATFS SPI2 problem

Question asked by xxx.ttttt on Oct 9, 2016
Latest reply on Oct 23, 2016 by Clive One
Hi everyone, i have problem with a something project, i dont have comunication with microsd card on my board,  my debug stay on function wait ready and next rcvr_spi(), and nothing to do ;/ i dont know where is problem,
i paste my configuration. 
my connect : CS - PE15, SCK - PB13, MISO PB14, MOSI PB15, i use coocox for comiple and debug


MAIN
[code]int main( void )
{


    SystemInit();
     SPI_SD_Init();






        fresult = f_mount( 0, &fatfs);
        fresult = f_open( &plik, "demo.wav", FA_OPEN_EXISTING | FA_READ );
        if( fresult == FR_OK )
        {
                  //fresult = f_read(&plik, void * buffor, 17, &zapisanych_bajtow);
                  fresult = f_read( &plik, ( void * ) buffor2, 112940, &odczytanych_bajtow );
        }
        fresult = f_close( &plik );
}
[/code]


SPI_SD


[code]void SPI_SD_Init( void )  //inicialize spi
{
     GPIO_InitTypeDef  GPIO_InitStructure;
     SPI_InitTypeDef   SPI_InitStructure;
      volatile BYTE dummyread;


       // Konfiguracja wyprowadzen i kontrolera SPI:
config output spi
     /* Enable GPIO clock for CS */
         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
         /* Enable SPI clock, SPI2 */




       // Wlaczenie sygnalow zegarowych dla peryferiow
clock for peripherials
       RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2, ENABLE);
       RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE );




       GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2 );
        GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);
        GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2 );




       // PE15 CS
       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
       GPIO_InitStructure.GPIO_Mode =     GPIO_Mode_OUT;
       GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
       GPIO_Init(GPIOE, &GPIO_InitStructure);


       DESELECT_SD();


       //SCK, MISO and MOSI SD


       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
       GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
       GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
       GPIO_Init(GPIOB, &GPIO_InitStructure);


       // Konfiguracja SPI enable spi
       SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
       SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
       SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
       SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; // low ?
       SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
       SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
       SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
       SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
       SPI_InitStructure.SPI_CRCPolynomial = 7;
       SPI_Init(SPI2, &SPI_InitStructure);


       // Wlacz SPI
       SPI_Cmd(SPI2, ENABLE);


        while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) { ; }
         dummyread = SPI_ReceiveData(SPI2);


}[/code]


ODEBRANIE BAJTU I WYSLANIE
[code]
static
void xmit_spi (uint8_t outB)  // Wyslanie bajtu do SPI
{
     u8 Data = 0;
     while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
     SPI_I2S_SendData(SPI2, Data);
}


static
BYTE rcvr_spi (void)           // Odebranie bajtu z SPI
{
     u8 Data = 0;
     // Wysłanie 0xFF
     while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
     SPI_I2S_SendData(SPI2, 0xFF);
     // odebranie bajtu
     while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
     Data = SPI_I2S_ReceiveData(SPI2);
     return Data;
}


static
BYTE wait_ready (void)
{
    BYTE res;
    Timer2 = 50;    /* Wait for ready in timeout of 500ms */
    rcvr_spi();
    do
        res = rcvr_spi();
    while ((res != 0xFF) && Timer2);


    return res;
}[/code]


[code]
static
void power_on (void)
{
     u8 i, cmd_arg[6];
     u32 Count = 0xFFF;
 
     // Inicjalizacja karty i przelaczenie w tryb SPI:
         DESELECT_SD();        // CS = 1
          for (i = 0; i < 10; i++)
                 xmit_spi(0xFF);    // Wyslij 0xFF 10 razy = 80 cykli zegarowych
                     // (wymaganych co najmniej 74 cykli)
          SELECT_SD();        // CS = 0


           // Przygotowanie ramki inicjujacej do wyslania
           cmd_arg[0] = (CMD0 | 0x40);
           cmd_arg[1] = 0;    // Argument komendy
           cmd_arg[2] = 0;    // nawet, gdy komenda go nie ma
           cmd_arg[3] = 0;    // musi zostac wyslany w postaci zer
           cmd_arg[4] = 0;
           cmd_arg[5] = 0x95;    // CRC = 0x95


           for (i = 0; i < 6; i++)        // Wyslanie ramki
                 xmit_spi(cmd_arg[i]);


           while ((rcvr_spi() != 0x01) && Count) // Czeka na 0x01
                 Count--;
           DESELECT_SD();        // CS = 1
           xmit_spi( 0XFF );    // Wyslij 0xFF


           PowerFlag = 1;




}[/code]


[/code]

Outcomes