Easyelectronics.ru

Электроника для всех
Текущее время: 23 сен 2019, 20:48

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 224 ]  На страницу Пред.  1, 2, 3, 4, 5, 6 ... 9  След.
Автор Сообщение
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 03 янв 2013, 11:51 
Только пришел

Зарегистрирован: 03 янв 2013, 11:37
Сообщения: 10
Вполне себе совпадает с теоретической. Может быть и выше. Под FreeRTOS на карте SDHC 8 Гб класса 2 на чтение наблюдал цифры 2-6 МБайт/сек, на запись 0,5-2 МБайт/сек. Контроллер STM32F207VC на 120 МГц.
Есть несколько багов, которые долго пришлось вылавливать: размер сектора всегда только 512 байт, несмотря на то, что карта может возвращать больший; скорость сильно зависит от размера блока, который DMA проталкивает за раз. Чем больше - тем лучше, начиная с 4 кБ рост незаметен; аппаратный контроль потока включать нужно - иначе DMA может "зависать". несмотря на то что в errata пишут, что он нерабочий в этом камне (ЧЯДНТ?); правильно расставляйте приоритеты прерываний при работе с ОС


Вложения:
Комментарий к файлу: Части проекта, отвечающие за работу с файловой системой и картой
sdcard.zip [30.8 Кб]
Скачиваний: 716
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 03 янв 2013, 19:43 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 10 фев 2012, 16:40
Сообщения: 197
Откуда: Украина г.Кировоград
Я решил использовать библиотеку ST для SDIO. Ее недостаток в том, что ДМА себя не особо оправдывает, ведь в ней множество циклических ожиданий ответа от карты. Хотелось бы это еще пересмотреть.((
И еще. На ск. я понял управл. потоком для карты работает так, что механизм контроллера дает нам знать, что осталось 2 слова в его буфере на передачу или прием и все.
Далее по флагам TXFIFOE RXFIFOE мы с этим можем крутить по своему. или вести дальнейшую передачу или нет. Но если данных в буфере осталось больше 2 ? Тогда ДМА все равно зависнет?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 03 янв 2013, 19:54 
Заглядывает иногда

Зарегистрирован: 08 май 2012, 21:18
Сообщения: 184
Откуда: Омск
ДМА себя начинает оправдывать когда надо переслать большой объем данных. А когда там байт 100 - 200 то и смысла в дма нету вообще.

_________________
Прежде чем спорить подумай о том что воевать можно бесконечно, а вот мир бывает крайне коротким и редким. Мой сайт про stm32 и не только - www.nis-embedded.blogspot.com


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 04 янв 2013, 00:47 
Заглядывает иногда

Зарегистрирован: 18 окт 2012, 23:31
Сообщения: 30
Подскажите: чтобы использовать Fatfs на STM32L152,нужно ее подключить на машинном уровне? тоесть это в diskio.с (или еще где?) ,а остальное идет уже сама FAT?

#define SD_DI 0
#define SD_DO 1
#define SD_CLK 2
#define SD_CS 3
#define SD_INS 4
#define SD_WP 5
и еще пол файла переделать?) - я правильно думаю?

у когонить есть FATfs для STM32L152?или чтобы переделывать поменьше?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 04 янв 2013, 01:06 
Заглядывает иногда

Зарегистрирован: 18 окт 2012, 23:31
Сообщения: 30
спящий писал(а):
Подскажите: чтобы использовать Fatfs на STM32L152,нужно ее подключить на машинном уровне? тоесть это в diskio.с (или еще где?) ,а остальное идет уже сама FAT?

#define SD_DI 0
#define SD_DO 1
#define SD_CLK 2
#define SD_CS 3
#define SD_INS 4
#define SD_WP 5
и еще пол файла переделать?) - я правильно думаю?

у когонить есть FATfs для STM32L152?или чтобы переделывать поменьше?


Написать отправку по SPI я смогу но совместить с Fatfs чет пока недопру.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 07 янв 2013, 20:37 
Только пришел

Зарегистрирован: 03 янв 2013, 11:37
Сообщения: 10
надо переписать sdio_sd.c под свой интерфейс. как именно вы его реализуете - разницы нету, хоть ногодрыгом. а fatfs от железа абстрагируется на уровне diskio.c, там все по-прежнему останется.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 09 янв 2013, 16:29 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 10 фев 2012, 16:40
Сообщения: 197
Откуда: Украина г.Кировоград
Вопрос к Yanichar или еще кому...

Библиотека FatFS господина Chan с которой ща все работают имеет возможность работы сразу с несколькими файлами (ЭТО ОЧЕНЬ ПОЛЕЗНО, за это низкий поклон))))
Хорошо, определяю я кол- во рабочих файлов для открытия по переменной _FS_SHARE, например = 3.
Таким обр. библиотека типа перестраивается на многозадачную работу.

Ок. Вопрос. Все функции содержат в аргументе указатель на структуру файла, где хранится все о нем. Вот эта структура:
Код:
/* File object structure (FIL) */

typedef struct {
   FATFS*   fs;            /* Pointer to the owner file system object */
   WORD   id;            /* Owner file system mount ID */
   BYTE   flag;         /* File status flags */
   BYTE   pad1;
   DWORD   fptr;         /* File read/write pointer (0 on file open) */
   DWORD   fsize;         /* File size */
   DWORD   org_clust;      /* File start cluster (0 when fsize==0) */
   DWORD   curr_clust;      /* Current cluster */
   DWORD   dsect;         /* Current data sector */
#if !_FS_READONLY
   DWORD   dir_sect;      /* Sector containing the directory entry */
   BYTE*   dir_ptr;      /* Ponter to the directory entry in the window */
#endif
#if _USE_FASTSEEK
   DWORD*   cltbl;         /* Pointer to the cluster link map table (null on file open) */
#endif
#if _FS_SHARE
   UINT   lockid;         /* File lock ID (index of file semaphore table) */
#endif
#if !_FS_TINY
   BYTE   buf[_MAX_SS];   /* File data read/write buffer */
#endif
} FIL;



По-умолчанию библиотека работает с 1-м файлом. Как мы знаем при многозадачной работе с каким файлом мы работаем в данный момент? На это я не нашел предпосылок...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 19 апр 2013, 23:45 
Здравствуйте!

Зарегистрирован: 30 мар 2013, 21:19
Сообщения: 3
011119xx писал(а):
Я использовал в stm32f103. В библиотеке периферии есть рабочий пример, сделаешь как там, будет работать.

Подскажите как эти библиотеки прицепить для stm32f103. У меня ошибку кричит:
Fatal Error[Pe035]: #error directive: "Please select first the STM32 EVAL board to be used (in stm32_eval.h)" C:\Users\admin\Desktop\ARM\stm32_helloworld_led_lib\stm32_helloworld_led_lib\stm32_eval.h 169
То есть надо выбрать тип борды, но у меня олимексовская отладка (STM-P103), как ее идентифицировать в этой таблице:
====================================================================================================== STM32 EVAL | LED | Buttons | Com Ports | LCD | IOE | sFLASH | sEE | TSENSOR | SD (SPI) | SD(SDIO) |
=====================================================================================================
STM3210B-EVAL | 4 | 8 | 2 | YES (SPI) | NO | YES | NO | YES | YES | NO |
-----------------------------------------------------------------------------------------------------------------+
STM3210E-EVAL | 4 | 8 | 2 | YES (FSMC)| NO | YES | NO | YES | NO | YES |
-----------------------------------------------------------------------------------------------------------------+
STM3210C-EVAL | 4 | 3 | 1 | YES (SPI) | YES | NO | YES | NO | YES | NO |
-----------------------------------------------------------------------------------------------------------------+
STM32100B-EVAL | 4 | 8 | 2 | YES (SPI) | NO | YES | NO | YES | YES | NO |
-----------------------------------------------------------------------------------------------------------------+
STM32L152-EVAL | 4 | 8 | 2 | YES (SPI) | NO | NO | NO | YES | YES | NO |
-----------------------------------------------------------------------------------------------------------------+
STM32100E-EVAL | 4 | 8 | 2 | YES (FSMC)| YES | YES | YES | YES | YES | NO |
=====================================================================================================


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 25 апр 2013, 15:12 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 10 фев 2012, 16:40
Сообщения: 197
Откуда: Украина г.Кировоград
Nikolay N. Noskov писал(а):
То есть надо выбрать тип борды, но у меня олимексовская отладка (STM-P103), как ее идентифицировать в этой таблице:
====================================================================================================== STM32 EVAL | LED | Buttons | Com Ports | LCD | IOE | sFLASH | sEE | TSENSOR | SD (SPI) | SD(SDIO) |
=====================================================================================================
STM3210B-EVAL | 4 | 8 | 2 | YES (SPI) | NO | YES | NO | YES | YES | NO |
-----------------------------------------------------------------------------------------------------------------+
STM3210E-EVAL | 4 | 8 | 2 | YES (FSMC)| NO | YES | NO | YES | NO | YES |
-----------------------------------------------------------------------------------------------------------------+
STM3210C-EVAL | 4 | 3 | 1 | YES (SPI) | YES | NO | YES | NO | YES | NO |
-----------------------------------------------------------------------------------------------------------------+
STM32100B-EVAL | 4 | 8 | 2 | YES (SPI) | NO | YES | NO | YES | YES | NO |
-----------------------------------------------------------------------------------------------------------------+
STM32L152-EVAL | 4 | 8 | 2 | YES (SPI) | NO | NO | NO | YES | YES | NO |
-----------------------------------------------------------------------------------------------------------------+
STM32100E-EVAL | 4 | 8 | 2 | YES (FSMC)| YES | YES | YES | YES | YES | NO |
=====================================================================================================


А че это за таблица такая? В каком она идет в библиотечном файле? не встречал....


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 25 апр 2013, 15:20 
Старожил
Аватара пользователя

Зарегистрирован: 27 апр 2011, 07:50
Сообщения: 404
Nikolay N. Noskov писал(а):
011119xx писал(а):
Я использовал в stm32f103. В библиотеке периферии есть рабочий пример, сделаешь как там, будет работать.

Подскажите как эти библиотеки прицепить для stm32f103. У меня ошибку кричит:
Fatal Error[Pe035]: #error directive: "Please select first the STM32 EVAL board to be used (in stm32_eval.h)" C:\Users\admin\Desktop\ARM\stm32_helloworld_led_lib\stm32_helloworld_led_lib\stm32_eval.h 169
То есть надо выбрать тип борды, но у меня олимексовская отладка (STM-P103), как ее идентифицировать в этой таблице:
====================================================================================================== STM32 EVAL | LED | Buttons | Com Ports | LCD | IOE | sFLASH | sEE | TSENSOR | SD (SPI) | SD(SDIO) |
=====================================================================================================
STM3210B-EVAL | 4 | 8 | 2 | YES (SPI) | NO | YES | NO | YES | YES | NO |
-----------------------------------------------------------------------------------------------------------------+
STM3210E-EVAL | 4 | 8 | 2 | YES (FSMC)| NO | YES | NO | YES | NO | YES |
-----------------------------------------------------------------------------------------------------------------+
STM3210C-EVAL | 4 | 3 | 1 | YES (SPI) | YES | NO | YES | NO | YES | NO |
-----------------------------------------------------------------------------------------------------------------+
STM32100B-EVAL | 4 | 8 | 2 | YES (SPI) | NO | YES | NO | YES | YES | NO |
-----------------------------------------------------------------------------------------------------------------+
STM32L152-EVAL | 4 | 8 | 2 | YES (SPI) | NO | NO | NO | YES | YES | NO |
-----------------------------------------------------------------------------------------------------------------+
STM32100E-EVAL | 4 | 8 | 2 | YES (FSMC)| YES | YES | YES | YES | YES | NO |
=====================================================================================================


Совсем не обязательно привязываться к какой-то конкретной плате. Нужно просто взять из примера нужное для вашего проекта, что я и сделал в свое время.
У меня в проект включены stm32_eval_sdio_sd.c и stm32_eval_sdio_sd.h которые изначально лежат в ...\stm32f10x_stdperiph_lib\STM32F10x_StdPeriph_Lib_V3.5.0\Utilities\STM32_EVAL\Common


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 16 фев 2014, 10:45 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2348
Так есть рабочий вариант для работы по SDIO под 103 камень?

Опять сижу с нуля сочиняю.
Нарыл где то файлы sdcard.c и sdcard.h - при компиляции ругается "неизвестный тип bool"
В каком хедере этот чертов bool описан?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 16 фев 2014, 11:15 
Старожил

Зарегистрирован: 27 сен 2013, 16:44
Сообщения: 229
Откуда: ЛНР, г. Луганск
если не ошибаюсь, но в stdbool.h
только, если это coocox включи Cи функции в репозитарии


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 16 фев 2014, 11:49 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2348
banzayy писал(а):
если не ошибаюсь, но в stdbool.h
только, если это coocox включи Cи функции в репозитарии

Кокос, но в составе C Library только файл syscalls.c
Подключил - не помогло.
Что то где то проинклюдить надо?

P.S.
#include <stdbool.h>

Перестал ругаться на тип bool, теперь FALSE не понимает.

Прописал false прописными буквами - схавал.

Что то собралось с кучей предупреждений.

Спасибо за помощь.


Спотыкается в этом месте

Код:
      if (errorstatus != SD_OK)
      {
        return(errorstatus);
      }
      SDIO_CmdInitStructure.SDIO_Argument = SD_VOLTAGE_WINDOW_SD | SDType;
      SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SD_APP_OP_COND;
      SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
      SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
      SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
      SDIO_SendCommand(&SDIO_CmdInitStructure);

      errorstatus = CmdResp3Error();
      if (errorstatus != SD_OK)
      {
        return(errorstatus);
      }


errorstatus возвращается SD_CMD_RSP_TIMEOUT


Куда копать?


Последний раз редактировалось Pingvin 16 фев 2014, 12:33, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 16 фев 2014, 12:10 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2348
И все же - может кто поделиться рабочим проектом под 103 камень?
С использованием SDIO


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 16 фев 2014, 14:26 
Старожил

Зарегистрирован: 15 янв 2013, 13:24
Сообщения: 5665
Pingvin писал(а):
Подключил - не помогло.
... ...
Перестал ругаться на тип bool, теперь FALSE не понимает.
... ...
Прописал false прописными буквами - схавал.
Какие смешные проблемы на ровном месте.

В рамках любого учебника по Си (да! Си учить надо, а не методом тыка действовать!):
Код:
#typedef unsigned char bool;    //для ARM можно unsigned int
#define #FALSE 0
#define #false 0
- добавить это в любом файле проекта, в сишном (где используется bool) или в глобальном хедере (это боле универсально).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 16 фев 2014, 14:29 
Старожил

Зарегистрирован: 15 янв 2013, 13:24
Сообщения: 5665
Pingvin писал(а):
И все же - может кто поделиться рабочим проектом под 103 камень?
С использованием SDIO
Ну вот и "встретились два одиночества" :-) Только Oxford начал переживать, а уже и потребитель нашёлся. Сегодняшняя ссылка.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 16 фев 2014, 16:29 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2348
AlexPM писал(а):
Pingvin писал(а):
И все же - может кто поделиться рабочим проектом под 103 камень?
С использованием SDIO
Ну вот и "встретились два одиночества" :-) Только Oxford начал переживать, а уже и потребитель нашёлся. Сегодняшняя ссылка.

Спасибо, поищу там.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 16 фев 2014, 17:03 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2348
011119xx писал(а):
Я использовал в stm32f103. В библиотеке периферии есть рабочий пример, сделаешь как там, будет работать.

Можно уточнить - в какой библиотеке?
Кокос, кейл?
Не дадите ссылку?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 16 фев 2014, 19:24 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2348
Чтение сектора и запись вроде заработали.
Балбес - не завел питание на карту! :-)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 16 фев 2014, 19:45 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2348
Мультиблочное чтение не работает.

Выпадает в Default_Handler

Что за фигня?

Код:
SD_Error SD_ReadMultiBlocks(uint32_t addr, uint32_t *readbuff, uint16_t BlockSize, uint32_t NumberOfBlocks)
{
  SD_Error errorstatus = SD_OK;
  uint32_t count = 0, *tempbuff = readbuff;
  uint8_t power = 0;

  if (NULL == readbuff)
  {
    errorstatus = SD_INVALID_PARAMETER;
    return(errorstatus);
  }

  TransferError = SD_OK;
  TransferEnd = 0;
  TotalNumberOfBytes = 0;

  /* Clear all DPSM configuration */
  SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT;
  SDIO_DataInitStructure.SDIO_DataLength = 0;
  SDIO_DataInitStructure.SDIO_DataBlockSize = SDIO_DataBlockSize_1b;
  SDIO_DataInitStructure.SDIO_TransferDir = SDIO_TransferDir_ToCard;
  SDIO_DataInitStructure.SDIO_TransferMode = SDIO_TransferMode_Block;
  SDIO_DataInitStructure.SDIO_DPSM = SDIO_DPSM_Disable;
  SDIO_DataConfig(&SDIO_DataInitStructure);
  SDIO_DMACmd(DISABLE);

  if (SDIO_GetResponse(SDIO_RESP1) & SD_CARD_LOCKED)
  {
    errorstatus = SD_LOCK_UNLOCK_FAILED;
    return(errorstatus);
  }

  if (CardType == SDIO_HIGH_CAPACITY_SD_CARD)
  {
    BlockSize = 512;
    addr /= 512;
  }
 
  if ((BlockSize > 0) && (BlockSize <= 2048) && (0 == (BlockSize & (BlockSize - 1))))
  {
    power = convert_from_bytes_to_power_of_two(BlockSize);

    /* Set Block Size for Card */
    SDIO_CmdInitStructure.SDIO_Argument = (uint32_t) BlockSize;
    SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SET_BLOCKLEN;
    SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
    SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
    SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
    SDIO_SendCommand(&SDIO_CmdInitStructure);

    errorstatus = CmdResp1Error(SDIO_SET_BLOCKLEN);

    if (SD_OK != errorstatus)
    {
      return(errorstatus);
    }
  }
  else
  {
    errorstatus = SD_INVALID_PARAMETER;
    return(errorstatus);
  }

  if (NumberOfBlocks > 1)
  {
    /* Common to all modes */
    if (NumberOfBlocks * BlockSize > SD_MAX_DATA_LENGTH)
    {
      errorstatus = SD_INVALID_PARAMETER;
      return(errorstatus);
    }

    TotalNumberOfBytes = NumberOfBlocks * BlockSize;
    StopCondition = 1;
    DestBuffer = readbuff;

    SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT;
    SDIO_DataInitStructure.SDIO_DataLength = NumberOfBlocks * BlockSize;
    SDIO_DataInitStructure.SDIO_DataBlockSize = (uint32_t) power << 4;
    SDIO_DataInitStructure.SDIO_TransferDir = SDIO_TransferDir_ToSDIO;
    SDIO_DataInitStructure.SDIO_TransferMode = SDIO_TransferMode_Block;
    SDIO_DataInitStructure.SDIO_DPSM = SDIO_DPSM_Enable;
    SDIO_DataConfig(&SDIO_DataInitStructure);

    /* Send CMD18 READ_MULT_BLOCK with argument data address */
    SDIO_CmdInitStructure.SDIO_Argument = (uint32_t)addr;
    SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_READ_MULT_BLOCK;
    SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
    SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
    SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
    SDIO_SendCommand(&SDIO_CmdInitStructure);

    errorstatus = CmdResp1Error(SDIO_READ_MULT_BLOCK);

    if (errorstatus != SD_OK)
    {
      return(errorstatus);
    }

    if (DeviceMode == SD_POLLING_MODE)
    {
      /* Polling mode */
      while (!(SDIO->STA &(SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DATAEND | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_STBITERR)))
      {
        if (SDIO_GetFlagStatus(SDIO_FLAG_RXFIFOHF) != RESET)
        {
          for (count = 0; count < SD_HALFFIFO; count++)
          {
            *(tempbuff + count) = SDIO_ReadData();
          }
          tempbuff += SD_HALFFIFO;
        }
      }

      if (SDIO_GetFlagStatus(SDIO_FLAG_DTIMEOUT) != RESET)
      {
        SDIO_ClearFlag(SDIO_FLAG_DTIMEOUT);
        errorstatus = SD_DATA_TIMEOUT;
        return(errorstatus);
      }
      else if (SDIO_GetFlagStatus(SDIO_FLAG_DCRCFAIL) != RESET)
      {
        SDIO_ClearFlag(SDIO_FLAG_DCRCFAIL);
        errorstatus = SD_DATA_CRC_FAIL;
        return(errorstatus);
      }
      else if (SDIO_GetFlagStatus(SDIO_FLAG_RXOVERR) != RESET)
      {
        SDIO_ClearFlag(SDIO_FLAG_RXOVERR);
        errorstatus = SD_RX_OVERRUN;
        return(errorstatus);
      }
      else if (SDIO_GetFlagStatus(SDIO_FLAG_STBITERR) != RESET)
      {
        SDIO_ClearFlag(SDIO_FLAG_STBITERR);
        errorstatus = SD_START_BIT_ERR;
        return(errorstatus);
      }
      while (SDIO_GetFlagStatus(SDIO_FLAG_RXDAVL) != RESET)
      {
        *tempbuff = SDIO_ReadData();
        tempbuff++;
      }

      if (SDIO_GetFlagStatus(SDIO_FLAG_DATAEND) != RESET)
      {
        /* In Case Of SD-CARD Send Command STOP_TRANSMISSION */
        if ((SDIO_STD_CAPACITY_SD_CARD_V1_1 == CardType) || (SDIO_HIGH_CAPACITY_SD_CARD == CardType) || (SDIO_STD_CAPACITY_SD_CARD_V2_0 == CardType))
        {
          /* Send CMD12 STOP_TRANSMISSION */
          SDIO_CmdInitStructure.SDIO_Argument = 0x0;
          SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_STOP_TRANSMISSION;
          SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
          SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
          SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
          SDIO_SendCommand(&SDIO_CmdInitStructure);

          errorstatus = CmdResp1Error(SDIO_STOP_TRANSMISSION);

          if (errorstatus != SD_OK)
          {
            return(errorstatus);
          }
        }
      }
      /* Clear all the static flags */
      SDIO_ClearFlag(SDIO_STATIC_FLAGS);
    }
    else if (DeviceMode == SD_INTERRUPT_MODE)
    {
      SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND | SDIO_IT_RXOVERR | SDIO_IT_RXFIFOHF | SDIO_IT_STBITERR, ENABLE);
      while ((TransferEnd == 0) && (TransferError == SD_OK))
      {}
      if (TransferError != SD_OK)
      {
        return(TransferError);
      }
    }
    else if (DeviceMode == SD_DMA_MODE)
    {
      SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND | SDIO_IT_RXOVERR | SDIO_IT_STBITERR, ENABLE);
      SDIO_DMACmd(ENABLE);
      DMA_RxConfiguration(readbuff, (NumberOfBlocks * BlockSize));
      while (DMA_GetFlagStatus(DMA2_FLAG_TC4) == RESET)
      {}
      while ((TransferEnd == 0) && (TransferError == SD_OK))
      {}
      if (TransferError != SD_OK)
      {
        return(TransferError);
      }
    }
  }
  return(errorstatus);
}


виснет тут
Код:
while (!(SDIO->STA &(SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DATAEND | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_STBITERR)))
      {
        if (SDIO_GetFlagStatus(SDIO_FLAG_RXFIFOHF) != RESET)
        {
          for (count = 0; count < SD_HALFFIFO; count++)
          {
            *(tempbuff + count) = SDIO_ReadData();
          }
          tempbuff += SD_HALFFIFO;
        }
      }


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 16 фев 2014, 21:17 
Старожил

Зарегистрирован: 15 янв 2013, 13:24
Сообщения: 5665
Pingvin писал(а):
Мультиблочное чтение не работает.
Выпадает в Default_Handler
Во-первых, мультиблочное чтение может потребовать и буфер соответствующего увеличенного размера. Какой сейчас размер буфера и сколько блоков одновременно пытаетесь читать? Или по-другому: чтение одного блока через мультиблочную функцию - не выпадает?

Во-вторых, у Вас сейчас вроде режим драйвера выбран "DMA". Попробуйте переключиться в другой режим - Interrupt. По скорости то же самое, а по багам нет.

Ну, и общего плана совет. Чтобы определять причину попадания в Default Handler, иногда достаточно посмотреть callstack под отладчиком, а ещё лучше сделать разные обработчики используемых ISR, а не оставлять во всех одинаковые переходы на Default handler.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 16 фев 2014, 22:13 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2348
AlexPM писал(а):
Pingvin писал(а):
Мультиблочное чтение не работает.
Выпадает в Default_Handler
Во-первых, мультиблочное чтение может потребовать и буфер соответствующего увеличенного размера. Какой сейчас размер буфера и сколько блоков одновременно пытаетесь читать? Или по-другому: чтение одного блока через мультиблочную функцию - не выпадает?

Во-вторых, у Вас сейчас вроде режим драйвера выбран "DMA". Попробуйте переключиться в другой режим - Interrupt. По скорости то же самое, а по багам нет.

Ну, и общего плана совет. Чтобы определять причину попадания в Default Handler, иногда достаточно посмотреть callstack под отладчиком, а ещё лучше сделать разные обработчики используемых ISR, а не оставлять во всех одинаковые переходы на Default handler.

Вы совершенно правы - я ступил с приемным буфером!
Задал буфер всего под один блок!
Сам понял, но сегодня уже проверить не смогу.
Завтра попробую.
Спасибо!

Как переключить режим драйвера?
Есть у меня рабочий пример для досточки stm32f4discovery, попробую от туда функции подергать.
Но там камень 407.

Главное - убедился, что железо макетки работает, а с софтом с Божьей и вашей помощью разберемся.
Но доки мало, все же. :-(

Пытаюсь, как Франкенштейн, слепить нечто из разных, понадерганных ото всюду кусков кода.
Хотелось бы готовый, грамотный, рабочий пример.


Последний раз редактировалось Pingvin 16 фев 2014, 22:25, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 16 фев 2014, 22:25 
Старожил

Зарегистрирован: 15 янв 2013, 13:24
Сообщения: 5665
Pingvin писал(а):
Как переключить режим драйвера?
Так вот же оно, по всему коду драйвера понатыкано:
... if (DeviceMode == SD_INTERRUPT_MODE)
... if (DeviceMode == SD_DMA_MODE)

Фактически код для SD/SDIO драйвера компилируется в тройном размере (все три варианта), хотя выбирается и используется обычно какой-то один. Теоретически можно менять режим на лету программно, но кроме как в self-test'е драйвера, я этого в проектах не встречал.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 16 фев 2014, 22:28 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2348
AlexPM писал(а):
Pingvin писал(а):
Как переключить режим драйвера?
Так вот же оно, по всему коду драйвера понатыкано:
... if (DeviceMode == SD_INTERRUPT_MODE)
... if (DeviceMode == SD_DMA_MODE)

Фактически код для SD/SDIO драйвера компилируется в тройном размере (все три варианта), хотя выбирается и используется обычно какой-то один. Теоретически можно переключать режим программно, но кроме как в self-test'е драйвера, я этого в проектах не встречал.

В том и проблема, что драйвер скачен не пойми откуда, может там,к примеру, нет настройки DMA или прерываний.
:-(

Код:
DeviceMode == SD_POLLING_MODE


А это что за режим?
Раз в if вход происходит, наверно он и используется.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 16 фев 2014, 22:37 
Старожил

Зарегистрирован: 15 янв 2013, 13:24
Сообщения: 5665
Pingvin писал(а):
DeviceMode == SD_POLLING_MODE
А это что за режим?
Здрасьте, приехали :-) Polling - это режим с программным опросом флагов (reference: English-Russian Dictionary) и программной же реализацией блочного чтения.
Когда Вы работаете с SD/SPI драйвером - там как раз polling, потому что периферийный модуль SPI знать не знает, что есть "особенный" размер данных ровно 512 байт.

SDIO-модуль умеет аппаратно прокачивать эти самые 512 байт, а основную программу извещает либо SDIO-прерывание, либо DMA-сигнал.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 224 ]  На страницу Пред.  1, 2, 3, 4, 5, 6 ... 9  След.

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: meykj


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB