Драйвер для MICRO_SD карт

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
Oxford
Опытный кот
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск
Контактная информация:

Re: Драйвер для MICRO_SD карт

Сообщение Oxford »

[quote="drakon"]Oxford, проверил ваш кусок, все работает. выдает 0x200 = 512.
вся эта фат-информация лежит на моей флешке в секторе 32, посмотрел в WinFex. компилятор keil.

У меня код по умолчанию читает 0 сектор, так как по умолчанию 0 сектор, если это не загрузочный, тогда он пытается вытащить логический диск из MBR, если MBR не найдена или не смог определить логический диск тады возврат ошибки.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Аватара пользователя
drakon
Грызет канифоль
Сообщения: 271
Зарегистрирован: Вт авг 09, 2011 15:01:44
Откуда: Харьков

Re: Драйвер для MICRO_SD карт

Сообщение drakon »

Это в С++ можно где-угодно объявлять переменные, а в Си можно только так:

Код: Выделить всё

char FAT_INI(void){
short BytePerSec;
SD_READ(0);
BytePerSec = *((short *)&BUFFER[11]);
lcd_int(BytePerSec, 4, 0);
return BytePerSec;
}
Аватара пользователя
Oxford
Опытный кот
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск
Контактная информация:

Re: Драйвер для MICRO_SD карт

Сообщение Oxford »

drakon писал(а):Это в С++ можно где-угодно объявлять переменные, а в Си можно только так:

Код: Выделить всё

char FAT_INI(void){
short BytePerSec;
SD_READ(0);
BytePerSec = *((short *)&BUFFER[11]);
lcd_int(BytePerSec, 4, 0);
return BytePerSec;
}


У меня везде работает в любом месте и глобально обьявлял и локально одинаково работает.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Аватара пользователя
drakon
Грызет канифоль
Сообщения: 271
Зарегистрирован: Вт авг 09, 2011 15:01:44
Откуда: Харьков

Re: Драйвер для MICRO_SD карт

Сообщение drakon »

В языке Си все определения должны следовать перед операторами, составляющими тело функции. В языке Си++ это ограничение снято и определения могут находиться в любом месте программы.

если тип *.c поменять на *.cpp то объявлять можно где-угодно, когда-то проверял. попробуйте написать туда класс (в Си точно его нету), может, компилятор автоматически на C++ переходит.
Аватара пользователя
balmer
Это не хвост, это антенна
Сообщения: 1433
Зарегистрирован: Вс дек 02, 2012 03:13:48
Откуда: Калининград

Re: Драйвер для MICRO_SD карт

Сообщение balmer »

drakon писал(а): если тип *.c поменять на *.cpp то объявлять можно где-угодно, когда-то проверял.


Еще есть стандарт C99, там можно объявлять переменные где угодно.
Аватара пользователя
Oxford
Опытный кот
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск
Контактная информация:

Re: Драйвер для MICRO_SD карт

Сообщение Oxford »

balmer писал(а):
drakon писал(а): если тип *.c поменять на *.cpp то объявлять можно где-угодно, когда-то проверял.


Еще есть стандарт C99, там можно объявлять переменные где угодно.


Все верно
http://ru.wikipedia.org/wiki/C99

Новые возможности

В C99 было добавлено несколько новых возможностей, многие из которых уже были реализованы в качестве расширения в некоторых компиляторах:
встраиваемые функции (объявленные с ключевым словом inline)
Место, в котором возможно объявление переменных, больше не ограничено глобальной областью видимости и началом составного оператора (блока)
Несколько новых типов данных, включая long long int, дополнительные расширенные целые типы, явный логический тип данных, а также комплексный тип (complex) для представления комплексных чисел
Массивы переменной длины (variable-length arrays)
Поддержка однострочных комментариев, начинающихся с //, как в BCPL или C++
Новые библиотечные функции, как, например, snprintf
Новые заголовочные файлы, такие как stdbool.h и inttypes.h
Типовые математические функции (tgmath.h)
Улучшена поддержка стандарта IEEE 754-2008
Проектируемые инициализаторы
Составные константы
Поддержка вариативных макросов (макросов переменной арности)
Смягчение (restrict) ограничений для более агрессивной оптимизации кода
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Аватара пользователя
Oxford
Опытный кот
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск
Контактная информация:

Re: Драйвер для MICRO_SD карт

Сообщение Oxford »

Уже перенес часть алгоритма, выводит короткие и длинные имена. Сейчас встраиваю навигатор на уровне драйвера
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Аватара пользователя
drakon
Грызет канифоль
Сообщения: 271
Зарегистрирован: Вт авг 09, 2011 15:01:44
Откуда: Харьков

Re: Драйвер для MICRO_SD карт

Сообщение drakon »

Oxford, как успехи с fat?
Аватара пользователя
Oxford
Опытный кот
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск
Контактная информация:

Re: Драйвер для MICRO_SD карт

Сообщение Oxford »

Занимаюсь еще. Реализовал сейчас длинные и короткие имена понимает. Сейчас маркую над навигацией. Работа с FAT будет немного иначе чем привыкли все.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
bishop-strip
Открыл глаза
Сообщения: 71
Зарегистрирован: Чт окт 28, 2010 11:20:39

Re: Драйвер для MICRO_SD карт

Сообщение bishop-strip »

Oxford писал(а):Занимаюсь еще. Реализовал сейчас длинные и короткие имена понимает. Сейчас маркую над навигацией. Работа с FAT будет немного иначе чем привыкли все.

А что вы подразумеваете под НАВИГАЦИЕЙ? сам интерфейс использования функций в библиотеке?
Аватара пользователя
Oxford
Опытный кот
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск
Контактная информация:

Re: Драйвер для MICRO_SD карт

Сообщение Oxford »

Навигация это когда требуется отображать на дисплее дерево флешки. Т.е. перемещение по папкам, файлам, поиск и т.д. Это будет реализовано внутри драйвера т.е. так как это удобно драйверу для работы с картой, а программисту будет предоставлен простой API.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Аватара пользователя
drakon
Грызет канифоль
Сообщения: 271
Зарегистрирован: Вт авг 09, 2011 15:01:44
Откуда: Харьков

Re: Драйвер для MICRO_SD карт

Сообщение drakon »

может, выложите пока без навигации?
Аватара пользователя
Oxford
Опытный кот
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск
Контактная информация:

Re: Драйвер для MICRO_SD карт

Сообщение Oxford »

FAT пока закрытая для своих проектов.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
DmitriyVovk
Родился
Сообщения: 1
Зарегистрирован: Пн апр 13, 2015 00:52:00

Re: Драйвер для MICRO_SD карт

Сообщение DmitriyVovk »

Изображение

Помогите запустить. Я вроде уже запускал ваш код, но теперь лыжи не едут.

Заголовочный файл MICROSD.h лежит в MICROSD.c
В главном main.c прописано

extern void SD_READ();


Если подключить заголовочный MICROSD.h в main.c то компилятор ругается на множественное обьявление BUFFER R1 R2 ... и т.д.


Что он от меня хочет(( я да, я еще нуб, помогите!
Аватара пользователя
B@R5uk
Собутыльник Кота
Сообщения: 2896
Зарегистрирован: Сб ноя 13, 2010 12:53:25
Откуда: приходит весна?

Re: Драйвер для MICRO_SD карт

Сообщение B@R5uk »

Galizin писал(а):
short BytePerSec = *((short *)&BUFFER[11]);

Попробуйте присвоить по 1 байту

Код: Выделить всё

short BytePerSec;
((char*)&BytePerSec)[0] = BUFFER[11];
((char*)&BytePerSec)[1] = BUFFER[12];

Должно заработать
Плохая идея. Индексация -- это куча накладных расходов, если только компилятор не с адовой сообразительностью (но тогда могут возникнуть другие проблемы). Чем меньше обращений, тем быстрее.


Вопрос к Oxford, а почему вы не используете вот эти замечательные типы данных:

Код: Выделить всё

int8_t   uint8_t
int16_t  uint16_t
int32_t  uint32_t
int64_t  uint64_t
Зачастую это и короче, и понятнее, и надёжнее. Против старой привычки три новых достоинства.
Аватара пользователя
Oxford
Опытный кот
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск
Контактная информация:

Re: Драйвер для MICRO_SD карт

Сообщение Oxford »

B@R5uk писал(а):

Вопрос к Oxford, а почему вы не используете вот эти замечательные типы данных:

Код: Выделить всё

int8_t   uint8_t
int16_t  uint16_t
int32_t  uint32_t
int64_t  uint64_t
Зачастую это и короче, и понятнее, и надёжнее. Против старой привычки три новых достоинства.

Особой разницы нет. Использую тоже.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Аватара пользователя
Oxford
Опытный кот
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск
Контактная информация:

Re: Драйвер для MICRO_SD карт

Сообщение Oxford »

DmitriyVovk, Скоро выложу драйвер обновленный :tea: . KEIL да капризный. :kill:
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Аватара пользователя
Oxford
Опытный кот
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск
Контактная информация:

Re: Драйвер для MICRO_SD карт

Сообщение Oxford »

Ребятушки всем привет. На данный момент попалась карточка 8G class 4 нонейм. Капризная карта, зависает иногда. Я с ней уже несколько дней войну веду. До этого в плеере стояла 16G class 10, проблем не было.
На данный момент отлаживаю драйвер. После выяснения будет выложен апдейт.

P.S. Карта скорее всего не зависает, а засыпает. Процедуру пробуждения отлажу. Некоторые карты автоматически уходят в спячку.
Временный костыль, вызывать инициализацию при открытии файла.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Аватара пользователя
Oxford
Опытный кот
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск
Контактная информация:

Re: Драйвер для MICRO_SD карт

Сообщение Oxford »

В общем разобрался с картой.
Суть следующая, карта( если в течении 5мс ничего не происходит) уходит в энергосберегающий режим, таймаут у карт разный. В этот момент команда CMD17 на чтение не доступна. В этом режиме доступны следующие команды CMD0, CMD1, CMD41 и CMD58

Поэтому перед чтением нужно разбудить карту и дальше в штатном режиме работать.

Fix следующий:


//ЧИТАЕТ СЕКТОР ДАННЫЕ В BUFFER: РЕЗУЛЬТАТ 1 - ОШИБКА 0 - НЕТ ОШИБОК
uint8_t SD_READ(uint32_t sector)
{

SPI_CMD(1, 0, 0); //Выход из спящего режима; доступные команды: CMD0, CMD1, CMD41 и CMD58

if (SD_VERSION != SPISD_VER2HC)
sector *= 512; //LBA
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Аватара пользователя
Oxford
Опытный кот
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск
Контактная информация:

Re: Драйвер для MICRO_SD карт

Сообщение Oxford »

При открытии файла, всегда вызывать новую инициализацию карты. Некоторые карты без этого впадают в спячку и не отвечают даже на пробуждение, реинит пробуждает ее. В противном случае при чтении вернет ошибку, пока ее не переинитят.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Ответить

Вернуться в «ARM»