реклама на сайте
подробности

 
 
> Как подключить микроSD к STM32F100
PCBExp
сообщение Jun 7 2015, 07:30
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 578
Регистрация: 23-12-06
Из: Москва
Пользователь №: 23 823



Подкиньте какой-нибудь рефдизайн как подключить микро SD карту на SPI.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
inventor
сообщение Jun 10 2015, 12:32
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



кста, может ктонить ответит!
я сделал 2 варианта чтения/записи по SPI - картой мы заменили микросхему от атмеги (spi eeprom)
первый вариант с библиотекой от STM
второй вариант с библиотекой от opencm3

вот что мне непонятно -
1) код с библиотекой STM в два раза компактнее!
2) код от STM работает всегда, а opencm3 иногда начинает глючить

вполне возможно я сделал неправилбно инициализацию SPI
помогите разобраться!

CODE
/**
* @brief Initializes the SPI and CS pins.
* @param None
* @retval None
*/
void spi_init(void)
{
SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;

/* Enable GPIO clock */
RCC_APB2PeriphClockCmd(SD_SPI_SCK_GPIO_CLK | SD_SPI_CS_GPIO_CLK | RCC_APB2Periph_AFIO, ENABLE);

/* Enable SPI clock */
RCC_APB1PeriphClockCmd(SD_SPI_CLK, ENABLE);

/* Configure SPI pins: SCK and MOSI */
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = SD_SPI_SCK_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(SD_SPI_SCK_GPIO_PORT, &GPIO_InitStructure);

// MOSI
GPIO_InitStructure.GPIO_Pin = SD_SPI_MOSI_PIN;
GPIO_Init(SD_SPI_MOSI_GPIO_PORT, &GPIO_InitStructure);

// MISO
GPIO_InitStructure.GPIO_Pin = SD_SPI_MISO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(SD_SPI_MISO_GPIO_PORT, &GPIO_InitStructure);

/* CS */
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = SD_SPI_CS_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(SD_SPI_CS_GPIO_PORT, &GPIO_InitStructure);

SD_CS_HIGH();

/* SPI Config */
SPI_StructInit(&SPI_InitStructure);
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_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;

SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SD_SPI, &SPI_InitStructure);
SPI_CalculateCRC(SD_SPI, DISABLE);
SPI_NSSInternalSoftwareConfig(SD_SPI, SPI_NSSInternalSoft_Set);

/* SPI enable */
SPI_Cmd(SD_SPI, ENABLE);
}


void spi_set_full_speed(void)
{
uint32_t tmp = SD_SPI->CR1;
tmp = (tmp & ~SPI_BaudRatePrescaler_64) | SPI_BaudRatePrescaler_2;
SD_SPI->CR1 = tmp;
}



и код opencm3

CODE
/**
* @brief Initializes the SD_SPI and CS pins.
* @param None
* @retval None
*/
void spi_init(void)
{
rcc_periph_clock_enable(RCC_GPIOB);
rcc_periph_clock_enable(RCC_GPIOA);
rcc_periph_clock_enable(RCC_AFIO);
rcc_periph_clock_enable(RCC_SPI2);

/* Configure SPI2: PB13(SCK), PB14(MISO), PB15(MOSI). */
gpio_set_mode(GPIOB, GPIO_MODE_OUTPUT_10_MHZ,
GPIO_CNF_OUTPUT_ALTFN_PUSHPULL, GPIO_SPI2_SCK | GPIO_SPI2_MOSI);

gpio_set_mode(GPIOB, GPIO_MODE_INPUT, GPIO_CNF_INPUT_FLOAT, GPIO_SPI2_MISO);

/* Enable CS pin on PA5. */
gpio_set(GPIOA, GPIO5);
gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_10_MHZ, GPIO_CNF_OUTPUT_ALTFN_PUSHPULL, GPIO5);

/* Explicitly disable I2S in favour of SPI operation */
SPI1_I2SCFGR = 0;

/* Set up SPI in Master mode with:
* Clock baud rate: 1/2 of peripheral clock frequency
* Clock polarity: Idle High
* Clock phase: Data valid on 2nd clock pulse
* Data frame format: 8-bit
* Frame format: MSB First
*/
spi_init_master(SPI2, SPI_CR1_BAUDRATE_FPCLK_DIV_64,
SPI_CR1_CPOL_CLK_TO_0_WHEN_IDLE,
SPI_CR1_CPHA_CLK_TRANSITION_1, SPI_CR1_DFF_8BIT, SPI_CR1_MSBFIRST);

/*
* Set NSS management to software.
*
* Note:
* Setting nss high is very important, even if we are controlling the GPIO
* ourselves this bit needs to be at least set to 1, otherwise the spi
* peripheral will not send any data out.
*/
spi_enable_software_slave_management(SPI2);
spi_set_nss_high(SPI2);
spi_enable(SPI2); /* Enable SPI2 periph. */
}
/* Set fast clock (depends on the CSD) */
void spi_set_full_speed(void)
{
/* spi_disable(SPI2); */
spi_set_baudrate_prescaler(SPI2, SPI_CR1_BAUDRATE_FPCLK_DIV_2);
/* spi_enable(SPI2); */
}


В чем может быть засада? проц 103 -й
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 10:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.02107 секунд с 7
ELECTRONIX ©2004-2016