kan35 7 13 апреля, 2015 Опубликовано 13 апреля, 2015 · Жалоба Здравствуйте все! У кого нибудь получалось напустить SDIO на DMA в STM32? Особенно инстресует если получалось оживить его на драйвере в комплекте HAL от ST. У меня какой то странный глюк - в счетчие ДМА перед началом транзакции считывания 512 байт в счетчике числится 128 32 битных слов, а после - остается 4 слова (не дочитывает). В итоге прерывание не случается и все остальные беды. Какого лешего эти 4 слова остаются не вычитанными??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dr.Alex 0 13 апреля, 2015 Опубликовано 13 апреля, 2015 (изменено) · Жалоба ДА. Не первый раз удивляюсь, почему этот и другие глюки не были найдены раньше, хотя народу кто якобы уже много лет пользуется СТМ32Ф4 целая москва. То ли все делают ёлочные гирлянды и не пишут СД через дма, то ли я лошара. Речь о записи на СД, как я понимаю. ДМА останавливается потому что в СДИО по непонятной причине возникает ошибка TXUNDERR (регистр STA), проверьте. Почему-то возникает она всегда на последних 10-и словах. Само ДМА не при чём. А лечение такое:: пишите в DLEN (SDIO) на 16+ слов больше, чем в ДМА. А окончание записи придётся контролировать именно по завершению ДМА, прерывание от СДИО вообще запретите. То есть, несколько функций придётся подредактировать, сейчас не скажу каких точно. Изменено 13 апреля, 2015 пользователем IgorKossak Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kan35 7 13 апреля, 2015 Опубликовано 13 апреля, 2015 · Жалоба Спасибо за ответ! У меня проблема при чтении пока, до записи банально не добрался. Попробовал прибавить 16 к 512 в DLEN, но ситуация не сильно поменялась, в счетчике стало оставаться 3 (вместо 4). при чем эти несчастные 16 остаются в счетчике DLEN после отработки, надо видимо еще что-то править Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 10 13 апреля, 2015 Опубликовано 13 апреля, 2015 · Жалоба У кого нибудь получалось напустить SDIO на DMA в STM32? Чтение работает как часы. Без шаманств, в строгом соответствии с документацией. Правда, сторонними библиотеками не пользуюсь. Могли бы вы привести код? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kan35 7 13 апреля, 2015 Опубликовано 13 апреля, 2015 · Жалоба У меня STM32F1 все заработало можно сказать с пол пинка - и чтение и запись. А на F4 - никак. Делаю одинаково - настраиваю проект через STM32CubeMX. Поллингом проверял - работает, хотя там другие беды. Ссылка на проект целиком ниже, я думаю запустится на любой плате с SD картой. https://yadi.sk/d/L5v5UHt0fxMdr Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dr.Alex 0 13 апреля, 2015 Опубликовано 13 апреля, 2015 · Жалоба Тоже не помню чтобы были проблемы с чтением (ДМА), но может быть просто забыл. А прожект всё-таки лучше чистый создать и тестировать пока только функции HAL_SD_ReadBlocks_DMA / HAL_SD_CheckReadOperation HAL_SD_WriteBlocks_DMA / HAL_SD_CheckWriteOperation Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 10 13 апреля, 2015 Опубликовано 13 апреля, 2015 · Жалоба Тоже не помню чтобы были проблемы с чтением (ДМА), но может быть просто забыл. Тут не совсем понятно в чем проблема. Проект, действительно, не маленький - разбираться очень долго. Я бы отметил две причины, которые следует устранить: - бывают плохие карты (фэйковые, бракованные, изношенные и т.п.); Советую попробовать разные карты. Но раз поллингом работает, значит не оно. - бывают медленные карты (чтение может прерываться); Таймаут действует для ожидания данных. От момента передачи команды на чтение до появления признака готовности данных. Чтобы порция не дочитывалась стабильно, это что-то другое. В DMA есть битик DMA_SCR_PFCTRL, который можно (и нужно) установить только при обмене с SDIO. Вообще, флаги ошибок о многом могут рассказать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dr.Alex 0 13 апреля, 2015 Опубликовано 13 апреля, 2015 · Жалоба В DMA есть битик DMA_SCR_PFCTRL, который можно (и нужно) установить только при обмене с SDIO. HAL нигде его не ставит, и я кажыцо догадываюс почему. Еррата запрещает ставить соответствующий битик в самом SDIO, поэтому я думаю что и в ДМА его либо нельзя ставить, либо он просто не возымеет действия без такого же битика в SDIO. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 10 13 апреля, 2015 Опубликовано 13 апреля, 2015 · Жалоба 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); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kan35 7 14 апреля, 2015 Опубликовано 14 апреля, 2015 · Жалоба Убрал вариант влияния FATfs. Оставил только эти функции: BSP_SD_Init(); char buffer[512]; BSP_SD_ReadBlocks((uint32_t *)buffer, 0, 512, 1); PFCTRL дейтсивтельно ни влияет. Просто NDTR начинается с 0xFFFF. И в данном случае так же не дочитывает 4 слова. По битам - проверяю, все то же самое, см. картинку. test Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 10 14 апреля, 2015 Опубликовано 14 апреля, 2015 · Жалоба Считывать надо словами (DWORD 32-бита). В NDTR должно лежать количество DWORD'ов для считывания (для сектора 512 байт NDTR=128). PBURST и PFCTRL нужно установить - помню тоже шаманил с настройками. Размеры транзакций для периферии и памяти 32-битные. А CIRC не лишний? Зачем нужен циклический буфер? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kan35 7 14 апреля, 2015 Опубликовано 14 апреля, 2015 · Жалоба CIRC не влияет, я отключал А 32 битный захват данных и так включен (PSIZE=2, MSIZE = 2). В NDTR перед началом транзакции было 0x00000080, после - 4, то есть отправилось 124 слова, кстати я в буфере вижу, что так и есть, данные из карты идут! раньше напарывался та такой косяк, что данные были не выровнены на 4 байта, но тут все четко. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 10 14 апреля, 2015 Опубликовано 14 апреля, 2015 · Жалоба то есть отправилось 124 слова, кстати я в буфере вижу, что так и есть, данные из карты идут! Т.е. последние 16 байт не укладываются в буфер? Буфер смотрели? Данные не смещены? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dr.Alex 0 14 апреля, 2015 Опубликовано 14 апреля, 2015 · Жалоба Вы так и не посмотрели статус СДИО, наверняка там ошибки.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kan35 7 14 апреля, 2015 Опубликовано 14 апреля, 2015 · Жалоба Вы так и не посмотрели статус СДИО, наверняка там ошибки.. Посмотрел - ошибок нет во флагах. Скрин приложу чуть позже. Данные 512 байт как будто пролетают все. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться