SPI + SD Card + Asm?

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
AlmazRa
Родился
Сообщения: 6
Зарегистрирован: Вс янв 31, 2010 18:23:24
Откуда: Омск

SPI + SD Card + Asm?

Сообщение 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 скиньте код, если не жалко?
Реклама
Fighter
Встал на лапы
Сообщения: 94
Зарегистрирован: Ср авг 01, 2007 13:32:33

Сообщение Fighter »

код выложите...
быстрее будет
Реклама
pirotehnick
Потрогал лапой паяльник
Сообщения: 327
Зарегистрирован: Пт фев 08, 2008 13:46:03
Откуда: Воронеж
Контактная информация:

Сообщение pirotehnick »

Да, пока не будет целых исходников трудно что сказать, а так проверяйте, правильно ли вы сконфигурировали SPI, для карточки SPI MODE = 3.
Я делал на асьме.
Пример брал отсюда:
http://piclist.ru/S-64MMC-PIC-RUS/S-64MMC-PIC-RUS.html
У меня всё заработало.
Если не сможете разобраться в исходниках, спрашивайте.
Вложения
MMC_prj.zip
(5.2 КБ) 441 скачивание
AlmazRa
Родился
Сообщения: 6
Зарегистрирован: Вс янв 31, 2010 18:23:24
Откуда: Омск

Сообщение 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 считывается замечательно.

Вечерком попробую, отпишусь)
Реклама
Эиком - электронные компоненты и радиодетали
AlmazRa
Родился
Сообщения: 6
Зарегистрирован: Вс янв 31, 2010 18:23:24
Откуда: Омск

Сообщение 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]
Реклама
AlmazRa
Родился
Сообщения: 6
Зарегистрирован: Вс янв 31, 2010 18:23:24
Откуда: Омск

Сообщение AlmazRa »

Внимательно просмотрел документацию и нашёл ошибку.
Я чёт не заметил, что адрес-то 32-разрядный, а у меня прописан 16-разрядный. Всё исправил всё заработало. Получаю 0х01. I'm Happy!!!))) :))
Ещё раз Вам большое СПАСИБО за ссылку и исходник :) :beer:
Реклама
kodo
Родился
Сообщения: 13
Зарегистрирован: Сб июн 12, 2010 07:27:27

Re: SPI + SD Card + Asm?

Сообщение 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 флешки спалил (в сомнениях ковырял аппаратную часть).
Исходники прилагаю и надеюсь на вашу помощь.
Вложения
MMC.rar
(7.3 КБ) 291 скачивание
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: SPI + SD Card + Asm?

Сообщение COKPOWEHEU »

С карточками дела не имел, но хочется)
Могу посоветовать 2 вещи:
1) Отформатируйте карточку как надо (файловая система fat16 / fat32 и размер кластера)
2) Попробуйте записать произвольный байт в произвольное место (не смотря на файловую систему и ее ограничения, просто по физическому адресу) и считать его. Ну может не байт а сектор или даже всю карточку заполнить чем-нибудь известным заранее и потом проверить.
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: SPI + SD Card + Asm?

Сообщение DX168B »

Искал теорию для работы с файловой системой FAT16 на ММС карточке.
Ничего не нашел. Хочу собрать модуль голосового оповещения для своего девайса,
но пока ничего не нашел. Что нибудь простое, типа закинул пару файлов waw формата с
определёнными названиями и подав например на выводы PB0...PB3 полубайт и чтобы
контроллер проиграл определённый файл, определённый полубайтом. Нашёл схему
подобной хрени на ATMEGA8 и там кроме контроллера, ММС, транзистора с динамиком и пары резисторов ни чего не надо. Только звук 8-битный, но мне больше и не надо. Там надо было мне переделать его на свой вид управления, но я бессилен с языком Си.
Мне бы побольше теории и желательно на ASMe. Помогите, кто может.
I am DX168B and this is my favourite forum on internet!
kodo
Родился
Сообщения: 13
Зарегистрирован: Сб июн 12, 2010 07:27:27

Re: SPI + SD Card + Asm?

Сообщение kodo »

Спасибо COKPOWEHEU за ответ.
По пункту 1 - пробовал, все остается так же.
По пункту 2 - еще не пробовал.
Вообще, пока интересно разобраться с чтением и не лезть в дебри записи.

DX168B

Вот описания

Архитектура файловой системы FAT
Структура диска
Азы работы с MMC

Что до практики - я сам пытаюсь разобраться в исходниках pirotehnick-а. Даже подправил их под себя.

Какие успехи - я уже написал.
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: SPI + SD Card + Asm?

Сообщение DX168B »

Спасибо, щаааас займусь... :) :)
поехали.... :write: :write: :write: :)
I am DX168B and this is my favourite forum on internet!
kodo
Родился
Сообщения: 13
Зарегистрирован: Сб июн 12, 2010 07:27:27

Re: SPI + SD Card + Asm?

Сообщение kodo »

Я, кстати, допетрил где я косого спорол.. Адрес то откуда начинать флешку читать я не указал! Сча новую подпрограмму добавляю..
pirotehnick
Потрогал лапой паяльник
Сообщения: 327
Зарегистрирован: Пт фев 08, 2008 13:46:03
Откуда: Воронеж
Контактная информация:

Re: SPI + SD Card + Asm?

Сообщение pirotehnick »

Инициализация, чтение и запись у меня работали. Единственное, моногоблочное чтение или запись не прокатывало. Я тестировал 2
флешки SD-Card на 1GB и MMC на 128Mb.
Прогу разрабатывал на основе статьи:

http://piclist.ru/S-64MMC-PIC-RUS/S-64MMC-PIC-RUS.html

Просто порой в чужих исходниках разобраться сложнее, тем более на асьме, чем написать свою прогу. Я щас уже не помню в деталях всего алгоритма.
Но если, всё же что-то будет не получаться, обращайся.
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3871
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: SPI + SD Card + Asm?

Сообщение Engineer_Keen »

Я тут тоже решил попробовать с MMC карточкой поработать, так как по глупости спалил EEPROM на 4Мбит, а новую хрен где найдешь :dont_know:

В общем ситуация такая: сброс проходит (CMD0), инициализация тоже (CMD1), устанавливаю размер блока =2 (CMD16).
Далее собственно - чтение. Посылаю CMD17, 4 байта адреса и байт CRC. Жду... Через 8 тактов приходит 0х00, типа ок, сейчас будут данные... Жду... Приходит еще 34х8 1-х битов и только потом 0хFE и долгожданные 2 байта :kill:

Это нормально? Просто когда я работал с EEPROM (AT45DB041) я слал байт команды, 3 байта адреса и мне тут же приходили данные, было очень удобно и быстро (всего 48 тактов - и 2 байта данных готовы :music: ).
Fighter
Встал на лапы
Сообщения: 94
Зарегистрирован: Ср авг 01, 2007 13:32:33

Re: SPI + SD Card + Asm?

Сообщение Fighter »

Engineer_Keen писал(а):Жду... Приходит еще 34х8 1-х битов и только потом 0хFE и долгожданные 2 байта :kill:

Это нормально?


это нормально... посмотрите доки на ММС, там пауза может быть еще больше...
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3871
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: SPI + SD Card + Asm?

Сообщение Engineer_Keen »

Тогда MMC это отстой, придется искать EEPROM :cry:
Аватара пользователя
БАТАРЕЙКУС
Потрогал лапой паяльник
Сообщения: 346
Зарегистрирован: Сб фев 07, 2009 19:21:25

Re: SPI + SD Card + Asm?

Сообщение БАТАРЕЙКУС »

Engineer_Keen писал(а):Тогда MMC это отстой, придется искать EEPROM :cry:

зато памяти гораздо больше :wink: . А многоблочное чтение у меня тож непошло почемуто :cry: хотя в протеусе всё хорошо проходит. сёдня составил asm подрограмки для чтения / записи и установки длинны блока , а также по определению длинны блока по умолчанию , работает наура вот ещё со скоростью чтения / записи разберусь и можно чтонть полезное попробовать собрать с применением ММС.

а EEPROM (AT45DB041) хорошая вещь, я сматрел в её сторону, но по русски так нечего и ненашол
Мечтатель - не тот, кто сидит на диване и думает о несбыточном, а тот, кто всеми силами стремится воплотить несбыточное в реальность.
Аватара пользователя
БАТАРЕЙКУС
Потрогал лапой паяльник
Сообщения: 346
Зарегистрирован: Сб фев 07, 2009 19:21:25

Re: SPI + SD Card + Asm?

Сообщение БАТАРЕЙКУС »

поюзал сёдня ММС 32Мбайт от ,,НОКИА 6230 ,, несколько опечалелся :cry:

всё дело в её сраных блоках которые 512 байт дело в том что записывать/считывать можно только с тачального адреса блока 512, 1024,1536..... итд. если скажем попробовать считать с середины блока (один или несколько байт)вылазиет ошибка (выход за границу-аргумент команды вне допустимых параметрах)
срань полная хотя в протеусе этих косяков нету.Чтото непонятно совсем так и должно быть с реальной флешкой или у меня какаято ошибка.

зато выяснилось что ЗАПИСЬ кластера из её буфера в её флеш мозг проходит за около 1600 мкс, а чтение из флеш мозга в буфер за около 580 мкс.
Мечтатель - не тот, кто сидит на диване и думает о несбыточном, а тот, кто всеми силами стремится воплотить несбыточное в реальность.
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3871
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: SPI + SD Card + Asm?

Сообщение Engineer_Keen »

Вся беда в том, что эту микросхему (EEPROM) теперь нигде не купить :(

Я кстати думал что считывать MMC можно с любого адреса, это записывать только с начала блока. По крайней мере я так понял из документа на нее. Если это так то, еще можно извернуться и считывать по-больше, но по-реже. А если и вправду считывать можно только с начала блока, то это совсем никуда не годится :evil:
Аватара пользователя
БАТАРЕЙКУС
Потрогал лапой паяльник
Сообщения: 346
Зарегистрирован: Сб фев 07, 2009 19:21:25

Re: SPI + SD Card + Asm?

Сообщение БАТАРЕЙКУС »

Попробовал сёдня произвести чтение с середины блока у ММС-карты нефика неполучается только с начала.
надо попробовать поюзать микро SD мож у ней полутше с этим дела обстоят. както неочень прикольно работать с такими масивами информаци, у PIC контроллеров вообще памяти столько нет чтоб считать весь кластер модифицировать несколько байтов и записать их заново.
Мечтатель - не тот, кто сидит на диване и думает о несбыточном, а тот, кто всеми силами стремится воплотить несбыточное в реальность.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»