Драйвер для MICRO_SD карт
- Oxford
- Опытный кот
- Сообщения: 819
- Зарегистрирован: Вт окт 23, 2012 13:17:25
- Откуда: Прокопьевск
- Контактная информация:
Драйвер для MICRO_SD карт
Написал маленький драйвер для MICROSD карточек, так как нормального драйвера не нашел.
Использует 5 переменных и буфер на 512 байт.
Код переносим достаточно две процедуры исправить это настройка SPI_SETUP и отправка/принятие байта SPI_SEND + дефайны для портов.
По умолчанию код написан в среде CooCox для процессора STM32F051RB, и настроен на SPI1.
Как демо пример можно использовать.
Драйвер читает и пишит посекторно, нужно указать только номер сектора.
На данный момент реализовал поддержку SD, SDSC, SDHC, MMC карт.
Какие у меня были читались и писались без проблем.
Драйвер будет поддерживаться и обновляться, так что если встретиться ошибка пишите.
Вобщем тестируем и пишим об ошибках. )
Пишите на каких картах тестировали, скорость обмена
Описание в MICROSD.h
Использует 5 переменных и буфер на 512 байт.
Код переносим достаточно две процедуры исправить это настройка SPI_SETUP и отправка/принятие байта SPI_SEND + дефайны для портов.
По умолчанию код написан в среде CooCox для процессора STM32F051RB, и настроен на SPI1.
Как демо пример можно использовать.
Драйвер читает и пишит посекторно, нужно указать только номер сектора.
На данный момент реализовал поддержку SD, SDSC, SDHC, MMC карт.
Какие у меня были читались и писались без проблем.
Драйвер будет поддерживаться и обновляться, так что если встретиться ошибка пишите.
Вобщем тестируем и пишим об ошибках. )
Пишите на каких картах тестировали, скорость обмена
Описание в MICROSD.h
- Вложения
-
- DRIVER_MICROSD_STM32F051.zip
- (2.73 КБ) 4112 скачиваний
Последний раз редактировалось Oxford Сб июн 29, 2013 19:43:41, всего редактировалось 3 раза.
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Re: Драйвер для MICRO_SD карт
Как раз то что сейчас очень для меня актуально! Собственно назрел вопрос. А в чем разница между MICRO_SD и просто SD ? На сколько я понимаю разницы никакой!
- Oxford
- Опытный кот
- Сообщения: 819
- Зарегистрирован: Вт окт 23, 2012 13:17:25
- Откуда: Прокопьевск
- Контактная информация:
Re: Драйвер для MICRO_SD карт
Ну впринципе разницы нет, размеры если только разные, просто так захотелось назвать ))
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Re: Драйвер для MICRO_SD карт
Пытаюсь все это прикрутить к STM32F4.... пока безуспешно ))
- Oxford
- Опытный кот
- Сообщения: 819
- Зарегистрирован: Вт окт 23, 2012 13:17:25
- Откуда: Прокопьевск
- Контактная информация:
Re: Драйвер для MICRO_SD карт
SPI запустили сигнал есть?
В какой среде пишите?
Какой процессор?
Какой номер SPI используется?
CS на какой ноге?
Там на F4 функции имеют названия другие, так как я под ядро M0 писал, потому как в M0 SPI расширенный и имеет несколько функций у него фрейм от 4 до 16 Бит.
Для проверки SPI с функциями из драйвера:
1. Соединить MOSI + MISO ноги на плате в кольцо.
2. SPI_SETUP(SPI_BaudRatePrescaler_256); Настроить порты и SPI интерфейс.
3. READ = SPI_SEND(0xAA); // В цикле отправляем байт и смотрим осцилом или анализатаром ноги CLK, MOSI
READ должен содержать тот же байт что и отправили.
В какой среде пишите?
Какой процессор?
Какой номер SPI используется?
CS на какой ноге?
Там на F4 функции имеют названия другие, так как я под ядро M0 писал, потому как в M0 SPI расширенный и имеет несколько функций у него фрейм от 4 до 16 Бит.
Для проверки SPI с функциями из драйвера:
1. Соединить MOSI + MISO ноги на плате в кольцо.
2. SPI_SETUP(SPI_BaudRatePrescaler_256); Настроить порты и SPI интерфейс.
3. READ = SPI_SEND(0xAA); // В цикле отправляем байт и смотрим осцилом или анализатаром ноги CLK, MOSI
READ должен содержать тот же байт что и отправили.
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Re: Драйвер для MICRO_SD карт
На чтение мне постоянно нули выдает! В каком формате должна быть карта? Или формат тут не имеет значение?
- Oxford
- Опытный кот
- Сообщения: 819
- Зарегистрирован: Вт окт 23, 2012 13:17:25
- Откуда: Прокопьевск
- Контактная информация:
Re: Драйвер для MICRO_SD карт
Формат имеете ввиду файловую систему? То без разницы какая FAT.
Сектора аппаратные. FAT программная.
Начало логического диска может лежать в разных секторах, в 0 секторе MBR находится.
Логический диск может лежать где угодно. Начало у меня было в секторах 63 и 135.
SD_INI(): какое у вас число возвращает?
Сектора аппаратные. FAT программная.
Начало логического диска может лежать в разных секторах, в 0 секторе MBR находится.
Логический диск может лежать где угодно. Начало у меня было в секторах 63 и 135.
SD_INI(): какое у вас число возвращает?
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Re: Драйвер для MICRO_SD карт
Не могу вывести, драйвер TFT вешается почему то
Re: Драйвер для MICRO_SD карт
На сколько я понимаю fsmc не нравится что я активирую SPI1
попробовал перекинуть на SPI3 вот так
но все равно TFT не реагирует
попробовал перекинуть на SPI3 вот так
Код: Выделить всё
SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // INIT NSS
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_SPI3); // INIT MISO/MOSI/SCK
GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_SPI3);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource12, GPIO_AF_SPI3);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12;
GPIO_Init(GPIOC, &GPIO_InitStructure);
// Set SPI interface
SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode=SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_256; // lowest speed for init
SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;
SPI_Init(SPI3,&SPI_InitStructure);
SPI_Cmd(SPI3,ENABLE); //Enable SPI3
CS_DISABLE;
но все равно TFT не реагирует
- Oxford
- Опытный кот
- Сообщения: 819
- Зарегистрирован: Вт окт 23, 2012 13:17:25
- Откуда: Прокопьевск
- Контактная информация:
Re: Драйвер для MICRO_SD карт
Полярность еще для карточки
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
А где включение тактирования PORTA?
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
NSS нога для MicroSD не нужна нога.
От SPI требуется три ноги SCK, MOSI, MISO.
CS выбор карты программно делается отдельной ногой.
Поэтому нужно
PC10 - SCK
PC11 - MISO
PC12 - MOSI
И CS можно тоже на какуйнить ногу повешать PORTC
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
А где включение тактирования PORTA?
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
NSS нога для MicroSD не нужна нога.
От SPI требуется три ноги SCK, MOSI, MISO.
CS выбор карты программно делается отдельной ногой.
Поэтому нужно
PC10 - SCK
PC11 - MISO
PC12 - MOSI
И CS можно тоже на какуйнить ногу повешать PORTC
Последний раз редактировалось Oxford Сб июн 29, 2013 22:21:20, всего редактировалось 1 раз.
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Re: Драйвер для MICRO_SD карт
SPI3 находится у F4 на порте C
- Oxford
- Опытный кот
- Сообщения: 819
- Зарегистрирован: Вт окт 23, 2012 13:17:25
- Откуда: Прокопьевск
- Контактная информация:
Re: Драйвер для MICRO_SD карт
У вас
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // INIT NSS
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
NNS на порту A это для кого? Вы PA9 не включили тактирование, вы его для CS инициализируете?
для CS так:
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // CS chip select
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // INIT NSS
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
NNS на порту A это для кого? Вы PA9 не включили тактирование, вы его для CS инициализируете?
для CS так:
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // CS chip select
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Re: Драйвер для MICRO_SD карт
Так, добился того что TFT отвечает... и ответ от SD_INI получается 0
Re: Драйвер для MICRO_SD карт
SD_READ возвращает 1
SD_WRITE возвращает 0
SD_WRITE возвращает 0
Re: Драйвер для MICRO_SD карт
Так эээ... получается по кодам ответа все нормально
НО каково было мое удивление когда вытащив карту я получил те же значения)))
- Oxford
- Опытный кот
- Сообщения: 819
- Зарегистрирован: Вт окт 23, 2012 13:17:25
- Откуда: Прокопьевск
- Контактная информация:
Re: Драйвер для MICRO_SD карт
SD_INI возвращает 0 значит инициализация не прошла, ошибка.
Читать и писать бессмысленно после этого.
Проверяйте SPI пока не вернет карта отличное от 0. Тогда можно будет читать и записывать
Читать и писать бессмысленно после этого.
Проверяйте SPI пока не вернет карта отличное от 0. Тогда можно будет читать и записывать
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Re: Драйвер для MICRO_SD карт
Я уже кручу кручу и ничего не получается...
Может дело в //SPI_RxFIFOThresholdConfig(SD_SPI, SPI_RxFIFOThreshold_QF); я не знаю чем его заменить в F4
Меня выкидывает вот здесь if (SPI_CMD(0, 0, 0x95, 0x01)) return SD_ERROR; //IDLE
Спойлер
Код: Выделить всё
[b]sd.h [/b]
#define SD_SPI SPI3
#define SD_SPI_CLK RCC_APB1Periph_SPI3
#define SD_SPI_SCK_PIN GPIO_Pin_10
#define SD_SPI_SCK_SOURCE GPIO_PinSource10
#define SD_SPI_MISO_PIN GPIO_Pin_11
#define SD_SPI_MISO_SOURCE GPIO_PinSource11
#define SD_SPI_MOSI_PIN GPIO_Pin_12
#define SD_SPI_MOSI_SOURCE GPIO_PinSource12
#define CS() GPIO_ResetBits(SD_CS_GPIO_PORT, SD_CS_PIN)
#define DECS() GPIO_SetBits(SD_CS_GPIO_PORT, SD_CS_PIN)
#define SD_CS_PIN GPIO_Pin_9
#define SD_CS_GPIO_PORT GPIOC
[b]sd.c[/b]
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE);
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = SD_SPI_SCK_PIN|SD_SPI_MISO_PIN| SD_SPI_MOSI_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = SD_CS_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOC, SD_SPI_SCK_SOURCE|SD_SPI_MISO_SOURCE|SD_SPI_MOSI_SOURCE, GPIO_AF_SPI3);
SPI_I2S_DeInit(SD_SPI);
/* SPI_MMC configuration */
SPI_StructInit(&SPI_InitStructure);
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPEED;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_CalculateCRC(SD_SPI, DISABLE);
SPI_Init(SD_SPI, &SPI_InitStructure);
//SPI_RxFIFOThresholdConfig(SD_SPI, SPI_RxFIFOThreshold_QF);
SPI_Cmd(SD_SPI, ENABLE);
Может дело в //SPI_RxFIFOThresholdConfig(SD_SPI, SPI_RxFIFOThreshold_QF); я не знаю чем его заменить в F4
Меня выкидывает вот здесь if (SPI_CMD(0, 0, 0x95, 0x01)) return SD_ERROR; //IDLE
- Oxford
- Опытный кот
- Сообщения: 819
- Зарегистрирован: Вт окт 23, 2012 13:17:25
- Откуда: Прокопьевск
- Контактная информация:
Re: Драйвер для MICRO_SD карт
Получится!
SPI_RxFIFOThresholdConfig(SD_SPI, SPI_RxFIFOThreshold_QF);
Убрать это для M0 ядра только специфично.
SPI_CalculateCRC(SD_SPI, DISABLE);
тоже убрать здесь не надо это
Выкидывает все верно потому что карта не отвечает.
На все ноги подтяжку сделай те CS тоже подтянуть надо, я имею ввиду внутри камня. внешне не надо.
SPI еще исправьте полярность и фазу
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
MOSI MISO CLK CS контакты правильно подключили к флешке? Не перепутали?

SPI_RxFIFOThresholdConfig(SD_SPI, SPI_RxFIFOThreshold_QF);
Убрать это для M0 ядра только специфично.
SPI_CalculateCRC(SD_SPI, DISABLE);
тоже убрать здесь не надо это
Выкидывает все верно потому что карта не отвечает.
На все ноги подтяжку сделай те CS тоже подтянуть надо, я имею ввиду внутри камня. внешне не надо.
SPI еще исправьте полярность и фазу
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
MOSI MISO CLK CS контакты правильно подключили к флешке? Не перепутали?
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Re: Драйвер для MICRO_SD карт
Я подключаю вот этот модуль, а не саму карту.... из-за этого может быть проблема?
- Oxford
- Опытный кот
- Сообщения: 819
- Зарегистрирован: Вт окт 23, 2012 13:17:25
- Откуда: Прокопьевск
- Контактная информация:
Re: Драйвер для MICRO_SD карт
Может, там через буферы сделаны сигналы. Все возможно.
Советую подключить карту напрямую и не гадать, когда заработает будете экспериментировать с другими платами.
Советую подключить карту напрямую и не гадать, когда заработает будете экспериментировать с другими платами.
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford