|
|
  |
Как подключить микроSD к STM32F100 |
|
|
|
Jun 7 2015, 09:06
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(PCBExp @ Jun 7 2015, 10:30)  ... как подключить микро SD карту на SPI. лично сам сделал тупо - закупил на ебеи демо плату с необходимым для ближайшего будущего в разработках. Там и схемные решения и софтовые. Тупо компилишь пример - работает, переносишь схемотехнику и расположение радиодеталей и узлов изучаешь. Далее софт уже под свои нужды компонуешь. И дёшево и сердито. А так - рекомендую примеры от СТМ-а глянуть. Там усё есть. Если коротко - либо SPI либо SD юзаешь, в зависимости от задачи и свободных лапок.
|
|
|
|
|
Jun 8 2015, 13:12
|
Знающий
   
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725

|
Цитата(Golikov A. @ Jun 8 2015, 12:32)  а какая разница что с клоком, если CS не выбран  ? может лучше его правильно притянуть? Для режима SPI может и все равно, но уж если делать с прицелом на SDIO, следует выработать привычку с CLK с резиком на землю. Это, вообще, не моя выдумка, я видел много схем, где именно так и сделано, а в одной схеме, с которой мне пришлось покопаться, я и вправду обнаружил, что при CLK с резистором на землю она работала лучше. Возможно, это было связано с тем, что рядом стоял SIM900 и сильно шумел. В общем, с тех пор я взял себе за правило подсаживать CLK, причем не 10К, а 2K2, что и другим советую.
|
|
|
|
|
Jun 8 2015, 20:58
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(mantech @ Jun 8 2015, 17:21)  Можно про это подробнее ? Например, тут. Цитата По поводу подтягивающих резисторов есть некоторая неоднозначность. Поскольку SD карты выпускаются несколькими производителями, на них существует несколько спецификаций. В одних документах четко указана необходимость подтягивающих резисторов (даже для неиспользуемых линий - 8, 9), в других документах этих указаний нет (или я не нашел). Я перестраховываюсь. Кста, еще ключик на питание карты посоветую. Из некоторых состояний карту только "power cycle" выводит.
|
|
|
|
|
Jun 10 2015, 12:32
|
Знающий
   
Группа: Свой
Сообщений: 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 -й
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|