Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Общетехнические вопросы

Общетехнические вопросы Общие вопросы аналоговой и цифровой электроники.

Ответ
 
Опции темы Опции просмотра
Старый 22.05.2020, 16:28   #1
Petr
Senior Member
 
Аватар для Petr
 
Регистрация: 25.02.2007
Возраст: 49
Сообщений: 1,844
Вес репутации: 3695/103
Petr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond repute
По умолчанию 6ти проводный интерфейс SD карты без модуля SDIO

Подскажите, если у кого есть толковое описание данного интерфейса.
Описание "общими словами" - этого в сети полно. Но конкретные времянки
и последовательности толком не нашел.
Только части и урывки информации.

Поясню к чему вопрос.
Конечно использование SPI для SD карт устарело и уходит в нирвану.
Я давно использую SD карты в своих устройствах с STM32
У них есть SDIO, его и использую.
Конечно после конкретного выгона индусского духа из имеющихся примеров
и драйверов

Но иногда возникает потребность или подключить карту к достаточно
быстрому контроллеру без данного модуля.
Или подключить ее с другой стороны корпуса с большим количеством ног.
Поскольку так удобно развести и так далее.
Ситуации такие встречаются.
И тут начинается недостаток информации. Почему то в сети две крайности
на эту тему.
Или подробно жуют SPI или не менее подробно жуют SDIO модуль.
Так что нужны описания процедур передачи команд, получения ответов
и операций обмена данными именно классического 6-ти проводного SD.
Всякие высокоуровневые дела и процедура инициализации - это как раз вообще не проблема.

По моим прикидкам скорость обмена в тех же STM32 без использования SDIO
или в других не менее быстрых процессорах будет соизмерима с SDIO
с небольшими потерями.
Поэтому такая реализация имеет смысл.
Petr вне форума   Ответить с цитированием
Старый 22.05.2020, 16:46   #2
DimaS
Senior Member
 
Регистрация: 05.04.2008
Адрес: Israel
Возраст: 47
Сообщений: 1,816
Вес репутации: 2531/88
DimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond repute
По умолчанию Re: 6ти проводный интерфейс SD карты без модуля SDIO

Цитата:
Сообщение от Petr Посмотреть сообщение
По моим прикидкам скорость обмена в тех же STM32 без использования SDIO или в других не менее быстрых процессорах будет соизмерима с SDIO с небольшими потерями.
Поэтому такая реализация имеет смысл.

Ногодрыг обеспечит 50мгц шинку? А с ПДП как?
DimaS на форуме   Ответить с цитированием
Старый 22.05.2020, 17:18   #3
Petr
Senior Member
 
Аватар для Petr
 
Регистрация: 25.02.2007
Возраст: 49
Сообщений: 1,844
Вес репутации: 3695/103
Petr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond repute
По умолчанию Re: 6ти проводный интерфейс SD карты без модуля SDIO

Цитата:
Сообщение от DimaS Посмотреть сообщение
Ногодрыг обеспечит 50мгц шинку? А с ПДП как?
А в чем проблема? Например с W25Q** обеспечивает. А уж в dual или quad режиме тем более. Про регистры слышали? Одна команда на изменение состояния.
Petr вне форума   Ответить с цитированием
Старый 22.05.2020, 17:21   #4
Petr
Senior Member
 
Аватар для Petr
 
Регистрация: 25.02.2007
Возраст: 49
Сообщений: 1,844
Вес репутации: 3695/103
Petr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond repute
По умолчанию Re: 6ти проводный интерфейс SD карты без модуля SDIO

Цитата:
Сообщение от DimaS Посмотреть сообщение
Ногодрыг обеспечит 50мгц шинку? А с ПДП как?
А собственно DMA тут мало полезен. Все равно жо шотовности сектора мало что можно сделать. Тем более DMA можно использовать в таком режиме запросто.
Petr вне форума   Ответить с цитированием
Старый 22.05.2020, 17:50   #5
Petr
Senior Member
 
Аватар для Petr
 
Регистрация: 25.02.2007
Возраст: 49
Сообщений: 1,844
Вес репутации: 3695/103
Petr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond repute
По умолчанию Re: 6ти проводный интерфейс SD карты без модуля SDIO

Цитата:
Сообщение от DimaS Посмотреть сообщение
Ногодрыг обеспечит 50мгц шинку? А с ПДП как?
Да и в "индусском" драйвере от ST функция чтения сектора вообще
вызывает хохот.
Там после пуска модуля и DMA идет глухой цикл!!!!!!! ожидания флага.
А флаг подымается в прерывании от DMA по завершению передачи или ошибке.
Так что.... готовка кошек дело тонкое.... особенно в Индии...
Petr вне форума   Ответить с цитированием
Старый 22.05.2020, 18:44   #6
DimaS
Senior Member
 
Регистрация: 05.04.2008
Адрес: Israel
Возраст: 47
Сообщений: 1,816
Вес репутации: 2531/88
DimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond repute
По умолчанию Re: 6ти проводный интерфейс SD карты без модуля SDIO

Цитата:
Сообщение от Petr Посмотреть сообщение
А в чем проблема? Например с W25Q** обеспечивает.

W25Q? Это в каком STM32?


Цитата:
А уж в dual или quad режиме тем более. Про регистры слышали? Одна команда на изменение состояния.
Регистр еще нужно заполнить. Может я как-то не правильно делал, но на ногодрыжном SPI, 50Мгц на клоке, на ф4, и близко не получалось.
DimaS на форуме   Ответить с цитированием
Старый 22.05.2020, 18:59   #7
DimaS
Senior Member
 
Регистрация: 05.04.2008
Адрес: Israel
Возраст: 47
Сообщений: 1,816
Вес репутации: 2531/88
DimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond repute
По умолчанию Re: 6ти проводный интерфейс SD карты без модуля SDIO

А что вообще конкретно надо, спецификацию физического интерфейса?
Бесплатно не встречал, на из сайте дают только упрощенную версию, там много чег есть. но именно это - пропущено.
DimaS на форуме   Ответить с цитированием
Старый 22.05.2020, 20:20   #8
Petr
Senior Member
 
Аватар для Petr
 
Регистрация: 25.02.2007
Возраст: 49
Сообщений: 1,844
Вес репутации: 3695/103
Petr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond repute
По умолчанию Re: 6ти проводный интерфейс SD карты без модуля SDIO

Цитата:
Сообщение от DimaS Посмотреть сообщение
W25Q? Это в каком STM32?




Регистр еще нужно заполнить. Может я как-то не правильно делал, но на ногодрыжном SPI, 50Мгц на клоке, на ф4, и близко не получалось.
На f4.
Регистр заполняется константой - маской номера пина
Petr вне форума   Ответить с цитированием
Старый 22.05.2020, 20:21   #9
Petr
Senior Member
 
Аватар для Petr
 
Регистрация: 25.02.2007
Возраст: 49
Сообщений: 1,844
Вес репутации: 3695/103
Petr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond repute
По умолчанию Re: 6ти проводный интерфейс SD карты без модуля SDIO

Цитата:
Сообщение от DimaS Посмотреть сообщение
А что вообще конкретно надо, спецификацию физического интерфейса?
Бесплатно не встречал, на из сайте дают только упрощенную версию, там много чег есть. но именно это - пропущено.
Именно физического интерфейса! Конкретно это и нужно. Можно и осциллом но тяжко и долго...
Petr вне форума   Ответить с цитированием
Старый 23.05.2020, 20:17   #10
DimaS
Senior Member
 
Регистрация: 05.04.2008
Адрес: Israel
Возраст: 47
Сообщений: 1,816
Вес репутации: 2531/88
DimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond repute
По умолчанию Re: 6ти проводный интерфейс SD карты без модуля SDIO

Цитата:
Сообщение от Petr Посмотреть сообщение
На f4.
Регистр заполняется константой - маской номера пина

Код для этого можно увидеть? Хочу ногдрыжный SPI хотя бы до 25мгц довести.
DimaS на форуме   Ответить с цитированием
Старый 23.05.2020, 20:22   #11
SergP01
Senior Member
 
Аватар для SergP01
 
Регистрация: 09.11.2012
Адрес: SPB
Возраст: 52
Сообщений: 1,491
Вес репутации: 725/49
SergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to behold
По умолчанию Re: 6ти проводный интерфейс SD карты без модуля SDIO

Цитата:
Сообщение от DimaS Посмотреть сообщение
Код для этого можно увидеть? Хочу ногдрыжный SPI хотя бы до 25мгц довести.
у вас потребитель выдержит 25?

напишите софтовый SPI.... 10 строчек кода....
SergP01 на форуме   Ответить с цитированием
Старый 24.05.2020, 11:00   #12
DimaS
Senior Member
 
Регистрация: 05.04.2008
Адрес: Israel
Возраст: 47
Сообщений: 1,816
Вес репутации: 2531/88
DimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond repute
По умолчанию Re: 6ти проводный интерфейс SD карты без модуля SDIO

Цитата:
Сообщение от SergP01 Посмотреть сообщение
у вас потребитель выдержит 25?

Выдержит.



Цитата:
напишите софтовый SPI.... 10 строчек кода....

Написан много лет назад.


Вообще, Сергей, я не Вас спрашивал, и я уже говорил, что конкретно Ваши ответы мне не интересны.
DimaS на форуме   Ответить с цитированием
Старый 24.05.2020, 13:53   #13
SergP01
Senior Member
 
Аватар для SergP01
 
Регистрация: 09.11.2012
Адрес: SPB
Возраст: 52
Сообщений: 1,491
Вес репутации: 725/49
SergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to behold
По умолчанию Re: 6ти проводный интерфейс SD карты без модуля SDIO

Цитата:
Сообщение от DimaS Посмотреть сообщение
Выдержит.

Написан много лет назад.


.
а чего тогда глупые вопросы задаётё..... сколько PORT вытянет....
на сколько можно переферию раскачать.... вот от этого.... по коду и считайте
SergP01 на форуме   Ответить с цитированием
Старый 24.05.2020, 16:55   #14
DimaS
Senior Member
 
Регистрация: 05.04.2008
Адрес: Israel
Возраст: 47
Сообщений: 1,816
Вес репутации: 2531/88
DimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond repute
По умолчанию Re: 6ти проводный интерфейс SD карты без модуля SDIO

Цитата:
Сообщение от SergP01 Посмотреть сообщение
а чего тогда глупые вопросы задаётё.....

Я же не задаю их ВАМ, ибо мне не интересны глупые ответы.
DimaS на форуме   Ответить с цитированием
Старый 24.05.2020, 17:45   #15
SergP01
Senior Member
 
Аватар для SergP01
 
Регистрация: 09.11.2012
Адрес: SPB
Возраст: 52
Сообщений: 1,491
Вес репутации: 725/49
SergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to behold
По умолчанию Re: 6ти проводный интерфейс SD карты без модуля SDIO

Цитата:
Сообщение от DimaS Посмотреть сообщение
Я же не задаю их ВАМ, ибо мне не интересны глупые ответы.
жалко, что мы не поняли друг друга....
в ваших вопросах кроме- "хочу дрыгать на 25мгц" .... больше ни каких исходных данных нет...
сами перечитайте свои посты...
SergP01 на форуме   Ответить с цитированием
Старый 24.05.2020, 18:42   #16
DimaS
Senior Member
 
Регистрация: 05.04.2008
Адрес: Israel
Возраст: 47
Сообщений: 1,816
Вес репутации: 2531/88
DimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond repute
По умолчанию Re: 6ти проводный интерфейс SD карты без модуля SDIO

Цитата:
Сообщение от SergP01 Посмотреть сообщение
жалко, что мы не поняли друг друга....

Мне - нет.
DimaS на форуме   Ответить с цитированием
Старый 25.05.2020, 05:20   #17
Petr
Senior Member
 
Аватар для Petr
 
Регистрация: 25.02.2007
Возраст: 49
Сообщений: 1,844
Вес репутации: 3695/103
Petr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond repute
По умолчанию Re: 6ти проводный интерфейс SD карты без модуля SDIO

Цитата:
Сообщение от DimaS Посмотреть сообщение
Код для этого можно увидеть? Хочу ногдрыжный SPI хотя бы до 25мгц довести.
Я выложу пример для W25Q** раз вы развели тут глупый спор о очевидном.
Читать доки на контроллеры и периферию
сейчас не модно - я знаю
Petr вне форума   Ответить с цитированием
Старый 25.05.2020, 05:48   #18
Petr
Senior Member
 
Аватар для Petr
 
Регистрация: 25.02.2007
Возраст: 49
Сообщений: 1,844
Вес репутации: 3695/103
Petr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond repute
По умолчанию Re: 6ти проводный интерфейс SD карты без модуля SDIO

Цитата:
Сообщение от DimaS Посмотреть сообщение
Ногодрыг обеспечит 50мгц шинку? А с ПДП как?
Кстати откуда это число 50???
Мудуль SDIO должен иметь тактирование не выше 48 МГц (и без вариантов)
Для того смотрим и ставим делители в схеме тактирования в зависимости от вашего генератора.
И не выше 25МГц шина в любом режиме.
Пропускная в режиме 4х бит более менее.
Это понятно...
Но 50 то откуда вычитали ?
Petr вне форума   Ответить с цитированием
Старый 25.05.2020, 09:55   #19
DimaS
Senior Member
 
Регистрация: 05.04.2008
Адрес: Israel
Возраст: 47
Сообщений: 1,816
Вес репутации: 2531/88
DimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond repute
По умолчанию Re: 6ти проводный интерфейс SD карты без модуля SDIO

Цитата:
Сообщение от Petr Посмотреть сообщение
Я выложу пример

ОК, будет интересно.





Цитата:
для W25Q** раз вы развели тут глупый спор о очевидном.
Читать доки на контроллеры и периферию
сейчас не модно - я знаю

Вы мне так и не ответили, что такое это "W25Q"?
DimaS на форуме   Ответить с цитированием
Старый 25.05.2020, 10:10   #20
Petr
Senior Member
 
Аватар для Petr
 
Регистрация: 25.02.2007
Возраст: 49
Сообщений: 1,844
Вес репутации: 3695/103
Petr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond repute
По умолчанию Re: 6ти проводный интерфейс SD карты без модуля SDIO

Цитата:
Сообщение от DimaS Посмотреть сообщение
Вы мне так и не ответили, что такое это "W25Q"?
Не ответил??????????????????????????????????
Вас в гугле забанили лет 20 назад?
Это популярная микросхема памяти.
Есть на 1/2/4/8 МБ
Широко используется как микросхема BIOS на материнках.
Имеет SPI, но!!!
У нее есть dual и quad режимы, которые не совместимы с SPI конечно,
но повышают скорость чтения (не записи) в 2 и 4 раза.
Тем она и напоминает интерфейс SD карт немного.

Не для вас, а для остальных код может быть интересен:
Зачем "линейные" участки кода всем ясно, на эти вопросы отвечать не буду.
Конструкции типа DF_SCK_PORT->BSRRH = DF_SCK_PIN;
препроцессор на первом проходе оптимизирует до адресов
в адресном пространстве регистров. Ну а DF_SCK_PIN и подобное
конечно константы.

Код:
//-----------------------------------------------------------------------------------------------------------------------
//инит портов памяти
void InitW25(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;                         //структура параметров пина

  //Enable GPIO clock
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
  //Configure the DF_SCK_PIN as output
  GPIO_InitStructure.GPIO_Pin = DF_SCK_PIN;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_Init(DF_SCK_PORT, &GPIO_InitStructure);
  //Configure the DF_MISO_PIN as output
  GPIO_InitStructure.GPIO_Pin = DF_MISO_PIN;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_Init(DF_MISO_PORT, &GPIO_InitStructure);
  //Configure the DF_MOSI_PIN as input
  GPIO_InitStructure.GPIO_Pin = DF_MOSI_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  GPIO_InitStructure.GPIO_PuPd =  GPIO_PuPd_NOPULL;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_Init(DF_MOSI_PORT, &GPIO_InitStructure);
  //Configure the DF_CS0 pin as output
  GPIO_InitStructure.GPIO_Pin = DF_CS0_PIN;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_Init(DF_CS0_PORT, &GPIO_InitStructure);
}  
//-----------------------------------------------------------------------------------------------------------------------
//смена режима порта IO_0
void Set_IO0_Mode(unsigned char Mode)
{
  GPIO_InitTypeDef  GPIO_InitStructure;                         //структура параметров пина

  if (Mode)                                                     //будет выходом
  {
    //Configure the DF_MISO_PIN as output
    GPIO_InitStructure.GPIO_Pin = DF_MISO_PIN;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_Init(DF_MISO_PORT, &GPIO_InitStructure);
  }
  else                                                          //вход
  {
    //Configure the DF_MISO_PIN as input
    GPIO_InitStructure.GPIO_Pin = DF_MISO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
    GPIO_InitStructure.GPIO_PuPd =  GPIO_PuPd_NOPULL;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_Init(DF_MISO_PORT, &GPIO_InitStructure);
  }
}  
//-----------------------------------------------------------------------------------------------------------------------
//включение CS
void CS_On(void)
{ 
  GPIO_ResetBits(DF_CS0_PORT, DF_CS0_PIN);                      //есть только одна микросхема
  __ASM("NOP");                                                 //пауза на один такт
}
//-----------------------------------------------------------------------------------------------------------------------
//выключение всех CS
void CS_AllOff(void)
{ 
  GPIO_SetBits(DF_CS0_PORT, DF_CS0_PIN);                        //выключаем все CS
  __ASM("NOP");                                                 //пауза на один такт
}
//-----------------------------------------------------------------------------------------------------------------------
//инит сервиса DF
void DF_Init(void)
{
  InitW25();                                                    //инит портов памяти
  ANomBl = 0xFFFFFFFF;                                          //текущий номер блока в кеше (невозможный)
  AWRPointSize = 0;                                             //точка записи/размер текущего файла
  AFileStarted = 0;                                             //признак открытия текущего файла
  Modified = 0;                                                 //признак изменений в буфере
  LogModified = 0;                                              //признак изменений в логе
  CS_AllOff();                                                  //выключение всех CS
  DF_RdLogPar();                                                //чтение параметров лога
}
//-----------------------------------------------------------------------------------------------------------------------
//отправка/получение байта по SPI, софтверный вариант
unsigned char DFTranserByte (unsigned char Data)
{
  //чуть более быстрый вариант, чем в бутлоадере
  unsigned char Res = 0x00;                                     //результат
  //бит 7
  if (Data & 0x80) DF_MISO_PORT->BSRRL = DF_MISO_PIN;           //1
  else             DF_MISO_PORT->BSRRH = DF_MISO_PIN;           //0
  DF_SCK_PORT->BSRRL = DF_SCK_PIN;                              //начался строб
  if (DF_MOSI_PORT->IDR & DF_MOSI_PIN) Res |= 0x80;             //читаем бит данных
  DF_SCK_PORT->BSRRH = DF_SCK_PIN;                              //закончился строб
  //бит 6
  if (Data & 0x40) DF_MISO_PORT->BSRRL = DF_MISO_PIN;
  else             DF_MISO_PORT->BSRRH = DF_MISO_PIN;
  DF_SCK_PORT->BSRRL = DF_SCK_PIN;
  if (DF_MOSI_PORT->IDR & DF_MOSI_PIN) Res |= 0x40;
  DF_SCK_PORT->BSRRH = DF_SCK_PIN;
  //бит 5
  if (Data & 0x20) DF_MISO_PORT->BSRRL = DF_MISO_PIN;
  else             DF_MISO_PORT->BSRRH = DF_MISO_PIN;
  DF_SCK_PORT->BSRRL = DF_SCK_PIN;
  if (DF_MOSI_PORT->IDR & DF_MOSI_PIN) Res |= 0x20;
  DF_SCK_PORT->BSRRH = DF_SCK_PIN;
  //бит 4
  if (Data & 0x10) DF_MISO_PORT->BSRRL = DF_MISO_PIN;
  else             DF_MISO_PORT->BSRRH = DF_MISO_PIN;
  DF_SCK_PORT->BSRRL = DF_SCK_PIN;
  if (DF_MOSI_PORT->IDR & DF_MOSI_PIN) Res |= 0x10;
  DF_SCK_PORT->BSRRH = DF_SCK_PIN;
  //бит 3
  if (Data & 0x08) DF_MISO_PORT->BSRRL = DF_MISO_PIN;
  else             DF_MISO_PORT->BSRRH = DF_MISO_PIN;
  DF_SCK_PORT->BSRRL = DF_SCK_PIN;
  if (DF_MOSI_PORT->IDR & DF_MOSI_PIN) Res |= 0x08;
  DF_SCK_PORT->BSRRH = DF_SCK_PIN;
  //бит 2
  if (Data & 0x04) DF_MISO_PORT->BSRRL = DF_MISO_PIN;
  else             DF_MISO_PORT->BSRRH = DF_MISO_PIN;
  DF_SCK_PORT->BSRRL = DF_SCK_PIN;
  if (DF_MOSI_PORT->IDR & DF_MOSI_PIN) Res |= 0x04;
  DF_SCK_PORT->BSRRH = DF_SCK_PIN;
  //бит 1
  if (Data & 0x02) DF_MISO_PORT->BSRRL = DF_MISO_PIN;
  else             DF_MISO_PORT->BSRRH = DF_MISO_PIN;
  DF_SCK_PORT->BSRRL = DF_SCK_PIN;
  if (DF_MOSI_PORT->IDR & DF_MOSI_PIN) Res |= 0x02;
  DF_SCK_PORT->BSRRH = DF_SCK_PIN;
  //бит 0
  if (Data & 0x01) DF_MISO_PORT->BSRRL = DF_MISO_PIN;
  else             DF_MISO_PORT->BSRRH = DF_MISO_PIN;
  DF_SCK_PORT->BSRRL = DF_SCK_PIN;
  if (DF_MOSI_PORT->IDR & DF_MOSI_PIN) Res |= 0x01;
  DF_SCK_PORT->BSRRH = DF_SCK_PIN;
  
  return Res;                                                   //результат
}
//-----------------------------------------------------------------------------------------------------------------------
//отправка/получение байта по DUAL SPI, софтверный вариант
unsigned char DFTranserByte_DUAL (unsigned char Data)
{
  unsigned char Res = 0x00;                                     //результат
  //пара 2
  if (Data & 0x80) DF_MISO_PORT->BSRRL = DF_MISO_PIN;           //1
  else             DF_MISO_PORT->BSRRH = DF_MISO_PIN;           //0
  DF_SCK_PORT->BSRRL = DF_SCK_PIN;                              //начался строб
  if (DF_MISO_PORT->IDR & DF_MISO_PIN) Res |= 0x40;             //читаем бит данных
  if (DF_MOSI_PORT->IDR & DF_MOSI_PIN) Res |= 0x80;             //читаем бит данных
  DF_SCK_PORT->BSRRH = DF_SCK_PIN;                              //закончился строб
  //пара 2
  if (Data & 0x40) DF_MISO_PORT->BSRRL = DF_MISO_PIN;
  else             DF_MISO_PORT->BSRRH = DF_MISO_PIN;
  DF_SCK_PORT->BSRRL = DF_SCK_PIN;
  if (DF_MISO_PORT->IDR & DF_MISO_PIN) Res |= 0x10;
  if (DF_MOSI_PORT->IDR & DF_MOSI_PIN) Res |= 0x20;
  DF_SCK_PORT->BSRRH = DF_SCK_PIN;
  //пара 1
  if (Data & 0x20) DF_MISO_PORT->BSRRL = DF_MISO_PIN;
  else             DF_MISO_PORT->BSRRH = DF_MISO_PIN;
  DF_SCK_PORT->BSRRL = DF_SCK_PIN;
  if (DF_MISO_PORT->IDR & DF_MISO_PIN) Res |= 0x04;
  if (DF_MOSI_PORT->IDR & DF_MOSI_PIN) Res |= 0x08;
  DF_SCK_PORT->BSRRH = DF_SCK_PIN;
  //пара 0
  if (Data & 0x10) DF_MISO_PORT->BSRRL = DF_MISO_PIN;
  else             DF_MISO_PORT->BSRRH = DF_MISO_PIN;
  DF_SCK_PORT->BSRRL = DF_SCK_PIN;
  if (DF_MISO_PORT->IDR & DF_MISO_PIN) Res |= 0x01;
  if (DF_MOSI_PORT->IDR & DF_MOSI_PIN) Res |= 0x02;
  DF_SCK_PORT->BSRRH = DF_SCK_PIN;

  return Res;                                                   //результат
}
//-----------------------------------------------------------------------------------------------------------------------
//очень приблизительная задержка в микросекундах
void SmallDel(unsigned long Delay)
{
  Delay *= 22;
  while (Delay--);
}
//-----------------------------------------------------------------------------------------------------------------------
//ожидание готовности
void Wait_BUSY(void)
{
  unsigned char  Var;                                           //переменная для результата
  unsigned char  WFl;                                           //флаг ожидания
  unsigned short WtTmr;                                         //счетчик ожидания

  WFl = 1;                                                      //предположим занятость
  WtTmr = 0;                                                    //количество попыток получить готовность памяти

  while (WFl)                                                   //ждем готовность какое то разумное время
  {
    CS_On();                                                    //заактивили чипселект
    DFTranserByte(0x05);                                        //команда чтения статуса 0
    Var = DFTranserByte(0x00);                                  //чтение статуса
    CS_AllOff();                                                //прекратили действие этой команды

    Var &= 0x01;                                                //сброс незначащих битов
    if (!Var) WFl = 0;                                          //микросхема свободна
    else      SmallDel(10);                                     //небольшое ожидание

    WtTmr++;                                                    //количество попыток
    if (WtTmr > 10000) WFl = 0;                                 //сколько можно ждать
  }  
}
//-----------------------------------------------------------------------------------------------------------------------
//разрешение записи
void Write_ON(void)
{
  Wait_BUSY();                                                  //ожидание готовности
  CS_On();                                                      //активный чипселект 
  DFTranserByte(0x06);                                          //команда разрешения записи
  CS_AllOff();                                                  //чипселект неактивен (команда завершена)
}
//-----------------------------------------------------------------------------------------------------------------------
//сброс буфера в микросхему
void Wr_Buf(unsigned long NBl)
{
  unsigned long  FullAdr;                                       //адрес блока в чипе (полный адрес)
  unsigned long  PgOffs;                                        //смещение страницы в кеше
  unsigned short i, j;                                          //индексы

  if (NBl > MaxErBlCnty) return;                                //превышение емкости установленной памяти
  
  FullAdr = NBl * ErBlSize;                                     //адрес блока в чипе (полный адрес)
  //стирание нужного блока
  Write_ON();                                                   //разрешение записи
  Wait_BUSY();                                                  //ожидание готовности
  CS_On();                                                      //активный чипселект 
  DFTranserByte(0x20);                                          //команда стирания блока
  DFTranserByte((unsigned char)(FullAdr >> 16));                //запись адреса блока
  DFTranserByte((unsigned char)(FullAdr >> 8));
  DFTranserByte((unsigned char) FullAdr);
  CS_AllOff();                                                  //чипселект неактивен (команда завершена)
  for (j = 0; j < WrPageInErBl; j++)                            //запись всех страниц в блоке
  {
    //запись одной страницы
    Write_ON();                                                 //разрешение записи
    Wait_BUSY();                                                //ожидание готовности
    CS_On();                                                    //активный чипселект 
    DFTranserByte(0x02);                                        //команда записи страницы
    DFTranserByte((unsigned char)(FullAdr >> 16));              //запись адреса страницы (начала)
    DFTranserByte((unsigned char)(FullAdr >> 8));
    DFTranserByte((unsigned char) FullAdr);
    FullAdr += WrPageSize;                                      //адрес нужно сдвинуть на размер страницы записи
    PgOffs = j * WrPageSize;                                    //смещение страницы в кеше
    //данные (одна страница записи)
    for (i = 0; i < WrPageSize; i++) DFTranserByte(ErBl_Bufer[PgOffs + i]);
    CS_AllOff();                                                //чипселект неактивен (команда завершена)
  }
  Modified = 0;                                                 //изменений нет - буфер записан
}
//-----------------------------------------------------------------------------------------------------------------------
//чтение буфера из dataflash
void Rd_Buf(unsigned long NBl)
{
  unsigned long  FullAdr;                                       //адрес блока в чипе (полный адрес)
  unsigned short i;                                             //индекс

  if (NBl > MaxErBlCnty) return;                                //превышение емкости установленной памяти
  
  FullAdr = NBl * ErBlSize;                                     //адрес блока в чипе (полный адрес)
  //чтение всего блока
  Wait_BUSY();                                                  //ожидание готовности
  CS_On();                                                      //активный чипселект 
  DFTranserByte(0x3B);                                          //команда чтения памяти в DUAL режиме
  DFTranserByte((unsigned char)(FullAdr >> 16));                //запись адреса страницы (начала)
  DFTranserByte((unsigned char)(FullAdr >> 8));
  DFTranserByte((unsigned char) FullAdr);
  DFTranserByte(0x00);                                          //Dummy байт
  Set_IO0_Mode(0);                                              //включили второй вход
  for (i = 0; i < ErBlSize; i++) ErBl_Bufer[i] = DFTranserByte_DUAL(0x00);
  CS_AllOff();                                                  //чипселект неактивен (команда завершена)
  Set_IO0_Mode(1);                                              //порт снова на выход
}
//-----------------------------------------------------------------------------------------------------------------------
//перезагрузка буфера в кеше
void Reload_Bufer(unsigned long New_Nom)
{
  if (Modified) Wr_Buf(ANomBl);                                 //сброс текущего буфера в DataFlash, если в нем есть изменения
  Rd_Buf(New_Nom);                                              //чтение нового буфера из DataFlash
  ANomBl = New_Nom;                                             //теперь это текущий номер
}
//-----------------------------------------------------------------------------------------------------------------------
//запись сектора для FAT
void Wr_Buf_FAT(unsigned long Sector, unsigned char *Buf)
{
  unsigned long  NBl;                                           //номер блока
  unsigned long  BlOffs;                                        //смещение в блоке
  unsigned short i;                                             //просто переменная

  Sector += FirstFATSec;                                        //смещение на величину резерва
  if (Sector >= MaxFSector) return;                             //превышение емкости памяти
  
  NBl = (Sector * 512) / ErBlSize;                              //номер блока
  BlOffs = (Sector * 512) % ErBlSize;                           //смещение в блоке (кеше)

  if (ANomBl != NBl) Reload_Bufer(NBl);                         //если требуется не текущий блок в кеше - перезагрузка блока
  for (i = 0; i <= 511; i++) ErBl_Bufer[BlOffs + i] = Buf[i];   //запись сектора в кеш
  Modified = 1;                                                 //в кеше есть изменения
}
//-----------------------------------------------------------------------------------------------------------------------
//чтение сектора для FAT
void Rd_Buf_FAT(unsigned long Sector, unsigned char *Buf)
{
  unsigned long  FullAdr;                                       //адрес сектора в чипе (полный адрес)
  unsigned short i;                                             //просто переменная
  
  Sector += FirstFATSec;                                        //смещение на величину резерва
  if (Sector >= MaxFSector) return;                             //превышение емкости памяти
  
  if (Modified) Wr_Buf(ANomBl);                                 //сброс текущего буфера в DataFlash, если в нем есть изменения
  FullAdr = Sector * 512;                                       //адрес сектора в чипе (полный адрес)
  Wait_BUSY();                                                  //ожидание готовности
  //чтение одного сектора DUAL режим
  CS_On();                                                      //активный чипселект 
  DFTranserByte(0x3B);                                          //команда чтения памяти в DUAL режиме
  DFTranserByte((unsigned char)(FullAdr >> 16));                //запись адреса страницы (начала)
  DFTranserByte((unsigned char)(FullAdr >> 8));
  DFTranserByte((unsigned char) FullAdr);
  DFTranserByte(0x00);                                          //Dummy байт
  Set_IO0_Mode(0);                                              //включили второй вход
  for (i = 0; i < 512; i++) Buf[i] = DFTranserByte_DUAL(0x00);
  CS_AllOff();                                                  //чипселект неактивен (команда завершена)
  Set_IO0_Mode(1);                                              //порт снова на выход
}
Petr вне форума   Ответить с цитированием
Старый 25.05.2020, 10:14   #21
DimaS
Senior Member
 
Регистрация: 05.04.2008
Адрес: Israel
Возраст: 47
Сообщений: 1,816
Вес репутации: 2531/88
DimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond repute
По умолчанию Re: 6ти проводный интерфейс SD карты без модуля SDIO

Цитата:
Сообщение от Petr Посмотреть сообщение
Кстати откуда это число 50???
Мудуль SDIO должен иметь тактирование не выше 48 МГц (и без вариантов)

А причем тут этот модуль к ногодрыгу?



Цитата:
Но 50 то откуда вычитали ?

ОК, меня и 25 устроит.
DimaS на форуме   Ответить с цитированием
Старый 25.05.2020, 10:22   #22
DimaS
Senior Member
 
Регистрация: 05.04.2008
Адрес: Israel
Возраст: 47
Сообщений: 1,816
Вес репутации: 2531/88
DimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond repute
По умолчанию Re: 6ти проводный интерфейс SD карты без модуля SDIO

Цитата:
Сообщение от Petr Посмотреть сообщение
Не ответил??????????????????????????????????
Вас в гугле забанили лет 20 назад?
Это популярная микросхема памяти.

А какая мне разница какая микросхема стоит в SD-карточке?

Откуда я знаю чтот юзер слот засунет?
И как влияет тип памяти, на скорость ногодрыга?


За код спасибо, но если не сложно, допишите где-нибудь:


while(1) DFTranserByte(0x5A);


и покажите осцилограмму на ножке DF_SCK_PIN.
DimaS на форуме   Ответить с цитированием
Старый 25.05.2020, 10:32   #23
Petr
Senior Member
 
Аватар для Petr
 
Регистрация: 25.02.2007
Возраст: 49
Сообщений: 1,844
Вес репутации: 3695/103
Petr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond repute
По умолчанию Re: 6ти проводный интерфейс SD карты без модуля SDIO

Цитата:
Сообщение от DimaS Посмотреть сообщение
А какая мне разница какая микросхема стоит в SD-карточке?

Откуда я знаю чтот юзер слот засунет?
И как влияет тип памяти, на скорость ногодрыга?


За код спасибо, но если не сложно, допишите где-нибудь:


while(1) DFTranserByte(0x5A);


и покажите осцилограмму на ножке DF_SCK_PIN.
Нет. Я не стану
Вы уж сами, если вам надо. Я по старинке... листинги смотрю и калькулятор использую (желтый с черными кнопочками).


(у вас смешно вышла "не шутка" о микросхеме в SD карте)
Хотя там действительно есть микросхемы памяти и контроллер.
Petr вне форума   Ответить с цитированием
Старый 25.05.2020, 11:19   #24
DimaS
Senior Member
 
Регистрация: 05.04.2008
Адрес: Israel
Возраст: 47
Сообщений: 1,816
Вес репутации: 2531/88
DimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond repute
По умолчанию Re: 6ти проводный интерфейс SD карты без модуля SDIO

Цитата:
Сообщение от Petr Посмотреть сообщение
Нет. Я не стану
Вы уж сами, если вам надо. Я по старинке... листинги смотрю и калькулятор использую (желтый с черными кнопочками).

И ниразу осциллографом не смотрели?
И какая частота получилась?


У меня к сожалению нет "желтого калькулятора с черными кнопочками", но процедура вывода практически точно такая-же:
Код:
static __INLINE void SendByte(u8 c){

  if(c &0x80) SDA_H; else SDA_L;   SCL_L; SCL_H;
  if(c &0x40) SDA_H; else SDA_L;   SCL_L; SCL_H;
  if(c &0x20) SDA_H; else SDA_L;   SCL_L; SCL_H;
  if(c &0x10) SDA_H; else SDA_L;   SCL_L; SCL_H;
  if(c &0x08) SDA_H; else SDA_L;   SCL_L; SCL_H;
  if(c &0x04) SDA_H; else SDA_L;   SCL_L; SCL_H;
  if(c &0x02) SDA_H; else SDA_L;   SCL_L; SCL_H;
  if(c &0x01) SDA_H; else SDA_L;   SCL_L; SCL_H;
  
}
Макросы SDA_H/L, SCL_H/L - это те-же BSRRH/BSRRL как у Вас.


Вообще, самый скоростной вариант- писать весь байт в порт и делать шифт порту и щелкать клоком. Но все ножки порта кроме одной (MOSI) пропадают. Делал так когда-то на пиках.
DimaS на форуме   Ответить с цитированием
Старый 25.05.2020, 12:03   #25
Petr
Senior Member
 
Аватар для Petr
 
Регистрация: 25.02.2007
Возраст: 49
Сообщений: 1,844
Вес репутации: 3695/103
Petr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond repute
По умолчанию Re: 6ти проводный интерфейс SD карты без модуля SDIO

Цитата:
Сообщение от DimaS Посмотреть сообщение
Делал так когда-то на пиках.
STM32 не пики!!! У них такой финт со сдвигом не катит.
Раз вы такое написали, то как работают порты у STM вы даже не слышали. Сочувствую. (вообще то нет).
Частота в байте около 30 МГц на клоке в приведенном коде при 160 МГц ядра.
Petr вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
usb с нуля gromovi Вопросы начинающих 61 09.03.2012 23:56


Часовой пояс GMT +3, время: 09:29.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot