реклама на сайте
подробности

 
 
15 страниц V  « < 4 5 6 7 8 > »   
Reply to this topicStart new topic
> SD Card - програмная реализация интерфейса, У кого нибудь есть примеры реализации взаимодействия с SD Card?
a3r3
сообщение Aug 10 2007, 13:08
Сообщение #76


Частый гость
**

Группа: Новичок
Сообщений: 84
Регистрация: 24-05-07
Пользователь №: 27 947



Цитата(zltigo @ Aug 10 2007, 16:54) *
Если эта команда, не используется для распознавания MMC/SD, однако.

Мня. Ступил, однако smile.gif

Сообщение отредактировал a3r3 - Aug 10 2007, 13:13
Go to the top of the page
 
+Quote Post
Rudolph
сообщение Aug 10 2007, 13:40
Сообщение #77


Участник
*

Группа: Новичок
Сообщений: 25
Регистрация: 19-02-07
Пользователь №: 25 505



При помощи CMD1 карточка (microSD 1024 Mb Kingston ) активизировалась в SPI-режиме, т.е. я получил R1 == 0x00. Теперь попытался получить CSD. т.е. CMD9 с аргументом == 0. Последний байт с CRC7 выставляю в 0xFF. Вся команда: 0x49, 0x00,0x00, 0x00, 0x00, 0xFF.

В ответ получаю
- R1 == 0x00
- признак начала данных - 0xFE
- 16 байт

Если еще попинговать карту FF-ми, то получаем еще 1 байт.

Странно, вроде, по идее, я должен получить 16 байт данных после 0xFE и CRC16, т.е. еще 2 байта.

Что-то я не так сделал, но вот что?
Go to the top of the page
 
+Quote Post
a3r3
сообщение Aug 10 2007, 15:25
Сообщение #78


Частый гость
**

Группа: Новичок
Сообщений: 84
Регистрация: 24-05-07
Пользователь №: 27 947



Цитата(Rudolph @ Aug 10 2007, 17:40) *
Если еще попинговать карту FF-ми, то получаем еще 1 байт.

Это как?

Цитата(Rudolph @ Aug 10 2007, 17:40) *
Странно, вроде, по идее, я должен получить 16 байт данных после 0xFE и CRC16, т.е. еще 2 байта.

Что-то я не так сделал, но вот что?

А CRC включен (CMD59)?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 10 2007, 15:50
Сообщение #79


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Rudolph @ Aug 10 2007, 16:40) *
Последний байт с CRC7 выставляю в 0xFF. Вся команда: 0x49, 0x00,0x00, 0x00, 0x00, 0xFF.

CRC = 0x00, у меня.
Цитата
В ответ получаю
- R1 == 0x00

Точнее любое значение без старшего бита в течении не более 80 тактов
Цитата
- признак начала данных - 0xFE

сканируя в течении не более 100ms
Цитата
- 16 байт

Да.
Цитата
Если еще попинговать карту FF-ми, то получаем еще 1 байт.

Ну получаете, то сколько угодно байт, но они все кроме первого 0xFF? Ну А может CRC 0xXXFF smile.gif
Не знаю, я в мусорник два байта вычитываю и все.
Цитата
Странно, вроде, по идее, я должен получить 16 байт данных после 0xFE и CRC16, т.е. еще 2 байта.

Да.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Rudolph
сообщение Aug 13 2007, 09:04
Сообщение #80


Участник
*

Группа: Новичок
Сообщений: 25
Регистрация: 19-02-07
Пользователь №: 25 505



Цитата(a3r3 @ Aug 10 2007, 19:25) *
Это как?

Ну отправляю 0xFF и жду, придет лии что нить еще, не равное 0xFF.

Цитата
А CRC включен (CMD59)?


CRC не включен. В мануале написано, что в SPI он по умолчанию отключен, но я так понимаю, что эти байты(CRC16) все равно присылаются, но их надо игнорировать. Или я неправ?

Сообщение отредактировал Rudolph - Aug 13 2007, 09:13
Go to the top of the page
 
+Quote Post
Rudolph
сообщение Aug 13 2007, 12:05
Сообщение #81


Участник
*

Группа: Новичок
Сообщений: 25
Регистрация: 19-02-07
Пользователь №: 25 505



Сейчас слегка переделал прием, чтобы только непрерывные последовательности байтов != FF принимать.
Получается, после 0xFE принимается сначала 10 байт, не равных FF, затем сколько-то 0xFF и затем следующая последовательнеость - 7 байт не равных 0xFF. И все. Как-то непонятно. Вроде данные с CRC16 должны идти непрерывным массивом.
Go to the top of the page
 
+Quote Post
a3r3
сообщение Aug 13 2007, 16:12
Сообщение #82


Частый гость
**

Группа: Новичок
Сообщений: 84
Регистрация: 24-05-07
Пользователь №: 27 947



Цитата(Rudolph @ Aug 13 2007, 13:04) *
В мануале написано, что в SPI он по умолчанию отключен, но я так понимаю, что эти байты(CRC16) все равно присылаются, но их надо игнорировать. Или я неправ?

Присылаются, только стандарт не оговаривает, что в них передается.

Цитата(Rudolph @ Aug 13 2007, 16:05) *
Сейчас слегка переделал прием, чтобы только непрерывные последовательности байтов != FF принимать.
Получается, после 0xFE принимается сначала 10 байт, не равных FF, затем сколько-то 0xFF и затем следующая последовательнеость - 7 байт не равных 0xFF. И все. Как-то непонятно. Вроде данные с CRC16 должны идти непрерывным массивом.

Данные всегда идут непрерывным массивом после токена, принимать нужно все.
Go to the top of the page
 
+Quote Post
Rudolph
сообщение Aug 14 2007, 08:30
Сообщение #83


Участник
*

Группа: Новичок
Сообщений: 25
Регистрация: 19-02-07
Пользователь №: 25 505



Присылаются, только стандарт не оговаривает, что в них передается.

Ессно.
Go to the top of the page
 
+Quote Post
Rudolph
сообщение Aug 15 2007, 09:46
Сообщение #84


Участник
*

Группа: Новичок
Сообщений: 25
Регистрация: 19-02-07
Пользователь №: 25 505



Короче, это я лось педальный. У меня ФФ-ы выкидывались, а один из них был в массиве CSD.

Все нормально карточка отвечает теперь(00 + FE + 16 байт CSD + 2 CRC16) и даже осмысленные данные в CSD.

Насчет CSD->C_SIZE, я так понял, что значения этого поля зависят от производителя? В мануале тошибы - одни значения, у SanDisk - другие. Мне Kingston возвращает третьи. А вот у 16Mb Sd card Canon - совпадает с мануалом от SanDisk.
Go to the top of the page
 
+Quote Post
John Silver
сообщение Nov 3 2008, 08:39
Сообщение #85


Местный
***

Группа: Свой
Сообщений: 206
Регистрация: 14-06-06
Из: Могилев
Пользователь №: 18 059



Подскажите, люди добрые, что я не так делаю.
Прошерстил все источники, просмотрел все исходники, написал прожку.

Настройка портов:

#define SPI_NPCS1_CONFIG (/*255<<24|0xFF<<16|*/AT91C_SPI_NCPHA|AT91C_SPI_BITS_8|(120<<8)) //400 kHz

AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA ) ;

AT91C_BASE_PIOA->PIO_PER = AT91C_PIO_PA25 | AT91C_PIO_PA23; // DispRS and DispReset
AT91C_BASE_PIOA->PIO_OER = AT91C_PIO_PA25 | AT91C_PIO_PA23;
AT91C_BASE_PIOA->PIO_SODR = AT91C_PIO_PA25 | AT91C_PIO_PA23;

// ======== Init SPI ================
AT91PS_SPI pSPI = AT91C_BASE_SPI ;
AT91F_SPI_CfgPMC(); // Enables the SPI Clock
AT91F_SPI_CfgPIO(); // Open PIO for SPI
AT91F_SPI_Reset(pSPI);// Reset SPI
AT91F_SPI_CfgMode(pSPI, SPI_MODE); // Configure SPI in Master Mode with No CS selected
AT91F_SPI_CfgCs(pSPI, 0, SPI_NPCS0_CONFIG); // Configure SPI0 Display CX65

pSPI->SPI_CSR[1] = SPI_NPCS1_CONFIG;
pSPI->SPI_IDR = 0xffffffff; //отключение прерываний

AT91F_SPI_Enable(pSPI); // SPI_Enable

AT91F_PIO_CfgInput(AT91C_BASE_PIOA, CARD_PROT|CARD_DET);

AT91C_BASE_PIOA->PIO_PER = AT91C_PIO_PA9; // CS1 for MMC/SDC
AT91C_BASE_PIOA->PIO_OER = AT91C_PIO_PA9;
AT91C_BASE_PIOA->PIO_SODR = AT91C_PIO_PA9;


Передача/прием байта:
void xmit_spi(char dat)
{
while (AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE==0);
AT91F_SPI_PutChar (AT91C_BASE_SPI, dat, 1);
}


static
BYTE rcvr_spi (char dat)
{
char res;
while (AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE==0);
AT91F_SPI_PutChar (AT91C_BASE_SPI, dat, 1);
while (AT91C_BASE_SPI->SPI_SR & AT91C_SPI_RDRF==0);
res = (BYTE)( AT91C_BASE_SPI->SPI_RDR );

return res;
}



Работа с картой:
do
{
__disable_interrupt();
DESELECT(); // поднять CS
Delay_mks(100);
for (n = 10; n; n--) xmit_spi(0xFF); /* 80 dummy clocks */
n=0;
ty=0;
SELECT(); // опустить CS
Delay_mks(100);

xmit_spi(0x40);
Delay_mks(100);
xmit_spi(0);
Delay_mks(100);
xmit_spi(0);
Delay_mks(100);
xmit_spi(0);
Delay_mks(100);
xmit_spi(0);
Delay_mks(100);

cmd=rcvr_spi(0x95);
// Delay_mks(100);
n=255;
while (cmd == 0xFF && n)
{
n--;
cmd = rcvr_spi(0xFF);
}
} while (cmd == 0xFF);

DESELECT();


Сначала ваще ничего не получал в ответ (0xFF), потом поставил ожидание после каждой SPI посылки 100 мкс, начал получать 0x01 в ответ на CMD0 (для MMC карты, и 0x05 для SD). Если изменял время задержек мог получать всяку ерунду, типа сдвинутого ответа.
Если убрать хоть одну задержку - ответ 0xFF, т.е. нет ответа.
Пробовал ставить аппаратные задержки в SPI #define SPI_NPCS1_CONFIG (255<<24|0xFF<<16|AT91C_SPI_NCPHA|AT91C_SPI_BITS_8|(120<<8)) - нет ответа.
MMC Canon 16MB
microSD SanDisk 512MB
SAM7S64

ЗЫ Дисплей от S65 на SPI0 - работает отлично.

Сообщение отредактировал John Silver - Nov 3 2008, 08:40
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Nov 3 2008, 10:15
Сообщение #86


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Посылку и прием лучше сделать одной универсальной функцией. Ждать по while (AT91C_BASE_SPI->SPI_SR & AT91C_SPI_RDRF==0); и всегда вычитывать AT91C_BASE_SPI->SPI_RDR.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
John Silver
сообщение Nov 3 2008, 11:04
Сообщение #87


Местный
***

Группа: Свой
Сообщений: 206
Регистрация: 14-06-06
Из: Могилев
Пользователь №: 18 059



делал,
без разницы (собственно, как и предполагалось)
во многих примерах чтение и запись сделаны раздельно, наверно что бы немножко экономить время

Сам интерфейс походу работает (хоть с задержками, но работает). Проблема в том, что задержек много.
Я еще конечно буду пробовать задержки плавно уменьшать, авось останется 1мкс, тады и фиг с ней.

Сообщение отредактировал John Silver - Nov 3 2008, 11:08
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Nov 3 2008, 16:24
Сообщение #88


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Тогда по пунктам. Если после отправки не дождаться принятия байта, то он конда-нибудь все же примется. тем самым взведет соответствующий бит в статус-регистре. При следующей посылке с чтением вы посылаете байт и тут же проверяете флаг принятия байта. Но он остался взеведенным с прошлой посылки. При этом контроллер именно в этот момент принимает байт. Что вы в этот момент прочитаете из регистра принятых данных - х.з. Хорошо если предыдуший принятый байт. Соответственно с задержками это все будет как-то работать.
Если уж так хочется иметь две разные функции, то перед отправкой делайте пустое чтение регистра принятых данных. тем самым сбросите флаг и дождетесь действительного нужного вам байта.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
Leopold111
сообщение Nov 3 2008, 17:43
Сообщение #89





Группа: Участник
Сообщений: 8
Регистрация: 23-01-08
Пользователь №: 34 363



Здравствуйте!!! Подскажите с инициализацией micro SD Apacer 1024Mb. Работаю через LPT. CMD и DAT подтянуты к питанию через 30к. Шлю CMD=0, ответ =1. CMD=1, ответ=255 и все, никание команды не принимает. При CMD=55 + CMD=41, эффект тот же. Если после CMD=0 ввести CMD=58 Ответ: 0 255 128 255. Ответ на CMD=8 ответ=9. Как ввести этой команде атрибуты нигде не нашел. А она вроде участвует в инициализации. Спасибо.
Go to the top of the page
 
+Quote Post
John Silver
сообщение Nov 4 2008, 08:58
Сообщение #90


Местный
***

Группа: Свой
Сообщений: 206
Регистрация: 14-06-06
Из: Могилев
Пользователь №: 18 059



Цитата(Dron_Gus @ Nov 3 2008, 18:24) *
Тогда по пунктам. Если после отправки не дождаться принятия байта, то он конда-нибудь все же примется. тем самым взведет соответствующий бит в статус-регистре. При следующей посылке с чтением вы посылаете байт и тут же проверяете флаг принятия байта. Но он остался взеведенным с прошлой посылки. При этом контроллер именно в этот момент принимает байт. Что вы в этот момент прочитаете из регистра принятых данных - х.з. Хорошо если предыдуший принятый байт. Соответственно с задержками это все будет как-то работать.
Если уж так хочется иметь две разные функции, то перед отправкой делайте пустое чтение регистра принятых данных. тем самым сбросите флаг и дождетесь действительного нужного вам байта.


Вообще логично, согласен. Уже сделал на одной функции.
Инициализацию прошел, но с задержками. MMC: CMD0, CMD1, CMD16, дальше пока не пробовал.
Но, откуда задержки? Ни в одном примере их нет, и у всех все работает. Сдираю пример "в ноль" для моего проца - без задержек не работает, уменьшаю задержку со 100 до 50 мкс - не работает.
Есть у кого какие мысли по этому поводу?


Цитата(Leopold111 @ Nov 3 2008, 19:43) *
Здравствуйте!!! Подскажите с инициализацией micro SD Apacer 1024Mb. Работаю через LPT. CMD и DAT подтянуты к питанию через 30к. Шлю CMD=0, ответ =1. CMD=1, ответ=255 и все, никание команды не принимает. При CMD=55 + CMD=41, эффект тот же. Если после CMD=0 ввести CMD=58 Ответ: 0 255 128 255. Ответ на CMD=8 ответ=9. Как ввести этой команде атрибуты нигде не нашел. А она вроде участвует в инициализации. Спасибо.

С командой CMD8 есть пример сдесь http://elm-chan.org/fsw/ff/ffsample.zip
if (send_cmd(CMD8, 0x1AA) == 1) { /* SDHC */
Я так понял это команда для SDHC карт.
Go to the top of the page
 
+Quote Post

15 страниц V  « < 4 5 6 7 8 > » 
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 19:31
Рейтинг@Mail.ru


Страница сгенерированна за 0.01508 секунд с 7
ELECTRONIX ©2004-2016