STM Урок 214. HAL. STM32F4. FLASH память W25Q. Получение информации из микросхемы



Продолжаем тему программирования контроллера STM32F4.

И сегодня мы попробуем к данному контроллеру подключить последовательную FLASH-память серии W25Q.

Данная последовательная память может быть различной ёмкости — 8, 16, 32, 64, 128, 256 Мбит и т. д.

Подключается такая память по интерфейсу SPI, а также по многопроводным интерфейсам Dual SPI, Quad SPI и QPI.

Мы же пока будем подключим данную микросхему по обычному интерфейсу SPI.

Краткие основные характеристики W25Q:

Потребляемая мощность и температурный диапазон:

  • Напряжение питания 2.7…3.6 В
  • Типичный потребляемый ток: 4 мА (активный режим), <1 мкА (в режиме снижения мощности)
  • Рабочий температурный диапазон -40°C…+85°C.

Гибкая архитектура с секторами размером 4 кбайт:

  • Посекторное стирание (размер каждого сектора 4 кбайт)
  • Блочное стирание (32кбайт и 64 кбайт)
  • Программирование от 1 до 256 байт
  • До 100 тыс. циклов стирания/записи
  • 20-летнее хранение данных

Максимальная частота работы микросхемы:

  • 104 МГц в режиме SPI
  • 208/416 МГц — Dual / Quad SPI

Есть ещё много различных возможностей, но это самые основные.

Также микросхема существует в различных корпусах, но в большинстве случаев распространён корпус SMD SO8.

Распиновка микросхемы следующая

 

 

Назначение каждого вывода:

 

Номер вывода Название Ввод/вывод (I/O) Назначение
1 /CS I Выбор чипа
2 DO (IO1) I/O Вывод данных (Ввод/вывод данных #1 для режимов S-SPI и D-SPI)
3 /WP (IO2) I/O Вход защиты записи (Ввод/вывод данных #2 для режима Q-SPI)
4 GND   Общий провод
5 DI(IO0 ) I/O Ввод данных (Ввод/вывод данных #0 для режимов S-SPI и D-SPI)
6 CLK I Ввод тактовых импульсов
7 /HOLD or /RESET (IO3 ) I/O Ввод/вывод данных #3 для режима Q-SPI
8 VCC   Напряжение питания

 

В зависимости от типа подключения схема подключения микросхемы к контроллеру также может различаться.

В режиме обычного SPI подключение будет следующее:

 

 

Следует отметить, что микросхема W25Q устроена так же как FLASH-память у stm32, то есть память у неё разбита на страницы по 256 байт, страницы объединены в секторы по 4096 байт, а секторы в блоки по 65536 байт. Организацию памяти микросхемы можно посмотреть на схеме

 

 

Перед тем как что-то записать, нужно стереть сектор (4096 байт) или блок (65536 байт). Можно стереть несколько секторов или блоков, или весь чип полностью. Во время стирания ячейки заполняются значениями 0xFF.

Каким образом организован процесс стирания, а также чтения и записи микросхемы, мы разберём в дальнейших занятиях, а сегодня наша задача — подключить микросхему к контроллеру, настроить проект для организации кода работы контроллера с микросхемой и в качестве испытания считать некоторые данные из неё.

Поэтому мы пока не будем забивать себе голову изучением всех регистров и их битов данной микросхемы W25Q, так как их там очень много, а будем их изучать по мере их использования.

Я буду использовать микросхему 25Q32FVSIG в корпусе SMD SO8, в которой 32 мегабита памяти, которую я припаял на переходник SO8-DIP, а также распаял штырьевые линейки для удобства подключения к контроллеру, получилась вот такая табуреточка

 

 

Подключим нашу микросхему к отладочной плате

 

 

Подключим отладочную плату к USB компьютера и приступим к проекту, который мы сегодня сделаем с нуля.

Запустим Cube MX создадим проект, выбрав для начала контроллер

 

Выберем отладчик

 

Включим HSE и задействуем кварцевый резонатор

 

В Clock Configuration внесем следующие настройки

 

 

Включим USART1, оставив все его настройки по умолчанию

 

 

 

У нас включились необходимые ножки

 

 

Включим SPI1

 

 

Увеличим делитель, так как у нас длинные провода, да и скорость нам сейчас не нужна

 

 

Задействуем на выход ножку PA4 — это у нас будет Chip Select

 

 

Увеличим скорость данной ножки, так как вдруг потом мы всё же решимся поднять частоту SPI

 

 

Настроим свойства проекта

 

 

Сгенерируем проект, откроем его в Cube IDE, и в файле main.c первым делом подключим стандартные библиотеки по работе со строками

 

 

Добавим также более простые функции для приёма и передачи байтов по шине SPI

 

 

Прежде чем работать с микросхемой, нужно произвести её сброс.

Чтобы сделать сброс, нужно сначала отправить команду разрешения сброса, а затем команду самого сброса

 

 

 

Объявим макросы для таких команд

 

 

Объявим также макросы для управления ножкой выбора

 

 

Также объявим буферы для приёма и передачи данных по SPI

 

 

Ниже функции SPI1_Recv добавим функцию сброса микросхемы

 

 

Так как сегодня мы будем только читать данные из памяти микросхемы, то нам нужно сначала узнать, как это делается.

Сначала передаётся команда чтения данных из памяти. Таких команд несколько, нам нужна будет пока только вот эта

 

 

Данная команда работает только в обычном режиме SPI, а мы сейчас с таким и работаем.

После команды передаётся 24-битный адрес и после этого мы на проводе MISO получаем интересующие нас байты памяти. В принципе, почти так же, как и в случае с EEPROM, только здесь используется команда и адресация 24-разрядная.

Объявим макрос для данной команды

 

 

Добавим функцию чтения определённого количества байтов из нашей микросхемы ниже функции W25_Reset

 

 

Ниже добавим функцию инициализации нашей микросхемы, в которой сначала произведём её сброс

 

 

Затем нам нужно будет считать идентификатор микросхемы, чтобы определить, какая именно микросхема у нас.

Таких команд также несколько, мы пока воспользуемся вот этой

 

 

Объявим для данной команды также макрос

 

 

Ниже функции W25_Read_Data добавим функцию, возвращающую идентификатор микросхемы

 

 

В функции W25_Ini вызовем данную функцию

 

 

Также вызовем функцию инициализации микросхемы в функции main()

 

 

Объявим глобальный символьный массив

 

 

А также объявим удобную структуру для хранения информации о микросхеме, а также переменную типа данной структуры

 

 

В функции W25_Ini отправим информацию об идентификаторе в терминальную программу

 

 

Соберём код, прошьём контроллер, запустим терминальную программу, перезагрузим контроллер и посмотрим, какой идентификатор считался из нашей микросхемы

 

 

Заглянем в документацию

 

 

Всё правильно.

Для микросхем различного объёма идентификатор разный, поэтому ниже добавим оператор вариантов, в теле которого в каждом кейсе выведем информацию о той или иной микросхеме на основе полученного идентификатора, предварительно обнулив старший байт

 

 

Соберём теперь код и посмотрим результат

 

 

Некоторые параметры известны, а некоторые можно рассчитать из количества блоков.

Проделаем это и отправим данную информацию в терминальную программу

 

 

Запустим теперь наш код на выполнение, после чего получим следующий результат

 

 

Отлично! Мы получили информацию о нашей микросхеме. Думаю, это будет достаточно для первого знакомства с линейкой W25Q. В дальнейших уроках мы попробуем что-нибудь в память нашей микросхемы записать, а также прочитать.

Всем спасибо за внимание!

 

 

Предыдущий урок Программирование МК STM32 Следующий урок

Исходный код

 

 

Отладочную плату можно приобрести здесь STM32F429I-DISCO

Микросхему FLASH-памяти W25Q32FVSSIG SOP8 (10 штук) можно приобрести здесь W25Q32FVSSIG

 

 

Смотреть ВИДЕОУРОК в RuTube (нажмите на картинку)

STM HAL. STM32F4. Подключаем FLASH память W25Q

 

Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)

STM HAL. STM32F4. Подключаем FLASH память W25Q

9 комментариев на “STM Урок 214. HAL. STM32F4. FLASH память W25Q. Получение информации из микросхемы
  1. Дмитрий:

    Спасибо Вам! Вопрос, в CubeIDE ведь уже встроен MX, или Вы просто привыкли к отдельной программе?

  2. Баязет Искаков:

    Здравствуйте! Спасибо за урок. Подскажите куда копать: не могу запустить флешку w25q16. Пробовал на регистрах и с помощью вашего проекта, результат один- не заводится Флешка и не отвечает на команды. При этом флешка прекрасно читается и пишется при помощи программатора XL866

  3. Добрый День.
    С Новым Годом!!!
    Спасибо Вам огромное за уроки. Отличные темы.
    По CAN BUS будут уроки?

    • Здравствуйте! Спасибо! CAN — очень нелёгкая тема особенно в плане практики. Поэтому пока неизвестно. У меня есть щиток приборов, есть CAN — Hacker, ряд плат с контроллерами с физикой CAN, переходники и т.д. Поэтому кое-что по практике можно слепить, но я просто не люблю незаконченности. Поэтому много надо ещё будет докупать, изучать, да и автомобиль у меня со старым интерфейсом K-Line, поэтому вроде как что-то есть, но пока точных планов не строю.

  4. а зачем в HAL если можно хотя бы в LL

  5. Evgeny:

    А есть ли рабочий вариант на базе скажем AT45DB641E-SHN2B-T

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*