Easyelectronics.ru

Электроника для всех
Текущее время: 18 окт 2019, 19:15

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



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

Начать новую тему Ответить на тему  [ Сообщений: 224 ]  На страницу Пред.  1 ... 5, 6, 7, 8, 9
Автор Сообщение
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 14 авг 2017, 09:28 
Старожил

Зарегистрирован: 21 мар 2012, 14:33
Сообщения: 542
Включил прерывания, удалил все задержки, добавил ожидание cplt коллбеков от SDIO DMA на отправку и приём.
Код:
while (nowTxSd==1) {}

Всё вроде бы заработало, буду смотреть дальше.
Show Коллбеки

Show Тест чтения и записи


Я смотрю на форуме ST говорят с новой библиотекой подглючивал FatFS + RTOS + DMA. По-моему тут может быть проблема, в вызове HAL_SD_GetCardState до того, как DMA отработало.
В новой версии HAL Firmware удалили функции
HAL_SD_CheckWriteOperation и HAL_SD_CheckReadOperation, а код из них (по смыслу) вроде бы перекочевал в HAL_SD_IRQHandler. Раньше у людей всё хорошо работало (FatFS + RTOS + DMA), а теперь видимо этот завершающий код вызывается из прерывания, и процесс может пойти не в той последовательности:
HAL_SD_WriteBlocks_DMA -> HAL_SD_GetCardState -> HAL_SD_IRQHandler
а нужно
HAL_SD_WriteBlocks_DMA -> HAL_SD_IRQHandler -> HAL_SD_GetCardState.


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

Зарегистрирован: 21 мар 2012, 14:33
Сообщения: 542
Pingvin писал(а):
А у меня ошибки вылезли при чтении из файла данных, более чем размер блока - 512 байт.
Решил вернутся к теме...
Посмотрел режим с DMA - так ожидание окончания операции всё-равно в цикле.
Это значит, при использовании FreeRTOS процессорное время будет тратиться на этот цикл ненужный.
По идее нужно семафор отпускать из прерывания DMA, а в задаче ждать семафора.
Но это нужно глубоко копать.
"Скрестить" так сказать FreeRTOS и SDIO драйвер.


А не могли бы вы показать как выглядит этот цикл ожидания окончания операции?

Как насчёт того, чтобы поставить циклы ожидания перед чтением/отправкой?
Это хотя бы ускорит запись одиночных крупных блоков.

1) Цикл ожидания. Т.к. никто ничего не отправлял, цикл сразу переходит к п.2
2) Записали один крупный блок
3) всё, больше ничего не делаем, система свободна

пока система работает, пришел txcplt и сбросил нужный флаг

решили записать еще один крупный блок

1) цикл ожидания опять ничего не ждет, т.к. txcplt пришел в процессе выполнения других задач
2) Записали крупный блок
3) выходим, отдаем время на другие задачи


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

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2349
Честно говоря - я так глубоко не копал.
Все исходники тут
https://github.com/PingvinOpenTag/ARMad ... tag-system


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

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2349
Непонятный глюк.
Пока не пойму, в чём дело.
Есть два варианта плат (пурпурные и белые), практически идентичных по топологии.
Единственная разница - для USB_ATTACH (подача питания через разистор 1,5 КОм на шину Data+ USB разъёма) - используются разные порты.
В одном случае PORTB (белые), во втором - PORTC (на нём же и SDIO расположен).
Код использую этот
https://github.com/PingvinOpenTag/ARMad ... rage_fatfs

Код:
#define USB_ATTACH_PIN GPIO_PIN_6
#define USB_ATTACH_PORT GPIOC
#define USB_ATTACH


Код:
#ifdef USB_ATTACH
static void USB_attach(void){


   GPIO_InitTypeDef GPIO_InitStruct;
   HAL_GPIO_WritePin(USB_ATTACH_PORT, USB_ATTACH_PIN, GPIO_PIN_SET);
   //USB Disconnect
      GPIO_InitStruct.Pin = USB_ATTACH_PIN;
      GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
      HAL_GPIO_Init(USB_ATTACH_PORT, &GPIO_InitStruct);

}
#endif


Чудеса в том, что если используем PORTB - все работает хорошо - система видит диск и отображает содержимое.
Если же PORTC - диск в системе появляется, но при попытке открыть его система пишет - "вставьте диск".

Очевидно, что не работает SDIO во втором случае.
Но почему?
Неужели использование ножки на том же порте (настроена как выход) - оказывает какое то влияние на работу SDIO?
Но у меня несколько ножек PORTC используются под различные цели - белой плате это не мешает.

Буду завтра пробовать перекинуть USB_ATTACH на пурпурной плате так же на PORTB - посмотрю, исчезнет ли проблема.
Понимаю - что так быть не должно!
Но... в ступоре пока...


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

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2349
Весь мозг мне проел этот SDIO с HAL вместе!
Какая штука нестабильная, оказывается...
Есть проект mass storage , сгенерированный кубом.
Так половину (если не больше) карточек не работает!
В системе появляются диск, но при попытке открыть пишет - вставьте диск!

Если же ставлю брекпоитн тут
Код:
int8_t STORAGE_GetCapacity_FS (uint8_t lun, uint32_t *block_num, uint16_t *block_size)
{
  /* USER CODE BEGIN 3 */   
// *block_num  = STORAGE_BLK_NBR;
//  *block_size = STORAGE_BLK_SIZ;
      HAL_SD_Get_CardInfo(&hsd, &SDCardInfo);
     *block_num  = SDCardInfo.CardCapacity / BLOCK_SIZE;
      *block_size = BLOCK_SIZE;
  return (USBD_OK);
  /* USER CODE END 3 */
}





перед HAL_SD_Get_CardInfo(&hsd, &SDCardInfo);
он останавливается, я убираю брекпоинт и жму "продолжить выполнение" - все работает!
Карточка открывается!

Как побороть?
Вот проект
https://yadi.sk/d/H7rQ5zat3QoqFf


Новая версия библиотеки Куба вообше чёрте-что генерит.


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

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2349
Убрал из функции STORAGE_GetCapacity_FS(...) вызов HAL_SD_Get_CardInfo(&hsd, &SDCardInfo);
Ибо она уже вызывается при инициализации карточки.
В режиме дебага теперь карточка открывается стабильно без брекпоинтов.
Но если не через дебаг - опять пишет "вставьте диск".


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

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2349
А в какой момент нужно ножку D+ подключать через резистор к плюсу?


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

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2349
Может интересно кому...
Поменял кое-что в бутлоадере - добавил паузу 1 сек. перед инициализацией и проверку успешности инициализации в цикле (пока не инициализируется).
Стало намного лучше!
Из 20 карт, что я получил - одна совсем дохлая - не читается даже заводским картридером.
Из 19 оставшихся читаются бутлоадером 15, а 4 все таки не хотят запускаться.
Но все же это лучше, чем ничего...
Карточки, кстати - многие Б/У.


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

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2349
Одна карточка, что не инициализируется в бутлоадере (но читается заводским карт-ридером) - выдаёт ошибку при запросе cmd55
Другие не смотрел ещё в дебаге.


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

Зарегистрирован: 18 май 2013, 20:43
Сообщения: 4340
Откуда: Кемеровская область, Киселевск
Зачем тебе SDIO? по SPI отлично все работает.

_________________
RADIOWOLF.RU


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

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2349
Проигнорил ошибку на cmd55
Код:

  /* Send CMD55 */
  sdio_cmdinitstructure.Argument         = 0;
  sdio_cmdinitstructure.CmdIndex         = SD_CMD_APP_CMD;
  SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
 
  /* Check for error conditions */
  errorstate = SD_CmdResp1Error(hsd, SD_CMD_APP_CMD);
 
  /* If errorstate is Command TimeOut, it is a MMC card */
  /* If errorstate is SD_OK it is a SD card: SD card 2.0 (voltage range mismatch)
     or SD card 1.x */
  if(/*errorstate == SD_OK*/ 1)
  {
    /* SD CARD */
    /* Send ACMD41 SD_APP_OP_COND with Argument 0x80100000 */
    while((!validvoltage) && (count < SD_MAX_VOLT_TRIAL))



Теперь читаются 19 из 20.
Одна совсем дохлая и заводским картридером не читается та же.


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

Зарегистрирован: 05 дек 2017, 18:17
Сообщения: 162
Решил не создавать новую тему, тут довольно много интересного обсуждения, спрошу лучше тут, чтобы в одном месте было.

STM32F407, работаю с SD картой через 4-bit SDIO. На карту пишу-читаю через DMA, низкоуровневые вызовы через FATFs.
Все чтение-запись происходит в основном теле программы. Кроме этого, там собственно ничего и нет, вся остальная работа в
прерываниях (экран, uart-ты, can, куча всего).
С записью вообще проблем нет. На чтении иногда SDIO останавливается с ошибкой DTIMEOUT. Иногда, это 2-3 раза на чтении 7мб файла кусками по
32кб.
При этом в функции чтения от FATFS я обрабатываю эту ошибку и тут же пытаюсь читать еще раз, время позволяет. Со второго раза чтение всегда проходит. Т.е. такого чтобы чтение по запрошенному адресу не прошло 2 раза подряд не было ни разу. А пробовал я много :)

В процессе поиска проблемы я обнаружил, что если "освободить" контроллер от других задач, которые в прерываниях, то ошибок с чтением нет. Я не понимаю, почему так
происходит, поскольку чтение сделано через DMA и контроллер тут вроде как не участвует.

Я пробовал включать прерывания SDIO по ошибкам, и смотрел на состояние регистров в этот момент. В SDIO->STA стоит бит DTIMEOUT, но в SDIO->DTIMER не 0, а то значение которое я туда записал перед запуском.

Вот код функции передачи. Она одна и на прием и на передачу, я думаю комментариев там достаточно:
Show


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

Зарегистрирован: 10 июн 2017, 14:46
Сообщения: 92
Взбодрю ка я тему.

Пытаюсь взлететь с SDIO и DMA. Микроконтроллер STM32F103RC.
Использую HAL версии 1.7, а также FreeRTOS с несколькими параллельными задачами.

Инициализация пинов, SDIO и карты, а также чтение в не-DMA режиме проходит нормально.
Пришлось, правда, чуток тактирование SDIO занизить, потому как чтение с карты происходило быстрее чем код HAL_SD_ReadBlocks() успевал вычитывать из FIFO и случалось переполнение (у меня же и другие потоки что-то делают). Но в целом карта живая и работает нормально.

Теперь хочу запустить это дело в DMA режиме и происходит вот что:
- Вызываю HAL_SD_ReadBlocks_DMA()
- через некоторое время попадаю в HAL'овский обработчик прерывания HAL_SD_IRQHandler с флагом SDIO_IT_RXFIFOHF.
- Тот в свою очередь делает вызов SD_Read_IT() который начинает по 4 байта переливать FIFO в буфер
- Поскольку указатель на буфер нулевой (мы же в DMA режиме!) система крешится.

Собственно вопрос:
- А какого фига вообще взводится флаг RXFIFOHF? Разве DMA не должен забирать байты сразу по мере их появления?
- Ну ок, если взводится, то зачем HAL хочет вызывать SD_Read_IT()? это ошибка?
- Может есть еще мысли ЧЯДНТ?

Код вот тут, и еще одна функция тут


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

Зарегистрирован: 18 май 2013, 20:43
Сообщения: 4340
Откуда: Кемеровская область, Киселевск
RXFIFOHF - означает FIFO заполнен на половину
По HAL читай мануал там талмута большая, не изучая ничего не получиться. Не для кухарок программирование микроконтроллеров, тем более на таком уровне. А разбираться сидеть за тебя и тратить время тут никто не будет.

_________________
RADIOWOLF.RU


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

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2349
А нет у кого нормальной рабочей связки SDIO+FatFS?
Не Хал.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 18 июл 2019, 09:57 
Заглядывает иногда

Зарегистрирован: 05 дек 2017, 18:17
Сообщения: 162
Я в качестве примера работы SDIO использовал драйвер от LonelyWolf https://github.com/LonelyWolf/stm32/blo ... c/sdcard.c

А с FATFs, что там связывать? Если HAL не использовать, с его обертками, то из функций в diskio просто вызываете свои для инициализации-чтения-записи. Пример diskio нужен?
Вот например чтение:
Код:
DRESULT disk_read (
   BYTE pdrv,      /* Physical drive nmuber to identify the drive */
   BYTE *buff,      /* Data buffer to store read data */
   DWORD sector,   /* Start sector in LBA */
   UINT count      /* Number of sectors to read */
)
{
uint32_t res=0;
   
   if(pdrv == DEV_SD){
      res=SD_transfer((uint8_t *)buff, (uint32_t) sector, count, SD2UM);
      return RES_OK;
   };
   return RES_PARERR;   
}


У меня чтение и запись одной функцией SD_transfer, а Вы как сами решите.

Раз уж подняли тему, я там чуть выше спрашивал, по поводу DTIMEOUT на чтении. Проблему решил, кратко о ней:
STM32F429, весь код в прерываниях разнесенных по приоритетам, в основном цикле только запись буфера из памяти на SD. Прерываний разных много,
но всё успевает отрабатывать. С SD работаю через DMA по 4-бит SDIO. Иногда на чтении возникает ошибка DTIMEOUT.
Оказалось, что это происходит, когда между отправкой команды карте о чтении и включением DMA и SDIO происходит прерывание. Там не много кода, между отправкой команды и включением передачи (запись в регистры SDIO и DMA и собственно включение), поэтому на высокой тактовой частоте (180Mhz) такое происходило очень редко и я долго не мог понять, в чем проблема.
Решил запретом прерываний перед отправкой команды карте и разрешением после включения SDIO. Поскольку кода там мало, отрабатывает очень быстро и на работу остального кода, который в прерываниях, не повлияло.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 18 июл 2019, 10:46 
Заглядывает иногда

Зарегистрирован: 25 сен 2017, 10:57
Сообщения: 171
Откуда: Украина
Pingvin писал(а):
А нет у кого нормальной рабочей связки SDIO+FatFS?
Не Хал.

Вот есть реализация - http://mikrocontroller.bplaced.net/word ... age_id=225
Пример по ссылке переделанный под Keil - https://dropmefiles.com/uWa8v


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

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2349
Спасибо, гляну.
Я так понял - это не от Чана FatFS?


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

Зарегистрирован: 25 сен 2017, 10:57
Сообщения: 171
Откуда: Украина
Демо проект и либа не от Чана. В оригинале старая версия FatFs, в проекте под Keil - FatFs R0.13c.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 20 июл 2019, 18:22 
Заглядывает иногда

Зарегистрирован: 10 июн 2017, 14:46
Сообщения: 92
Oxford писал(а):
RXFIFOHF - означает FIFO заполнен на половину
По HAL читай мануал там талмута большая, не изучая ничего не получиться. Не для кухарок программирование микроконтроллеров, тем более на таком уровне. А разбираться сидеть за тебя и тратить время тут никто не будет.

Это был просто офигенный, мотивирующий на свершения, комментарий! ага, да...
Просто видимо хотелось написать 4114й никак никому не помогающий комментарий.

Вы действительно думаете, что я не заглядывал в мануал и не перешерстил весь код HAL SD прежде чем спросить?
А если там нет ответа (а там таки про это не написано!)?
А форум зачем, если на нем нельзя спросить? Чтобы тебя говном облили? прекрасно....


Теперь по теме. Вдруг нормальным пацанам (или может быть кухаркам?) инфа пригодится.
У STM32F1 всего один DMA канал и на чтение и на запись SDIO. Функция HAL_DMA_Init() написана так, что пишет сразу в регистры (даже не смотря на то, что судя по интерфейсу эта функция должна работать только с DMA Handle'ом, а не с регистрами)

Код:
   dmaReadHandle.Instance = DMA2_Channel4;
   dmaReadHandle.Init.Direction = DMA_PERIPH_TO_MEMORY;
   dmaReadHandle.Init.PeriphInc = DMA_PINC_DISABLE;
   dmaReadHandle.Init.MemInc = DMA_MINC_ENABLE;
   dmaReadHandle.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
   dmaReadHandle.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
   dmaReadHandle.Init.Mode = DMA_NORMAL;
   dmaReadHandle.Init.Priority = DMA_PRIORITY_MEDIUM;
   if(HAL_DMA_Init(&dmaReadHandle) != HAL_OK)
      return false;

   dmaWriteHandle.Instance = DMA2_Channel4;
   dmaWriteHandle.Init.Direction = DMA_MEMORY_TO_PERIPH;
   dmaWriteHandle.Init.PeriphInc = DMA_PINC_DISABLE;
   dmaWriteHandle.Init.MemInc = DMA_MINC_ENABLE;
   dmaWriteHandle.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
   dmaWriteHandle.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
   dmaWriteHandle.Init.Mode = DMA_NORMAL;
   dmaWriteHandle.Init.Priority = DMA_PRIORITY_MEDIUM;
   if(HAL_DMA_Init(&dmaWriteHandle) != HAL_OK)
      return false;

В общем, так писать нельзя. Второй вызов HAL_DMA_Init() перезатирает регистры, которые выставил первый вызов, и в частности поле Direction.

По всей видимости инициализацию DMA придется делать непосредственно перед операцией чтения или записи.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 20 июл 2019, 22:59 
Заглядывает иногда

Зарегистрирован: 25 янв 2012, 20:51
Сообщения: 76
grafalex писал(а):
В общем, так писать нельзя. Второй вызов HAL_DMA_Init() перезатирает регистры, которые выставил первый вызов, и в частности поле Direction.

По всей видимости инициализацию DMA придется делать непосредственно перед операцией чтения или записи.

Или распихать это по 2-м разным потокам DMA...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 23 июл 2019, 22:33 
Заглядывает иногда

Зарегистрирован: 10 июн 2017, 14:46
Сообщения: 92
Я бы с радостью, да в STM32F1 под SDIO выделен только один канал - четвертый в DMA2


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 24 июл 2019, 00:07 
Старожил

Зарегистрирован: 06 окт 2014, 20:14
Сообщения: 325
Прикольное ПО даже с SD работать не умеет. Вообще, я бы не рассчитывал на библиотеки писаные студентами и не тестированные на практике, только время терять. Писать заново, только так и, не бояться.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 30 июл 2019, 23:49 
Заглядывает иногда

Зарегистрирован: 10 июн 2017, 14:46
Сообщения: 92
Это ограничение в железе STM32F1.
HAL тут, в общем-то не виноват - тот же самый код работал бы на другом контроллере. Хотя в документации могли бы и упомянуть, конечно же.


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

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


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

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


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

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

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