| Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
Пытаюсь работать с SD card. Нужна помощь
03.10.2009, 18:10
|
|
|
Вид на жительство
Регистрация: 05.07.2006
Адрес: Tashkent
Сообщений: 454
Сказал спасибо: 24
Сказали Спасибо 67 раз(а) в 44 сообщении(ях)
|
Пытаюсь работать с SD card. Нужна помощь
Вообщем пробую в железе. Карта 256МБ SanDisk.Инициализация SPI проходит нормально, чтение как-то плохо работает.
Читаю по одному сектору: посылаю CMD17, принимаю результат в буфер 512 байт(это для удобства). Сектор 0 (MBR) читается нормально, по нему считаю адрес сектора PBR(чтобы работать с ФАТ16). У меня получился адрес смещения 103. При попытке обратится к сектору 103 карта не отвечает(возвращает ошибку). Я просканировал небольшой диапазон секторов с помошью МК, вот что выходит:
read error, sector#0000001
read error, sector#0000002
read error, sector#0000003
.............................................
read error, sector#0000508
read error, sector#0000509
read error, sector#0000510
read error, sector#0000511
read error, sector#0000513
read error, sector#0000514
Т.е. к нулевому и 512-му сектору доступ нормальный. К остальным - нету.
Затем я использовал команду CMD18 для мультиблочного чтения с сектора 0. Здесь карта честно выдала все свое содержимое(и кажется сделала это без ошибок). Почему нету доступа при одноблочном чтении к остальным секторам кроме 0 и 512?
ЗЫ. За основу кода я взял функцию посылки команд у Чана(elm-chan.org), а прием сектора делаю по описанию http://piclist.ru/S-64MMC-PIC-RUS/S-64MMC-PIC-RUS.html
|
|
|
|
05.10.2009, 10:26
|
|
|
Вид на жительство
Регистрация: 05.07.2006
Адрес: Tashkent
Сообщений: 454
Сказал спасибо: 24
Сказали Спасибо 67 раз(а) в 44 сообщении(ях)
|
Re: Пытаюсь работать с SD card. Нужна помощь
Да, забыл сказать, может это имеет какое-то значение. Это microSD карта, хотя по идее должно быть все как у карты обычных размеров. Комп через кардридер ее видит и нормально с ней работает(т.е. карта 100% не дохлая).
Только до сих пор не могу понять:
функция load_sector()
При посылке адреса adr !=0 и adr!=512
условие (send_CMD(CMD17,adr)!=0) не выполняется
и дальше происходит возврат из функции либо карта не отвечает ничего вразумительного и виснет если продолжать выполнение кода:
while(spi(0xFF)!=0xFE);//wait for start of transmission
т.е. она просто не отвечает 0xFE.
|
|
|
|
05.10.2009, 17:35
|
|
|
Прописка
Регистрация: 29.11.2007
Адрес: Могилев. РБ.
Сообщений: 143
Сказал спасибо: 30
Сказали Спасибо 20 раз(а) в 20 сообщении(ях)
|
Re: Пытаюсь работать с SD card. Нужна помощь
вы читайте указывая номер сектора * 512... т.е. 0=0 1=512, 2=1024 и тд. это если посекторно читать. т.е. адрес кратен 512
|
|
|
|
Сказали "Спасибо" Cyber_RAT
|
|
|
05.10.2009, 18:25
|
|
|
Вид на жительство
Регистрация: 05.07.2006
Адрес: Tashkent
Сообщений: 454
Сказал спасибо: 24
Сказали Спасибо 67 раз(а) в 44 сообщении(ях)
|
Re: Пытаюсь работать с SD card. Нужна помощь
Да, заработало, спасибо большое  ! Только-только разобрался. Оказывается надо посылать линейный адрес сектора в пересчете на байты. Я же просто указывал номер блока и получал ответ 0x20(Adress Error).
|
|
|
|
28.10.2009, 13:06
|
|
|
Вид на жительство
Регистрация: 05.07.2006
Адрес: Tashkent
Сообщений: 454
Сказал спасибо: 24
Сказали Спасибо 67 раз(а) в 44 сообщении(ях)
|
Re: Пытаюсь работать с SD card. Нужна помощь
Добрался до FAT16. Сделал простой PCM RIFF плейер. Играет, но столкнулся со следующей проблемой. Я открываю мультиблочное считываение (CMD 18 ), считываю первый кластер файла и параллельно вывожу звуковой поток в ШИМ(частота дискретизации потока 32КГц, 8 бит, моно), атмега88 тактируется от 16МГц кварца,установлена максимальная частота шины SPI. Когда кластер заканчивается, то я прекращаю мультиблочное считывание(CMD 12), а затем обращаюсь в таблицу FAT для поиска следующего клатсера. Когда я дохожу до требуемой записи ФАТ и ее считываю, то торможу чтение текущего сектора ФАТ с помощью CMD 12(это чтобы не читать лишнюю информацию) и снова перехожу на мультиблочное считывание следующего кластера файла. Все работает, данные читаются, но обращение к таблице FAT требует достаточно много времени и у меня в динамике в этот момент проскакивает довольно сильный щелчок. А учитывая что размер кластера 16КБ, то этот треск идет с частотой 2Гц. Первое что пришло в голову - это буферизовать всю таблицу ФАТ, но где я в 88-й меге возьму столько ОЗУ? Второе о чем я подумал - это частично буферизовать записи цепочки кластеров файла, но опять же когда они будут прочитаны, то необходимо будет загрузить новую цепочку для остальной части файла, а для этого также потребуется время и следовательно чтение временно остановится. Вопрос как еще можно решить эту задачу?
В нете есть похожий проект: http://elm-chan.org/works/sd8p/report.html
Вроде там нету подобной проблемы. При просмотре исходников я там не обнаружил чего-то полезного в данном случае.
Средняя скорость чтения файла(просто последовательно грузится поток байтов без обработки) около 120-130КБайт/сек. Может быть это карта тормознутая и стоит попробовать другую?
|
|
|
|
28.10.2009, 16:34
|
|
|
Временная регистрация
Регистрация: 26.09.2009
Сообщений: 81
Сказал спасибо: 4
Сказали Спасибо 16 раз(а) в 13 сообщении(ях)
|
Re: Пытаюсь работать с SD card. Нужна помощь
uk8amk, зачем область ФАТ читать командой CMD18, когда есть CMD17.
|
|
|
|
28.10.2009, 16:45
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 30.06.2005
Сообщений: 3,392
Сказал спасибо: 5
Сказали Спасибо 429 раз(а) в 305 сообщении(ях)
|
Re: Пытаюсь работать с SD card. Нужна помощь
Если нужен ультрабюджетный вариант то мучайся с atmega. Если нет то возьми проц помощнее.
|
|
|
|
28.10.2009, 16:58
|
|
|
Вид на жительство
Регистрация: 05.07.2006
Адрес: Tashkent
Сообщений: 454
Сказал спасибо: 24
Сказали Спасибо 67 раз(а) в 44 сообщении(ях)
|
Re: Пытаюсь работать с SD card. Нужна помощь
Давайте прикинем. Если нужные данные находятся в конце сектора, то да, особой разницы нету. Но представим, что требуемая запись, а именно 2 байта, находятся в начале сектора. Тогда после CMD17 мы должны прочитать весь сектор(данные о корректной работе CMD12 после CMD17 в даташите от Sandisk и опублиекованном стандарте JEDEC на (e)MMC я так и не нашел, быть может плохо искал?). Таким образом с помощью CMD18 я открываю транзакцию неопределенной длины, а когда прочитаю запись ФАТ, то тутже прибиваю эту транзакцию с CMD12 не дожидаясь конца сектора. При тактовой частоте SPI 8 МГц пересылка одного байта займет 1мкс. Если длина блока около 500байт, то я уже не должен ждать 500мкс для того чтобы закончить начатую транзакцию. Вместо этого я уже передаю в карту адрес нового кластера. Я прав?
|
|
|
|
28.10.2009, 17:04
|
|
|
Вид на жительство
Регистрация: 05.07.2006
Адрес: Tashkent
Сообщений: 454
Сказал спасибо: 24
Сказали Спасибо 67 раз(а) в 44 сообщении(ях)
|
Re: Пытаюсь работать с SD card. Нужна помощь
Gnider: Я осведомлен о существовании камней со встроенным интерфейсом MMC. Вопрос в том чтобы сделать из того что есть в наличии, т.е. на атмеге. Точнее у меня уже сделано на атмеге, но я хочу знать как народ обходит данную трудность.
|
|
|
|
28.10.2009, 17:43
|
|
|
Временная регистрация
Регистрация: 26.09.2009
Сообщений: 81
Сказал спасибо: 4
Сказали Спасибо 16 раз(а) в 13 сообщении(ях)
|
Re: Пытаюсь работать с SD card. Нужна помощь
uk8amk, я лично глубоко убежден, что делать нужно не из того, что в наличии, а из того с чем можно более-менее комфортно работать. Возьмите к примеру мегу32, там больше оперативы и считанный сектор ФАТ можно хранить в ней.
|
|
|
|
Сказали "Спасибо" espectr0
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 06:50.
|
|