Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.95/19: Рейтинг темы: голосов - 19, средняя оценка - 4.95
northcitizen
13 / 12 / 1
Регистрация: 29.03.2019
Сообщений: 108
1

SPI или SDIO и microSD

10.07.2019, 18:38. Просмотров 3428. Ответов 13

Доброго времени, гуру.
Подскажите, что не так, плиз.
Купил плату для microSD, чтобы по SPI подключить к мк. Настроил spi2, подключил плату согласно spi2 (мк stm32f407vgt6)
PB15->MOSI
PB14->MISO
PB13->SCLK
PB12-> CS
Флешка SDHC 8GB(SAMSUNG)
Нашел такой код инициализции
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
uint8_t SD_init(void)
{
  uint8_t   i;
  uint8_t   response;
  uint8_t   SD_version = 2;             //по умолчанию версия SD = 2
  uint16_t  retry = 0 ;
 
  for(i=0;i<10;i++) spi_send(0xff);      //послать свыше 74 единиц
 
  //выполним программный сброс карты
  //CS_HIGH;
  while(SD_sendCommand(CMD0, 0)!=0x01)
    if(retry++>0x20)  return 1;
  //CS_LOW;
  spi_send (0xff);
  spi_send (0xff);
 
  retry = 0;
  while(SD_sendCommand(CMD8,0x000001AA)!=0x01)
  {
    if(retry++>0xfe)
    {
      SD_version = 1;
      break;
    }
  }
 
 retry = 0;
 do
 {
   response = SD_sendCommand(CMD55,0);
   response = SD_sendCommand(ACMD41,0x40000000); ///////////CMD1
   retry++;
   if(retry>0xffe) return 2;
 }while(response != 0x00);
 
 
 //читаем регистр OCR, чтобы определить тип карты
 retry = 0;
 SDHC = 1;
 if (SD_version == 2)
 {
   while(SD_sendCommand(CMD58,0)!=0x00)
    if(retry++>0xfe)  break;
 }
 
 return 0;
}
Но функция возвращает 2;
SPI настроен так
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
void spi2_init(void) {
    GPIO_InitTypeDef gpio; //переменная инициализации структуры настройки портов ввода/вывода 
    SPI_InitTypeDef spi2; //переменная инициализации структуры настройки SPI2 
    
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE); // включение тактирования порта B
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE); // включение тактирования SPI2
  
    
    GPIO_StructInit(&gpio); // инициализация структуры портов ввода/вывода
  
  gpio.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; // определение портов 13, 14, 15 для MISO, MOSI и SCLK
    gpio.GPIO_Mode = GPIO_Mode_AF; // настройка портов, как альтернативные функции
    gpio.GPIO_Speed = GPIO_Speed_50MHz; // выбор частоты тактироания портов 50 MHz
    gpio.GPIO_OType = GPIO_OType_PP; // тип выхода портов - двухтактный
    gpio.GPIO_PuPd = GPIO_PuPd_UP;// подтягивание портов к питанию 3.3V
    GPIO_Init(GPIOB,&gpio); // инициализация настройки портов ввода/вывода
     
  gpio.GPIO_Pin = GPIO_Pin_12; // определения порта 12 для CS
    gpio.GPIO_Mode = GPIO_Mode_OUT; // настройка порта на выход
    gpio.GPIO_Speed = GPIO_Speed_50MHz; // выбор частоты тактирования порта 50 MHz
    gpio.GPIO_OType = GPIO_OType_PP; // тип выхода порта - двухтактный
    gpio.GPIO_PuPd = GPIO_PuPd_UP; // подтягивание порта к питанию 3.3V
  GPIO_Init(GPIOB,&gpio); // инициализация настройки порта вывода
  
  
    GPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_SPI2); // //////////////////////////////////////////////
    GPIO_PinAFConfig(GPIOB,GPIO_PinSource14,GPIO_AF_SPI2); // Функции включения альтернативного режима работы портов
    GPIO_PinAFConfig(GPIOB,GPIO_PinSource15,GPIO_AF_SPI2); // //////////////////////////////////////////////
  
    SPI_I2S_DeInit(SPI2); // функция сбрасывает все настройки, выключает SPI и его прерывания
 
  SPI_StructInit(&spi2); // инициализация стрктуры настройки SPI2
  
      spi2.SPI_Direction = SPI_Direction_2Lines_FullDuplex; // 
    spi2.SPI_Mode = SPI_Mode_Master; // включение режима работы SPI как Master
    spi2.SPI_DataSize = SPI_DataSize_8b;  // размер данных = 8 бит
        spi2.SPI_CPOL = SPI_CPOL_Low; // определяет начальную полярность сигнала синхронизации в данном случае низкий уровень
        spi2.SPI_CPHA = SPI_CPHA_1Edge; //фаза синхронизации, определяет по какому из фронтов синхронизирующего сигнала 
                                        //производить выборку данных в данном случа по переднему фронту
    spi2.SPI_NSS = SPI_NSS_Soft; // вывод предназначен для выбора подчинённого устройства в режиме Slave, при подаче на его
                                     //вход логического ноля, также с помощью этого вывода можно переключать режимы SPI (Master/Slave), 
                                                                 //в мультимастерной шине.
        spi2.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; // предделитель скорости = 256
        spi2.SPI_FirstBit = SPI_FirstBit_MSB; //отправку начинаем со старшего бита заканчиваем младшим
        spi2.SPI_CRCPolynomial = 7; //данное число(полином) используется для вычисления контрольной суммы если используете CRC calculation,
                                //по умолчанию в нем установлено значение 7, если не используете контроль
                                                                //значение не важно, на передачу и прием данных не влияет.
        SPI_Init(SPI2,&spi2); // Инициализация настроек для SPI2
    SPI_Cmd(SPI2,ENABLE); // Включение SPI2 
}
Дефайны взял эти
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#define CMD0       (0x40+0) /* GO_IDLE_STATE */
#define CMD1      (0x40+1)  /* SEND_OP_COND (MMC) */
#define ACMD41  (0xC0+41)   /* SEND_OP_COND (SDC) */
#define CMD8      (0x40+8)  /* SEND_IF_COND */
#define CMD9      (0x40+9)  /* SEND_CSD */
#define CMD10   (0x40+10)   /* SEND_CID */
#define CMD12     (0x40+12) /* STOP_TRANSMISSION */
#define ACMD13  (0xC0+13)   /* SD_STATUS (SDC) */
#define CMD16     (0x40+16) /* SET_BLOCKLEN */
#define CMD17     (0x40+17) /* READ_SINGLE_BLOCK */
#define CMD18     (0x40+18) /* READ_MULTIPLE_BLOCK */
#define CMD23     (0x40+23) /* SET_BLOCK_COUNT (MMC) */
#define ACMD23  (0xC0+23)   /* SET_WR_BLK_ERASE_COUNT (SDC) */
#define CMD24     (0x40+24) /* WRITE_BLOCK */
#define CMD25     (0x40+25) /* WRITE_MULTIPLE_BLOCK */
#define CMD55     (0x40+55) /* APP_CMD */
#define CMD58     (0x40+58) /* READ_OCR */
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.07.2019, 18:38
Ответы с готовыми решениями:

Использование внутренних pull-up для SDIO (microSD)
Видел несколько тем на разных форумах, где советуют внешние резисторы подтяжки по всем каналам...

Sdio vs spi
Привет ребята, на данный момент нужно подключить lpc4357 микроконтроллер к wi-fi модулю gainspan...

Поиск библиотеки для работы с картами SD/MMC (SDIO, SPI)
Ребят, никто не встречал библиотеки для работы с картами SD по SDIO или по SPI с наиболее полным...

Проблема microSD spi
Здравствуйте, столкнулся с такой проблемой: имеется устройство на мк stm32f103, работающее с...

Stm32f4 + spi + microsd еще разок D:
Вежливо попросив исходные файлы связывающие уже существующий Fatfs-SPI-MSD, я запнулся и в...

13
locm
10.07.2019, 21:27
  #2

Не по теме:

Цитата Сообщение от northcitizen Посмотреть сообщение
мк stm32f407vgt6
SDIO занят?

0
northcitizen
13 / 12 / 1
Регистрация: 29.03.2019
Сообщений: 108
10.07.2019, 23:46  [ТС] 3
locm, нет. Но я боюсь его. Просто у меня данные , которые нужно на флеш память записать сделаны в spl(парсер gps), а с sdio чтобы мне просто было я только на hal нашел видеоуроки. А сам sdio никогда не подключал. На spl не справлюсь наверное. А, вот скажите, можно ли сделать так: я собираю проект для sdio на hal, если работает, то файлы для работы с sd перебрасываю в проект на spl? Или это бред? Там же ff.c fatfs.c deikoio.c и т.п. файлы не привязаны к hal..
0
Rius
Эксперт .NET
5948 / 3817 / 924
Регистрация: 25.05.2015
Сообщений: 11,601
Записей в блоге: 12
Завершенные тесты: 4
11.07.2019, 06:08 4
Проект "Говорящий будильник"

Добавлено через 1 минуту
Цитата Сообщение от northcitizen Посмотреть сообщение
Просто у меня данные , которые нужно на флеш память записать сделаны в spl(парсер gps)
Достался готовый проект, который нельзя переделать?
1
11.07.2019, 06:08
northcitizen
13 / 12 / 1
Регистрация: 29.03.2019
Сообщений: 108
11.07.2019, 10:04  [ТС] 5
Rius, у меня нет проекта. у меня есть функция gps парсера, данные от которой я хочу сохранить на SD. Уважаемые Humanoid и _SayHello мне помогли с функцией парсера и как записать данные на флеш (внешнюю по SPI). Но так как я не далекий умом, то только потом понял, что нужно утилиту, чтобы данные с флеш памяти вычитать => чтобы не писать утилиту(а я ее и не напишу) , то более приемлемо записать данные на SD карту. Так как я HAL не знаю, то все делаю в SPL. А, если вы просто хотели, сказать(обидеть), что я затупок, то я полностью с вами согласен.
0
Rius
Эксперт .NET
5948 / 3817 / 924
Регистрация: 25.05.2015
Сообщений: 11,601
Записей в блоге: 12
Завершенные тесты: 4
11.07.2019, 10:11 6
Незнание HAL - не повод, можно примеры комплектные поизучать.
Вот если бы памяти у МК было настолько мало, что HAL не влезал, тогда да.
1
northcitizen
13 / 12 / 1
Регистрация: 29.03.2019
Сообщений: 108
11.07.2019, 15:52  [ТС] 7
подружилась SDHC с FATFS через SDIO в HAL по этому видео . Теперь можно работать c SPL. Плату с разъемом SD взял для SPI.
Так как режим SDIO 1-bit, то ножек хватает. К MISO подключил DATA0(PC8), MOSI к CMD(PD2), CLK(PC12). Удобнее, конечно, сразу использовать плату флешки для SDIO(там сразу все подписано). Может пригодится кому данный пост. если видео не открывается вот ссылка https://www.youtube.com/watch?v=Y5UMTGQDmog
0
northcitizen
13 / 12 / 1
Регистрация: 29.03.2019
Сообщений: 108
12.07.2019, 12:34  [ТС] 8
Получилось все-таки завести работу FATFS с использованием библиотеки SPL. Подключение не менял, то есть режим 1-bit. Уверен, что в режиме 4-bit тоже будет работать(нет возможности проверить).
Все делал по статье http://stm32f4-discovery.net/2014/07...2f4xx-devices/
Но возникли проблемы:
1. С прикрученными библиотеками FATFS размер исходного файла равен 32808 байт. Keil(если вы им пользуетесь, конечно) без лицензии не пропустит файл больше 32000 байт. Данная проблема на ваше решение (если будете этот проект использовать, конечно)
2. при запуске программы microSD монтировался без проблем. Но программа не хотела открывать файл.
полез смотреть, что в
C
1
f_open(&fil, "FILE.TXT\0", FA_WRITE | FA_CREATE_ALWAYS);
debug'ом нашел, что не работает
C
1
INIT_BUF(dj);
в ff.c. Как я понял, проблема при работе с кучей, так как в ffconf.h у меня был устанвлен такой define
C
1
#define _USE_LFN    3
, что отвечает за работу с динамическим массивом в куче(это я так понял из описания, но скорее всего я не прав)
вот описание переменной _USE_LFN
C
1
2
3
4
5
6
/* The _USE_LFN option switches the LFN feature.
/
/   0: Disable LFN feature. _MAX_LFN has no effect.
/   1: Enable LFN with static working buffer on the BSS. Always NOT thread-safe.
/   2: Enable LFN with dynamic working buffer on the STACK.
/   3: Enable LFN with dynamic working buffer on the HEAP.
Поэтому я выбрал
C
1
#define _USE_LFN    1
.
После этого на флеш памяти создались (согласно main.c) два файла. Все заработало.
Жду ваших комментов по поводу, того к чему это может привести, кроме: Always NOT thread-safe.

Также выкладываю проекты с использованием библиотек HAL и SPL.

Версия с использованием библиотеки HAl очень удобна тем, что можно протестить свое железо, если работает на HAL, то можно заводить на SPL(ну это у меня такой подход был)
Подключение, как в посте выше.
0
Вложения
Тип файла: rar FATFS_SDIO_HAL.rar (21.22 Мб, 0 просмотров)
Тип файла: rar FATFS_SDIO_SPL.rar (11.18 Мб, 2 просмотров)
Rius
Эксперт .NET
5948 / 3817 / 924
Регистрация: 25.05.2015
Сообщений: 11,601
Записей в блоге: 12
Завершенные тесты: 4
12.07.2019, 12:56 9
LFN - long file names.
Можно вообще выключить, если хватит имён формата 8.3 .
1
locm
2208 / 969 / 121
Регистрация: 28.10.2011
Сообщений: 3,260
Записей в блоге: 6
12.07.2019, 15:52 10
Цитата Сообщение от northcitizen Посмотреть сообщение
размер исходного файла равен 32808 байт
Имели в виду размер bin файла прошивки? Оптимизация включена?

Цитата Сообщение от northcitizen Посмотреть сообщение
Keil
Используйте среду с GCC и не будете думать об ограничениях.
Для STM32 много бесплатных IDE.
1
northcitizen
13 / 12 / 1
Регистрация: 29.03.2019
Сообщений: 108
12.07.2019, 16:01  [ТС] 11
locm,
Цитата Сообщение от locm Посмотреть сообщение
Имели в виду размер bin файла прошивки? Оптимизация включена?
да, файл прошивки. Делаю без оптимизации. Не знаю, как программа может себя повести с оптимизацией.
Цитата Сообщение от locm Посмотреть сообщение
Для STM32 много бесплатных IDE.
Спасибо за совет, но я пользуюсь крякнутым Keil'ом(люблю его). Это я написал, чтобы если у новичков такая проблема появится.
0
locm
2208 / 969 / 121
Регистрация: 28.10.2011
Сообщений: 3,260
Записей в блоге: 6
12.07.2019, 16:58 12
Цитата Сообщение от northcitizen Посмотреть сообщение
Делаю без оптимизации.
Из-за этого большой размер прошивки.

Цитата Сообщение от northcitizen Посмотреть сообщение
Не знаю, как программа может себя повести с оптимизацией.
Если программа написана по всем правилам, оптимизация не должна мешать.
1
_SayHello
704 / 417 / 132
Регистрация: 30.07.2015
Сообщений: 1,411
13.07.2019, 10:43 13
northcitizen,
Цитата Сообщение от northcitizen Посмотреть сообщение
Жду ваших комментов по поводу, того к чему это может привести, кроме: Always NOT thread-safe.
Намек, что не рекомендуется использовать в многопоточных проектах с ОС.
Цитата Сообщение от northcitizen Посмотреть сообщение
вот описание переменной _USE_LFN
LFN вроде нужен если ты эмулируешь exFAT, если FAT32 то вроде как можно отключить вообще.
1
northcitizen
13 / 12 / 1
Регистрация: 29.03.2019
Сообщений: 108
13.07.2019, 16:56  [ТС] 14
Товарищи, почему после монтирования microSD не работает SysTick_Handler? Если microSD не устанавливать в разъем, то SysTick_Handler работает. Задержки ставил после инициализации карты все равно.. Вызываю SysTick_Handler каждую мс
0
13.07.2019, 16:56
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.07.2019, 16:56

Драйвер для MICROSD (SPI) + FAT32 для STM32
Собственно пишу драйвер для Micro SD карточек и файловую систему FAT32. Тестируем драйвер...

ADC->DMA->SDIO (или NAND через FSMC) без остановки в обработчике прерываний DMA на STM32F407VG, реально или нет?
Добрый день. Столкнулся с необходимостью писать большой объём данных АЦП с высокой скоростью....

SD через SPI или новые грабли STM32F415
Доброго всем времени суток! Продолжая ковырять свое устройство наткнулся на некоторую интересную...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru