Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
11 / 11 / 2
Регистрация: 15.08.2011
Сообщений: 448

STM32F4 SDIO CMSIS

18.02.2022, 15:13. Показов 947. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Может кто писал на регистрах под sd карту? Пока даже не могу пройти инициализацию, и ошибки постоянно разные.
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
void Sdio::init(void)
{
 uint32_t wait = 0x0000FFFF;
 uint32_t resp;
 initLowLevel();
 command(CMD_0, 0, RESP_NONE);
 command(CMD_8, 0x000001AA, RESP_SHORT); // CMD8: SEND_IF_COND. Send this command to verify SD card interface operating condition
 if(SDIO->STA & SDIO_STA_CMDREND)         // SD v2.0 or later
   {
      command(CMD_55, 0, RESP_SHORT); 
        if(response(RESP_R7, &resp) != SUCCESS)
          {
             uprintr("Error R7");   
            }
        if((resp & 0x01ff) != (0x000001AA & 0x01ff))
          {
             uprintr("Error ");
            }   
   }
 else if(SDIO->STA & SDIO_STA_CTIMEOUT)  // SD v1.x or MMC
   {
      command(CMD_55, 0, RESP_SHORT);                                 // CMD 55
      while(wait--)           
             {
              command(CMD_55, 0, RESP_SHORT);                           // CMD 55
                    if(response(RESP_R1, &resp) != SUCCESS) uprintr("Error R1");  // 
                    command(ACMD_41, 0x80100000 | 0x40000000, RESP_SHORT);                 // ACMD 41
                    if(SDIO->STA & SDIO_STA_CTIMEOUT) uprintr("Time out");
          if(response(RESP_R3, &resp) != SUCCESS) uprintr("Error R3");
          if (resp & (1 << 31)) 
                       {
                             break; 
                             uprintr("OK");
                         } 
                    
                 }                   
   }
}
Добавлено через 43 секунды
Кликните здесь для просмотра всего текста
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
51
52
53
54
55
56
57
58
void Sdio::command(uint32_t cmd, uint32_t arg, int32_t resp) 
{
 SDIO->ICR = SDIO_ICR_CCRCFAILC | SDIO_ICR_CTIMEOUTC | SDIO_ICR_CMDRENDC | SDIO_ICR_CMDSENTC;  // Clear the command flags
 SDIO->ARG = arg;                                                                              // Command argument value
 SDIO->CMD = SDIO_CMD_CPSMEN | (resp << SDIO_CMD_WAITRESP_Pos) | cmd;                          // Write CMD
 if(resp) 
   {
        while(!(SDIO->STA & (SDIO_STA_CTIMEOUT | SDIO_STA_CMDREND | SDIO_STA_CCRCFAIL)));          // Wait for CMDSENT or CRCFAIL   
     }
 else 
   {
      while(!(SDIO->STA & (SDIO_STA_CTIMEOUT | SDIO_STA_CMDSENT)));                              // Wait for timeout or CMD sent flag
     }
// uprintNUM(SDIO->STA);     
}
 
 
uint32_t Sdio::response(uint16_t resp_type, uint32_t *pResp) 
{
    uint32_t result = SUCCESS; 
 // Get first 32-bit value, it similar for all types of response except R2
 *pResp = SDIO->RESP1;
 uprint("SDIO->RESP1 ");
 uprintNUM(SDIO->RESP1);
 uprint("SDIO->RESPCMD ");
 uprintNUM(SDIO->RESPCMD);
 switch(resp_type) 
           {
            case RESP_R1:
            case RESP_R1b:
              // RESP1 contains card status information
              // Check for error bits in card status
              result = *pResp;
              break;
            case RESP_R2:
              *pResp++ = __builtin_bswap32(SDIO->RESP1);
              *pResp++ = __builtin_bswap32(SDIO->RESP2);
              *pResp++ = __builtin_bswap32(SDIO->RESP3);
              *pResp   = __builtin_bswap32(SDIO->RESP4);
        break;
            case RESP_R3:
              // RESP3 contains the OCR register value
              // Check for correct OCR header
              if (SDIO->RESPCMD != 0x3F)result = BAD_RESPONSE; 
              break;
            case RESP_R6:
              // RESP6 contains the RCA response value
              // Only CMD3 generates R6 response, so RESPCMD must be 0x03
              if (SDIO->RESPCMD != 0x03) result = BAD_RESPONSE;
              break;
            case RESP_R7:
              // RESP7 contains 'Voltage accepted' and echo-back of check pattern
              // Only CMD8 generates R7 response, so RESPCMD must be 0x08
              if (SDIO->RESPCMD != 0x08) result = BAD_RESPONSE;
              break;
         }
    return result;
}


Добавлено через 43 секунды
C++
1
2
3
4
5
6
7
8
9
10
11
12
---Start---
SDIO->RESP1 0
SDIO->RESPCMD 0
SDIO->RESP1 0
SDIO->RESPCMD 0
Error R3
---Start---
SDIO->RESP1 288
SDIO->RESPCMD 55
Error R1
SDIO->RESP1 288
SDIO->RESPCMD 63
Добавлено через 25 минут
инициализация
Кликните здесь для просмотра всего текста
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
void Sdio::initLowLevel(void)
{
 /* Enable clock */
 RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN;            // Port C clock
 RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN;              // Port D clock
 RCC->APB2ENR |= RCC_APB2ENR_SDIOEN;             // SDIO clock
 RCC->AHB1ENR |= RCC_AHB1ENR_DMA2EN;               // DMA2 clock
 /* Port config */
 GPIOC->MODER |= GPIO_MODER_MODE12_1             // Alternate function, MODER 10
                 | GPIO_MODER_MODE11_1
                 | GPIO_MODER_MODE10_1
                 | GPIO_MODER_MODE9_1 
                 | GPIO_MODER_MODE8_1;        
 GPIOD->MODER |= GPIO_MODER_MODE2_1;             // Alternate function, MODER 10
 GPIOC->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR12       // Set speed, OSPEED 11 - very high speed
                   | GPIO_OSPEEDER_OSPEEDR11 
                   | GPIO_OSPEEDER_OSPEEDR10 
                   | GPIO_OSPEEDER_OSPEEDR9 
                   | GPIO_OSPEEDER_OSPEEDR8;
 GPIOD->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR2;       // Set speed, OSPEED 11 - very high speed
 GPIOC->PUPDR |= GPIO_PUPDR_PUPD12_0             // Set pull up
                 | GPIO_PUPDR_PUPD11_0
                 | GPIO_PUPDR_PUPD10_0
                 | GPIO_PUPDR_PUPD9_0
                 | GPIO_PUPDR_PUPD8_0;
 GPIOD->PUPDR |= GPIO_PUPDR_PUPD2_0;             // Set pull up
 GPIOC->AFR[1] |= (12 << GPIO_AFRH_AFSEL12_Pos)  // AF12
                | (12 << GPIO_AFRH_AFSEL11_Pos)
                                |   (12 << GPIO_AFRH_AFSEL10_Pos)
                                |   (12 << GPIO_AFRH_AFSEL9_Pos)
                | (12 << GPIO_AFRH_AFSEL8_Pos);
 GPIOD->AFR[0] |= (12 << GPIO_AFRL_AFSEL2_Pos);  // AF12                            
 /* SDIO */ 
 SDIO->CLKCR = SDIO_CLKCR_CLKEN | 0x76;          // SDIO_CK is enabled, Clock = 48000 / (118+2) = 400Khz
 SDIO->POWER |= SDIO_POWER_PWRCTRL;              // Power-on: the card is clocked


Добавлено через 2 часа 22 минуты
Блин почему-то после команды CMD 0, нужно ждать 1 мс, иначе потом вываливается везде по таймаутам
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.02.2022, 15:13
Ответы с готовыми решениями:

SDIO STM32F4
Доброго времени суток, уважаемые формучане! Сразу оговорюсь, что вопрос адресован тем, кто пользуется либами и уже занимался SDIO. ...

Stm32f4 cmsis
как настроить таймер stm32f4 cmsis

CMSIS и STM32F4
Имеется Dyscovery c STM32F4 на борту. От SPL решил отказаться и использовать только CMSIS. CMSIS взял из официальной сборки SPL для своей...

1
11 / 11 / 2
Регистрация: 15.08.2011
Сообщений: 448
19.02.2022, 15:36  [ТС]
Эм тоже самое пишу в регисты что и в HAL, но после команды CMD8 Тайм-аут ответа на команду SDIO_STA_CTIMEOUT
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
---Start---HAL
CMD_0
SDIOx->ARG 0
SDIO->CMD 1024
SDIO->STA 128
CMD_8
SDIOx->ARG 426
SDIO->CMD 1096
SDIO->STA 64
 
---Start---CMSIS
CMD_0
SDIO->ARG 0
SDIO->CMD 1024
SDIO->STA 128
CMD_8
SDIO->ARG 426
SDIO->CMD 1096
SDIO->STA 132
Тоже самое в регистры пишу что не так то
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.02.2022, 15:36
Помогаю со студенческими работами здесь

SDIO на STM32F4 Discovery
Всем привет! Возник такой вопрос! Кто-нибудь пробовал запускать SDIO на STM32F4 DISCOVERY? Меня смущает один момент: когда пытаюсь...

Работа с SDIO на STM32F4
Здравствуйте. Поделитесь пожалуйста примером работы с SDIO (4bit) на функциях stm32f4xx_sdyo. Идеальный вариант под CooCox... DMA пока...

STM32F4 USB CMSIS
Я понимаю сейчас наверное скажите: &quot;Куда ты полез школьник, иди лучше уроки учи или мамке по дому помоги!&quot; Но я всё же попробую, кто...

stm32f4 cmsis шим
/* * main.c * * Created on: 10 лист. 2019 р. * Author: Ivan */ #include&quot;main.h&quot; volatile unsigned int pauza=0; ...

USB CDC + SDIO на STM32F4
Парни, приветствую. Подскажите, может кто пытался запустить Fatfs + USB CDC одновременно? У меня проблема такого характера: идет...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru