Перейти к содержанию
    

Здравствуйте все!

У кого нибудь получалось напустить SDIO на DMA в STM32? Особенно инстресует если получалось оживить его на драйвере в комплекте HAL от ST.

 

У меня какой то странный глюк - в счетчие ДМА перед началом транзакции считывания 512 байт в счетчике числится 128 32 битных слов, а после - остается 4 слова (не дочитывает). В итоге прерывание не случается и все остальные беды. Какого лешего эти 4 слова остаются не вычитанными???

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ДА.

Не первый раз удивляюсь, почему этот и другие глюки не были найдены раньше, хотя народу кто якобы уже много лет пользуется СТМ32Ф4 целая москва.

То ли все делают ёлочные гирлянды и не пишут СД через дма, то ли я лошара.

 

Речь о записи на СД, как я понимаю.

ДМА останавливается потому что в СДИО по непонятной причине возникает ошибка TXUNDERR (регистр STA), проверьте.

Почему-то возникает она всегда на последних 10-и словах. Само ДМА не при чём.

 

А лечение такое:: пишите в DLEN (SDIO) на 16+ слов больше, чем в ДМА.

А окончание записи придётся контролировать именно по завершению ДМА, прерывание от СДИО вообще запретите.

То есть, несколько функций придётся подредактировать, сейчас не скажу каких точно.

Изменено пользователем IgorKossak

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за ответ!

У меня проблема при чтении пока, до записи банально не добрался.

Попробовал прибавить 16 к 512 в DLEN, но ситуация не сильно поменялась, в счетчике стало оставаться 3 (вместо 4).

 

при чем эти несчастные 16 остаются в счетчике DLEN после отработки, надо видимо еще что-то править

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У кого нибудь получалось напустить SDIO на DMA в STM32?

Чтение работает как часы. Без шаманств, в строгом соответствии с документацией.

Правда, сторонними библиотеками не пользуюсь.

Могли бы вы привести код?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня STM32F1 все заработало можно сказать с пол пинка - и чтение и запись. А на F4 - никак. Делаю одинаково - настраиваю проект через STM32CubeMX. Поллингом проверял - работает, хотя там другие беды.

Ссылка на проект целиком ниже, я думаю запустится на любой плате с SD картой.

https://yadi.sk/d/L5v5UHt0fxMdr

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тоже не помню чтобы были проблемы с чтением (ДМА), но может быть просто забыл.

 

А прожект всё-таки лучше чистый создать и тестировать пока только функции

 

HAL_SD_ReadBlocks_DMA / HAL_SD_CheckReadOperation

 

HAL_SD_WriteBlocks_DMA / HAL_SD_CheckWriteOperation

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тоже не помню чтобы были проблемы с чтением (ДМА), но может быть просто забыл.

Тут не совсем понятно в чем проблема. Проект, действительно, не маленький - разбираться очень долго.

Я бы отметил две причины, которые следует устранить:

- бывают плохие карты (фэйковые, бракованные, изношенные и т.п.);

Советую попробовать разные карты. Но раз поллингом работает, значит не оно.

- бывают медленные карты (чтение может прерываться);

Таймаут действует для ожидания данных. От момента передачи команды на чтение до появления признака готовности данных.

Чтобы порция не дочитывалась стабильно, это что-то другое.

В DMA есть битик DMA_SCR_PFCTRL, который можно (и нужно) установить только при обмене с SDIO.

Вообще, флаги ошибок о многом могут рассказать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В DMA есть битик DMA_SCR_PFCTRL, который можно (и нужно) установить только при обмене с SDIO.

HAL нигде его не ставит, и я кажыцо догадываюс почему.

Еррата запрещает ставить соответствующий битик в самом SDIO, поэтому я думаю что и в ДМА его либо нельзя ставить, либо он просто не возымеет действия без такого же битика в SDIO.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

HAL нигде его не ставит, и я кажыцо догадываюс почему.

Еррата запрещает ставить соответствующий битик в самом SDIO, поэтому я думаю что и в ДМА его либо нельзя ставить, либо он просто не возымеет действия без такого же битика в SDIO.

Errata описывает только SDIO HW flow control, но я его и не использую. На DMA это не влияет. Еще один нужный битик DMA_SCR_PBURST.

У меня такой код (обработку ошибок и нестандартного поведения не привожу):

Перед считыванием данных я проверяю статус (CMD13) - если карта в TRAN, то буду считывать:

			else if(cs.current_state == CARD_STATE_TRAN)
			{
				SDIO->DCTRL = 0;
				SDIO->DLEN = sdio_p_buf_size;
				DMA2_Stream6->CR = 0
					| (4 << DMA_SCR_CHSEL)
					| (1 << DMA_SCR_MINC)
					| (2 << DMA_SCR_MSIZE)
					| (2 << DMA_SCR_PSIZE)
					| (1 << DMA_SCR_PBURST)
					| (1 << DMA_SCR_PFCTRL)
					| (0 << DMA_SCR_EN);
				DMA2_Stream6->FCR = 0
					| (1 << DMA_SFCR_DMDIS)
					| (1 << DMA_SFCR_FTH);
				DMA2->HIFCR = (0x3D << 16);
				DMA2_Stream6->PAR = (DWORD)&SDIO->FIFO;
				DMA2_Stream6->M0AR = (DWORD)sdio_p_buf;
				DMA2_Stream6->NDTR = sdio_p_buf_size / sizeof(DWORD);
				sdio_fsm = SDIO_FSM_READ;
				SDIO_Send(CMD18_READ_MULTIPLE_BLOCK, (sdio_sect << ((card_type == CARD_SDHC)? 0 : 9)), EXPECT_SHORT_RESP);
			}

когда CMD18 выполнится запускаю прием данных так:

			DMA2_Stream6->CR = 0
				| (4 << DMA_SCR_CHSEL)
				| (1 << DMA_SCR_MINC)
				| (2 << DMA_SCR_MSIZE)
				| (2 << DMA_SCR_PSIZE)
				| (1 << DMA_SCR_PBURST)
				| (1 << DMA_SCR_PFCTRL)
				| (1 << DMA_SCR_EN);
			SDIO->DCTRL = 0
				| (9 << SDIO_DCTRL_DBLOCKSIZE)
				| (1 << SDIO_DCTRL_DTDIR)
				| (1 << SDIO_DCTRL_DMAEN)
				| (1 << SDIO_DCTRL_DTEN);

по приходу прерывания DATAEND отправляю "горшочек не вари" для CMD18:

		if(status & (1 << SDIO_DATAEND))
		{
			SDIO->ICR = (1 << SDIO_DATAEND);
			SDIO->DCTRL = 0;
			sdio_fsm = SDIO_FSM_READ_STOP;
			SDIO_Send(CMD12_STOP_TRANSMISSION, NO_ARGUMENTS, EXPECT_SHORT_RESP);
		}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Убрал вариант влияния FATfs. Оставил только эти функции:

    BSP_SD_Init();
    char buffer[512];
    BSP_SD_ReadBlocks((uint32_t *)buffer, 0, 512, 1);

PFCTRL дейтсивтельно ни влияет. Просто NDTR начинается с 0xFFFF. И в данном случае так же не дочитывает 4 слова.

По битам - проверяю, все то же самое, см. картинку.

 

test

post-14594-1428990694_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Считывать надо словами (DWORD 32-бита). В NDTR должно лежать количество DWORD'ов для считывания (для сектора 512 байт NDTR=128).

PBURST и PFCTRL нужно установить - помню тоже шаманил с настройками. Размеры транзакций для периферии и памяти 32-битные.

 

А CIRC не лишний? Зачем нужен циклический буфер?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

CIRC не влияет, я отключал

А 32 битный захват данных и так включен (PSIZE=2, MSIZE = 2).

В NDTR перед началом транзакции было 0x00000080, после - 4, то есть отправилось 124 слова, кстати я в буфере вижу, что так и есть, данные из карты идут!

 

раньше напарывался та такой косяк, что данные были не выровнены на 4 байта, но тут все четко.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

то есть отправилось 124 слова, кстати я в буфере вижу, что так и есть, данные из карты идут!

Т.е. последние 16 байт не укладываются в буфер?

Буфер смотрели? Данные не смещены?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы так и не посмотрели статус СДИО, наверняка там ошибки..

Посмотрел - ошибок нет во флагах. Скрин приложу чуть позже.

Данные 512 байт как будто пролетают все.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...