Страница 1 из 3
SPI + SD Card + Asm?
Добавлено: Вс янв 31, 2010 18:48:57
AlmazRa
Собрал устройство подобное
http://www.dharmanitech.com/2009/01/sd- ... fat32.html (прошивка с нуля своя)
На комп отсылается все что уходит и затем приходит по SPI...
обрботка SPI:
SPI_WR: ;в R16 байт для SPI
rcall USART_Transmit ;отсылает то что в R16
out SPDR,R16
wait:
sbis SPSR,SPIF
rjmp wait
in R16,SPDR
rcall USART_Transmit
ret
Так вот постоянно приходит "0"?!
По описанию
http://piclist.ru/S-MMC-SD-Cards-RUS/S- ... s-RUS.html - с DO SDкарточки всегда идёт 1.
(RS232 точно работает, отсылаются модельные данные)
Не вдаваясь в подробности приходит всегда 0 и даже если карту отключить, то тоже 0. (SD Adaptor + microSD)
Порт сконфигурирован
DDRB=0b11101111
PORTB=0b11101111
т.е. вход тока B4=MISO
Инициализация SPI
ldi R16,(1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0)
1.Почему всегда 0 приходит на SPI? Так и должно быть? (раньше никогда со SPI не работал, а примеры везде с карточками на Си)
2.Правильно ли написана инициализация самого SPI для SPI + SD?
3.Может кто делал такую сборку на ASM'e скиньте код, если не жалко?
Добавлено: Вс янв 31, 2010 19:50:20
Fighter
код выложите...
быстрее будет
Добавлено: Пн фев 01, 2010 01:21:37
pirotehnick
Да, пока не будет целых исходников трудно что сказать, а так проверяйте, правильно ли вы сконфигурировали SPI, для карточки SPI MODE = 3.
Я делал на асьме.
Пример брал отсюда:
http://piclist.ru/S-64MMC-PIC-RUS/S-64MMC-PIC-RUS.html
У меня всё заработало.
Если не сможете разобраться в исходниках, спрашивайте.
Добавлено: Пн фев 01, 2010 04:30:27
AlmazRa
Спасибо. Пока заметил
у вас:
ldi r16, (1<<SPE|1<<MSTR|1<<CPOL|1<<CPHA)
вместо своего:
ldi R16,(1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0)
Про SPI MODE 3 я как-то не подумал. Полярность и фаза, наверное, важные штуки)))
Вы делали подтгивающий резистор на вход MOSI к питанию (SDI на Вашей схеме) или так считывало 0xFF при свободной ноге? Я проверил вчера. Если подсоеденить этот выход через резистор на питание, то 0xFF из SPDR считывается замечательно.
Вечерком попробую, отпишусь)
Добавлено: Пн фев 01, 2010 18:26:18
AlmazRa
1.Неа... Нет ответа от флешки.
2.Думал в самой microSD'шке дело (вроде как новая и относительно большой емкости, думал нет поддержки SPI). Попробывал на 3х разных (64Mb,1024Mb,2048Mb). Никакого результата.
3.Подпаял подтягивающий к питанию (12k). Стало приходить 0xFF со SPI. Но после комманды 0x40 0x00 0x00 0x95 0xFF так ничего и не пришло, а должно быть 0x01 когда нибудь.... Я правильно понимаю?
4.Код:
(Atmega8 + microSD + internal 4MHz RC + Vcc=3.3V)
;----------
;тестовая подпрограмма для проверки контрольных точек и общей работы USART
send_ok:
ldi R16,123
rcall USART_Transmit
ret
;----------
;----------
SPI_Init:
;SCK=B5;MISO=B4;MOSI=B3;SS=B2
ldi R16,0b11101111
out DDRB,R16
out PORTB,R16
ldi R16,(1<<SPE)|(1<<MSTR)|(1<<CPHA)|(1<<CPOL)
out SPCR,R16
cbi PORTB,2
ret
;----------
;----------
SPI_WR:
rcall USART_Transmit
out SPDR,R16
Wait_SPI_WR:
sbis SPSR,SPIF
rjmp Wait_SPI_WR
in R16,SPDR
rcall USART_Transmit
ret
;----------
;----------
SD_Command:
;R16-Command
;R17-AdrH
;R18-AdrL
;R19-CRC
;R16-recieved
;Command
rcall SPI_WR
;AdrH
mov R16,R17
rcall SPI_WR
;AdrL
mov R16,R18
rcall SPI_WR
;CRC
mov R16,R19
rcall SPI_WR
;First after CRC byte
ldi R16,0xFF
rcall SPI_WR
ret
;----------
;----------
SD_Wait:
ldi R16,0xFF
rcall SPI_WR
cpi R16,0xFF
breq SD_Wait
ret
;----------
;----------
SD_Init:
;disable SD
sbi PORTB,2
ldi R17,255
rep_SDI:rcall Delay_ms
ldi R16,0xFF
rcall SPI_WR
dec R17
brne rep_SDI
;enable SD
cbi PORTB,2
rcall send_ok
;CMD_Reset_CMD0
ldi R16,0x40
ldi R17,0x00
ldi R18,0x00
ldi R19,0x95
rcall SD_Command
rcall send_ok
;жду байт не равный 0xFF... А ЕГО НЕТ!!!!!!!! (ждал более 100 000 0xFF)
rcall SD_Wait
cpi R16,0x01
brne exit_SDI
;.... тут было продолжение, но это не важно
exit_SDI:
ret
;----------[/b]
Добавлено: Пн фев 01, 2010 19:06:01
AlmazRa
Внимательно просмотрел документацию и нашёл ошибку.
Я чёт не заметил, что адрес-то 32-разрядный, а у меня прописан 16-разрядный. Всё исправил всё заработало. Получаю 0х01. I'm Happy!!!)))
Ещё раз Вам большое СПАСИБО за ссылку и исходник

Re: SPI + SD Card + Asm?
Добавлено: Сб июн 12, 2010 19:12:26
kodo
Здравствуйте уважаемые коты!
Я новичок. И в радиолюбительстве и на форуме. Так сказать, с корабля и сразу на бал..
Трабла вот какая: собрал схему atmega8+sdcard (все вроде правильно, схема вот от седава
http://robozone.su/2008/10/22/modul-dlja-pokljuchenija-sdmmc-kart-pamjati.html) и решил таки попробовать исходники
pirotehnick-а в образовательных целях.
Малость их поправил. Закоментил инициализацию USART-а (у меня на порту D висит индикатор) и добавил макрос на отображение чисел на индикаторе.
Грубо говоря, каждый этап - цифера или текст на индикаторе. Запустил, а девайс мне "ок!"
Не сразу обнаружил вот какую проблему исходников
pirotehnick-а: в случае если в USART все таки вываливается ответ типа MSG_MMC_FAILED, то прога все равно выполняется дальше
(!). Двое суток голову ломал от чего же, если выдает что все ОК, а на деле - не ок..Сегодня нашел. Подправил текст так, что бы в случае неудачной инициализации происходил reset. Тогда все начинается заново, до тех пор, пока карточка не ответит.
Осцилом щупал ноги, там все ок (правда осцил ОЛМ-3М [У]).
В общем, инициализацию делает. Пытаюсь прочитать. При передаче команды на чтение огрызается что MSG_MMC_READ_FAILED. Т.к. USART возможности за юзать нет, то втыкнул подпрограмму command_mmc_transmit1. В ней реализовал запись ответа в EEPROM, и вот что он мне выдал..
Код: Выделить всё
:10000000FFFFFFFFFFFFFFFF20FFFF08FFFFFFFFD6
:10001000FF20FFFF08FFFFFFFFFF20FFFF08FFFF9C
:10002000FFFFFF20FFFF08FFFFFFFFFF20FFFF088C
:10003000FFFFFFFFFF20000000000000000000FFA6
:10004000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0
:10005000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0
:10006000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0
:10007000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90
:10008000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80
:10009000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70
:1000A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60
:1000B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50
:1000C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40
:1000D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30
:1000E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20
:1000F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10
:10010000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
:10011000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF
:10012000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF
:10013000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF
:10014000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF
:10015000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF
:10016000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F
:10017000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F
:10018000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F
:10019000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F
:1001A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F
:1001B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F
:1001C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F
:1001D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F
:1001E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F
:1001F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F
:00000001FF
Насколько я понял, тут зашифрованы коды ошибок, а именно: 08 - Ошибка CRC - последняя принятая команда не прошла проверку CRC, и 20 - Ошибка адреса - блок пересекает границу физического сектора. Вот собственно и все.. Куда дальше копать и в чем причина - ума не приложу. Уже 2 флешки спалил (в сомнениях ковырял аппаратную часть).
Исходники прилагаю и надеюсь на вашу помощь.
Re: SPI + SD Card + Asm?
Добавлено: Вт июн 15, 2010 21:08:31
COKPOWEHEU
С карточками дела не имел, но хочется)
Могу посоветовать 2 вещи:
1) Отформатируйте карточку как надо (файловая система fat16 / fat32 и размер кластера)
2) Попробуйте записать произвольный байт в произвольное место (не смотря на файловую систему и ее ограничения, просто по физическому адресу) и считать его. Ну может не байт а сектор или даже всю карточку заполнить чем-нибудь известным заранее и потом проверить.
Re: SPI + SD Card + Asm?
Добавлено: Вт июн 15, 2010 21:50:00
DX168B
Искал теорию для работы с файловой системой FAT16 на ММС карточке.
Ничего не нашел. Хочу собрать модуль голосового оповещения для своего девайса,
но пока ничего не нашел. Что нибудь простое, типа закинул пару файлов waw формата с
определёнными названиями и подав например на выводы PB0...PB3 полубайт и чтобы
контроллер проиграл определённый файл, определённый полубайтом. Нашёл схему
подобной хрени на ATMEGA8 и там кроме контроллера, ММС, транзистора с динамиком и пары резисторов ни чего не надо. Только звук 8-битный, но мне больше и не надо. Там надо было мне переделать его на свой вид управления, но я бессилен с языком Си.
Мне бы побольше теории и желательно на ASMe. Помогите, кто может.
Re: SPI + SD Card + Asm?
Добавлено: Ср июн 16, 2010 04:55:00
kodo
Спасибо
COKPOWEHEU за ответ.
По пункту 1 - пробовал, все остается так же.
По пункту 2 - еще не пробовал.
Вообще, пока интересно разобраться с чтением и не лезть в дебри записи.
DX168BВот описания
Архитектура файловой системы FATСтруктура дискаАзы работы с MMCЧто до практики - я сам пытаюсь разобраться в исходниках
pirotehnick-а. Даже подправил их под себя.
Какие успехи - я уже написал.
Re: SPI + SD Card + Asm?
Добавлено: Ср июн 16, 2010 15:19:49
DX168B
Re: SPI + SD Card + Asm?
Добавлено: Ср июн 16, 2010 16:50:28
kodo
Я, кстати, допетрил где я косого спорол.. Адрес то откуда начинать флешку читать я не указал! Сча новую подпрограмму добавляю..
Re: SPI + SD Card + Asm?
Добавлено: Чт июн 17, 2010 19:21:32
pirotehnick
Инициализация, чтение и запись у меня работали. Единственное, моногоблочное чтение или запись не прокатывало. Я тестировал 2
флешки SD-Card на 1GB и MMC на 128Mb.
Прогу разрабатывал на основе статьи:
http://piclist.ru/S-64MMC-PIC-RUS/S-64MMC-PIC-RUS.htmlПросто порой в чужих исходниках разобраться сложнее, тем более на асьме, чем написать свою прогу. Я щас уже не помню в деталях всего алгоритма.
Но если, всё же что-то будет не получаться, обращайся.
Re: SPI + SD Card + Asm?
Добавлено: Пт июн 18, 2010 14:25:22
Engineer_Keen
Я тут тоже решил попробовать с MMC карточкой поработать, так как по глупости спалил EEPROM на 4Мбит, а новую хрен где найдешь
В общем ситуация такая: сброс проходит (CMD0), инициализация тоже (CMD1), устанавливаю размер блока =2 (CMD16).
Далее собственно - чтение. Посылаю CMD17, 4 байта адреса и байт CRC. Жду... Через 8 тактов приходит 0х00, типа ок, сейчас будут данные... Жду... Приходит еще 34х8 1-х битов и только потом 0хFE и долгожданные 2 байта
Это нормально? Просто когда я работал с EEPROM (AT45DB041) я слал байт команды, 3 байта адреса и мне тут же приходили данные, было очень удобно и быстро (всего 48 тактов - и 2 байта данных готовы

).
Re: SPI + SD Card + Asm?
Добавлено: Пт июн 18, 2010 16:27:33
Fighter
Engineer_Keen писал(а):Жду... Приходит еще 34х8 1-х битов и только потом 0хFE и долгожданные 2 байта
Это нормально?
это нормально... посмотрите доки на ММС, там пауза может быть еще больше...
Re: SPI + SD Card + Asm?
Добавлено: Пт июн 18, 2010 16:34:34
Engineer_Keen
Тогда MMC это отстой, придется искать EEPROM

Re: SPI + SD Card + Asm?
Добавлено: Сб июн 19, 2010 00:43:24
БАТАРЕЙКУС
Engineer_Keen писал(а):Тогда MMC это отстой, придется искать EEPROM

зато памяти гораздо больше

. А многоблочное чтение у меня тож непошло почемуто

хотя в протеусе всё хорошо проходит. сёдня составил asm подрограмки для чтения / записи и установки длинны блока , а также по определению длинны блока по умолчанию , работает наура вот ещё со скоростью чтения / записи разберусь и можно чтонть полезное попробовать собрать с применением ММС.
а EEPROM (AT45DB041) хорошая вещь, я сматрел в её сторону, но по русски так нечего и ненашол
Re: SPI + SD Card + Asm?
Добавлено: Сб июн 19, 2010 21:03:58
БАТАРЕЙКУС
поюзал сёдня ММС 32Мбайт от ,,НОКИА 6230 ,, несколько опечалелся
всё дело в её сраных блоках которые 512 байт дело в том что записывать/считывать можно только с тачального адреса блока 512, 1024,1536..... итд. если скажем попробовать считать с середины блока (один или несколько байт)вылазиет ошибка (выход за границу-аргумент команды вне допустимых параметрах)
срань полная хотя в протеусе этих косяков нету.Чтото непонятно совсем так и должно быть с реальной флешкой или у меня какаято ошибка.
зато выяснилось что ЗАПИСЬ кластера из её буфера в её флеш мозг проходит за около 1600 мкс, а чтение из флеш мозга в буфер за около 580 мкс.
Re: SPI + SD Card + Asm?
Добавлено: Вс июн 20, 2010 16:47:54
Engineer_Keen
Вся беда в том, что эту микросхему (EEPROM) теперь нигде не купить
Я кстати думал что считывать MMC можно с любого адреса, это записывать только с начала блока. По крайней мере я так понял из документа на нее. Если это так то, еще можно извернуться и считывать по-больше, но по-реже. А если и вправду считывать можно только с начала блока, то это совсем никуда не годится

Re: SPI + SD Card + Asm?
Добавлено: Вс июн 20, 2010 21:45:26
БАТАРЕЙКУС
Попробовал сёдня произвести чтение с середины блока у ММС-карты нефика неполучается только с начала.
надо попробовать поюзать микро SD мож у ней полутше с этим дела обстоят. както неочень прикольно работать с такими масивами информаци, у PIC контроллеров вообще памяти столько нет чтоб считать весь кластер модифицировать несколько байтов и записать их заново.