Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: SD Card - програмная реализация интерфейса
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Страницы: 1, 2, 3, 4, 5
Andrei....
У кого нибудь есть примеры реализации взаимодействия с SD Card? Хотелось бы взглянуть.
aaarrr
Желательно под EP93xx. Угадал? smile.gif
etoja
Я делал полную реализацию работы с MMС карточками памяти.
MMC включена в режиме SPI. Поддерживается файловая система FAT16.
Для пользователя реализованы функции поиска файла по имени, чтения и записи файла.
Мои услуги будут платными.
aaarrr
Цитата(etoja @ Dec 28 2006, 16:32) *
Мои услуги будут платными.

А мои - бесплатными. cool.gif Новый год, все-таки. santa2.gif.
Вот оно - Нажмите для просмотра прикрепленного файлаПишите, если будут вопросы.
Doka
Цитата(etoja @ Dec 28 2006, 16:32) *
Мои услуги будут платными.

вот еще докучи хорошая и бесплатная файловая система Embedded Filesystems Library
Pat
Цитата(Doka @ Dec 28 2006, 22:13) *
вот еще докучи хорошая и бесплатная файловая система Embedded Filesystems Library


Уважаемые.
Я конечно извиняюсь, но подскажите ни разу не грамотному.

Я правильно понимаю, что если отформатировать при помощи этой файловой системы SD карточку,
то эту карточку можно будет прочитать в любом карт ридере в том же WinXP.
el34
Цитата(Doka @ Dec 28 2006, 23:13) *
Цитата(etoja @ Dec 28 2006, 16:32) *
Мои услуги будут платными.

вот еще докучи хорошая и бесплатная файловая система Embedded Filesystems Library

бесплатно
Interfacing Philips LPC2000 ARM7TDMI-S with memory-cards (SD/MMC)
и
Interfacing ATMEL AT91SAM7S ARM7TDMI with memory-cards (SD/MMC)
_http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/index.html
KostyantynT
Посмотри
http://sourceforge.net/projects/efsl
etoja
В файле "sd_spi_ep93xx.rar ", присланном aaarrr нет файловой системы. Есть только
функции чтения и записи блока.
Doka
Цитата(etoja @ Dec 29 2006, 07:43) *
В файле "sd_spi_ep93xx.rar ", присланном aaarrr нет файловой системы. Есть только функции чтения и записи блока.

внимательно читаем топик:
Цитата
> SD Card - програмная реализация интерфейса, У кого нибудь есть примеры реализации взаимодействия с SD Card?
etoja
Doka, подумай хотя бы на один ход вперёд.
Doka
Цитата(etoja @ Dec 29 2006, 10:42) *
Doka, подумай хотя бы на один ход вперёд.
^
Цитата(Doka @ Dec 28 2006, 23:13) *
вот еще докучи хорошая и бесплатная файловая система Embedded Filesystems Library
dm_mur
Флеш File System от PRLLC. Есть в местных закромах. Файловая система + интерфейс с SD
Andrei....
Цитата(aaarrr @ Dec 28 2006, 16:50) *
А мои - бесплатными. cool.gif Новый год, все-таки. santa2.gif.
Вот оно - Нажмите для просмотра прикрепленного файлаПишите, если будут вопросы.

спасибо за файлы, пытаюсь разобраться...как я понимаю у вас sd-карта переводится в spi-mode посредством последовательности команд CMD0,CMD1,CMD59 и далее происходит работа в этом режиме.
вопрос: изначально, при включении питания sd-карта ведь находится в sd-режиме? и я могу работать в нём? и инициализационная последовательность в этом случае будет ACMD41, CMD2, CMD3? я правильно понимаю?
aaarrr
Цитата(Andrei.... @ Jan 9 2007, 13:49) *
вопрос: изначально, при включении питания sd-карта ведь находится в sd-режиме? и я могу работать в нём? и инициализационная последовательность в этом случае будет ACMD41, CMD2, CMD3? я правильно понимаю?

Да, стартует карта в SD-режиме, и последовательность инициализации будет именно такой. А какое железо используется, на борту есть контроллер SD? С программной эмуляцией SD-режима я бы не связывался.
Andrei....
Цитата(aaarrr @ Jan 9 2007, 13:59) *
Цитата(Andrei.... @ Jan 9 2007, 13:49) *

вопрос: изначально, при включении питания sd-карта ведь находится в sd-режиме? и я могу работать в нём? и инициализационная последовательность в этом случае будет ACMD41, CMD2, CMD3? я правильно понимаю?

Да, стартует карта в SD-режиме, и последовательность инициализации будет именно такой. А какое железо используется, на борту есть контроллер SD? С программной эмуляцией SD-режима я бы не связывался.

всё то же самое - ep9307, а с програмной реализацией я уже связался (D[0:3],CMD,CLK всё завёл на PortB), Да кстати, команда ACMD41 ведь состоит из последовательности CMD55, CMD41...поэтому на данном этапе я посылаю CMD55 и жду ответа r1...но карта ничего не отвечает.
aaarrr
Цитата(Andrei.... @ Jan 9 2007, 14:50) *
всё то же самое - ep9307, а с програмной реализацией я уже связался (D[0:3],CMD,CLK всё завёл на PortB)

Интересно будет узнать, что из этого получится.
CRC данных там шибко неудобно считать - нужно вычислить CRC16 для потока по каждой линии отдельно, если правильно помню. Можно все скопом, но придется написать извращенную функцию.

Цитата(Andrei.... @ Jan 9 2007, 14:50) *
Да кстати, команда ACMD41 ведь состоит из последовательности CMD55, CMD41...поэтому на данном этапе я посылаю CMD55 и жду ответа r1...но карта ничего не отвечает.

А CMD0 подать не забыли? Без нее ничего работать не будет.
Andrei....
Цитата(aaarrr @ Jan 9 2007, 14:58) *
Цитата(Andrei.... @ Jan 9 2007, 14:50) *

Да кстати, команда ACMD41 ведь состоит из последовательности CMD55, CMD41...поэтому на данном этапе я посылаю CMD55 и жду ответа r1...но карта ничего не отвечает.

А CMD0 подать не забыли? Без нее ничего работать не будет.

вон оно что выясняется...никакое CMD0 не подаю, дак CMD0 же переводит в SPI-режим или в Idle State, а ведь изначально карта находится в Idle State, ну я ничего и не подаю - включил питание и CMD55 туда!
sff
Цитата(Andrei.... @ Jan 9 2007, 15:43) *
вон оно что выясняется...никакое CMD0 не подаю, дак CMD0 же переводит в SPI-режим или в Idle State

CMD0 переводит исключительно в Idle State
А вот CMD1 это уже SEND_OP_COND.

Откуда такая уверенность что карточка изначально в Idle State, может в sleep mode неходится
aaarrr
Цитата(Andrei.... @ Jan 9 2007, 15:43) *
дак CMD0 же переводит в SPI-режим или в Idle State, а ведь изначально карта находится в Idle State, ну я ничего и не подаю - включил питание и CMD55 туда!

В SPI-режим карта переводится подачей CMD0 только при низком уровне CS. Кроме того, после включения карте нужно подать ~80 пустых циклов CLK.
В Вашем случае еще понадобится включить четырехбитный режим - ACMD6.

Цитата(sff @ Jan 9 2007, 16:08) *
Откуда такая уверенность что карточка изначально в Idle State, может в sleep mode неходится

По спецификации это действительно так. Однако, жизнь порой преподносит сюрпризы.
Andrei....
Цитата(sff @ Jan 9 2007, 16:08) *
Цитата(Andrei.... @ Jan 9 2007, 15:43) *

вон оно что выясняется...никакое CMD0 не подаю, дак CMD0 же переводит в SPI-режим или в Idle State

CMD0 переводит исключительно в Idle State
А вот CMD1 это уже SEND_OP_COND.

Откуда такая уверенность что карточка изначально в Idle State, может в sleep mode неходится


Ещё раз посмотрел док-ию, после power up она действительно находится в idle state.
Кстати посылка сначала команды CMD0 не изменяет ситуацию. (на следущую за ней CMD55, по прежнему не отвечает, точнее я пока смотрю только стартовый 0-бит, линия CMD глухо висит в 1)
aaarrr
Цитата(Andrei.... @ Jan 9 2007, 16:21) *
Кстати посылка сначала команды CMD0 не изменяет ситуацию. (на следущую за ней CMD55, по прежнему не отвечает, точнее я пока смотрю только стартовый 0-бит, линия CMD глухо висит в 1)

Должна сначала ответить на CMD0. "Пустые" клоки после старта подаются? Как долго ждете ответ на команду?
Andrei....
Цитата(aaarrr @ Jan 9 2007, 16:16) *
Кроме того, после включения карте нужно подать ~80 пустых циклов CLK.
В Вашем случае еще понадобится включить четырехбитный режим - ACMD6.


~80 пустых циклов CLK на полёт не повлияло...а до четырёхбитного режима надо ещё дожить smile.gif)

Цитата(aaarrr @ Jan 9 2007, 16:28) *
Должна сначала ответить на CMD0. "Пустые" клоки после старта подаются? Как долго ждете ответ на команду?


СТОП!!! Команда CMD0 ведь без ответа!
А после CMD55 клок идёт постоянно (пока не возникнет стартовый бит ответа)... а может у меня чего то с полярностью клока, как я понимаю у CLK активный уровень 1, долно быть что типа такого:
#define SDCLK PBDR_bit.PxDATA0 /* PortB.0 */
#define SDCMD PBDR_bit.PxDATA1 /* PortB.1 */
...
SDCMD=cmd_bit;
SDCLK=1;
Sleep(10);
SDCLK=0;
Sleep(10);
...
sff
Да немного запамятствовал я..

Цитата(Andrei.... @ Jan 9 2007, 16:35) *
СТОП!!! Команда CMD0 ведь без ответа!

Это в режиме SD CMD0 без ответа, а вот в SPI ответ R1 smile.gif

А вы уверены что у вас CRC7 правильно рассчитывается, ведь если на карточки проверка не прошла то она ничего и не отвечает.
Andrei....
Цитата(sff @ Jan 9 2007, 17:18) *
Да немного запамятствовал я..

Цитата(Andrei.... @ Jan 9 2007, 16:35) *

СТОП!!! Команда CMD0 ведь без ответа!

Это в режиме SD CMD0 без ответа, а вот в SPI ответ R1 smile.gif

А вы уверены что у вас CRC7 правильно рассчитывается, ведь если на карточки проверка не прошла то она ничего и не отвечает.


да, crc7 считается правильно, используется процедура любезно присланная aaarrr (сомневаться в правильности не приходится)
Andrei....
To aaarrr:

У вас присутствуют такие строки в примере:
...
SSP1CPSR = 0x02; // 7.3728MHz
SSP1CR0 = 0xc7; // SPI Mode 3
...
Это означает SSPCLKout=283kHz?
aaarrr
Цитата(Andrei.... @ Jan 9 2007, 16:35) *
СТОП!!! Команда CMD0 ведь без ответа!

Да, это в SPI режиме есть ответ, как уже заметили.

Цитата(Andrei.... @ Jan 9 2007, 16:35) *
а может у меня чего то с полярностью клока, как я понимаю у CLK активный уровень 1

Данные защелкиваются по фронту, а выставляются картой по спаду CLK.

Цитата(Andrei.... @ Jan 9 2007, 17:43) *
To aaarrr:

У вас присутствуют такие строки в примере:
...
SSP1CPSR = 0x02; // 7.3728MHz
SSP1CR0 = 0xc7; // SPI Mode 3
...
Это означает SSPCLKout=283kHz?

Это ошибка - SSPCLKout будет 3.6864MHz.
Andrei....
Похоже всё заработало, запутка была в том что я байты не в той последовательности отправлял smile.gif
Однако, возвращаясь к вопросу о ~80 пустых циклах, где сказано что их нужно отправлять (выяснилось что они влияют на полёт). Я так полагал, что достаточно поставить 8 clk перед отправкой любой команды, и это уже позволяеет выдержать все тайминги между командами и ответами.
sff
Цитата(Andrei.... @ Jan 10 2007, 12:04) *
Однако, возвращаясь к вопросу о ~80 пустых циклах, где сказано что их нужно отправлять (выяснилось что они влияют на полёт). Я так полагал, что достаточно поставить 8 clk перед отправкой любой команды, и это уже позволяеет выдержать все тайминги между командами и ответами.

Если быть точным то там сказано 74 такта. Раздел Power-Up
Цитата
After power up, the host starts the clock and sends the initializing sequence on the CMD line. This sequence is a
contiguous stream of logical ‘1’s. The sequence length is the maximum of 1msec, 74 clocks or the supply-ramp-uptime;
the additional 10 clocks (over the 64 clocks after what the card should be ready for communication) is
provided to eliminate power-up synchronization problems.
Andrei....
почему то на команду ACMD41 приходит бит busy=0 и на последущую команду CMD2 не отвечает.
aaarrr
Так надо дождаться, пока карта не будет готова, постоянно кидая ей ACMD41.
Andrei....
Цитата(aaarrr @ Jan 10 2007, 18:31) *
Так надо дождаться, пока карта не будет готова, постоянно кидая ей ACMD41.


т.е даже несмотря на то что питание на неё было подано за пару минут до того как я послал первую команду ACMD41, она ещё не соизволила сбросить бит busy?
sff
Цитата(Andrei.... @ Jan 11 2007, 09:48) *
т.е даже несмотря на то что питание на неё было подано за пару минут до того как я послал первую команду ACMD41, она ещё не соизволила сбросить бит busy?

Да, мне такое часто встречалось..
А если за пару минут то может она перешла уже в automatic sleep режим
К примеру вот что сказано про SanDisk:
Upon completion of an operation, the SD Card will enter the sleep mode to conserve power if no further
commands are received within 5msec.
aaarrr
Цитата(Andrei.... @ Jan 11 2007, 09:48) *
...сбросить бит busy?

Только не сбросить, а установить - бит Busy в OCR инверсный, насколько я помню.
Andrei....
Цитата(aaarrr @ Jan 11 2007, 11:20) *
Цитата(Andrei.... @ Jan 11 2007, 09:48) *

...сбросить бит busy?

Только не сбросить, а установить - бит Busy в OCR инверсный, насколько я помню.


Понятно, это заработало. А что такое за BUSY посылается (к примеру на команду CMD7 и.т.п) по линии DAT0?
aaarrr
Цитата(Andrei.... @ Jan 12 2007, 15:55) *
А что такое за BUSY посылается (к примеру на команду CMD7 и.т.п) по линии DAT0?

Сигнал BUSY посылается. Первый ненулевой бит - это END-бит ответа, как я понимаю.
Andrei....
Цитата(aaarrr @ Jan 12 2007, 16:07) *
Цитата(Andrei.... @ Jan 12 2007, 15:55) *

А что такое за BUSY посылается (к примеру на команду CMD7 и.т.п) по линии DAT0?

Сигнал BUSY посылается. Первый ненулевой бит - это END-бит ответа, как я понимаю.


Он посылается после CMD7? После команды смотрю DAT0 и там постоянно 1. Однако следущая команда уже не проходит (нет ответа).
aaarrr
Цитата(Andrei.... @ Jan 12 2007, 16:54) *
Он посылается после CMD7? После команды смотрю DAT0 и там постоянно 1. Однако следущая команда уже не проходит (нет ответа).

Напишите, какую последовательность команд (с аргументами) Вы даете до CMD7, и какую команду - после.
Andrei....
Цитата(aaarrr @ Jan 12 2007, 17:06) *
Цитата(Andrei.... @ Jan 12 2007, 16:54) *

Он посылается после CMD7? После команды смотрю DAT0 и там постоянно 1. Однако следущая команда уже не проходит (нет ответа).

Напишите, какую последовательность команд (с аргументами) Вы даете до CMD7, и какую команду - после.


До CMD7 всё нормально. Посылаю CMD7 c аргументом RCA (и она переходит в trans mode) и сразу за ней посылаю CMD7 с аргументом 0 (ожидая что она перейдёт в stand-by), вот на вторую CMD7 ответ и не приходит.
aaarrr
Цитата(Andrei.... @ Jan 12 2007, 18:22) *
До CMD7 всё нормально. Посылаю CMD7 c аргументом RCA (и она переходит в trans mode) и сразу за ней посылаю CMD7 с аргументом 0 (ожидая что она перейдёт в stand-by), вот на вторую CMD7 ответ и не приходит.

Ответ может быть только от выбранной карты, т.е. на CMD7 с RCA=0 ответа быть не должно.
Andrei....
Цитата(aaarrr @ Jan 12 2007, 18:32) *
Ответ может быть только от выбранной карты, т.е. на CMD7 с RCA=0 ответа быть не должно.


Ах, ну да, логично. Возвращаясь к вопросу о вычислении контрольной суммы, действительно, как можно было бы попроще вычислить контрольную сумму (crc64) при четырёх линиях данных.
aaarrr
Цитата(Andrei.... @ Jan 15 2007, 16:19) *
Возвращаясь к вопросу о вычислении контрольной суммы, действительно, как можно было бы попроще вычислить контрольную сумму (crc64) при четырёх линиях данных.

Хорошая задача, были идеи, подумаю и напишу потом. А пока можно решить в лоб - будет медленно, но для проверки работоспособности сгодится.
Andrei....
Цитата(aaarrr @ Jan 15 2007, 16:48) *
Цитата(Andrei.... @ Jan 15 2007, 16:19) *

Возвращаясь к вопросу о вычислении контрольной суммы, действительно, как можно было бы попроще вычислить контрольную сумму (crc64) при четырёх линиях данных.

Хорошая задача, были идеи, подумаю и напишу потом. А пока можно решить в лоб - будет медленно, но для проверки работоспособности сгодится.


чего то в лоб не получилось...не сошлось, как я понимаю стартовый и стоповый бит в crc не входит, считаем только по данным?
aaarrr
Да, только по данным.
Andrei....
Цитата(aaarrr @ Jan 15 2007, 18:34) *
Да, только по данным.

всё равно не сходится. sad.gif
Andrei....
Любопытный момент: есть две SD карты (Transcend 512 и 256 Mb) на одной написано 80x На другой 45x, как я понимаю скоростные характеристики. Однако в CSD регистре как у первой, так и у второй в поле TRAN_SPEED вижу 25 Mbit/s. Т.е макс. скорости (по чтению) декларируются одинаковые. Вопрос в чём же разница между 80х и 45х?
aaarrr
25Мбит/линию - это скорость интерфейса, и, скорее всего, у всех так написано. А разница между картами 80х и 45х должна выражаться в большей скорости выполнения команд записи и чтения у первых.
Andrei....
Почему при чтении блоков с адресов близких к максимальной ёмкости карты она просто не отвечает, так задумано?
Fortune
Цитата(Andrei.... @ Jan 23 2007, 13:43) *
Почему при чтении блоков с адресов близких к максимальной ёмкости карты она просто не отвечает, так задумано?


А у меня она вообще не отвечает на комманду чтения сектора. sad.gif
Fortune
Цитата(Andrei.... @ Dec 28 2006, 16:13) *
У кого нибудь есть примеры реализации взаимодействия с SD Card? Хотелось бы взглянуть.


Как и когда можно подавать комманду чтения блока?
Потому что у меня блок не читается.

Остановился на следующем:
Подал комманду CMD16 с аргументом 1024 (для проверки)
Карточка выдала 0x40 - неверный аргумент
Потом подаю CMD16 c аргументом 512.
Ответ - 0x00, т.е все ок.

Далее подаю комманду CMD17: и все виснет
получаю одни 0xFF, response r1 нету и в помине.
Не говоря уже о признаке начала блока 0xFE.
help.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.