Урок 57
Часть 1
Wi-Fi. SPWF01SA11. Команды
Сегодня мы начинаем интересную тему. Это беспроводные технологии для передачи данных, в частности Wi-Fi. Для чего нужна данная технология, я думаю, знают все, так как она очень популярна у всех пользователей компьютеров и интернета. Поэтому и нам, программистам МК, данную тему обойти стороной никак не получится.
А рассмотрим мы это на примере модуля от компании ST Microelectronics — SPWF01SA, который распаян в плате расширения X-NUCLEO-IDW01M1. Данную плату мы, как обычно, подключим к отладочной плате STM32 NUCLEO F401RE.
Модуль SPWF01SA представляет собой готовое решение с несколькими элементами, призванное обеспечивать стандарт передачи данных 802.11 b/g/n Основное назначение данной серии — создание приложений «Интернета вещей» (Internet of Things) — управление какими-либо устройствами или схемами удалённо. Для потоковой передачи данных, а также для передачи больших объёмов информации данные модули не предназначены, так как нет скоростного интерфейса обмена информацией между модулем и контроллером. Обмен информацией, а также передача команд и приём сообщений от модуля осуществляется посредством интерфейса USART. Есть информация, что в будущих прошивках будет поддерживаться обмен по SPI. Но я считаю, что для изучения технологии модуль подходит как нельзя лучше. У него функционал гораздо шире, чем у предшественников (полную информацию можно увидеть в технической документации, которая будет приложена к статье, а также находится в открытом доступе на сайте производителя). Также на борту модуля находится микроконтроллер, посредством которого и осуществляется вся низкоуровневая работа с модулем, находящаяся в прошивке.
Структурная схема модуля
Приведу некоторые характеристики модуля:
Стандарт: 2.4 GHz IEEE 802.11 b/g/n transceiver
Контроллер: STM32 ARM Cortex-M3, with 64 KB RAM and 512 KB Flash memory – 1 MB extended Flash available on SPWF01Sx.1y
Стандарты и уровни передачи данных:
TCP/IP stack (IPv4); TCP/UDP – 8 simultaneous TCP or UDP clients and 1
socket server; DHCP; DNS; Web Server/HTTP-client
Безопасность: WEP/WPA/WPA2 personal security
Уровень сигнала передатчика
– 18.3 dBm @ 1 Mbps DSSS
– 13.7 dBm @ 54 Mbps OFDM
Чувствительность приемника
– -96.0 dBm @ 1 Mbps DSSS
– -74.5 dBm @ 54 Mbps OFDM
16 конфигурируемых портов GPIO.
Управление данным модулем осуществляется посредством AT-команд, часть которых мы попробуем в деле в данном уроке.
Чтобы нам управлять модулем с помощью команд, нам необходимо либо воспользоваться готовым кодом из примеров, которые также доступны на официальном сайте производителя, либо что-то написать самим.
Я думаю, мы без сомнения, просто обязаны выбрать вариант второй, так как урок у нас по программированию, и мы обязаны программировать.
Остальные тонкости работы с модулем будут рассмотрены в процессе работы с ним.
Поэтому давайте начинать. А начнём мы, как всегда с проекта. Новый проект мы, как обычно создавать не будем, а воспользуемся одним из предыдущих проектов, например проектом по датчику влажности Humidity_HTS221, новое название дадим по наименованию модуля и специфики нашей первой работы с ним SPWF01SA11_AT, так как наша первая программа по общению с данным модулем будет призвана обеспечить передачу команд управления модулем, а также приём сообщений из модуля через внутренний виртуальный COM-порт платы Nucleo.
Файлы hts221.h и hts221.c переименуем в SPWF01SA11.h и SPWF01SA11.c.
Откроем проект в Cube MX, включим ещё один USART — USART1, так как по 2 USART мы будем общаться с компьютером, а по USART1 наш контроллер STM32F401 будет общаться с контроллером модуля.
I2C можно, в принципе отключить
Перейдём в Configuration. Для USART1 настроим скорость 115200 и включим глобальные прерывания
В USART2 скорость установим 230400, так как в результате моих исследований было установлено, что на скорости 115200 данная шина не успевает передавать сообщения, пришедшие по USART1 в компьютер, если данные сообщения превышают 24 байт, даже при включенном DMA. Также убедимся, что у нас в USART2 включены глобальные прерывания и DMA
Таймер оставляем, может когда-то пригодится.
Также включим ножки PС8 и PC12 на выход
Также прибавим им скорость в Configuration
Соберем проект для Keil и отроем его. Настроим программатор на авторезет, подключим файл SPWF01SA11.c в дерево проекта и побробуем собрать проект. Соответственно, как всегда, будут ошибки из-за переименования файлов, поэтому подключим также файл SPWF01SA11.h в main.h и в SPWF01SA11.c
#include «stm32f4xx_hal.h»
#include «SPWF01SA11.h»
————
#include «SPWF01SA11.h»
//———————————————
Также удалим объявление шины I2c в файле SPWF01SA11.c.
Удалим функции I2Cx_ReadData и I2Cx_WriteData, Humidity_IO_Read и Humidity_IO_Write, функии Press_Get_Temp, Humidity_ReadID и Humidity_ReadID, Press_Get_Press, Humidity_Read и HumidityInit.
Удалим весь код из функции Humidity_Ini и переименуем её в SPWF01SA11_Ini
//———————————————
void SPWF01SA11_Ini(void)
{
Также переименуем в заголовочном файле и заодно удалим из него объявления всех макросов, ну конечно, за исключением светодиодных и удалим из файла прототип функции Humidity_Read, так как собственно сама функия удалена выше. Ещё немного исправим в заголовочном файле директивы и файл теперь станет вот таким
#ifndef SPWF01SA11_H_
#define SPWF01SA11_H_
#include «stm32f4xx_hal.h»
#include <string.h>
//————————————————
#define LD2_Pin GPIO_PIN_5
#define LD2_GPIO_Port GPIOA
#define LD2_ON HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET) //GREEN
#define LD2_OFF HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET)
//————————————————
void SPWF01SA11_Ini(void);
//————————————————
#endif /* SPWF01SA11_H_ */
Переходим в файл main.c.
Исправим в нём вызов функции инициализации модуля
HAL_TIM_Base_Start_IT(&htim1);
SPWF01SA11_Ini();
/* USER CODE END 2 */
Из бесконечного цикла удалим всё полностью, ну кроме конечно комментариев с ключевыми словами BEGIN и END.
Из функции обработки прерываний от таймера удалим весь код за исключением условия, в дальнейшем оно пригодится. Останется вот что
/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM1)
{
}
}
/* USER CODE END 4 */
Теперь проект должен собраться без ошибок.
Напишем инициализацию.
Для этого перейдём в файл SPWF01SA11.h и добавим туда некоторую структуру
typedef enum
{
WIFI_FALSE = 0,
WIFI_TRUE = 1,
Undefine = 0xFF
} wifi_bool;
В следующей части занятия мы закончим писать все функции по работе с модулем, и попытаемся с ним отправить в него пока единственную команду.
Предыдущий урок Программирование МК STM32 Следующая часть
Техническая документация:
Отладочную плату можно приобрести здесь Nucleo STM32F401RE
Оценочную плату можно приобрести здесь X-NUCLEO-IDW01M1
Смотреть ВИДЕОУРОК в RuTube (нажмите на картинку)
Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)
Добавить комментарий