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

SD Card - програмная реализация интерфейса

Кристал селект ручками попробуйте дергать. У САМов были проблеммы с автоматическим дерганьем. Кристал селект не успевал уйти в ноль между посылками.

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


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

Кристал селект ручками попробуйте дергать. У САМов были проблеммы с автоматическим дерганьем. Кристал селект не успевал уйти в ноль между посылками.

Да он и так ручками дергается. Просто товарищ Вашему совету про оверраны и сброс приемника напрасно совершенно не внял.

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


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

CS дергаю вручную

DESELECT();

Delay_mks (100);

SELECT();

Delay_mks (100);

Если и в этом месте убрать хоть одну задержку - команда не проходит.

 

Очень даже внял. Я же сказал "уже сделал".

Расшифруйте понятие оверран в данном контексте, пожалуйста.

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


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

Очень даже внял. Я же сказал "уже сделал".

Тогда выложите получившийся вариант. И желательно без загадок типа "SPI_MODE".

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


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

Тогда выложите получившийся вариант. И желательно без загадок типа "SPI_MODE".

 

Кароче есть ещё офигенная фича: скорость инициализации карточки по SPI не более 200кГерц(у меня на 200 уже не пахало). Если сразу, после подачи питания, пихать данные карточке со скоростью 20МГц, она ничерта не принимает. Больше со своей стороны глюков не видел.В EFSL есть исходник для работы на атмеге.Заменить передачу/приём байтов на свой и усё как по маслу.

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


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

Кароче есть ещё офигенная фича: скорость инициализации карточки по SPI не более 200кГерц(у меня на 200 уже не пахало).

Такого ограничения нет. В режиме инициализации скорость должна быть не более 400kHz, но только для обеспечения совместимости с MMC, картам SD все равно.

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


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

Вощем добил работу с картой. Испытал создание директории, создание файла, запись в файл.

Все работает только с задержками.

Скорость инициализации ставил от 188 до 400 кГц - все равно требует задержки.

Token отлавливаю софтовым SPI, как рекомендовал QuickWitted :a14: (http://www.swordgreenline.narod.ru/BookReader.html), иначе все 3 мои карточки не отвечают нормально.

Использовал FatFs. Интерфейс карты портирован с EFSL.

 

Проц - SAM7S64

Плата - самопал

Карты - MMC Canon 16 MB, microSD SanDisk 512MB, SDHC Transdent 2MB

Дисплей - LS020 от Siemens S65

IDE - IAR 5.2

 

Проект сырой. Работает только в конфигурации Debug_Flash (еще не разобрался с ремапами). За стиль не ругайтесь сильно, это мой 2-ой проект.

 

Если, уважаемый aaarrr, посмотрите, буду весьма признателен.

CarController.rar

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


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

Такого ограничения нет. В режиме инициализации скорость должна быть не более 400kHz, но только для обеспечения совместимости с MMC, картам SD все равно.

 

Не может такого быть, я на SD как раз и пробовал, может какая старая была, ещё на 32 метра. Ставлю передачу больше 200 кГц и не инициализируется. Зато если инит на 150кГц, а уже потом 20МГц то всё ок.

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


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

Не может такого быть, я на SD как раз и пробовал, может какая старая была, ещё на 32 метра. Ставлю передачу больше 200 кГц и не инициализируется. Зато если инит на 150кГц, а уже потом 20МГц то всё ок.

В спецификации есть вполне конкретная цифра - 400kHz. И примечание, что сделано это для совместимости с MMC.

 

А у Вас дело, по всей видимости, в чем-то другом.

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


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

Проект сырой. Работает только в конфигурации Debug_Flash (еще не разобрался с ремапами). За стиль не ругайтесь сильно, это мой 2-ой проект.

 

Если, уважаемый aaarrr, посмотрите, буду весьма признателен.

Хотя просили и не меня... Посмотрел. У вас функция xmit_spi() оставляет после себя невычитаные данные. Если уж так хочется посылать и не ждать приема (хотя ждать там не долго) перепишите функцию отправки с приемом как-нибудь так

static
BYTE rcvr_spi (char dat)
{
    char res;
    if (AT91C_BASE_SPI->SPI_SR & AT91C_SPI_RDRF)
        res = (BYTE)( AT91C_BASE_SPI->SPI_RDR );
    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 );
    Delay_mks(100);
    return  res;
}

Т.е. проверяйте, не осталось ли с прошлой посылки что-то непрочитанное.

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


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

Спасибо за ответ.

Попробую, хотя меня берут сомнения в целесообразности. Ведь я пользуюсь только функцией rcvr_spi, и в конце всегда вычитываю буфер приема, откуда взяться невычитанным данным.

Или я что-то не учел?

 

Нашел баг в либе FatFs.

Fres = f_getfree(0, &p1, &pfs);
    CardSize = (DWORD)(pfs->max_clust - 2) * pfs->csize / 2;
    FreeSize = p1 * pfs->csize / 2;
    BuzySize = CardSize - FreeSize;

 

Для MMC и SDv1 свободное место считает нормально. Для SDv2 - врет (карта почти пустая, а из 2 ГБ высчитывает свободных ~200 кБ).

Изменено пользователем John Silver

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


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

Контроль буфера приема перед новым чтением с карты, ситуацию не поменял.

 

Убрал задержки после изменения CS, оставил задержку только в фукции чтения SPI.

Уменьшил задержку:

80 мкс - все читает, SDv2 врет свободное место

60 мкс - все читает, SDv2 врет свободное место

50 мкс - SDv2 читает нормально свободное место

40 мкс - SDv2 читает нормально свободное место

25 мкс - не инициализирует

почистил контакты

30 мкс - все читает

20 мкс - не инициализирует

10 мкс - не инициализирует

Остановлся на 40мкс. Хотя раньше на 50мкс уже ничего не проходило.

 

Функция f_getfree(0, &p1, &pfs) нормально работает.

 

Вобщем мистика.

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


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

Таки да, мистика. Особенно вылезающие проблемы при увеличении задержки.

 

Карта случайно не пучком проводов подключена?

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


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

Шлейф, примерно 10 см.

MOSI и CLK идут сначала на дисплей, с него на карту. MISO и CS сразу на карту.

 

post-18059-1226099253_thumb.jpg post-18059-1226099387_thumb.jpg

 

На 400 кГц инициализация не проходит, всмысле, довольно низкая частота.

А вообще, конечно, надо будет напрямую к разъему подпаяться короткими проводами, авось сдесь собака и порылась.

Изменено пользователем John Silver

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


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

А вообще, конечно, надо будет напрямую к разъему подпаяться короткими проводами, авось сдесь собака и порылась.

Да уж, весьма вероятно :(

И еще рекомендую поставить 10к pull-up'ы на все линии SD-карты, в том числе и неиспользуемые.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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