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();
}