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

SDIO интерфейс STM32F407

Добрый день.

Не могу разобраться с работой интерфейса 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 поставлена искусственная задержка.

 

sdio.png

 

Заранее благодарю за помощь.

 

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


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

Строкой SDIO->ICR=(SDIO_ICR_CCRCFAILC | SDIO_ICR_CTIMEOUTC | SDIO_ICR_CMDRENDC | SDIO_ICR_CMDSENTC); должны были очищаться биты CCRCFAILC, CTIMEOUTC, CMDRENDC, CMDSENTC регистра STA.

По факту этого не происходило. Первое чтение регистра давала старые данные. При повторном чтении регистр STA регистр был уже сброшен.

 

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

 

Но еще лучше окончание передачи команды и получения ответа (или таймаута) отслеживать путем тестирования бита CMDACT регистра STA.

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


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

Вы работаете с девайсом, который работает асинхронно с Вашей программой.

Поэтому вполне могобыть, что когда Вы от него чего-то хотите, оно занято.

Поэтому перед любым обращением к нему опрашивайте регистр статуса или состояния, не знаю как оно в этом случае наз-ся.

А тем более - при засылке нескольких команд последовательно, в частоности "долгоиграющих" вроде записи и стирания.

Если при подборе задержек между посылаемыми командами девайс становится работоспособным - то это ОНО.

 

 

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


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

Вот что видно в логическом анализаторе.

Вопрос не по теме...

Какую модель анализатора используете?

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


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

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

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

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

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

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

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

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

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

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