STM Урок 215. HAL. STM32F4. FLASH память W25Q. Чтение данных



Продолжаем тему программирования контроллера STM32F4 и также продолжаем работу с последовательной FLASH-памятью серии W25Q. И теперь мы попробуем прочитать из данной микросхемы не служебную информацию, так как это мы уже умеем, а полезные данные, которые записаны в её памяти. Для данной цели, конечно же надо, что-то туда для начала записать, а так как это мы ещё программно не умеем, то я записал туда готовую прошивку для какого-то спутникового приёмника с помощью специального программатора. Вы можете либо проделать то же самое, либо взять микросхему уже с записанной информацией. Я решил начать с чтения, а не с записи, так как это несколько легче организовать, ибо чтобы писать информацию, её ещё нужно где-то взять.

Схема наша осталась такая же, как и в прошлом уроке

 

 

Изучать процесс чтения данных мы будем в плотном взаимодействии с технической документацией, только изучение документации и написание кода мы объединим в один общий процесс, так как изучать без одновременного кодинга нецелесообразно и материал усваивается хуже, что уже проверено ранее.

Поэтому мы сначала создадим проект урока из проекта прошлого урока с именем SPI_25Q32_INFO и назовём его SPI_25Q32_READ.

Откроем наш проект в Cube MX и, ничего в нём не трогая, сгенерируем проект и откроем его в Cube IDE.

Чтобы не писать весь код в одном модуле, в каталогах Inc и Src создадим соответственно файлы w25q_spi.h и w25q_spi.c следующего содержания

 

 

 

Из файла main.c перенесём в файл w25q_spi.c с последующим удалением из источника все наши макросы, а также подключим переменные структур интерфейсов SPI и UART

 

 

То же самое проделаем вот с этой структурой и переменной

 

 

Перенесем также вот этот массив

 

 

 

Добавим целочисленный массив

 

 

Также перенесём функции SPI1_Send, SPI1_Recv, W25_Reset, W25_Read_Data , W25_Read_ID и W25_Ini со всеми их телами.

В функциях W25_Reset, W25_Read_Data и W25_Read_ID изменим везде имя массива tx_buf на buf.

В файле w25q_spi.h создадим прототипы для наших функций

 

 

Теперь мы можем собрать и прошить наш проект, чтобы проверить его работоспособность. Если всё нормально работает, то продолжим дальше.

Функция для чтения данных с определённого адреса у нас уже есть, поэтому перейдём в main.c и попробуем ею воспользоваться и считать какие-нибудь данные.

Для начала подключим нашу библиотеку

 

 

Затем объявим массив и переменную в функции main()

 

 

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

 

 

Соберём код, прошьём контроллер и увидим вот такую вот картину в терминальной программе

 

 

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

 

 

Первым параметром у данной функции будет указатель на данные, вторым — адрес (в страницах, а не в байтах), третьим — смещение в байтах от реального адреса страницы, четвёртым — количество байтов, которые мы собираемся считать.

Добавим в тело функции небольшую защиту от превышения количества страниц и смещения

 

 

Получим реальный адрес

 

 

 

Так как в микросхемах объёмом 512 и 1024 мегабит используется адресация 32-разрядная, то давайте добавим в нашу структуру свойств w25_info_t ещё один параметр

 

 

Сначала данный параметр в функции W25_Ini обнулим

 

 

А затем установим его в единицу в случае попадания в следующие кейсы

 

 

 

Ничего особенного в чтении целой страницы мы не применяем, так как нет каких-то отдельных команд у микросхемы для данной операции, мы лишь попробуем применить другую команду для чтения байтов с кодом 0Bh

 

 

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

 

 

Вернёмся в функцию W25_Read_Page и запишем данную команду в буфер

 

 

Запишем в буфер также адрес, обращая теперь внимание на объём микросхемы, и передадим элементы буфера в память микросхемы, дав тем самым команду на начало чтения

 

 

Прочитаем байты и поднимем ножку выбора

 

 

Вернёмся в main.c и в функции main() закомментируем чтение с помощью обычной функции

 

 

Вместо неё попробуем использовать нашу новую

 

 

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

Итак, на данном уроке нам удалось прочитать из микросхемы W25Q уже не служебные данные, а записанную информацию.

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

 

 

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

Исходный код

 

 

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

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

 

 

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

STM HAL. STM32F4. FLASH память W25Q. Чтение данных

Один комментарий на “STM Урок 215. HAL. STM32F4. FLASH память W25Q. Чтение данных
  1. Влад:

    Скорейшего Вам выздоровления!!! Возвращайтесь поскорее. Очень полезные и нужные уроки у Вас. Всего самого доброго и здоровья, здоровья, здоровья…

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

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

*