STM Урок 57. Wi-Fi. SPWF01SA11. Команды. Часть 1

 

 

 

Урок 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. Но я считаю, что для изучения технологии модуль подходит как нельзя лучше. У него функционал гораздо шире, чем у предшественников (полную информацию можно увидеть в технической документации, которая будет приложена к статье, а также находится в открытом доступе на сайте производителя). Также на борту модуля находится микроконтроллер, посредством которого и осуществляется вся низкоуровневая работа с модулем, находящаяся в прошивке.

Структурная схема модуля

 

image001

 

Приведу некоторые характеристики модуля:

 

Стандарт: 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 будет общаться с контроллером модуля.

 

image002

 

I2C можно, в принципе отключить

 

image003

 

Перейдём в Configuration. Для USART1 настроим скорость 115200 и включим глобальные прерывания

 

image004

image005

 

В USART2 скорость установим 230400, так как в результате моих исследований было установлено, что на скорости 115200 данная шина не успевает передавать сообщения, пришедшие по USART1 в компьютер, если данные сообщения превышают 24 байт, даже при включенном DMA. Также убедимся, что у нас в USART2 включены глобальные прерывания и DMA

 

image006

image007

image008

 

Таймер оставляем, может когда-то пригодится.

 

 

Также включим ножки PС8 и PC12 на выход

 

image033

 

Также прибавим им скорость в Configuration

 

image034

 

Соберем проект для 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 Следующая часть

 

Техническая документация:

SPWF01 Datasheet

SPWF01 User manual

x-nucleo-idw01m1 datasheet

x-nucleo-idw01m1 User manual

 

 

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

и здесь Nucleo STM32F401RE

Оценочную плату можно приобрести здесь STM32 X-NUCLEO-IDW01M1

 

 

Смотреть ВИДЕОУРОК

 

STM32 Wi-Fi. SPWF01SA11. Команды

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

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

*