wifi
Dependents: DISCO_IOT-wifi_client
Fork of DISCO_L475VG_IOT01A_wifi by
es_wifi_io.c@0:c61a93635433, 2017-08-17 (annotated)
- Committer:
- adustm
- Date:
- Thu Aug 17 15:26:02 2017 +0000
- Revision:
- 0:c61a93635433
Wifi driver for ES_WIFI module of DISCO_L475VG_IOT1A platform; (ie Inventek ISM43362-M3G-L44M2)
Who changed what in which revision?
User | Revision | Line number | New 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>© 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****/ |