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

Добрый день! :)

 

Может кто в курсе?

 

Можно ли читать MMC по одному байту с любого адреса.

 

Можно установить длину блока - есть такая команда.

Вопрос в том адрес блока в этом случае считается с учётом установленной длины или он всё равно всегда кратен 512 байт?

 

 

 

А то уж больно геморно с ней работать буфферы по 512 байт отводить.

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


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

А зачем всё хранить? Считывайте весь блок, а нужные данные сохраняйте.

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


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

Ха в том то и вопрос.

 

Пример:

Вывод звука

Вывод графики на дисплей

Ну и работа с каким то файлом

 

одновременно.

 

т.е. требуется 512 *3 полтора килобайта.

 

Это много для микроконтроллера.

 

Работать с линейной памятью удобнее в моём случае.

 

А скорость очень уж высокая и не требуется - готов пойти на потери скорости при побайтном считывании.

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


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

А скорость очень уж высокая и не требуется - готов пойти на потери скорости при побайтном считывании.

 

Так может просто прочитать без записи в ОЗУ нужное количество байт в секторе да и все? А потом уже читать куда надо? Кривовато, но как вариант...

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


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

Была такая мысль.

 

Но это уже больно накладно.

 

При выводе звука 16 кгц каждые 64 мс по spi читать 512 байт не получится

 

 

интересно всё таки. при длине блока 1 байт как вычисляется адрес блока?

 

приёдтся экспепримент наверное ставить :wacko:

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


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

приёдтся экспепримент наверное ставить

 

Правильно бы было покурить спецификацию. Потому как эксперимент может дать, например, положительный результат на всех карточках, которые есть под рукой, а на каких-нибудь других карточках (уже у заказчика) - отрицательный. Я в том смысле, что возможны недетсткие грабли...

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


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

Длина блока зашита в карточку и работать с другой длиной блока не будет.

Читать карточку можно только блоками. С произвольного адреса - нельзя.

Для карточек более 2Гбайт размер блока может быть 1024 байта.

Не старайтесь решить задачу вывода изображения и звука на AVR.

Возьмите дешёвый ARM, например LPC2103. Сделаете гораздо быстрее.

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


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

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

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


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

По два байта я читал. Но учтите, что это будет очень-очень медленно.

Изменено пользователем Ivan A-R

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


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

Читать карточку можно только блоками.

Неправильно. См. описание параметра READ_BL_PARTIAL в регистре CSD

Не старайтесь решить задачу вывода изображения и звука на AVR.

Возьмите дешёвый ARM, например LPC2103. Сделаете гораздо быстрее.

Я бы не был столь категоричен.

http://pol-sem.narod.ru/polymuson/polymuson.htm

Хотя сам бы делал на ARM:)

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


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

Длина блока зашита в карточку и работать с другой длиной блока не будет.

Читать карточку можно только блоками. С произвольного адреса - нельзя.

Для карточек более 2Гбайт размер блока может быть 1024 байта.

Не старайтесь решить задачу вывода изображения и звука на AVR.

Возьмите дешёвый ARM, например LPC2103. Сделаете гораздо быстрее.

Это все не так! Вам надо внимательней читать спецификацию

Если брать CSD версии 1.0 ( standart capacity)

то там есть параметр READ_BL_LEN он обычно 512 ( но для карт больше 1 гб т.е. в районе 2 GB это максимум для standart capacity READ_BL_LEN = 1024.

Но этот параметр не влияет на чтение, при чтении по умолчанию BLOCK_LEN = 512.

И больше 512 его устанавливать нельзя! (Block Length set by CMD16 can be set up to 512 bytes regardless of READ_BL_LEN.)

к тому же! ВЫ МОЖЕТЕ читать хоть по байту! Главное не пересекать границу 512 байтового сектора!

( у standart capacity для чтения выставляется абсолютный адрес байта! )

Block read is block oriented data transfer. The basic unit of data transfer is a block whose maximum

size is always 512 bytes. Smaller blocks whose starting and ending address are entirely contained

within 512 bytes boundary may be transmitted.

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


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

Неправильно. См. описание параметра READ_BL_PARTIAL в регистре CSD

 

Я бы не был столь категоричен.

http://pol-sem.narod.ru/polymuson/polymuson.htm

Хотя сам бы делал на ARM:)

Есть еще такое: http://electronix.ru/forum/index.php?showtopic=43180&hl=

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


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

Спасибо!!!!!!!

 

т.е. можно для карт меньше 2 Гб

 

 

по времени конечно да немного накладно получится

 

1. Установка длины блока (т.к. в других ф-циях длина нужна512)

2. CMD17 чтение одного ну или двух байт

 

в среднем если на команду допустить передачу 10ти SPI байт

 

то опять с запасом передать для доступа к байту нужно 30 байт

при spi clock = CLC/2 при 16 МГЦ общее время получится примерно 15 мкс

 

при прерываниях порядка 64 мкс вполне приемлимо!!!

 

Может можно обойтись и без установки длины блока просто останавливать приём байт по SPI ???

- нужно будет почитать :)

 

 

Ещё раз спасибо!

Изменено пользователем Пришелец

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


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

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

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

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

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

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

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

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

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

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