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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> STM32 SDIO 4bit SD-card, Подскажите кто делал, в чем может быть проблема
zksystem
сообщение Jul 16 2010, 10:12
Сообщение #1


embedder
***

Группа: Свой
Сообщений: 264
Регистрация: 11-05-05
Из: Казань
Пользователь №: 4 911



Всем привет, подскажите пожалуйста кто реализовывал работу с SD картой через 4bit SDIO на STM32, у меня почему-то зависает напрочь при инициализации SD_EnableWideBusOperation(SDIO_BusWide_4b);


printf("Init SD card:");
Status = SD_Init();
printf("%u\n",Status);

printf("get info status:");
Status = SD_GetCardInfo(&SDCardInfo);
printf("%u\n",Status);

printf("Select card:");
Status = SD_SelectDeselect((uint32_t) (SDCardInfo.RCA << 16));
printf("%u\n",Status);

printf("Set 4bit operation:");
Status = SD_EnableWideBusOperation(SDIO_BusWide_4b); <- дальше этого не идет
printf("%u\n",Status);

printf("Set DMA mode:");
Status = SD_SetDeviceMode(SD_DMA_MODE);
printf("%u\n",Status);


--------------------
Мечты стареют куда быстрее мечтателей… Стивен Кинг. "Ловец снов"
Go to the top of the page
 
+Quote Post
zksystem
сообщение Jul 16 2010, 11:16
Сообщение #2


embedder
***

Группа: Свой
Сообщений: 264
Регистрация: 11-05-05
Из: Казань
Пользователь №: 4 911



Вопрос снят, оказывается забыл запаять подтягивающие резисторы 47К на SDIO0..3, SDIOCLK, SDIOCMD.


--------------------
Мечты стареют куда быстрее мечтателей… Стивен Кинг. "Ловец снов"
Go to the top of the page
 
+Quote Post
klen
сообщение Jul 17 2010, 05:01
Сообщение #3


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



Цитата(zksystem @ Jul 16 2010, 15:16) *
Вопрос снят, оказывается забыл запаять подтягивающие резисторы 47К на SDIO0..3, SDIOCLK, SDIOCMD.

sdio и резисторы на stm32 это уже не просто грабли - это место культового посещения граблей. я тоже бывал в этой ситуации.
Go to the top of the page
 
+Quote Post
011119xx
сообщение May 3 2011, 06:05
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



Столкнулся с проблемой чтения блока из карты. Код выглядит так:
Код
    ...То что выше опущено...

    Status = SD_Init();                                            

    if (Status == SD_OK)
      {
        /*----------------- Read CSD/CID MSD registers ------------------*/
        Status = SD_GetCardInfo(&SDCardInfo);
      }

      if (Status == SD_OK)
      {
        /*----------------- Select Card --------------------------------*/
        Status = SD_SelectDeselect((uint32_t) (SDCardInfo.RCA << 16));
      }

      if (Status == SD_OK)
      {
        Status = SD_EnableWideBusOperation(SDIO_BusWide_4b);
      }

      /* Set Device Transfer Mode */
      if (Status == SD_OK)
      {
        Status = SD_SetDeviceMode(SD_DMA_MODE);
      }

      Status = SD_ReadBlock(0, tempbuf1, 512);


Чтения блока не происходит. Происходит зацикливание в функции SD_ReadBlock на строке:
Код
    while (DMA_GetFlagStatus(DMA2_FLAG_TC4) == RESET)
    {}


Обработчик прерывания SDIO определен как:
Код
void SDIO_IRQHandler(void)
{
  /* Process All SDIO Interrupt Sources */
  SD_ProcessIRQSrc();
}


Прерывания инициализированы так:
Код
void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;

  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);  
    
  /* Configure the NVIC Preemption Priority Bits */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

  NVIC_InitStructure.NVIC_IRQChannel = SDIO_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}


Может забыл чего-то еще сделать?
Go to the top of the page
 
+Quote Post
011119xx
сообщение May 4 2011, 08:43
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



В качестве эксперимента попробовал другой режим:
Код
Status = SD_SetDeviceMode(SD_POLLING_MODE);

В результате при попытке чтения блока устанавливается флаг SDIO_FLAG_STBITERR. Такое ощущение что с шиной данных что-то не то.
Go to the top of the page
 
+Quote Post
011119xx
сообщение May 6 2011, 02:42
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



Проблема неработоспособности была в том, что вывод SDIO_D1 был закорочен на землю. После устранения коротыша сектора читаются правильно. Но работает только комбинация режимов: SD_POLLING_MODE и SDIO_BusWide_1b. Некоторые комбинации вообще приводят к HardFault exception. Возможно ли, что вывод SDIO_D1 микроконтроллера погорел от коротыша на землю?
Go to the top of the page
 
+Quote Post
zksystem
сообщение May 8 2011, 06:49
Сообщение #7


embedder
***

Группа: Свой
Сообщений: 264
Регистрация: 11-05-05
Из: Казань
Пользователь №: 4 911



Цитата(011119xx @ May 6 2011, 05:42) *
Проблема неработоспособности была в том, что вывод SDIO_D1 был закорочен на землю. После устранения коротыша сектора читаются правильно. Но работает только комбинация режимов: SD_POLLING_MODE и SDIO_BusWide_1b. Некоторые комбинации вообще приводят к HardFault exception. Возможно ли, что вывод SDIO_D1 микроконтроллера погорел от коротыша на землю?

SDIO [D0..D3] резисторами подтянуты?

P.S. Вы библиотечный пример SDIO смотрели? ИМХО там не сразу на 4bit передача включается, вначале определяется тип карты.


--------------------
Мечты стареют куда быстрее мечтателей… Стивен Кинг. "Ловец снов"
Go to the top of the page
 
+Quote Post
011119xx
сообщение May 10 2011, 02:57
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



Проблема решена полностью. Работают все режимы. Дело было в том, что в стартовом ассемблерном файле, который кейл создает при создании проекта, содержит неполную информацию о прерываниях (при этом прерывания от периферии в принципе не могут быть обработаны). Замена кейловского файл на аналогичный из библиотеки stm привела к полному порядку.
Go to the top of the page
 
+Quote Post
ALXLight
сообщение Mar 23 2012, 11:28
Сообщение #9





Группа: Новичок
Сообщений: 5
Регистрация: 23-03-12
Пользователь №: 70 962



Цитата(011119xx @ May 3 2011, 09:05) *
Чтения блока не происходит. Происходит зацикливание в функции SD_ReadBlock на строке:
Код
    while (DMA_GetFlagStatus(DMA2_FLAG_TC4) == RESET)
    {}

Аналогичная проблема на плате Open103Z (STM32F103ZE). Пытаюсь прикрутить FatFs на карточку, но, видимо, не приходит прерывание. Можно поподробнее расписать от чего может быть такое? Или, если это возможно, кинуть заработавший проект, попробую расковырять сам.
Прошу прощения, если написал фигню, просто в микроконтроллерах я не очень разбираюсь.
Go to the top of the page
 
+Quote Post
011119xx
сообщение Mar 23 2012, 11:48
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



Если использовал стартовый ассемблерный файл, созданный по умолчанию, то попробуй заменить его на стартовый файл из библиотеки периферии, в моем случае это startup_stm32f10x_xl.s
Go to the top of the page
 
+Quote Post
ALXLight
сообщение Mar 23 2012, 12:03
Сообщение #11





Группа: Новичок
Сообщений: 5
Регистрация: 23-03-12
Пользователь №: 70 962



Я брал файл с диска от платы. Насчёт startup_stm32f10x_xl.s не уверен, у меня памяти 512к, поэтому взял как в примере, hd.

Что самое странное, пример с диска по записи звука на флэшку вообще не работал, валился с ошибкой длины блока при попытке чтения. Взял отсюда часть по работе с карточкой - блоки нормально, но виснет этот while.
Если стопнуть выполнение, он показывает на эту строчку
Код
323   DMA2_Channel4_5_IRQHandler
>324                   B       .


Сообщение отредактировал ALXLight - Mar 23 2012, 12:04
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Mar 23 2012, 17:53
Сообщение #12


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(ALXLight @ Mar 23 2012, 18:03) *
Взял отсюда часть по работе с карточкой - блоки нормально, но виснет этот while.
Если стопнуть выполнение, он показывает на эту строчку
Код
323   DMA2_Channel4_5_IRQHandler
>324                   B       .

Дык, вроде правильно виснет. Потому что в примере в файле fatfs_sdcard/fatfs_stm32_sdio.c в процедуре disk_initialize () вызывается SD_SetDeviceMode(SD_DMA_MODE), а в этом случае включаются прерывания от DMA.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
ALXLight
сообщение Mar 26 2012, 05:57
Сообщение #13





Группа: Новичок
Сообщений: 5
Регистрация: 23-03-12
Пользователь №: 70 962



Цитата(AHTOXA @ Mar 23 2012, 20:53) *
Дык, вроде правильно виснет. Потому что в примере в файле fatfs_sdcard/fatfs_stm32_sdio.c в процедуре disk_initialize () вызывается SD_SetDeviceMode(SD_DMA_MODE), а в этом случае включаются прерывания от DMA.

Ну это я понял. А можно для нубов пояснить как это работает? Чего реально ждёт этот пример и зачем это сделано? И что нужно сделать, чтобы он читал/писал сразу?
Go to the top of the page
 
+Quote Post
ALXLight
сообщение Mar 26 2012, 08:38
Сообщение #14





Группа: Новичок
Сообщений: 5
Регистрация: 23-03-12
Пользователь №: 70 962



Не нашёл кнопки редактирования, поэтому прошу прощения за даблпост.
Проверил чтение/зпись напрямую, без ФС. запись - нормально, чтение всё равно виснет там же.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Mar 26 2012, 08:43
Сообщение #15


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Попробуйте вызвать SD_SetDeviceMode() с другим параметром (не SD_DMA_MODE, там ещё два варианта).


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

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

 


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


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