added function to enable power saving mode for es_wifi driver (Inventek Systems ISM43362-M3G-L44 )

Fork of DISCO_L475VG_IOT01A_wifi by ST

Committer:
jaafaryn
Date:
Sat Jan 13 23:37:46 2018 +0000
Revision:
2:9bbbcd0eff1c
Parent:
0:c61a93635433
added function to enable power saving mode

Who changed what in which revision?

UserRevisionLine numberNew contents of line
adustm 0:c61a93635433 1 /**
adustm 0:c61a93635433 2 ******************************************************************************
adustm 0:c61a93635433 3 * @file es_wifi_io.c
adustm 0:c61a93635433 4 * @author MCD Application Team
adustm 0:c61a93635433 5 * @version V1.8.0
adustm 0:c61a93635433 6 * @date 21-April-2017
adustm 0:c61a93635433 7 * @brief This file implments the IO operations to deal with the es-wifi
adustm 0:c61a93635433 8 * module. It mainly Inits and Deinits the SPI interface. Send and
adustm 0:c61a93635433 9 * receive data over it.
adustm 0:c61a93635433 10 ******************************************************************************
adustm 0:c61a93635433 11 * @attention
adustm 0:c61a93635433 12 *
adustm 0:c61a93635433 13 * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics International N.V.
adustm 0:c61a93635433 14 * All rights reserved.</center></h2>
adustm 0:c61a93635433 15 *
adustm 0:c61a93635433 16 * Redistribution and use in source and binary forms, with or without
adustm 0:c61a93635433 17 * modification, are permitted, provided that the following conditions are met:
adustm 0:c61a93635433 18 *
adustm 0:c61a93635433 19 * 1. Redistribution of source code must retain the above copyright notice,
adustm 0:c61a93635433 20 * this list of conditions and the following disclaimer.
adustm 0:c61a93635433 21 * 2. Redistributions in binary form must reproduce the above copyright notice,
adustm 0:c61a93635433 22 * this list of conditions and the following disclaimer in the documentation
adustm 0:c61a93635433 23 * and/or other materials provided with the distribution.
adustm 0:c61a93635433 24 * 3. Neither the name of STMicroelectronics nor the names of other
adustm 0:c61a93635433 25 * contributors to this software may be used to endorse or promote products
adustm 0:c61a93635433 26 * derived from this software without specific written permission.
adustm 0:c61a93635433 27 * 4. This software, including modifications and/or derivative works of this
adustm 0:c61a93635433 28 * software, must execute solely and exclusively on microcontroller or
adustm 0:c61a93635433 29 * microprocessor devices manufactured by or for STMicroelectronics.
adustm 0:c61a93635433 30 * 5. Redistribution and use of this software other than as permitted under
adustm 0:c61a93635433 31 * this license is void and will automatically terminate your rights under
adustm 0:c61a93635433 32 * this license.
adustm 0:c61a93635433 33 *
adustm 0:c61a93635433 34 * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS"
adustm 0:c61a93635433 35 * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT
adustm 0:c61a93635433 36 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
adustm 0:c61a93635433 37 * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY
adustm 0:c61a93635433 38 * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT
adustm 0:c61a93635433 39 * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
adustm 0:c61a93635433 40 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
adustm 0:c61a93635433 41 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
adustm 0:c61a93635433 42 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
adustm 0:c61a93635433 43 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
adustm 0:c61a93635433 44 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
adustm 0:c61a93635433 45 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
adustm 0:c61a93635433 46 *
adustm 0:c61a93635433 47 ******************************************************************************
adustm 0:c61a93635433 48 */
adustm 0:c61a93635433 49
adustm 0:c61a93635433 50 /* Includes ------------------------------------------------------------------*/
adustm 0:c61a93635433 51 #include "es_wifi_io.h"
adustm 0:c61a93635433 52 #include <string.h>
adustm 0:c61a93635433 53
adustm 0:c61a93635433 54 /* Private define ------------------------------------------------------------*/
adustm 0:c61a93635433 55 #define MIN(a, b) ((a) < (b) ? (a) : (b))
adustm 0:c61a93635433 56 /* Private typedef -----------------------------------------------------------*/
adustm 0:c61a93635433 57 /* Private macro -------------------------------------------------------------*/
adustm 0:c61a93635433 58 /* Private variables ---------------------------------------------------------*/
adustm 0:c61a93635433 59 SPI_HandleTypeDef hspi;
adustm 0:c61a93635433 60
adustm 0:c61a93635433 61 /* Private function prototypes -----------------------------------------------*/
adustm 0:c61a93635433 62
adustm 0:c61a93635433 63 /* Private functions ---------------------------------------------------------*/
adustm 0:c61a93635433 64 /*******************************************************************************
adustm 0:c61a93635433 65 COM Driver Interface (SPI)
adustm 0:c61a93635433 66 *******************************************************************************/
adustm 0:c61a93635433 67 /**
adustm 0:c61a93635433 68 * @brief Initialize SPI MSP
adustm 0:c61a93635433 69 * @param hspi: SPI handle
adustm 0:c61a93635433 70 * @retval None
adustm 0:c61a93635433 71 */
adustm 0:c61a93635433 72 void SPI_WIFI_MspInit(SPI_HandleTypeDef* hspi)
adustm 0:c61a93635433 73 {
adustm 0:c61a93635433 74
adustm 0:c61a93635433 75 GPIO_InitTypeDef GPIO_Init;
adustm 0:c61a93635433 76
adustm 0:c61a93635433 77 __HAL_RCC_SPI3_CLK_ENABLE();
adustm 0:c61a93635433 78 __HAL_RCC_GPIOB_CLK_ENABLE();
adustm 0:c61a93635433 79 __HAL_RCC_GPIOC_CLK_ENABLE();
adustm 0:c61a93635433 80 __HAL_RCC_GPIOE_CLK_ENABLE();
adustm 0:c61a93635433 81
adustm 0:c61a93635433 82 /* configure Wake up pin */
adustm 0:c61a93635433 83 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET );
adustm 0:c61a93635433 84 GPIO_Init.Pin = GPIO_PIN_13;
adustm 0:c61a93635433 85 GPIO_Init.Mode = GPIO_MODE_OUTPUT_PP;
adustm 0:c61a93635433 86 GPIO_Init.Pull = GPIO_NOPULL;
adustm 0:c61a93635433 87 GPIO_Init.Speed = GPIO_SPEED_FREQ_LOW;
adustm 0:c61a93635433 88 HAL_GPIO_Init(GPIOB, &GPIO_Init );
adustm 0:c61a93635433 89
adustm 0:c61a93635433 90 /* configure Data ready pin */
adustm 0:c61a93635433 91 GPIO_Init.Pin = GPIO_PIN_1;
adustm 0:c61a93635433 92 GPIO_Init.Mode = GPIO_MODE_IT_RISING;
adustm 0:c61a93635433 93 GPIO_Init.Pull = GPIO_NOPULL;
adustm 0:c61a93635433 94 GPIO_Init.Speed = GPIO_SPEED_FREQ_LOW;
adustm 0:c61a93635433 95 HAL_GPIO_Init(GPIOE, &GPIO_Init );
adustm 0:c61a93635433 96
adustm 0:c61a93635433 97 /* configure Reset pin */
adustm 0:c61a93635433 98 GPIO_Init.Pin = GPIO_PIN_8;
adustm 0:c61a93635433 99 GPIO_Init.Mode = GPIO_MODE_OUTPUT_PP;
adustm 0:c61a93635433 100 GPIO_Init.Pull = GPIO_NOPULL;
adustm 0:c61a93635433 101 GPIO_Init.Speed = GPIO_SPEED_FREQ_LOW;
adustm 0:c61a93635433 102 GPIO_Init.Alternate = 0;
adustm 0:c61a93635433 103 HAL_GPIO_Init(GPIOE, &GPIO_Init );
adustm 0:c61a93635433 104
adustm 0:c61a93635433 105 /* configure SPI NSS pin pin */
adustm 0:c61a93635433 106 HAL_GPIO_WritePin( GPIOE, GPIO_PIN_0, GPIO_PIN_SET );
adustm 0:c61a93635433 107 GPIO_Init.Pin = GPIO_PIN_0;
adustm 0:c61a93635433 108 GPIO_Init.Mode = GPIO_MODE_OUTPUT_PP;
adustm 0:c61a93635433 109 GPIO_Init.Pull = GPIO_NOPULL;
adustm 0:c61a93635433 110 GPIO_Init.Speed = GPIO_SPEED_FREQ_MEDIUM;
adustm 0:c61a93635433 111 HAL_GPIO_Init( GPIOE, &GPIO_Init );
adustm 0:c61a93635433 112
adustm 0:c61a93635433 113 /* configure SPI CLK pin */
adustm 0:c61a93635433 114 GPIO_Init.Pin = GPIO_PIN_10;
adustm 0:c61a93635433 115 GPIO_Init.Mode = GPIO_MODE_AF_PP;
adustm 0:c61a93635433 116 GPIO_Init.Pull = GPIO_NOPULL;
adustm 0:c61a93635433 117 GPIO_Init.Speed = GPIO_SPEED_FREQ_MEDIUM;
adustm 0:c61a93635433 118 GPIO_Init.Alternate = GPIO_AF6_SPI3;
adustm 0:c61a93635433 119 HAL_GPIO_Init( GPIOC, &GPIO_Init );
adustm 0:c61a93635433 120
adustm 0:c61a93635433 121 /* configure SPI MOSI pin */
adustm 0:c61a93635433 122 GPIO_Init.Pin = GPIO_PIN_12;
adustm 0:c61a93635433 123 GPIO_Init.Mode = GPIO_MODE_AF_PP;
adustm 0:c61a93635433 124 GPIO_Init.Pull = GPIO_NOPULL;
adustm 0:c61a93635433 125 GPIO_Init.Speed = GPIO_SPEED_FREQ_MEDIUM;
adustm 0:c61a93635433 126 GPIO_Init.Alternate = GPIO_AF6_SPI3;
adustm 0:c61a93635433 127 HAL_GPIO_Init( GPIOC, &GPIO_Init );
adustm 0:c61a93635433 128
adustm 0:c61a93635433 129 /* configure SPI MISO pin */
adustm 0:c61a93635433 130 GPIO_Init.Pin = GPIO_PIN_11;
adustm 0:c61a93635433 131 GPIO_Init.Mode = GPIO_MODE_AF_PP;
adustm 0:c61a93635433 132 GPIO_Init.Pull = GPIO_PULLUP;
adustm 0:c61a93635433 133 GPIO_Init.Speed = GPIO_SPEED_FREQ_MEDIUM;
adustm 0:c61a93635433 134 GPIO_Init.Alternate = GPIO_AF6_SPI3;
adustm 0:c61a93635433 135 HAL_GPIO_Init( GPIOC, &GPIO_Init );
adustm 0:c61a93635433 136 }
adustm 0:c61a93635433 137
adustm 0:c61a93635433 138 /**
adustm 0:c61a93635433 139 * @brief Initialize the SPI3
adustm 0:c61a93635433 140 * @param None
adustm 0:c61a93635433 141 * @retval None
adustm 0:c61a93635433 142 */
adustm 0:c61a93635433 143 int8_t SPI_WIFI_Init(void)
adustm 0:c61a93635433 144 {
adustm 0:c61a93635433 145 uint32_t tickstart = HAL_GetTick();
adustm 0:c61a93635433 146 uint8_t Prompt[6];
adustm 0:c61a93635433 147 uint8_t count = 0;
adustm 0:c61a93635433 148 HAL_StatusTypeDef Status;
adustm 0:c61a93635433 149
adustm 0:c61a93635433 150 hspi.Instance = SPI3;
adustm 0:c61a93635433 151 SPI_WIFI_MspInit(&hspi);
adustm 0:c61a93635433 152
adustm 0:c61a93635433 153 hspi.Init.Mode = SPI_MODE_MASTER;
adustm 0:c61a93635433 154 hspi.Init.Direction = SPI_DIRECTION_2LINES;
adustm 0:c61a93635433 155 hspi.Init.DataSize = SPI_DATASIZE_16BIT;
adustm 0:c61a93635433 156 hspi.Init.CLKPolarity = SPI_POLARITY_LOW;
adustm 0:c61a93635433 157 hspi.Init.CLKPhase = SPI_PHASE_1EDGE;
adustm 0:c61a93635433 158 hspi.Init.NSS = SPI_NSS_SOFT;
adustm 0:c61a93635433 159 hspi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8; /* 80/8= 10MHz (Inventek WIFI module supportes up to 20MHz)*/
adustm 0:c61a93635433 160 hspi.Init.FirstBit = SPI_FIRSTBIT_MSB;
adustm 0:c61a93635433 161 hspi.Init.TIMode = SPI_TIMODE_DISABLE;
adustm 0:c61a93635433 162 hspi.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
adustm 0:c61a93635433 163 hspi.Init.CRCPolynomial = 0;
adustm 0:c61a93635433 164
adustm 0:c61a93635433 165 if(HAL_SPI_Init( &hspi ) != HAL_OK)
adustm 0:c61a93635433 166 {
adustm 0:c61a93635433 167 return -1;
adustm 0:c61a93635433 168 }
adustm 0:c61a93635433 169
adustm 0:c61a93635433 170 WIFI_RESET_MODULE();
adustm 0:c61a93635433 171
adustm 0:c61a93635433 172 WIFI_ENABLE_NSS();
adustm 0:c61a93635433 173
adustm 0:c61a93635433 174 while (WIFI_IS_CMDDATA_READY())
adustm 0:c61a93635433 175 {
adustm 0:c61a93635433 176 Status = HAL_SPI_Receive(&hspi , &Prompt[count], 1, 0xFFFF);
adustm 0:c61a93635433 177 count += 2;
adustm 0:c61a93635433 178 if(((HAL_GetTick() - tickstart ) > 0xFFFF) || (Status != HAL_OK))
adustm 0:c61a93635433 179 {
adustm 0:c61a93635433 180 WIFI_DISABLE_NSS();
adustm 0:c61a93635433 181 return -1;
adustm 0:c61a93635433 182 }
adustm 0:c61a93635433 183 }
adustm 0:c61a93635433 184
adustm 0:c61a93635433 185 if((Prompt[0] != 0x15) ||(Prompt[1] != 0x15) ||(Prompt[2] != '\r')||
adustm 0:c61a93635433 186 (Prompt[3] != '\n') ||(Prompt[4] != '>') ||(Prompt[5] != ' '))
adustm 0:c61a93635433 187 {
adustm 0:c61a93635433 188 WIFI_DISABLE_NSS();
adustm 0:c61a93635433 189 return -1;
adustm 0:c61a93635433 190 }
adustm 0:c61a93635433 191
adustm 0:c61a93635433 192 WIFI_DISABLE_NSS();
adustm 0:c61a93635433 193 return 0;
adustm 0:c61a93635433 194 }
adustm 0:c61a93635433 195
adustm 0:c61a93635433 196 /**
adustm 0:c61a93635433 197 * @brief DeInitialize the SPI
adustm 0:c61a93635433 198 * @param None
adustm 0:c61a93635433 199 * @retval None
adustm 0:c61a93635433 200 */
adustm 0:c61a93635433 201 int8_t SPI_WIFI_DeInit(void)
adustm 0:c61a93635433 202 {
adustm 0:c61a93635433 203 HAL_SPI_DeInit( &hspi );
adustm 0:c61a93635433 204 return 0;
adustm 0:c61a93635433 205 }
adustm 0:c61a93635433 206
adustm 0:c61a93635433 207 /**
adustm 0:c61a93635433 208 * @brief Receive wifi Data from SPI
adustm 0:c61a93635433 209 * @param pdata : pointer to data
adustm 0:c61a93635433 210 * @param len : Data length
adustm 0:c61a93635433 211 * @param timeout : send timeout in mS
adustm 0:c61a93635433 212 * @retval Length of received data (payload)
adustm 0:c61a93635433 213 */
adustm 0:c61a93635433 214 int16_t SPI_WIFI_ReceiveData(uint8_t *pData, uint16_t len, uint32_t timeout)
adustm 0:c61a93635433 215 {
adustm 0:c61a93635433 216 uint32_t tickstart = HAL_GetTick();
adustm 0:c61a93635433 217 int16_t length = 0;
adustm 0:c61a93635433 218 uint8_t tmp[2];
adustm 0:c61a93635433 219
adustm 0:c61a93635433 220 HAL_SPIEx_FlushRxFifo(&hspi);
adustm 0:c61a93635433 221
adustm 0:c61a93635433 222 WIFI_DISABLE_NSS();
adustm 0:c61a93635433 223
adustm 0:c61a93635433 224 while (!WIFI_IS_CMDDATA_READY())
adustm 0:c61a93635433 225 {
adustm 0:c61a93635433 226 if((HAL_GetTick() - tickstart ) > timeout)
adustm 0:c61a93635433 227 {
adustm 0:c61a93635433 228 return -1;
adustm 0:c61a93635433 229 }
adustm 0:c61a93635433 230 }
adustm 0:c61a93635433 231
adustm 0:c61a93635433 232 WIFI_ENABLE_NSS();
adustm 0:c61a93635433 233
adustm 0:c61a93635433 234 while (WIFI_IS_CMDDATA_READY())
adustm 0:c61a93635433 235 {
adustm 0:c61a93635433 236 if((length < len) || (!len))
adustm 0:c61a93635433 237 {
adustm 0:c61a93635433 238 HAL_SPI_Receive(&hspi, tmp, 1, timeout) ;
adustm 0:c61a93635433 239 /* let some time to hardware to change CMDDATA signal */
adustm 0:c61a93635433 240 if(tmp[1] == 0x15)
adustm 0:c61a93635433 241 {
adustm 0:c61a93635433 242 SPI_WIFI_Delay(1);
adustm 0:c61a93635433 243 }
adustm 0:c61a93635433 244 /*This the last data */
adustm 0:c61a93635433 245 if(!WIFI_IS_CMDDATA_READY())
adustm 0:c61a93635433 246 {
adustm 0:c61a93635433 247 if(tmp[1] == 0x15)
adustm 0:c61a93635433 248 {
adustm 0:c61a93635433 249 pData[0] = tmp[0];
adustm 0:c61a93635433 250 length++;
adustm 0:c61a93635433 251 break;
adustm 0:c61a93635433 252 }
adustm 0:c61a93635433 253 }
adustm 0:c61a93635433 254
adustm 0:c61a93635433 255 pData[0] = tmp[0];
adustm 0:c61a93635433 256 pData[1] = tmp[1];
adustm 0:c61a93635433 257 length += 2;
adustm 0:c61a93635433 258 pData += 2;
adustm 0:c61a93635433 259
adustm 0:c61a93635433 260 if((HAL_GetTick() - tickstart ) > timeout)
adustm 0:c61a93635433 261 {
adustm 0:c61a93635433 262 WIFI_DISABLE_NSS();
adustm 0:c61a93635433 263 return -1;
adustm 0:c61a93635433 264 }
adustm 0:c61a93635433 265 }
adustm 0:c61a93635433 266 else
adustm 0:c61a93635433 267 {
adustm 0:c61a93635433 268 break;
adustm 0:c61a93635433 269 }
adustm 0:c61a93635433 270 }
adustm 0:c61a93635433 271
adustm 0:c61a93635433 272 WIFI_DISABLE_NSS();
adustm 0:c61a93635433 273 return length;
adustm 0:c61a93635433 274 }
adustm 0:c61a93635433 275 /**
adustm 0:c61a93635433 276 * @brief Send wifi Data thru SPI
adustm 0:c61a93635433 277 * @param pdata : pointer to data
adustm 0:c61a93635433 278 * @param len : Data length
adustm 0:c61a93635433 279 * @param timeout : send timeout in mS
adustm 0:c61a93635433 280 * @retval Length of sent data
adustm 0:c61a93635433 281 */
adustm 0:c61a93635433 282 int16_t SPI_WIFI_SendData( uint8_t *pdata, uint16_t len, uint32_t timeout)
adustm 0:c61a93635433 283 {
adustm 0:c61a93635433 284 uint32_t tickstart = HAL_GetTick();
adustm 0:c61a93635433 285 uint8_t Padding[2];
adustm 0:c61a93635433 286
adustm 0:c61a93635433 287 while (!WIFI_IS_CMDDATA_READY())
adustm 0:c61a93635433 288 {
adustm 0:c61a93635433 289 if((HAL_GetTick() - tickstart ) > timeout)
adustm 0:c61a93635433 290 {
adustm 0:c61a93635433 291 WIFI_DISABLE_NSS();
adustm 0:c61a93635433 292 return -1;
adustm 0:c61a93635433 293 }
adustm 0:c61a93635433 294 }
adustm 0:c61a93635433 295
adustm 0:c61a93635433 296 WIFI_ENABLE_NSS();
adustm 0:c61a93635433 297 if (len > 1)
adustm 0:c61a93635433 298 {
adustm 0:c61a93635433 299 if( HAL_SPI_Transmit(&hspi, (uint8_t *)pdata , len/2, timeout) != HAL_OK)
adustm 0:c61a93635433 300 {
adustm 0:c61a93635433 301 WIFI_DISABLE_NSS();
adustm 0:c61a93635433 302 return -1;
adustm 0:c61a93635433 303 }
adustm 0:c61a93635433 304 }
adustm 0:c61a93635433 305
adustm 0:c61a93635433 306 if ( len & 1)
adustm 0:c61a93635433 307 {
adustm 0:c61a93635433 308 Padding[0] = pdata[len-1];
adustm 0:c61a93635433 309 Padding[1] = '\n';
adustm 0:c61a93635433 310
adustm 0:c61a93635433 311 if( HAL_SPI_Transmit(&hspi, Padding, 1, timeout) != HAL_OK)
adustm 0:c61a93635433 312 {
adustm 0:c61a93635433 313 WIFI_DISABLE_NSS();
adustm 0:c61a93635433 314 return -1;
adustm 0:c61a93635433 315 }
adustm 0:c61a93635433 316 }
adustm 0:c61a93635433 317
adustm 0:c61a93635433 318 return len;
adustm 0:c61a93635433 319 }
adustm 0:c61a93635433 320
adustm 0:c61a93635433 321 /**
adustm 0:c61a93635433 322 * @brief Delay
adustm 0:c61a93635433 323 * @param Delay in ms
adustm 0:c61a93635433 324 * @retval None
adustm 0:c61a93635433 325 */
adustm 0:c61a93635433 326 void SPI_WIFI_Delay(uint32_t Delay)
adustm 0:c61a93635433 327 {
adustm 0:c61a93635433 328 HAL_Delay(Delay);
adustm 0:c61a93635433 329 }
adustm 0:c61a93635433 330
adustm 0:c61a93635433 331 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/