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

Проблема с SD картой

Теперь вопрос, а что с хардварным SPI на асме делать?

На софтовом - понятно, а с хардой?

Не понятно, что подразумевается под хардварным и софтовым SPI? В чем тут разница?

Кстати, специально купили карту MMCmicro. Все работает так же как и с обычной ММС

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


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

Не понятно, что подразумевается под хардварным и софтовым SPI? В чем тут разница?

 

Софтовый алгоритм написан командами выдать в ногу порта/считать с ноги порта бит...

Хардварный (читай аппаратный) - выдвинул байт по адресу во внутренней памяти и он сам передаётся

с прерыванием по окончанию

 

Софтовый может работать на MK без аппаратного SPI

 

Кстати, специально купили карту MMCmicro. Все работает так же как и с обычной ММС

 

Одно НО не для всех карт !!!

 

Повторно привожу цитату:

Max_Shaman

Спецификация гласит что так называемый TOKEN "синхронизирующий бит начала передачи", может появляться в любой момент тактов ожидания ответа, то-есть он может быть не кратен 8-ми циклам.

Решение проблемы: надо отлавливаить не код "FE" , а всего-лишь первый нулевой бит, и по нему уже синхронизироваться, он может появляется в любое время а не так как вы его ожидаете.

Я в интернете на зарубежных форумах находил исходники с подобным неправильным способом работы с карточкой и также жалобы на неспособность работы некоторых карточек от некоторых производителей.

 

И повторно задаю вопрос: Как к этому прикрутить хардварный SPI?

(И простым языком: как пояснить МК что начало передачи сдвинулось и лежит в середине байта,

а хвост байта ещё не принят?)

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


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

как пояснить МК что начало передачи сдвинулось и лежит в середине байта,

а хвост байта ещё не принят?)

Если используется "on chip SPI" то все объяснения происходят при инциализации порта SPI. Вот пример для ADuC845:

MOV SPICON,#00110010b ;Initialise SPICON

; |||!||++-SPR0,1-частота тактовых SCLK=core/8

; |||!|+---CPHA=0 фаза: вначале бит DATA, потом в середине бит SCLK

; |||!+----CPOL=0,полярность тактов SCLK - неактивный уровень - ноль

; |||+-----SPIM=1 master mode select

; ||+------SPE=1 Enable SPI serial port

; |+-------WCOL=0 ERROR write

; +--------SPI Inerrupt flag

комментарий надо сдвинуть вправо до решетки #...

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


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

Если используется "on chip SPI" то все объяснения происходят при инциализации порта SPI.

Вы меня не поняли...

 

Карта даёт ответ В СЕРЕДИНЕ БАЙТА, и где первый бит отличный от ЕДИНИЦЫ, там и начало байта.

Вопрос КАК ЭТО ОБЬЯСНИТЬ МК?

Т.е. фактически надо произвести дополнительное тактирование и принять хвост байта...

далее опять принимать по целому байту...

 

Если есть возможность скорректировать счётчик в хардварном SPI...

или отключить SPI протактировать самому, потом включить обратно...

 

Кто уже решал и решил эту задачу?

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


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

Карта даёт ответ В СЕРЕДИНЕ БАЙТА, и где первый бит отличный от ЕДИНИЦЫ, там и начало байта.

Вопрос КАК ЭТО ОБЬЯСНИТЬ МК?

С чего вы это взяли? Любое устройство, работающее в SPI выдает информацию (т.е. биты DATA) только при получении тактовых импульсов SCLK ( один бит DATA на один такт SCLK) и никак она не может "начать давать ответ" в середине байта. А то, про что вы говорите "где первый бит отличный от ЕДИНИЦЫ, там и начало байта", похоже на UART. Посмотрите все процессы по 2-х канальному осцилу, а иначе не будет Вам щастья :)

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


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

С чего вы это взяли? Любое устройство, работающее в SPI выдает информацию (т.е. биты DATA) только при получении тактовых импульсов SCLK ( один бит DATA на один такт SCLK) и никак она не может "начать давать ответ" в середине байта.

 

В любой доке на ММС или SD посмотрите описание Ncr

А после прочтения станет ясно что:

Ncr - измеряется не в байтах, а в CLOCK CYCLE - а это в переводе означает один такт CLK на шине SPI.

 

Подробно тут:

http://electronix.ru/forum/index.php?showt...633?entry243656

 

а иначе не будет Вам щастья :)

При ответе счастье - это когда твой ответ с мануалом не расходится :twak:

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


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

В любой доке на ММС или SD посмотрите описание Ncr

А после прочтения станет ясно что:

Ncr - измеряется не в байтах, а в CLOCK CYCLE - а это в переводе означает один такт CLK на шине SPI.

 

Полный бред, не вводите в заблуждение если сами не читали или не понимаете

Спецификация на SD

...

While the SD Memory Card channel is based on command and data bit streams which are initiated

by a start bit and terminated by a stop bit, the SPI channel is byte oriented. Every command or data

block is built of 8-bit bytes and is byte aligned to the CS signal (i.e. the length is a multiple of 8 clock

cycles).

...

Таблица Timing Values

Ncr - Unit - 8 clock cycles

...

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


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

В любой доке на ММС или SD посмотрите описание Ncr

А после прочтения станет ясно что:

Ncr - измеряется не в байтах, а в CLOCK CYCLE - а это в переводе означает один такт CLK на шине SPI.

Прошла по ссылке. Там как раз и пинают за эту путаницу :). Все задержки, в т.ч. и Ncr измеряются именно в байтах. Обратите внимание на цифру 8 перед CLOCK CYCLE. Не может аппаратный SPI работать с циклами не кратными байту (т.е. 8 бит). Мне не попадалось... Итак для задержки нужно послать N-ое количество "пустых БАЙТ (0хFF)". Для Ncr это число от 0 до 8. Это означает, что если отклик после посылки 8-го пустого байта не пришел, то его уже не будет. Кстати "пустой" байт посылается не столько для задержки, а для того чтобы Мaster SPI (в Вашем случае это РС) послал тактовые импульсы Slave SPI (это FLASH карта) и с их помощью получил отклик. Если вы не пошлете пустой байт, то отклик не получите ни под каким видом, потому,что SPI - это СИНХРОННЫЙ интерфейс. И не хмурьте лоб на смайлике, лучше его наморщите :-)

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


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

Полный бред, не вводите в заблуждение если сами не читали или не понимаете

Спецификация на SD

 

Всех датащитов на флеши не читал, но с десяток изучил...

 

While the SD Memory Card channel is based on command and data bit streams which are initiated

by a start bit and terminated by a stop bit, the SPI channel is byte oriented. Every command or data

block is built of 8-bit bytes and is byte aligned to the CS signal (i.e. the length is a multiple of 8 clock

cycles).

Ну и что?

И чем это противоречит?

Токен FE для ловли начала и предназначен...

 

Таблица Timing Values

Ncr - Unit - 8 clock cycles

 

Написано же НЕ У ВСЕХ производителей он КРАТЕН 8...

Из спецификации на SD С.т. 4-46 таблица 4-24 "Timing Values"

 

NCR

Min - 2 Clock cycles

Max - 64 Clock cycles

 

Страницу прикладываю...

 

Прошла по ссылке. Там как раз и пинают за эту путаницу :). Все задержки, в т.ч. и Ncr измеряются именно в байтах. Обратите внимание на цифру 8 перед CLOCK CYCLE. Не может аппаратный SPI работать с циклами не кратными байту (т.е. 8 бит).

 

Во во поэтому они гибрид и делали (ловили софтово, а принимали хардварно)

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


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

Всех датащитов на флеши не читал, но с десяток изучил...

...

Страницу прикладываю..

Как говорят: смотришь в книгу а видишь фигу :07:

Вы точно чего то не дочитали

у SD есть два режима - родной SD в котором действительно битовая синхронизация и SPI - в котором только байтовая.

вы привели как раз как раз таблицу для родного SD режима (в котором и эффективно работать можно только с SD контроллером).

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

И если у когото и вылезла она в середине байта, то это из за мягко сказать неумелости - карта не переведена в режим SD или сбои по фронтам линии clock. Только и всего.

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


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

Вот и у меня, ребята назрел снова вопрос. Не буду добивать вас какой-то ерундой, у меня всё конкретно.

После инициализации карты шлём команду CMD18 и начинаем непрерывно считать байтики. Вот в порыве своей идеи я и забыл про CRC и мой DAC стал озвучивать и эту ахинею :).

Т.е. картина после посылки CMD18 такая:

Block 512 byte - CRC - CRC - Block 512 byte - CRC - CRC - Block 512 byte - CRC - CRC........ и т.д.

Так оно и есть.

 

Вопрос следующий: как отключить эти CRC, чтобы посылки имели вид:

Block 512 byte - Block 512 byte - Block 512 byte....

 

Из буржуйского даташита вычитал, что есть такая команда, как CMD59, но вот её подробное описание не удосужились привести...

Кто что знает?

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


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

Вопрос следующий: как отключить эти CRC, чтобы посылки имели вид:

Block 512 byte - Block 512 byte - Block 512 byte....

 

Так как время между посылками в звуковой цап или шим при оцифровке звука 16кГц составляет 65мкС - Вы спокойно успеете прочитать два CRC. Правда, если Вы используете 51 кристалл надо все просчитать - может понадобится снизить частоту оцифровки до 8 кГц (125 мкС).

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


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

Так как время между посылками в звуковой цап или шим при оцифровке звука 16кГц составляет 65мкС - Вы спокойно успеете прочитать два CRC. Правда, если Вы используете 51 кристалл надо все просчитать - может понадобится снизить частоту оцифровки до 8 кГц (125 мкС).

 

Не всё так просто. Я на своём AT89C2051 решил вытянуть все 22 кГц! И это получилось. Почти :))

Звук проигрывается, но со щелчками. Я встал ослом на выход ЦАПа и узнал характер этих щелчков - это те самые 2 байта CRC.

Так вот, для проигрывания 22 кГц, 8 бит мне пришлось поставить кварц 20 МГц (у 2051 на один такт уходит 12 циклов кварца, в итоге имеем реальную частоту 1,67 МГц, если бы это был AVR).

И со всеми этими условиями программка работает впритык, т.е не всунешь туда ещё пару строк.

Даже для этого мне пришлось ужать цикл воспроизведения 1 байта хитрым способом. ЦАП у меня 12 бит, поставил то, что было под рукой. Реально значат только старшие 8 бит, остальные 4 нули.

У DAC7513 цикл состоит из 16 бит: x-x-0-0-bit12-bit11-.....-bit0.

В рамках этой схемы всё получилось впритык, и эти 2 байта CRC всё портят. Сегодня попробую их просто не читать (16 clock на карточке и всё), но тогда появится ступенька в фонограмме. Но это лучше, чем щелчки.

Отпишусь о результатах.

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


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

Не всё так просто. Я на своём AT89C2051 решил вытянуть все 22 кГц! И это получилось. Почти :))

Звук проигрывается, но со щелчками. Я встал ослом на выход ЦАПа и узнал характер этих щелчков - это те самые 2 байта CRC.

Так вот, для проигрывания 22 кГц, 8 бит мне пришлось поставить кварц 20 МГц (у 2051 на один такт уходит 12 циклов кварца, в итоге имеем реальную частоту 1,67 МГц, если бы это был AVR).

И со всеми этими условиями программка работает впритык, т.е не всунешь туда ещё пару строк.

Даже для этого мне пришлось ужать цикл воспроизведения 1 байта хитрым способом. ЦАП у меня 12 бит, поставил то, что было под рукой. Реально значат только старшие 8 бит, остальные 4 нули.

У DAC7513 цикл состоит из 16 бит: x-x-0-0-bit12-bit11-.....-bit0.

В рамках этой схемы всё получилось впритык, и эти 2 байта CRC всё портят. Сегодня попробую их просто не читать (16 clock на карточке и всё), но тогда появится ступенька в фонограмме. Но это лучше, чем щелчки.

Отпишусь о результатах.

 

Честно говоря я бы в Вашей задаче заменил AT89C2051 на Tiny2313 - по ногам совпадает

плюсы:

-питание 3В

- малое потребление в слипе

-внутренний генератор 8 мГц

-не нужен внешний ЦАП - звук можно вывести на 8-ми битный шим (их там четыре) + 1резистор и конденсатор - звук получается хороший (проверено)

- и лично для меня большой плюс - любимая среда разработки - Алгоритм билдер (до 2К компилирует не зарегистрированная версия)

не сочтите за рекламу АВРов - 51 серию тоже регулярно пользую

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


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

Честно говоря я бы в Вашей задаче заменил AT89C2051 на Tiny2313 - по ногам совпадает

плюсы:

-питание 3В

- малое потребление в слипе

-внутренний генератор 8 мГц

-не нужен внешний ЦАП - звук можно вывести на 8-ми битный шим (их там четыре) + 1резистор и конденсатор - звук получается хороший (проверено)

- и лично для меня большой плюс - любимая среда разработки - Алгоритм билдер (до 2К компилирует не зарегистрированная версия)

не сочтите за рекламу АВРов - 51 серию тоже регулярно пользую

 

На тини это чудо техники сделать - раз плюнуть! Там быстродействие всё покроет и все дыры залатает.

Весь смысл в том, чтобы сделать это на AT89C2051. Проект не коммерческий, строится исключительно на энтузиазме. Поймите меня правильно.

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


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

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

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

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

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

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

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

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

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

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