|
Висяк ММС |
|
|
|
Apr 19 2007, 17:21
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(zorromen @ Apr 19 2007, 14:49)  Привет всем ... Зафигачил тут карту ММС ... Все хорошо, при обращении к конкретному адрессу и прочесть 512 байт все работает ... Если читать уже не один сектор, а несколько подряд, то уже на примерно 10 прочтении висяк while(SPI(0xff)!=0xFE); нема ответа 0xFE он че заснул чтоли? Вот эта конструкция не очень понятна SPI(0xff)!=0xFE Скорее всего он не заснул а перешел в slave У Вас SS сконфигурирован на вход или на выход ? если на вход, подтяжка есть ?
|
|
|
|
|
Apr 19 2007, 18:50
|

Местный
  
Группа: Свой
Сообщений: 205
Регистрация: 19-12-05
Из: Kiev
Пользователь №: 12 394

|
Цитата(singlskv @ Apr 19 2007, 17:21)  Вот эта конструкция не очень понятна SPI(0xff)!=0xFE
Скорее всего он не заснул а перешел в slave
У Вас SS сконфигурирован на вход или на выход ? если на вход, подтяжка есть ? SS лучше управлять вручную, так надежнее. Попробуй этот кусок, у меня работает нормально.
Прикрепленные файлы
mmc2.zip ( 677 байт )
Кол-во скачиваний: 154
|
|
|
|
|
Apr 22 2007, 16:01
|

Участник

Группа: Участник
Сообщений: 33
Регистрация: 21-04-07
Из: Odessa
Пользователь №: 27 227

|
На сайте самсунга есть полная документация MMC стандарта как в работе по SPI так и в MMC режимах.
Спецификация гласит что так называемый TOKEN "синхронизирующий бит начала передачи", может появляться в любой момент тактов ожидания ответа, то-есть он может быть не кратен 8-ми циклам. Решение проблемы: надо отлавливаить не код "FE" , а всего-лишь первый нулевой бит, и по нему уже синхронизироваться, он может появляется в любое время а не так как вы его ожидаете. Я в интернете на зарубежных форумнаходил исходники с подобным неправильным способом работы с карточкой и так-же жалобы на неспособность работы некоторых карточек от некоторых производителей. Поэтому пришлось написать полность свои функции. С обработкой токенов-ответов на разные там ошибки карты. Карточки с которыми я работал вот такие: APACER 512Mb, Kingston 1G, Transced 2G и пару каких-то неизвестных ( 5 вольтовых )производителей. И никаких проблем. Написал функции обработки информационных структур (CCD, SCD - по моему их так зовут), для определения размерности карты и максимального рабочего пакета, без обработки этих структур в которых присутствует информация о максимальных размерах: входном пакете записи и пакете чтения. Так же перед работой карточки надо установить командами размерность пакета, это как за правило. Еще, можно пересекать границы адресов, но только не адресов которые кратны максимально заявленного размера блока передачи текущей карты.
Я думаю Вам надо переписать код, для того чтобы синхронизировать работу вашего SPI в микроконтролере Вы должны написать чисто програмный отлавливатель первого нулевого бита. Тогда у Вас не будут проблемы с несовместимостью Вашего устройства с карточками.
|
|
|
|
|
Apr 25 2007, 05:10
|

Участник

Группа: Участник
Сообщений: 33
Регистрация: 21-04-07
Из: Odessa
Пользователь №: 27 227

|
Однозначно. Почитай мануал с самсунга, поймешь что я не шучу. Там есть так называемый на графиках обмена, период ожидания ( Ncr ) - и может принимать значение от 1 до 8, но обычное заявленное значение равно 8. В других мануалах максимальное значение и того больше. И самое главное, обязательно: если будешь применять команды записи или чтения, то предварительно примени команду SET_BLOCKLEN (она же CMD16), с параметром удобного для тебя размером блока, но не больше заявленого в CSD.WRITE_BLK_LEN. И при чтении не пересекай адреса через границы кратные размерности CSD.WRITE_BLK_LEN или CSD.READ_BL_LEN. Привет студентам.
|
|
|
|
|
Apr 25 2007, 11:22
|

Местный
  
Группа: Свой
Сообщений: 205
Регистрация: 19-12-05
Из: Kiev
Пользователь №: 12 394

|
Цитата(Max_Shaman @ Apr 25 2007, 05:10)  Однозначно. Почитай мануал с самсунга, поймешь что я не шучу. Там есть так называемый на графиках обмена, период ожидания ( Ncr ) - и может принимать значение от 1 до 8, но обычное заявленное значение равно 8. В других мануалах максимальное значение и того больше. Не пугайте людей, в spi все что происходит должно быть кратно 8 битам, иначе это уже не spi. while(((r1 = mmc_spi(0xff)) & 0x80) && --retry); // wait for response return r1; // if more than 8 retries, card has timed-out это ожидание после посылки команды, никаких сдвигов. почитайте вложение в мой предыдущий пост, перепробовано на 20 разных карточках.
|
|
|
|
|
Apr 26 2007, 20:05
|

Участник

Группа: Участник
Сообщений: 33
Регистрация: 21-04-07
Из: Odessa
Пользователь №: 27 227

|
В структуре CSD или OSD не помню уже как конкретно она зовется. Есть информация о максимально граничных частотах CLK, но там как минимум 20 мгц, я эти данные просматривал даже у старых 5 вольтовых карточек, у MMC+ заявленая СLK как правило до 50мгц доходит . AlexBoy - спецификация, она и в африке спецификация, а SPI тут не причем.  MMC_STARTBLOCK_READ - это константа заявленная в скачаном где-то хеадере как FE. И такие исходники не по спецификации, я их просматривал и жалобы на них тоже. Поэтому и решил поискать спецификацию.
|
|
|
|
|
Apr 28 2007, 14:01
|
Участник

Группа: Свой
Сообщений: 45
Регистрация: 19-04-07
Пользователь №: 27 172

|
Цитата(zorromen @ Apr 22 2007, 21:20)  Тогда получается если 0 бит будет в середине(апаратный SPI) допустим 4й бит, то все данные за ним нужно подвинуть на 4 влево? Тогда и вправду нада програмный SPI ... Цитата Однозначно. Почитай мануал с самсунга, поймешь что я не шучу Не все так мрачно. Нулевой бит может придти любым, но это не значит, что нужно двигать данные на 4 бита  java script:emoticon(':)', 'smid_2') У меня проверка выглядит так: do Res=ShiftSPI(0xFF); while((Res==0xFF) && --cnt; Работает примерно с 20 разными типами MMC и SD на аппаратном SPI 16 МГц (не в AVR правда, а в ARM, но это без разницы)
|
|
|
|
|
Apr 29 2007, 13:24
|
Участник

Группа: Свой
Сообщений: 33
Регистрация: 29-04-07
Из: Минск
Пользователь №: 27 397

|
Max_Shaman - боюсь вы невнимательно читали документацию.
Я использовал: MultiMediaCard Product Manual, Rev. 5.2 © 2002/2003 SANDISK CORPORATION
А там есть таблица "Table 5-9. Timing Constants definitions" в которой NCR от 1 до 8 при этом единица измерения равна 8 clock cycles.
Мой MP3 плейер на ATmega отлично считывает файлы как с MMC так и с SD карточек и ни разу проблем с чтением не наблюдал.
|
|
|
|
|
Apr 29 2007, 17:03
|

Участник

Группа: Участник
Сообщений: 33
Регистрация: 21-04-07
Из: Odessa
Пользователь №: 27 227

|
Цитата(TinyQ @ Apr 29 2007, 13:24)  Max_Shaman - боюсь вы невнимательно читали документацию.
Я использовал: MultiMediaCard Product Manual, Rev. 5.2 © 2002/2003 SANDISK CORPORATION
А там есть таблица "Table 5-9. Timing Constants definitions" в которой NCR от 1 до 8 при этом единица измерения равна 8 clock cycles.
Мой MP3 плейер на ATmega отлично считывает файлы как с MMC так и с SD карточек и ни разу проблем с чтением не наблюдал. Ты сам себе противоречишь. Привет вечным студентам.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|