isz 0 25 июля, 2016 Опубликовано 25 июля, 2016 · Жалоба Добрый день. Не могу разобраться с работой интерфейса 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 0 25 июля, 2016 Опубликовано 25 июля, 2016 · Жалоба Строкой 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 27 25 июля, 2016 Опубликовано 25 июля, 2016 · Жалоба Вы работаете с девайсом, который работает асинхронно с Вашей программой. Поэтому вполне могобыть, что когда Вы от него чего-то хотите, оно занято. Поэтому перед любым обращением к нему опрашивайте регистр статуса или состояния, не знаю как оно в этом случае наз-ся. А тем более - при засылке нескольких команд последовательно, в частоности "долгоиграющих" вроде записи и стирания. Если при подборе задержек между посылаемыми командами девайс становится работоспособным - то это ОНО. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bureau 0 1 октября, 2016 Опубликовано 1 октября, 2016 · Жалоба Вот что видно в логическом анализаторе. Вопрос не по теме... Какую модель анализатора используете? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
isz 0 4 октября, 2016 Опубликовано 4 октября, 2016 · Жалоба Добрый день. Железо: клон saleae logic ПО: https://sigrok.org/ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться