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. Чтение данных

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

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

*