Easyelectronics.ru

Электроника для всех
Текущее время: 25 май 2020, 23:59

Часовой пояс: 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
Сообщения: 2566
Честно говоря - я так глубоко не копал.
Все исходники тут
https://github.com/PingvinOpenTag/ARMad ... tag-system


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

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2566
Непонятный глюк.
Пока не пойму, в чём дело.
Есть два варианта плат (пурпурные и белые), практически идентичных по топологии.
Единственная разница - для 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
Сообщения: 2566
Весь мозг мне проел этот 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
Сообщения: 2566
Убрал из функции STORAGE_GetCapacity_FS(...) вызов HAL_SD_Get_CardInfo(&hsd, &SDCardInfo);
Ибо она уже вызывается при инициализации карточки.
В режиме дебага теперь карточка открывается стабильно без брекпоинтов.
Но если не через дебаг - опять пишет "вставьте диск".


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

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


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

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


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

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


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

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

_________________
RADIOWOLF.RU


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

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2566
Проигнорил ошибку на 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
Сообщения: 225
Решил не создавать новую тему, тут довольно много интересного обсуждения, спрошу лучше тут, чтобы в одном месте было.

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
Сообщения: 4785
Откуда: Кемеровская область, Киселевск
RXFIFOHF - означает FIFO заполнен на половину
По HAL читай мануал там талмута большая, не изучая ничего не получиться. Не для кухарок программирование микроконтроллеров, тем более на таком уровне. А разбираться сидеть за тебя и тратить время тут никто не будет.

_________________
RADIOWOLF.RU


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

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


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

Зарегистрирован: 05 дек 2017, 18:17
Сообщения: 225
Я в качестве примера работы 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
Сообщения: 210
Откуда: Украина
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
Сообщения: 2566
Спасибо, гляну.
Я так понял - это не от Чана FatFS?


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

Зарегистрирован: 25 сен 2017, 10:57
Сообщения: 210
Откуда: Украина
Демо проект и либа не от Чана. В оригинале старая версия 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
Сообщения: 78
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
Сообщения: 585
Прикольное ПО даже с 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 часов


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

Сейчас этот форум просматривают: BARS_, Eddy_Em, x893, Порфирий


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

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

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