Программа считывает показания датчиков и управляет сервомашинками.

Dependencies:   mbed-src

Fork of NUCLEO_BLUENRG by Ostap Ostapsky

Committer:
Sergeev
Date:
Mon Aug 25 09:45:34 2014 +0000
Revision:
1:fb307cfca15c
Parent:
0:aa1e012ec210
Final

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ostapsky 0:aa1e012ec210 1 /**
ostapsky 0:aa1e012ec210 2 ******************************************************************************
ostapsky 0:aa1e012ec210 3 * File Name : bluenrg_shield_bsp.c
ostapsky 0:aa1e012ec210 4 * Date : 16/05/2014
ostapsky 0:aa1e012ec210 5 * Description : This file provides code for the BlueNRG Shield driver
ostapsky 0:aa1e012ec210 6 * based on STM32Cube HAL for STM32 Nucleo boards.
ostapsky 0:aa1e012ec210 7 ******************************************************************************
ostapsky 0:aa1e012ec210 8 *
ostapsky 0:aa1e012ec210 9 * COPYRIGHT(c) 2014 STMicroelectronics
ostapsky 0:aa1e012ec210 10 *
ostapsky 0:aa1e012ec210 11 * Redistribution and use in source and binary forms, with or without modification,
ostapsky 0:aa1e012ec210 12 * are permitted provided that the following conditions are met:
ostapsky 0:aa1e012ec210 13 * 1. Redistributions of source code must retain the above copyright notice,
ostapsky 0:aa1e012ec210 14 * this list of conditions and the following disclaimer.
ostapsky 0:aa1e012ec210 15 * 2. Redistributions in binary form must reproduce the above copyright notice,
ostapsky 0:aa1e012ec210 16 * this list of conditions and the following disclaimer in the documentation
ostapsky 0:aa1e012ec210 17 * and/or other materials provided with the distribution.
ostapsky 0:aa1e012ec210 18 * 3. Neither the name of STMicroelectronics nor the names of its contributors
ostapsky 0:aa1e012ec210 19 * may be used to endorse or promote products derived from this software
ostapsky 0:aa1e012ec210 20 * without specific prior written permission.
ostapsky 0:aa1e012ec210 21 *
ostapsky 0:aa1e012ec210 22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
ostapsky 0:aa1e012ec210 23 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
ostapsky 0:aa1e012ec210 24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
ostapsky 0:aa1e012ec210 25 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
ostapsky 0:aa1e012ec210 26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
ostapsky 0:aa1e012ec210 27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
ostapsky 0:aa1e012ec210 28 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
ostapsky 0:aa1e012ec210 29 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
ostapsky 0:aa1e012ec210 30 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
ostapsky 0:aa1e012ec210 31 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
ostapsky 0:aa1e012ec210 32 *
ostapsky 0:aa1e012ec210 33 ******************************************************************************
ostapsky 0:aa1e012ec210 34 */
ostapsky 0:aa1e012ec210 35 /* Includes ------------------------------------------------------------------*/
ostapsky 0:aa1e012ec210 36 #include "bluenrg_shield_bsp.h"
ostapsky 0:aa1e012ec210 37 #include "cube_hal.h"
ostapsky 0:aa1e012ec210 38 #include "hci.h"
ostapsky 0:aa1e012ec210 39
ostapsky 0:aa1e012ec210 40 /** @addtogroup BlueNRG_Shield
ostapsky 0:aa1e012ec210 41 * @{
ostapsky 0:aa1e012ec210 42 */
ostapsky 0:aa1e012ec210 43
ostapsky 0:aa1e012ec210 44 /** @defgroup BlueNRG_Shield_Driver
ostapsky 0:aa1e012ec210 45 * @brief BlueNRG Shield driver based on STM32Cube HAL for STM32 Nucleo boards.
ostapsky 0:aa1e012ec210 46 * @{
ostapsky 0:aa1e012ec210 47 */
ostapsky 0:aa1e012ec210 48
ostapsky 0:aa1e012ec210 49
ostapsky 0:aa1e012ec210 50 /* SPI handler declared in "main.c" file */
ostapsky 0:aa1e012ec210 51 extern SPI_HandleTypeDef SpiHandle;
ostapsky 0:aa1e012ec210 52
ostapsky 0:aa1e012ec210 53
ostapsky 0:aa1e012ec210 54 /**
ostapsky 0:aa1e012ec210 55 * @brief This function is used for low level initialization of the SPI
ostapsky 0:aa1e012ec210 56 * communication with the BlueNRG Shield.
ostapsky 0:aa1e012ec210 57 * @param hspi: handle of the STM32Cube HAL SPI interface
ostapsky 0:aa1e012ec210 58 * @retval None
ostapsky 0:aa1e012ec210 59 */
ostapsky 0:aa1e012ec210 60 void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
ostapsky 0:aa1e012ec210 61 {
ostapsky 0:aa1e012ec210 62 GPIO_InitTypeDef GPIO_InitStruct;
ostapsky 0:aa1e012ec210 63 if(hspi->Instance==BNRG_SPI_INSTANCE) {
ostapsky 0:aa1e012ec210 64 /* Enable peripherals clock */
ostapsky 0:aa1e012ec210 65
ostapsky 0:aa1e012ec210 66 /* Enable GPIO Ports Clock */
ostapsky 0:aa1e012ec210 67 BNRG_SPI_RESET_CLK_ENABLE();
ostapsky 0:aa1e012ec210 68 BNRG_SPI_SCLK_CLK_ENABLE();
ostapsky 0:aa1e012ec210 69 BNRG_SPI_MISO_CLK_ENABLE();
ostapsky 0:aa1e012ec210 70 BNRG_SPI_MOSI_CLK_ENABLE();
ostapsky 0:aa1e012ec210 71 BNRG_SPI_CS_CLK_ENABLE();
ostapsky 0:aa1e012ec210 72 BNRG_SPI_IRQ_CLK_ENABLE();
ostapsky 0:aa1e012ec210 73
ostapsky 0:aa1e012ec210 74 /* Enable SPI clock */
ostapsky 0:aa1e012ec210 75 BNRG_SPI_CLK_ENABLE();
ostapsky 0:aa1e012ec210 76
ostapsky 0:aa1e012ec210 77 /* Reset */
ostapsky 0:aa1e012ec210 78 GPIO_InitStruct.Pin = BNRG_SPI_RESET_PIN;
ostapsky 0:aa1e012ec210 79 GPIO_InitStruct.Mode = BNRG_SPI_RESET_MODE;
ostapsky 0:aa1e012ec210 80 GPIO_InitStruct.Pull = BNRG_SPI_RESET_PULL;
ostapsky 0:aa1e012ec210 81 GPIO_InitStruct.Speed = BNRG_SPI_RESET_SPEED;
ostapsky 0:aa1e012ec210 82 GPIO_InitStruct.Alternate = BNRG_SPI_RESET_ALTERNATE;
ostapsky 0:aa1e012ec210 83 HAL_GPIO_Init(BNRG_SPI_RESET_PORT, &GPIO_InitStruct);
ostapsky 0:aa1e012ec210 84 HAL_GPIO_WritePin(BNRG_SPI_RESET_PORT, BNRG_SPI_RESET_PIN, GPIO_PIN_RESET); /*Added to avoid spurious interrupt from the BlueNRG */
ostapsky 0:aa1e012ec210 85
ostapsky 0:aa1e012ec210 86 /* SCLK */
ostapsky 0:aa1e012ec210 87 GPIO_InitStruct.Pin = BNRG_SPI_SCLK_PIN;
ostapsky 0:aa1e012ec210 88 GPIO_InitStruct.Mode = BNRG_SPI_SCLK_MODE;
ostapsky 0:aa1e012ec210 89 GPIO_InitStruct.Pull = BNRG_SPI_SCLK_PULL;
ostapsky 0:aa1e012ec210 90 GPIO_InitStruct.Speed = BNRG_SPI_SCLK_SPEED;
ostapsky 0:aa1e012ec210 91 GPIO_InitStruct.Alternate = BNRG_SPI_SCLK_ALTERNATE;
ostapsky 0:aa1e012ec210 92 HAL_GPIO_Init(BNRG_SPI_SCLK_PORT, &GPIO_InitStruct);
ostapsky 0:aa1e012ec210 93
ostapsky 0:aa1e012ec210 94 /* MISO */
ostapsky 0:aa1e012ec210 95 GPIO_InitStruct.Pin = BNRG_SPI_MISO_PIN;
ostapsky 0:aa1e012ec210 96 GPIO_InitStruct.Mode = BNRG_SPI_MISO_MODE;
ostapsky 0:aa1e012ec210 97 GPIO_InitStruct.Pull = BNRG_SPI_MISO_PULL;
ostapsky 0:aa1e012ec210 98 GPIO_InitStruct.Speed = BNRG_SPI_MISO_SPEED;
ostapsky 0:aa1e012ec210 99 GPIO_InitStruct.Alternate = BNRG_SPI_MISO_ALTERNATE;
ostapsky 0:aa1e012ec210 100 HAL_GPIO_Init(BNRG_SPI_MISO_PORT, &GPIO_InitStruct);
ostapsky 0:aa1e012ec210 101
ostapsky 0:aa1e012ec210 102 /* MOSI */
ostapsky 0:aa1e012ec210 103 GPIO_InitStruct.Pin = BNRG_SPI_MOSI_PIN;
ostapsky 0:aa1e012ec210 104 GPIO_InitStruct.Mode = BNRG_SPI_MOSI_MODE;
ostapsky 0:aa1e012ec210 105 GPIO_InitStruct.Pull = BNRG_SPI_MOSI_PULL;
ostapsky 0:aa1e012ec210 106 GPIO_InitStruct.Speed = BNRG_SPI_MOSI_SPEED;
ostapsky 0:aa1e012ec210 107 GPIO_InitStruct.Alternate = BNRG_SPI_MOSI_ALTERNATE;
ostapsky 0:aa1e012ec210 108 HAL_GPIO_Init(BNRG_SPI_MOSI_PORT, &GPIO_InitStruct);
ostapsky 0:aa1e012ec210 109
ostapsky 0:aa1e012ec210 110 /* NSS/CSN/CS */
ostapsky 0:aa1e012ec210 111 GPIO_InitStruct.Pin = BNRG_SPI_CS_PIN;
ostapsky 0:aa1e012ec210 112 GPIO_InitStruct.Mode = BNRG_SPI_CS_MODE;
ostapsky 0:aa1e012ec210 113 GPIO_InitStruct.Pull = BNRG_SPI_CS_PULL;
ostapsky 0:aa1e012ec210 114 GPIO_InitStruct.Speed = BNRG_SPI_CS_SPEED;
ostapsky 0:aa1e012ec210 115 GPIO_InitStruct.Alternate = BNRG_SPI_CS_ALTERNATE;
ostapsky 0:aa1e012ec210 116 HAL_GPIO_Init(BNRG_SPI_CS_PORT, &GPIO_InitStruct);
ostapsky 0:aa1e012ec210 117 HAL_GPIO_WritePin(BNRG_SPI_CS_PORT, BNRG_SPI_CS_PIN, GPIO_PIN_SET);
ostapsky 0:aa1e012ec210 118
ostapsky 0:aa1e012ec210 119 /* IRQ -- INPUT */
ostapsky 0:aa1e012ec210 120 GPIO_InitStruct.Pin = BNRG_SPI_IRQ_PIN;
ostapsky 0:aa1e012ec210 121 GPIO_InitStruct.Mode = BNRG_SPI_IRQ_MODE;
ostapsky 0:aa1e012ec210 122 GPIO_InitStruct.Pull = BNRG_SPI_IRQ_PULL;
ostapsky 0:aa1e012ec210 123 GPIO_InitStruct.Speed = BNRG_SPI_IRQ_SPEED;
ostapsky 0:aa1e012ec210 124 GPIO_InitStruct.Alternate = BNRG_SPI_IRQ_ALTERNATE;
ostapsky 0:aa1e012ec210 125 HAL_GPIO_Init(BNRG_SPI_IRQ_PORT, &GPIO_InitStruct);
ostapsky 0:aa1e012ec210 126
ostapsky 0:aa1e012ec210 127 /* Configure the NVIC for SPI */
ostapsky 0:aa1e012ec210 128 HAL_NVIC_SetPriority(BNRG_SPI_EXTI_IRQn, 4, 0);
ostapsky 0:aa1e012ec210 129 HAL_NVIC_EnableIRQ(BNRG_SPI_EXTI_IRQn);
ostapsky 0:aa1e012ec210 130 }
ostapsky 0:aa1e012ec210 131 }
ostapsky 0:aa1e012ec210 132
ostapsky 0:aa1e012ec210 133 /**
ostapsky 0:aa1e012ec210 134 * @brief EXTI line detection callback.
ostapsky 0:aa1e012ec210 135 * @param GPIO_Pin: Specifies the pins connected EXTI line
ostapsky 0:aa1e012ec210 136 * @retval None
ostapsky 0:aa1e012ec210 137 */
ostapsky 0:aa1e012ec210 138 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
ostapsky 0:aa1e012ec210 139 {
ostapsky 0:aa1e012ec210 140 tHciDataPacket * hciReadPacket;// = NULL;
ostapsky 0:aa1e012ec210 141 uint8_t data_len;
ostapsky 0:aa1e012ec210 142 /*
ostapsky 0:aa1e012ec210 143 * No need to call Clear_SPI_EXTI_Flag() here as
ostapsky 0:aa1e012ec210 144 * HAL_GPIO_EXTI_IRQHandler() already does it
ostapsky 0:aa1e012ec210 145 */
ostapsky 0:aa1e012ec210 146
ostapsky 0:aa1e012ec210 147 if(GPIO_Pin == BNRG_SPI_EXTI_PIN) {
ostapsky 0:aa1e012ec210 148
ostapsky 0:aa1e012ec210 149 while (HAL_GPIO_ReadPin(BNRG_SPI_EXTI_PORT, BNRG_SPI_EXTI_PIN) == GPIO_PIN_SET) {
ostapsky 0:aa1e012ec210 150 if (list_is_empty (&hciReadPktPool) == FALSE) {
ostapsky 0:aa1e012ec210 151 /* enqueueing a packet for read */
ostapsky 0:aa1e012ec210 152 list_remove_head (&hciReadPktPool, (tListNode **)&hciReadPacket);
ostapsky 0:aa1e012ec210 153 data_len = BlueNRG_SPI_Read_All(&SpiHandle, hciReadPacket->dataBuff, HCI_PACKET_SIZE);
ostapsky 0:aa1e012ec210 154
ostapsky 0:aa1e012ec210 155 if(data_len > 0) {
ostapsky 0:aa1e012ec210 156 /* Packet will be inserted to the correct queue */
ostapsky 0:aa1e012ec210 157 HCI_Input(hciReadPacket);
ostapsky 0:aa1e012ec210 158 } else {
ostapsky 0:aa1e012ec210 159 /* Insert the packet back into the pool */
ostapsky 0:aa1e012ec210 160 list_insert_head(&hciReadPktPool, (tListNode *)hciReadPacket);
ostapsky 0:aa1e012ec210 161 }
ostapsky 0:aa1e012ec210 162
ostapsky 0:aa1e012ec210 163 } else {
ostapsky 0:aa1e012ec210 164 /* TODO: HCI Read Packet Pool is empty, wait for a free packet */
ostapsky 0:aa1e012ec210 165 }
ostapsky 0:aa1e012ec210 166
ostapsky 0:aa1e012ec210 167 Clear_SPI_EXTI_Flag();
ostapsky 0:aa1e012ec210 168 }
ostapsky 0:aa1e012ec210 169 }
ostapsky 0:aa1e012ec210 170 }
ostapsky 0:aa1e012ec210 171
ostapsky 0:aa1e012ec210 172
ostapsky 0:aa1e012ec210 173 /**
ostapsky 0:aa1e012ec210 174 * @brief This function is used to initialize the SPI communication with
ostapsky 0:aa1e012ec210 175 * the BlueNRG Shield.
ostapsky 0:aa1e012ec210 176 * @param None
ostapsky 0:aa1e012ec210 177 * @retval None
ostapsky 0:aa1e012ec210 178 */
ostapsky 0:aa1e012ec210 179 void BNRG_SPI_Init(void)
ostapsky 0:aa1e012ec210 180 {
ostapsky 0:aa1e012ec210 181 SpiHandle.Instance = BNRG_SPI_INSTANCE;
ostapsky 0:aa1e012ec210 182 SpiHandle.Init.Mode = BNRG_SPI_MODE;
ostapsky 0:aa1e012ec210 183 SpiHandle.Init.Direction = BNRG_SPI_DIRECTION;
ostapsky 0:aa1e012ec210 184 SpiHandle.Init.DataSize = BNRG_SPI_DATASIZE;
ostapsky 0:aa1e012ec210 185 SpiHandle.Init.CLKPolarity = BNRG_SPI_CLKPOLARITY;
ostapsky 0:aa1e012ec210 186 SpiHandle.Init.CLKPhase = BNRG_SPI_CLKPHASE;
ostapsky 0:aa1e012ec210 187 SpiHandle.Init.NSS = BNRG_SPI_NSS;
ostapsky 0:aa1e012ec210 188 SpiHandle.Init.FirstBit = BNRG_SPI_FIRSTBIT;
ostapsky 0:aa1e012ec210 189 SpiHandle.Init.TIMode = BNRG_SPI_TIMODE;
ostapsky 0:aa1e012ec210 190 SpiHandle.Init.CRCPolynomial = BNRG_SPI_CRCPOLYNOMIAL;
ostapsky 0:aa1e012ec210 191 SpiHandle.Init.BaudRatePrescaler = BNRG_SPI_BAUDRATEPRESCALER;
ostapsky 0:aa1e012ec210 192 SpiHandle.Init.CRCCalculation = BNRG_SPI_CRCCALCULATION;
ostapsky 0:aa1e012ec210 193
ostapsky 0:aa1e012ec210 194 HAL_SPI_Init(&SpiHandle);
ostapsky 0:aa1e012ec210 195 }
ostapsky 0:aa1e012ec210 196
ostapsky 0:aa1e012ec210 197 /**
ostapsky 0:aa1e012ec210 198 * @brief Read from BlueNRG SPI buffer and store data into local buffer
ostapsky 0:aa1e012ec210 199 * @param hspi: handle of the STM32Cube HAL SPI interface
ostapsky 0:aa1e012ec210 200 * @param buffer: buffer where data from SPI are stored
ostapsky 0:aa1e012ec210 201 * @param buff_size: buffer size
ostapsky 0:aa1e012ec210 202 * @retval number of read bytes
ostapsky 0:aa1e012ec210 203 */
ostapsky 0:aa1e012ec210 204 int32_t BlueNRG_SPI_Read_All(SPI_HandleTypeDef *hspi, uint8_t *buffer, uint8_t buff_size)
ostapsky 0:aa1e012ec210 205 {
ostapsky 0:aa1e012ec210 206 uint16_t byte_count;
ostapsky 0:aa1e012ec210 207 uint8_t len = 0;
ostapsky 0:aa1e012ec210 208 uint8_t i = 0;
ostapsky 0:aa1e012ec210 209 uint8_t char_ff = 0xff;
ostapsky 0:aa1e012ec210 210 volatile uint8_t read_char;
ostapsky 0:aa1e012ec210 211
ostapsky 0:aa1e012ec210 212 uint8_t header_master[5] = {0x0b, 0x00, 0x00, 0x00, 0x00};
ostapsky 0:aa1e012ec210 213 uint8_t header_slave[5];
ostapsky 0:aa1e012ec210 214
ostapsky 0:aa1e012ec210 215 /* CS reset */
ostapsky 0:aa1e012ec210 216 HAL_GPIO_WritePin(BNRG_SPI_CS_PORT, BNRG_SPI_CS_PIN, GPIO_PIN_RESET);
ostapsky 0:aa1e012ec210 217
ostapsky 0:aa1e012ec210 218 /* Read the header */
ostapsky 0:aa1e012ec210 219 for (i = 0; i < 5; i++) {
ostapsky 0:aa1e012ec210 220 HAL_SPI_TransmitReceive(hspi, &header_master[i], &header_slave[i], 1, 15);
ostapsky 0:aa1e012ec210 221 }
ostapsky 0:aa1e012ec210 222
ostapsky 0:aa1e012ec210 223
ostapsky 0:aa1e012ec210 224 if (header_slave[0] == 0x02) {
ostapsky 0:aa1e012ec210 225 /* device is ready */
ostapsky 0:aa1e012ec210 226 byte_count = (header_slave[4]<<8)|header_slave[3];
ostapsky 0:aa1e012ec210 227
ostapsky 0:aa1e012ec210 228 if (byte_count > 0) {
ostapsky 0:aa1e012ec210 229
ostapsky 0:aa1e012ec210 230 /* avoid to read more data that size of the buffer */
ostapsky 0:aa1e012ec210 231 if (byte_count > buff_size) {
ostapsky 0:aa1e012ec210 232 byte_count = buff_size;
ostapsky 0:aa1e012ec210 233 }
ostapsky 0:aa1e012ec210 234
ostapsky 0:aa1e012ec210 235 for (len = 0; len < byte_count; len++) {
ostapsky 0:aa1e012ec210 236 HAL_SPI_TransmitReceive(hspi, &char_ff, (uint8_t*)&read_char, 1, 15);
ostapsky 0:aa1e012ec210 237 buffer[len] = read_char;
ostapsky 0:aa1e012ec210 238 }
ostapsky 0:aa1e012ec210 239 }
ostapsky 0:aa1e012ec210 240 }
ostapsky 0:aa1e012ec210 241 /* Release CS line */
ostapsky 0:aa1e012ec210 242 HAL_GPIO_WritePin(BNRG_SPI_CS_PORT, BNRG_SPI_CS_PIN, GPIO_PIN_SET);
ostapsky 0:aa1e012ec210 243
ostapsky 0:aa1e012ec210 244 return len;
ostapsky 0:aa1e012ec210 245 }
ostapsky 0:aa1e012ec210 246
ostapsky 0:aa1e012ec210 247 /**
ostapsky 0:aa1e012ec210 248 * @brief Write data from local buffer to SPI
ostapsky 0:aa1e012ec210 249 * @param hspi: handle of the STM32Cube HAL SPI interface
ostapsky 0:aa1e012ec210 250 * @param data1: first data buffer to be written
ostapsky 0:aa1e012ec210 251 * @param data2: second data buffer to be written
ostapsky 0:aa1e012ec210 252 * @param Nb_bytes1: size of first data buffer to be written
ostapsky 0:aa1e012ec210 253 * @param Nb_bytes2: size of second data buffer to be written
ostapsky 0:aa1e012ec210 254 * @retval number of read bytes
ostapsky 0:aa1e012ec210 255 */
ostapsky 0:aa1e012ec210 256 int32_t BlueNRG_SPI_Write(SPI_HandleTypeDef *hspi, uint8_t* data1, uint8_t* data2, uint8_t Nb_bytes1, uint8_t Nb_bytes2)
ostapsky 0:aa1e012ec210 257 {
ostapsky 0:aa1e012ec210 258 uint32_t i;
ostapsky 0:aa1e012ec210 259 uint8_t read_char;
ostapsky 0:aa1e012ec210 260 int32_t result = 0;
ostapsky 0:aa1e012ec210 261
ostapsky 0:aa1e012ec210 262 unsigned char header_master[5] = {0x0a, 0x00, 0x00, 0x00, 0x00};
ostapsky 0:aa1e012ec210 263 unsigned char header_slave[5] = {0xaa, 0x00, 0x00, 0x00, 0x00};
ostapsky 0:aa1e012ec210 264
ostapsky 0:aa1e012ec210 265 Disable_SPI_IRQ();
ostapsky 0:aa1e012ec210 266
ostapsky 0:aa1e012ec210 267 /* CS reset */
ostapsky 0:aa1e012ec210 268 HAL_GPIO_WritePin(BNRG_SPI_CS_PORT, BNRG_SPI_CS_PIN, GPIO_PIN_RESET);
ostapsky 0:aa1e012ec210 269
ostapsky 0:aa1e012ec210 270 /* Exchange header */
ostapsky 0:aa1e012ec210 271
ostapsky 0:aa1e012ec210 272
ostapsky 0:aa1e012ec210 273 for (i = 0; i < 5; i++) {
ostapsky 0:aa1e012ec210 274 HAL_SPI_TransmitReceive(hspi, &header_master[i], &header_slave[i], 1, 15);
ostapsky 0:aa1e012ec210 275 }
ostapsky 0:aa1e012ec210 276
ostapsky 0:aa1e012ec210 277
ostapsky 0:aa1e012ec210 278 if (header_slave[0] == 0x02) {
ostapsky 0:aa1e012ec210 279 /* SPI is ready */
ostapsky 0:aa1e012ec210 280 if (header_slave[1] >= (Nb_bytes1+Nb_bytes2)) {
ostapsky 0:aa1e012ec210 281 /* Buffer is big enough */
ostapsky 0:aa1e012ec210 282 for (i = 0; i < Nb_bytes1; i++) {
ostapsky 0:aa1e012ec210 283 HAL_SPI_TransmitReceive(hspi, (data1 + i), &read_char, 1, 15);
ostapsky 0:aa1e012ec210 284 }
ostapsky 0:aa1e012ec210 285 for (i = 0; i < Nb_bytes2; i++) {
ostapsky 0:aa1e012ec210 286 HAL_SPI_TransmitReceive(hspi, (data2 + i), &read_char, 1, 15);
ostapsky 0:aa1e012ec210 287 }
ostapsky 0:aa1e012ec210 288 } else {
ostapsky 0:aa1e012ec210 289 /* Buffer is too small */
ostapsky 0:aa1e012ec210 290 result = -2;
ostapsky 0:aa1e012ec210 291 }
ostapsky 0:aa1e012ec210 292 } else {
ostapsky 0:aa1e012ec210 293 /* SPI is not ready */
ostapsky 0:aa1e012ec210 294 result = -1;
ostapsky 0:aa1e012ec210 295 }
ostapsky 0:aa1e012ec210 296
ostapsky 0:aa1e012ec210 297 /* Release CS line */
ostapsky 0:aa1e012ec210 298 HAL_GPIO_WritePin(BNRG_SPI_CS_PORT, BNRG_SPI_CS_PIN, GPIO_PIN_SET);
ostapsky 0:aa1e012ec210 299
ostapsky 0:aa1e012ec210 300 Enable_SPI_IRQ();
ostapsky 0:aa1e012ec210 301
ostapsky 0:aa1e012ec210 302 return result;
ostapsky 0:aa1e012ec210 303 }
ostapsky 0:aa1e012ec210 304
ostapsky 0:aa1e012ec210 305 /**
ostapsky 0:aa1e012ec210 306 * Writes data to a serial interface.
ostapsky 0:aa1e012ec210 307 *
ostapsky 0:aa1e012ec210 308 * @param data1 1st buffer
ostapsky 0:aa1e012ec210 309 * @param data2 2nd buffer
ostapsky 0:aa1e012ec210 310 * @param n_bytes1 number of bytes in 1st buffer
ostapsky 0:aa1e012ec210 311 * @param n_bytes2 number of bytes in 2nd buffer
ostapsky 0:aa1e012ec210 312 */
ostapsky 0:aa1e012ec210 313 void Hal_Write_Serial(const void* data1, const void* data2, tHalInt32 n_bytes1, tHalInt32 n_bytes2)
ostapsky 0:aa1e012ec210 314 {
ostapsky 0:aa1e012ec210 315 struct timer t;
ostapsky 0:aa1e012ec210 316
ostapsky 0:aa1e012ec210 317 Timer_Set(&t, CLOCK_SECOND/10);
ostapsky 0:aa1e012ec210 318
ostapsky 0:aa1e012ec210 319 while(1) {
ostapsky 0:aa1e012ec210 320 if(BlueNRG_SPI_Write(&SpiHandle, (uint8_t *)data1,(uint8_t *)data2, n_bytes1, n_bytes2)==0) break;
ostapsky 0:aa1e012ec210 321 if(Timer_Expired(&t)) {
ostapsky 0:aa1e012ec210 322 break;
ostapsky 0:aa1e012ec210 323 }
ostapsky 0:aa1e012ec210 324 }
ostapsky 0:aa1e012ec210 325 }
ostapsky 0:aa1e012ec210 326
ostapsky 0:aa1e012ec210 327 /**
ostapsky 0:aa1e012ec210 328 * @brief Disable SPI IRQ
ostapsky 0:aa1e012ec210 329 * @param None
ostapsky 0:aa1e012ec210 330 * @retval None
ostapsky 0:aa1e012ec210 331 */
ostapsky 0:aa1e012ec210 332 void Disable_SPI_IRQ(void)
ostapsky 0:aa1e012ec210 333 {
ostapsky 0:aa1e012ec210 334 HAL_NVIC_DisableIRQ(BNRG_SPI_EXTI_IRQn);
ostapsky 0:aa1e012ec210 335 }
ostapsky 0:aa1e012ec210 336
ostapsky 0:aa1e012ec210 337 /**
ostapsky 0:aa1e012ec210 338 * @brief Enable SPI IRQ
ostapsky 0:aa1e012ec210 339 * @param None
ostapsky 0:aa1e012ec210 340 * @retval None
ostapsky 0:aa1e012ec210 341 */
ostapsky 0:aa1e012ec210 342 void Enable_SPI_IRQ(void)
ostapsky 0:aa1e012ec210 343 {
ostapsky 0:aa1e012ec210 344 HAL_NVIC_EnableIRQ(BNRG_SPI_EXTI_IRQn);
ostapsky 0:aa1e012ec210 345 }
ostapsky 0:aa1e012ec210 346
ostapsky 0:aa1e012ec210 347 /**
ostapsky 0:aa1e012ec210 348 * @brief Clear Pending SPI IRQ
ostapsky 0:aa1e012ec210 349 * @param None
ostapsky 0:aa1e012ec210 350 * @retval None
ostapsky 0:aa1e012ec210 351 */
ostapsky 0:aa1e012ec210 352 void Clear_SPI_IRQ(void)
ostapsky 0:aa1e012ec210 353 {
ostapsky 0:aa1e012ec210 354 HAL_NVIC_ClearPendingIRQ(BNRG_SPI_EXTI_IRQn);
ostapsky 0:aa1e012ec210 355 }
ostapsky 0:aa1e012ec210 356
ostapsky 0:aa1e012ec210 357 /**
ostapsky 0:aa1e012ec210 358 * @brief Clear EXTI (External Interrupt) line for SPI IRQ
ostapsky 0:aa1e012ec210 359 * @param None
ostapsky 0:aa1e012ec210 360 * @retval None
ostapsky 0:aa1e012ec210 361 */
ostapsky 0:aa1e012ec210 362 void Clear_SPI_EXTI_Flag(void)
ostapsky 0:aa1e012ec210 363 {
ostapsky 0:aa1e012ec210 364 __HAL_GPIO_EXTI_CLEAR_IT(BNRG_SPI_EXTI_PIN);
ostapsky 0:aa1e012ec210 365 }
ostapsky 0:aa1e012ec210 366
ostapsky 0:aa1e012ec210 367 /**
ostapsky 0:aa1e012ec210 368 * @brief Reset the BlueNRG
ostapsky 0:aa1e012ec210 369 * @param None
ostapsky 0:aa1e012ec210 370 * @retval None
ostapsky 0:aa1e012ec210 371 */
ostapsky 0:aa1e012ec210 372 void BlueNRG_RST(void)
ostapsky 0:aa1e012ec210 373 {
ostapsky 0:aa1e012ec210 374 HAL_GPIO_WritePin(BNRG_SPI_RESET_PORT, BNRG_SPI_RESET_PIN, GPIO_PIN_RESET);
ostapsky 0:aa1e012ec210 375 HAL_Delay(5);
ostapsky 0:aa1e012ec210 376 HAL_GPIO_WritePin(BNRG_SPI_RESET_PORT, BNRG_SPI_RESET_PIN, GPIO_PIN_SET);
ostapsky 0:aa1e012ec210 377 HAL_Delay(5);
ostapsky 0:aa1e012ec210 378 }
ostapsky 0:aa1e012ec210 379
ostapsky 0:aa1e012ec210 380 /**
ostapsky 0:aa1e012ec210 381 * @}
ostapsky 0:aa1e012ec210 382 */
ostapsky 0:aa1e012ec210 383
ostapsky 0:aa1e012ec210 384 /**
ostapsky 0:aa1e012ec210 385 * @}
ostapsky 0:aa1e012ec210 386 */
ostapsky 0:aa1e012ec210 387
ostapsky 0:aa1e012ec210 388 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/