Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: SDIO интерфейс STM32F407
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
isz
Добрый день.
Не могу разобраться с работой интерфейса SDIO.
Шлю по очереди команды CMD0, CMD8, CMD55.
Команда 0 без ответа. После команды 8 получаю нормально ответ (опросом бит CTIMEOUT, CMDREND, CCRCFAIL региста STA. Как и положено бит выставляется после получения ответа.
Проблема возникает при отправке следующей команды. Функция отправки команды отдает сразу управления не дожидаясь получения ответа. Соответственно и в регистре RESPCMD содержится старая команда CMD8.

Код функции отправки команд:

Код
SDIO->ICR=(SDIO_ICR_CCRCFAILC | SDIO_ICR_CTIMEOUTC | SDIO_ICR_CMDRENDC | SDIO_ICR_CMDSENTC);

SDIO->ARG=argument;
SDIO->CMD=(uint32_t)(cmd&SDIO_CMD_CMDINDEX)|respType|SDIO_CMD_CPSMEN;

if (respType==NoResponse)
{
    while (!(SDIO->STA & (SDIO_STA_CTIMEOUT | SDIO_STA_CMDSENT))) {};
}
else
{
    while (!(SDIO->STA & (SDIO_STA_CTIMEOUT | SDIO_STA_CMDREND | SDIO_STA_CCRCFAIL))) {};
}

response[0]=SDIO->RESP1;
response[1]=SDIO->RESP2;
response[2]=SDIO->RESP3;
response[3]=SDIO->RESP4;


Вот что видно в логическом анализаторе. Линия D6 - это вывод отладки. Переключаю его состояние при выходе из функции отправки. Видно, что при отправке последней команды контроллер выходит из функции в самом начале. Перед командой 55 поставлена искусственная задержка.



Заранее благодарю за помощь.
isz
Строкой SDIO->ICR=(SDIO_ICR_CCRCFAILC | SDIO_ICR_CTIMEOUTC | SDIO_ICR_CMDRENDC | SDIO_ICR_CMDSENTC); должны были очищаться биты CCRCFAILC, CTIMEOUTC, CMDRENDC, CMDSENTC регистра STA.
По факту этого не происходило. Первое чтение регистра давала старые данные. При повторном чтении регистр STA регистр был уже сброшен.

Как вариант 2 раза читать регистр STA.

Но еще лучше окончание передачи команды и получения ответа (или таймаута) отслеживать путем тестирования бита CMDACT регистра STA.
k155la3
Вы работаете с девайсом, который работает асинхронно с Вашей программой.
Поэтому вполне могобыть, что когда Вы от него чего-то хотите, оно занято.
Поэтому перед любым обращением к нему опрашивайте регистр статуса или состояния, не знаю как оно в этом случае наз-ся.
А тем более - при засылке нескольких команд последовательно, в частоности "долгоиграющих" вроде записи и стирания.
Если при подборе задержек между посылаемыми командами девайс становится работоспособным - то это ОНО.

bureau
Цитата(isz @ Jul 25 2016, 11:44) *
Вот что видно в логическом анализаторе.

Вопрос не по теме...
Какую модель анализатора используете?
isz
Добрый день.
Железо: клон saleae logic
ПО: https://sigrok.org/
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.