Easyelectronics.ru

Электроника для всех
Текущее время: 16 дек 2019, 06:56

Часовой пояс: 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 Кб]
Скачиваний: 721
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: 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
Сообщения: 2447
Так есть рабочий вариант для работы по 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
Сообщения: 2447
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
Сообщения: 2447
И все же - может кто поделиться рабочим проектом под 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
Сообщения: 2447
AlexPM писал(а):
Pingvin писал(а):
И все же - может кто поделиться рабочим проектом под 103 камень?
С использованием SDIO
Ну вот и "встретились два одиночества" :-) Только Oxford начал переживать, а уже и потребитель нашёлся. Сегодняшняя ссылка.

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


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

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

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


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

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


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

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

Выпадает в 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
Сообщения: 2447
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
Сообщения: 2447
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 часов


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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

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