реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> AM1808 MMC/SD Controller
doom13
сообщение Oct 31 2014, 11:41
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Приветствую.
Настраиваю MMC/SD Controller, пишу-читаю данные, вроде бы всё работает. Но возникла проблема, при постоянной записи данных контроллер периодически начинает тупить.
Последовательность записи данных следующая:
1) Отправляю команду SET_BLOCKLEN
2) Настраиваю фифо на передачу
3) Заполняю фифо до упора
4) Отправляю команду WRITE_BLOCK
5) При наличии в фифо свободного места записываю все остальные данные
6) Жду установки DATDNE в MMCST0

Тупит в месте проверки DATDNE, иногда почему-то DATDNE долго не устанавливается. С чем это может быть связано?
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Oct 31 2014, 13:39
Сообщение #2


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(doom13 @ Oct 31 2014, 14:41) *
...иногда почему-то DATDNE долго не устанавливается. С чем это может быть связано?


идёт скидывание внутреннего кэша в физическую память. там вроде как тайминг до 200 ms может быть
(если я по памяти назвал вам верные цифры, но порядок такой). Лучше загляните на uSD карточки доки, там вроде как пробегало.
Go to the top of the page
 
+Quote Post
doom13
сообщение Oct 31 2014, 14:09
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Цитата(kolobok0 @ Oct 31 2014, 16:39) *
идёт скидывание внутреннего кэша в физическую память. там вроде как тайминг до 200 ms может быть
(если я по памяти назвал вам верные цифры, но порядок такой). Лучше загляните на uSD карточки доки, там вроде как пробегало.

Если можно по-подробнее.
Данные в фифо mmcsd-контроллера записываю при условии, что фифо не полон циклом. После записи последних 4-х байт жду DATDNE. И вот тут в большинстве случаев DATDNE устанавливается через ~1,2 мс, но иногда более чем через 400 мс.
Как понимаю, тупит mmcsd-контроллер.
Go to the top of the page
 
+Quote Post
Alex11
сообщение Oct 31 2014, 14:46
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 106
Регистрация: 23-10-04
Из: С-Петербург
Пользователь №: 965



Это когда ему внутри что-то стереть надо, то идет такая пауза. Это для всех карточек так. Для каких-то больше, для каких-то меньше. Бороться частично можно предварительным стиранием карты и записью больших блоков (128-256КБ).
Go to the top of the page
 
+Quote Post
doom13
сообщение Nov 3 2014, 06:56
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Цитата(Alex11 @ Oct 31 2014, 17:46) *
Это когда ему внутри что-то стереть надо, то идет такая пауза. Это для всех карточек так. Для каких-то больше, для каких-то меньше. Бороться частично можно предварительным стиранием карты и записью больших блоков (128-256КБ).

Но DATDNE - флаг MMCSD-контроллера процессора, т.е. если пакет данных в фифо запихнули и они ушли на память, то он и должен установиться. Связи со стиранием-записью самой карты не вижу, может что-то не понимаю, поправте.
Go to the top of the page
 
+Quote Post
doom13
сообщение Nov 4 2014, 13:17
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Перечитал всё что писали, потыкал осцилом на плату (жёлтый - ожидание DATDNE, зелёный - линия DATA0), нашёл в даташите, что низкий уровень на DATA0 - сигнал BUSY (т.е. контроллер памяти перекидывает данные в NAND-flash). Вопрос, почему в некоторых случаях этот BUSY длится почти 500 мс? Нормально ли это?
Данные пишу в цикле последовательно увеличивая адрес блоком в 512 байт.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Копейкин
сообщение Nov 5 2014, 10:07
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 190
Регистрация: 7-11-07
Из: С-Петербург
Пользователь №: 32 134



В MMC/SDSC/SDHC встроенный контроллер занимается перемешиванием блоков с целью равномерного износа.
Также, пока возможно (есть запас) производится рамаппинг сбойных блоков.
Вот на построение таблицы переадресации и тратится время.
Поэтому в описании декларируются задержки до 700-800мс. К этому нужно быть готовым.
Даже если писать потоком, последовательные сектора, то 1-2 паузы в самом начале присутствуют.
Далее, вроде всё быстро.
Go to the top of the page
 
+Quote Post
doom13
сообщение Nov 5 2014, 12:12
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Похоже, что-то неправильно делаю. Сравнил со старым проектом (там SDHC карта в режиме SPI), таких длительных пауз (ожидания пока BUSY) нет. Тут используется eMMC, но таких оличий ведь быть не должно.
Проблемка остаётся актуальной.
Go to the top of the page
 
+Quote Post
doom13
сообщение Nov 5 2014, 14:20
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Переделал алгоритм записи:
Цитата
0) Проверяю состояние памяти и жду пока установится State Transfer (tran)
1) Отправляю команду SET_BLOCKLEN
2) Настраиваю фифо на передачу
3) Заполняю фифо до упора
4) Отправляю команду WRITE_BLOCK
5) При наличии в фифо свободного места записываю все остальные данные
6) Жду установки DATDNE в MMCST0


Получаю, что иногда долго висит на 0 пункте, т.е. состояние у памяти Programming State (prg).
Вопрос - как это обойти? Что-то не совсем понимаю каким образом большой буфер спасёт ситуацию. Может есть ещё какой-то способ?
Go to the top of the page
 
+Quote Post
doom13
сообщение Nov 6 2014, 08:52
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Цитата(Копейкин @ Nov 5 2014, 13:07) *
Даже если писать потоком, последовательные сектора, то 1-2 паузы в самом начале присутствуют.
Далее, вроде всё быстро.

Хотел это попробовать, но при отправке команды CMD20 (WRITE_DAT_UNTIL_STOP) память вообще дохнет, не отвечает R1. Нашёл в доке, что команда должна работать только в режиме шины 1х, но и это не помогло.

Цитата(kolobok0 @ Oct 31 2014, 16:39) *
идёт скидывание внутреннего кэша в физическую память. там вроде как тайминг до 200 ms может быть

Почему получаем разное время записи физической памяти? Один раз буфер 512 байт записывается во внутреннюю NAND за 1.5 мс, а иногда BUSY держится целых 500 мс?
Go to the top of the page
 
+Quote Post
Копейкин
сообщение Nov 6 2014, 11:48
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 190
Регистрация: 7-11-07
Из: С-Петербург
Пользователь №: 32 134



Я, года 3 назад, проводил такой эксперимент.
1) SD/SDHC или MMC пишу по одному сектору последовательные адреса, 100 секторов
2) пишу по 1 сектору произвольные сектора по псевдослучайной таблице адресов,тоже 100 секторов
Так вот время записи отличается на порядки, не шучу. Точных значений не помню, но помню, что
неприятно удивило.
Потом в документации на SD прочитал, что нужно быть готовым к состоянию карты - занято - до ~700мс.
Причины я выше приводил.
Поэтому я всегда, где требовалась скорость, через SPI или SDIO писал строго последовательные адреса.
И то, при первой записи, почти всегда есть занятость 300-600мс. Наблюдал осциллографом.
Далее идет равномерно.
Кстати, есть современные карточки, в которых не предусматривается алгоритм перемешивания блоков и
горячей подстановки сбойных секторов. Их признак - они придназначены только для exFAT. В них не должно быть
таких пауз.
Go to the top of the page
 
+Quote Post
doom13
сообщение Nov 10 2014, 12:42
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Что-то не могу понять: в CSD есть поля WRITE_BL_LEN и READ_BL_LEN, которые определяют размер блока при чтении и записи. Данные поля определены как READ ONLY, т.е. получается что они определяют максимальную длинну блока данных на чтение/запись и её значение я изменить не могу (у моего чипа они равны 9 -> максимальный размер блока 2^9=512 байт).
Что тогда делает команда SET_BLOCKLEN, если повлиять на размер блока я не могу?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Nov 10 2014, 12:57
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



может ключевое слово максимальный?
то есть меньше можно...
Go to the top of the page
 
+Quote Post
doom13
сообщение Nov 10 2014, 13:07
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Цитата(Golikov A. @ Nov 10 2014, 15:57) *
может ключевое слово максимальный?
то есть меньше можно...

Есть ещё и READ_BL_PARTIAL (WRITE_BL_PARTIAL) также READ ONLY и равны нулю - говорит о том, что и меньше нельзя.
В чём тогда смысл SET_BLOCKLEN для данной памяти? Или здесь данную команду можно и не использовать, а размер блока данных у чипа всегда постоянен?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Nov 10 2014, 13:33
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



в этой нельзя, в какой то другой можно, это что повод не поддерживать команду?

http://we.easyelectronics.ru/AVR/mmcsd-i-a...a-s-kartoy.html

Команда CMD16 (SET_BLOCKLEN) в этом случае устанавливает размер блока для чтения. Если READ_BLK_MISALIGN установлен, можем читать как нам приспичит=) с нарушением границ блока. Стоит, однако, помнить, что только что сказанное не относится к картам SDHC, где размер блока чтения всегда равен 512.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th June 2025 - 17:28
Рейтинг@Mail.ru


Страница сгенерированна за 0.01492 секунд с 7
ELECTRONIX ©2004-2016